Всем привет! Хочу поделиться своим решением автоматизации тестирования на платформе 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,"ДФ=дд.ММ.гггг;"); КонецЕсли;
И дальше в документ записываем нужные даты — думаю, это не сложно. Единственное, лучше к вводу даты добавить цикл. Он необходим, т.к. иногда дата может не ввестись в поле.
Итог
Мы автоматизировали сценарий создания документа «Работа в выходные и праздничные дни» и «Отпуск». Теперь все зависимости от текущей даты у нас в документах всегда будет указываться необходимый день недели и период отпуска. Думаю, такой алгоритм можно использовать при решении других задач связанными с датами и днями недели.
Если есть интересные вопросы — то пишите.
ссылка на оригинал статьи https://habr.com/ru/articles/848324/
Добавить комментарий