Как реализовать автоматический выбор из выпадающего списка и формы выбора в автотестах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Автоматизированное тестирование в среде 1С:Предприятие часто сталкивается с трудностями при взаимодействии с динамическими элементами интерфейса, такими как выпадающие списки и формы выбора. Стандартный механизм записи действий пользователя не всегда корректно воспроизводит сложные сценарии, где требуется дождаться отрисовки окна или подбора данных. Рассмотрим подробнее, как решить проблему открытия формы выбора и какие подходы к тестированию считаются наиболее эффективными в современной разработке на платформе 1С.

Анализ проблемы: почему стандартный код может не срабатывать

Проанализируем ситуацию, описанную в вопросе. Автор пытается имитировать ввод текста и ожидать формирования списка. Основная причина неудачи часто кроется в асинхронности работы управляемого интерфейса. Когда мы используем ТестируемоеПриложение, система посылает команды клиентскому приложению, но не всегда гарантирует, что визуальный компонент (форма выбора или выпадающий список) успел инициализироваться в памяти и отобразиться на экране.

В приведенном примере кода используются методы ВвестиТекст и ОжидатьФормированияВыпадающегоСписка. Если после этого форма не открывается, это может означать, что фокус с поля ушел раньше времени или метод ВыполнитьВыборИзВыпадающегоСписка не находит нужный элемент, так как список пуст или еще не сформирован запросом к серверу.

Решение 1: Использование стандартных методов имитации выбора

Для того чтобы гарантированно открыть форму выбора справочника (например, "Сотрудники"), вместо простого ввода текста рекомендуется использовать метод ВыполнитьВыбор(). Рассмотрим пример правильной последовательности действий для работы с полем формы:


// Находим окно и форму
ОкноПриема = ТестовоеПриложение.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), "Прием на работу (создание)");
ФормаДокумента = ОкноПриема.НайтиОбъект(Тип("ТестируемаяФорма"), "Прием на работу (создание)");

// Находим поле "Сотрудник"
ПолеСотрудник = ФормаДокумента.НайтиОбъект(Тип("ТестируемоеПолеФормы"), "Сотрудник");

// Активизируем поле, чтобы имитировать фокус пользователя
ПолеСотрудник.Активизировать();

// Выполняем команду выбора (нажатие на кнопку с тремя точками)
ПолеСотрудник.ВыполнитьВыбор();

// Теперь нужно дождаться появления нового окна — формы выбора справочника
ОкноВыбора = ТестовоеПриложение.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), "Выберите сотрудника", , 10);
ФормаВыбора = ОкноВыбора.НайтиОбъект(Тип("ТестируемаяФорма"), "ФормаВыбора");

// В форме выбора находим список и выбираем нужный элемент
Список = ФормаВыбора.НайтиОбъект(Тип("ТестируемаяТаблицаФормы"), "Список");
Список.ВыбратьСтроку(); 

Важный момент: при работе с управляемыми формами всегда указывайте таймаут в методе НайтиОбъект. Это позволяет тесту дождаться завершения серверного вызова и отрисовки интерфейса.

Решение 2: Программный подход через имитацию бизнес-логики

Как отмечают опытные разработчики, UI-тесты (тестирование через интерфейс) часто бывают "хрупкими". Любое изменение дизайна формы может сломать тест. Рассмотрим более надежный, программный метод тестирования. Суть его заключается в заполнении реквизитов объекта напрямую в форме и принудительном вызове обработчиков событий ПриИзменении.

Для этого в конфигурацию (или через расширение) добавляется экспортный метод, который позволяет тесту "дергать" логику формы. Разберем по шагам, как это реализовать:

  1. Создаем расширение для тестируемой формы.
  2. Делаем процедуру СотрудникПриИзменении экспортной или создаем вспомогательную экспортную процедуру.
  3. В коде теста используем программное заполнение.

Пример программного заполнения в тесте:


// В контексте теста получаем форму
Форма = ОткрытьФорму("Документ.ПриемНаРаботу.Форма.ФормаДокумента");

// Программное заполнение реквизита
Форма.Объект.Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию("Иванов Иван Иванович");

// Вызов логики, которая должна отработать при выборе сотрудника
// (например, заполнение подразделения или оклада)
ЭлементСотрудник = Форма.Элементы.Сотрудник;
Форма.СотрудникПриИзменении(ЭлементСотрудник);

// Проверяем результат
Если Форма.Объект.Подразделение.Пустая() Тогда
    ВызватьИсключение "Автозаполнение подразделения не сработало!";
КонецЕсли;

Этот подход значительно ускоряет выполнение тестов, так как исключает медленные визуальные операции отрисовки окон и поиска элементов по заголовкам.

Решение 3: Использование Vanessa Automation (современный стандарт)

Если вы планируете заниматься автоматизацией всерьез, проанализируем возможности фреймворка Vanessa Automation. Это мощный инструмент на базе языка Gherkin, который надстроен над штатным механизмом 1С и решает большинство проблем с ожиданиями.

В Vanessa Automation сценарий выбора сотрудника будет выглядеть как простой текст:

И Я выбираю "Иванов Иван Иванович" в поле "Сотрудник"

Система сама под капотом выполнит следующие действия:

Преимущества Vanessa: Умные ожидания (Smart Waits): Тест не упадет, если сервер "задумался" на лишнюю секунду. Скриншоты и видео: В случае ошибки вы получите полный отчет с картинкой того, что пошло не так. Документация: Сценарии пишутся на русском языке, что позволяет бизнес-аналитикам проверять логику тестов.

Инфраструктурные советы для стабильности тестов

Выясним причины, по которым тесты могут выдавать "косяки", как упоминалось в сообщениях форума:

  1. Режим модальности: Убедитесь, что в свойствах конфигурации установлено "Использовать блокирующие окна" вместо "Использовать модальные окна". Автотесты 1С плохо работают с устаревшими модальными окнами.
  2. Масштабирование: При запуске тестов на сервере или другом компьютере убедитесь, что масштаб экрана в Windows установлен на 100%. Иначе координаты элементов могут вычисляться неверно.
  3. Права доступа: Тестовый пользователь должен обладать правами не только на чтение данных, но и на просмотр соответствующих форм. Часто тест падает просто потому, что у пользователя "Автотест" не открывается форма выбора из-за ограничений RLS.
  4. Очистка данных: Перед запуском теста всегда обеспечивайте чистоту базы или используйте механизмы транзакций, чтобы один упавший тест не блокировал выполнение всей цепочки из-за дублей данных.

Использование связки из Vanessa Automation для высокоуровневых сценариев и xUnitFor1C (или Vanessa-ADD) для низкоуровневых Unit-тестов позволяет создать надежную систему контроля качества кода, которая не будет "сыпаться" при каждом обновлении платформы.

← На главную