Всем привет! Хочу поделиться своим решением автоматизации тестирования на платформе 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,"ДФ=дд.ММ.гггг;");      
КонецЕсли; 

И дальше в документ записываем нужные даты - думаю, это не сложно. Единственное, лучше к вводу даты добавить цикл. Он необходим, т.к. иногда дата может не ввестись в поле.

Ввод даты в поле
Ввод даты в поле

Итог

Мы автоматизировали сценарий создания документа "Работа в выходные и праздничные дни" и "Отпуск". Теперь все зависимости от текущей даты у нас в документах всегда будет указываться необходимый день недели и период отпуска. Думаю, такой алгоритм можно использовать при решении других задач связанными с датами и днями недели.

Если есть интересные вопросы - то пишите.

Комментарии (2)


  1. totus
    06.10.2024 05:14
    +1

    А не проще ли вместо громадного условия сделать что-то вроде такого?

    ТекущийДеньНедели = ДеньНедели(ТекущаяДата())
    СледующееВоскресениеЧерез = 7 - (ТекущийДеньНедели % 7)
    
    ДатаВоскресения = Формат(ТекущаяДата() + СледующееВоскресениеЧерез*86400,"ДФ=дд.ММ.гггг;")

    Ну и с отпусками аналогично.


    1. Petr_Strelyaev Автор
      06.10.2024 05:14

      Да, идея интересная.

      Надо будет попробовать)