Всем привет! Хочу поделиться своим решением автоматизации тестирования на платформе 1С, а именно выбор необходимых дней недели или определенных периодов.
Правильный выбор даты создания документа необходим для автоматизации проверок любого документа в 1С. Обычно в него можно записывать либо статичное, либо вычисляемое значение. В зависимости от поставленной задачи. В Vanessa Automation в блоке Переменные это выглядит следующим образом:
Как видно, из примера выше для вычисляемой даты используется функция ТекущаяДата(). Которая возвращает текущая дату и время. А с помощью функции Формат() - указываем нужный нас формат даты.
Это очень удобно, т.к. в документе всегда указывается текущая дата. Также, используя функцию ТекущаяДата() можно вычислить предыдущий день отняв значение 86400, и будущую прибавив 86400. Само значение 86400 - это 60 секунд * 60 минут * 24 часа, т.е. количество секунд в одном дне.
Но, если мы хотим автоматизировать проверку документа "Работа в выходные и праздничные дни" - нужно указывать именно выходные дни. Как это можно сделать?
Проблема
Как известно месяц может начинаться с любого дня недели. Если, заглянуть в производственный календарь - то в этом можно легко убедится.
Когда пользователь создает документ "Работа в выходные и праздничные дни" он легко может понять какое число в календаре является выходным или праздничным днем - оно окрашено в красный цвет.
Но, если мы хотим сделать автоматизированный сценарий - то нужно вычислить число выходного дня.
Решение
Как я указал выше - мы можем использовать функцию ТекущаяДата(), которая возвращает текущую дату и время текущего дня. Далее к ней добавляем функцию ДеньНедели(), которая возвращает номер дня недели. Всего получается 7 возможных значений.
1 - Понедельник
2 - Вторник
3 - Среда
4 - Четверг
5 - Пятница
6 - Суббота
7 - Воскресение
Получается, вот такая строка:
ТекущийДеньНедели = ДеньНедели(ТекущаяДата());
Допустим, мы хотим, чтобы при создании документа "Работа в выходные и праздничные дни" всегда указывалось воскресение. Получается, что если текущий день понедельник - нам надо добавить 6 дней и у нас получится дата дня воскресения. А если вторник, то надо добавить 5 дней. К воскресению будем добавлять 7 дней, чтобы получить воскресение следующей недели. Для этого использовал условный оператор Если.
Если ТекущийДеньНедели = 1 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 2 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 5*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 3 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 4*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 4 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 3*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 5 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 2*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 6 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 1*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 7 Тогда
ДатаВоскресения = Формат(ТекущаяДата() + 7*86400,"ДФ=дд.ММ.гггг;");
КонецЕсли;
И затем записываем получившуюся дату в Контекст.
Контекст.Вставить("ДатаВыходногоДня", ДатаВоскресения);
В итоге получившийся кусок сценария будет выглядеть вот так (вычисляется на сервере):
Рассмотрим еще вариант в временным периодом. Используем для этого документ Отпуск. В нем нужно указать дату начала отпуска и дату окончания.
Думаю, что многие сотрудники уходят в отпуск в понедельник, а заканчивают в воскресение. Также нужно учесть, что документ отпуск заводится в системе заранее. Примерно за 2 или 3 недели. Поэтому поступим следующим образом:
Для даты начала - если, текущий день понедельник то прибавим 14 дней, а если вторник, то 13 и т.д.
Для даты окончания - нужно вычислить дату воскресения, относительно даты начала отпуска. Получается, что к понедельнику надо добавить 6 дней и получится дата воскресения. Если отпуск на 2 недели, то добавляем 13 дней.
Получается, следующий код оператора Если:
Если ТекущийДеньНедели = 1 Тогда
ДатаНачала = Формат(ТекущаяДата() + 14*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 14*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 2 Тогда
ДатаНачала = Формат(ТекущаяДата() + 13*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 13*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 3 Тогда
ДатаНачала = Формат(ТекущаяДата() + 12*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 12*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 4 Тогда
ДатаНачала = Формат(ТекущаяДата() + 11*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 11*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 5 Тогда
ДатаНачала = Формат(ТекущаяДата() + 10*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 10*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 6 Тогда
ДатаНачала = Формат(ТекущаяДата() + 9*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 9*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
ИначеЕсли ТекущийДеньНедели = 7 Тогда
ДатаНачала = Формат(ТекущаяДата() + 8*86400,"ДФ=дд.ММ.гггг;");
ДатаОкончания = Формат(ТекущаяДата() + 8*86400 + 6*86400,"ДФ=дд.ММ.гггг;");
КонецЕсли;
И дальше в документ записываем нужные даты - думаю, это не сложно. Единственное, лучше к вводу даты добавить цикл. Он необходим, т.к. иногда дата может не ввестись в поле.
Итог
Мы автоматизировали сценарий создания документа "Работа в выходные и праздничные дни" и "Отпуск". Теперь все зависимости от текущей даты у нас в документах всегда будет указываться необходимый день недели и период отпуска. Думаю, такой алгоритм можно использовать при решении других задач связанными с датами и днями недели.
Если есть интересные вопросы - то пишите.
totus
А не проще ли вместо громадного условия сделать что-то вроде такого?
Ну и с отпусками аналогично.
Petr_Strelyaev Автор
Да, идея интересная.
Надо будет попробовать)