При написании сценариев автоматизированного тестирования во встроенном языке «1С:Предприятие 8.3» разработчики часто сталкиваются с необходимостью динамического ввода дат. Использование жестко закодированных строковых значений (например, "19.02.2021") делает тесты хрупкими и неактуальными уже на следующий день. Однако прямая попытка передать текущую дату с помощью системного метода ТекущаяДата() в объект тестирования вызывает ошибку или оставляет поле пустым. В этой статье мы подробно разберем причины этой проблемы и пошагово реализуем правильный алгоритм ввода динамических дат.
Для начала проанализируем поведение платформы 1С при попытке передать дату напрямую. Объект встроенного языка ТестируемоеПолеФормы предоставляет метод ВвестиТекст(), который имитирует ввод символов пользователем с клавиатуры. Этот метод принимает исключительно строковые параметры (тип Строка).
Когда мы пытаемся написать код следующим образом:
Т.ВвестиТекст(ТекущаяДата());
Платформа выполняет неявное преобразование типа Дата в тип Строка. По умолчанию системный формат даты в 1С включает в себя не только календарный день, но и время. Таким образом, вместо ожидаемой строки "19.02.2021" в метод передается значение вида "19.02.2021 00:00:00".
Поле ввода даты на форме (в частности, «Дата начала» в стандартном периоде) ожидает строго структурированный ввод без символов времени. При попытке вставить туда строку со временем, маска ввода сбрасывает значение, и поле остается незаполненным. Аналогичный результат дает и явное приведение типов через функцию Строка(ТекущаяДата()), так как она использует стандартное системное представление даты со временем.
Для корректного заполнения поля даты нам необходимо избавиться от времени и привести значение к строгому текстовому формату "ДД.ММ.ГГГГ". Для решения этой задачи идеально подходит стандартная функция платформы Формат().
Рассмотрим пример формирования правильной строки для русской и английской локализаций платформы:
// Для русскоязычной локализации платформы:
ТекДатаСтрокой = Формат(ТекущаяДата(), "ДФ=дд.ММ.гггг");
// Для англоязычной локализации платформы:
ТекДатаСтрокой = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Функция Формат() с параметром "ДФ=дд.ММ.гггг" возвращает текстовое представление даты ровно из 10 символов (например, "25.10.2023"). Такой текст безошибочно распознается маской ввода тестируемого поля.
Помимо форматирования даты, в реальных сценариях авторов тестов часто кроется еще одна критическая ошибка — неверное позиционирование в иерархии объектов тест-клиента. Рассмотрим проблемный участок кода:
Т1 = ТП.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Выбор периода");
Т1.Выбрать(); // Открывается модальное окно выбора периода
Т = Т1.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения")); // Ошибка!
Т = Т1.НайтиОбъект(Тип("ТестируемаяФорма"), "Выберите период"); // Ошибка!
Проанализируем две ключевые ошибки в этом фрагменте:
Т1.Выбрать() открывает новое независимое диалоговое окно (форму выбора стандартного периода). Попытка найти это новое окно внутри объекта Т1 (который является простым полем ввода на родительской форме) обречена на провал. Поиск любых новых окон и форм всегда должен производиться от корневого объекта тест-клиента (в нашем случае это ТП).Т для хранения разных объектов, из-за чего теряется контекст выполнения.Разберем по шагам правильную реализацию сценария заполнения периода с учетом исправления всех иерархических и форматных ошибок. Мы будем использовать понятные имена переменных для каждого объекта:
// Шаг 1: Находим основную форму документа или обработки
ФормаГрафика = ТП.НайтиОбъект(Тип("ТестируемаяФорма"), "Заполнение графика");
// Шаг 2: Находим поле выбора периода на этой форме и нажимаем кнопку выбора
ПолеПериода = ФормаГрафика.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Выбор периода");
ПолеПериода.Выбрать(); // В этот момент открывается модальное окно "Выберите период"
// Шаг 3: Находим открывшуюся форму выбора периода, выполняя поиск от КОРНЯ (ТП)
ФормаВыбораПериода = ТП.НайтиОбъект(Тип("ТестируемаяФорма"), "Выберите период");
// Шаг 4: Находим поле "Дата начала" внутри новой формы
ПолеДатаНачала = ФормаВыбораПериода.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Дата начала");
// Шаг 5: Активизируем поле для имитации фокуса ввода
ПолеДатаНачала.Активизировать();
// Шаг 6: Форматируем текущую дату и вводим её в поле
ДатаДляВвода = Формат(ТекущаяДата(), "ДФ=дд.ММ.гггг");
ПолеДатаНачала.ВвестиТекст(ДатаДляВвода);
Этот алгоритм гарантирует стабильное нахождение элементов интерфейса и безошибочный ввод даты в любых конфигурациях на управляемых формах.
Если в вашей компании автоматизация тестирования строится не на «чистом» встроенном языке, а с использованием современных инструментов поведенческого тестирования (BDD), таких как Vanessa Automation или Vanessa ADD, задача упрощается в разы.
Вам не потребуется вручную прописывать иерархию поиска окон. В сценарии на языке Gherkin это реализуется декларативно:
Переменные:
| Имя | Значение |
| МояТекущаяДата | Format(CurrentDate(), "dd.MM.yyyy") |
Сценарий: Заполнение периода текущей датой
* И в поле 'Выбор периода' я ввожу значение '$МояТекущаяДата$'
Использование подобных инструментов позволяет не только легко форматировать даты, но и вычислять относительные периоды (например, начало месяца, прошлую неделю или смещение на определенное количество дней назад) без написания сложного программного кода в автотестах.