Полный UI-тест отдельного поля строки и кнопки собственной командной панели. Контролируются реальная идентичность, вид, заголовок, родители, подсказка и видимость; после ввода свой обработчик переключает ТолькоПросмотр и пометку, затем собственные данные и режим восстанавливаются.
Где и как запускать
Полный модуль управляемой формы МенеджерПолей85.Пульт: имя своей конфигурации возвращает серверная функция без контекста, UI выполняется в своём тонком /TESTMANAGER-клиенте8.5.1.1343; новый тонкий /TESTCLIENT той же пустой базы УчебныеПоляТестирования85 на вручную проверенном порту15382, Такси.
Подготовка
Создайте с нуля отдельную пустую конфигурацию УчебныеПоляТестирования85 на платформе8.5.1.1343; Управляемое приложение, Такси. Без прикладных объектов, общих реквизитов-разделителей, расширений, подписок и чужих обработчиков. В рабочей базе тесты не запускайте.
Общие формы → УчебныеПоля85, тип Управляемая. Вставьте полный дополнительный модуль fixture ниже и назначьте ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Не заменяйте реквизиты этой формы данными справочника или документа.
Добавьте реквизиты МеткаСеанса типа Строка, УчебныйТекст85 типа Строка длиной100 и РежимПросмотра типа Булево. РежимПросмотра не показывайте пользователю; он меняется только собственным обработчиком кнопки.
Добавьте группу ГруппаДанных85 обычного вертикального вида, заголовок Данные опыта. Внутри неё два отдельных поля ввода: МеткаСеанса только для просмотра и УчебныйТекст85 с заголовком Учебный текст, видимым заголовком и доступным редактированием. Это не колонки таблицы.
Добавьте отдельную группу ПанельРежима85 вида Командная панель. Внутри неё кнопку РежимПросмотра85 вида КнопкаКоманднойПанели, заголовок Только просмотр, Пометка=Ложь. Не заменяйте её обычной кнопкой вне панели: свойство Пометка предназначено для командной панели.
Создайте команду ПереключитьРежимПросмотра85 с одноимённым действием и свяжите с кнопкой РежимПросмотра85. Создайте команду СброситьСвойОпыт85 с одноимённым действием и кнопку именно СброситьСвойОпыт85. Обе команды ИзменяетСохраняемыеДанные=Ложь.
Создайте единственную учебную подсистему и общую команду ОткрытьУчебныеПоля85, без параметра, с модулем запуска ниже. Включите её в подсистему и покажите её кнопку; она открывает только свою ОбщаяФорма.УчебныеПоля85.
Обработки → МенеджерПолей85 → управляемая форма Пульт. Добавьте Согласие типа Булево, МеткаСеанса типа Строка, Итог типа Строка неограниченной длины, команду и кнопку ВыполнитьСвойТест с одноимённым действием. Основной код урока — полный модуль именно менеджера.
Назначьте менеджеру ПриОткрытии(Отказ). Покажите флажок согласия, поле ввода фактической метки и многострочный Итог только для просмотра. Никаких неизвестных входных объектов урок не требует.
Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: здесь 1С, приложение, тестируемые окна и соединения не запускались. Статическая проверка не доказывает фактическое отображение элементов.
Вручную запустите один тонкий клиент этой новой базы с /TESTCLIENT -TPort15382, другой с /TESTMANAGER. Администратор заранее выделяет этот собственный свободный локальный порт и убеждается, что его не занимает чужой клиент. Код ничего не запускает автоматически.
В тестируемом клиенте откройте свою форму. Исходно видны Книга, выключенная пометка кнопки и разрешённое редактирование. Скопируйте реальную метку из поля в менеджер; не генерируйте UUID в менеджере вместо собственного источника.
Установите согласие и выполните тест. На промежуточном шаге свой текст Учебная книга должен сохраниться при ТолькоПросмотр=Истина и пометке=Истина; повторное нажатие возвращает редактируемое состояние.
В завершении отдельная собственная кнопка сбрасывает только данные этой формы к Книга и исходному режиму. При ошибке очистки нажмите СброситьСвойОпыт85 вручную именно в своей форме. Клиент и форма не закрываются, документы, регистры и файлы не записываются.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Подготовьте свою форму в собственном клиенте /TESTCLIENT";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если Не Согласие Тогда
ВызватьИсключение "Подтвердите UI-тест только собственной формы в памяти";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Скопируйте фактический UUID из своей формы, не создавайте метку в менеджере";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвоюФорму(Приложение)
Заголовок = "Учебные поля85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Нужна ровно одна реально подготовленная своя форма этого сеанса";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Метка = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "МеткаСеанса", 10);
Если Метка.ПолучитьПредставлениеДанных() <> МеткаСеанса Тогда
ВызватьИсключение "Форма не подтвердила настоящую метку сеанса";
КонецЕсли;
Возврат Форма;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоиЭлементы(Поле, Кнопка)
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> "УчебныйТекст85"
Или Поле.Вид <> ВидПоляФормы.ПолеВвода Или Поле.ТекстЗаголовка <> "Учебный текст" Тогда
ВызватьИсключение "Нужно именно собственное отдельное поле ввода, не колонка рабочей таблицы";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Или Не Поле.ЗаголовокОтображается() Тогда
ВызватьИсключение "Собственное поле должно быть видимым, доступным и с видимым заголовком";
КонецЕсли;
Если Поле.ПолучитьТекстПодсказки() <> "Введите только учебный текст без записи базы" Тогда
ВызватьИсключение "Подсказка не совпала с собственным fixture";
КонецЕсли;
Если ТипЗнч(Кнопка) <> Тип("ТестируемаяКнопкаФормы") Или Кнопка.Имя <> "РежимПросмотра85"
Или Кнопка.Вид <> ВидКнопкиФормы.КнопкаКоманднойПанели Или Кнопка.ТекстЗаголовка <> "Только просмотр" Тогда
ВызватьИсключение "Нужна своя кнопка командной панели, поддерживающая пометку";
КонецЕсли;
Если Не Кнопка.ТекущаяВидимость() Или Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственная кнопка должна быть видимой и доступной";
КонецЕсли;
РодительПоля = Поле.ПолучитьРодителя();
Если ТипЗнч(РодительПоля) <> Тип("ТестируемаяГруппаФормы") Или РодительПоля.Имя <> "ГруппаДанных85" Тогда
ВызватьИсключение "У поля не подтвердился фактический собственный родитель";
КонецЕсли;
РодительКнопки = Кнопка.ПолучитьРодителя();
Если ТипЗнч(РодительКнопки) <> Тип("ТестируемаяГруппаФормы") Или РодительКнопки.Имя <> "ПанельРежима85" Тогда
ВызватьИсключение "У кнопки не подтвердился фактический собственный родитель";
КонецЕсли;
ДочерниеПоля = Поле.ПолучитьПодчиненныеОбъекты();
ДочерниеКнопки = Кнопка.ПолучитьПодчиненныеОбъекты();
Если ТипЗнч(ДочерниеПоля) <> Тип("ФиксированныйМассив") Или ТипЗнч(ДочерниеКнопки) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Нужны настоящие коллекции подчинённых объектов, не придуманные элементы";
КонецЕсли;
Сообщить("Фактические подчинённые: поле=" + Строка(ДочерниеПоля.Количество()) + "; кнопка=" + Строка(ДочерниеКнопки.Количество()));
КонецПроцедуры
&НаКлиенте
Функция ЗавершитьСвойТест(Приложение, Форма, ИсходныйЛимит)
Ошибки = "";
Если Форма <> Неопределено Тогда
Попытка
Сброс = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвойОпыт85", 10);
Сброс.Нажать();
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Свои исходные данные и режим ещё не восстановлены";
КонецЕсли;
Исключение
Ошибки = "Не восстановлен свой опыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
Ошибки = Ошибки + " Не восстановлен фактический лимит: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
Ошибки = Ошибки + " Разрыв соединения не подтверждён: " + ОписаниеОшибки();
КонецПопытки;
Возврат Ошибки;
КонецФункции
&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
ПроверитьСвойСтенд();
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15382);
СвояФорма = Неопределено;
ИсходныйЛимит = Неопределено;
ОшибкаТеста = "";
Итог = "Фактический результат ещё не получен";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
СвояФорма = ПолучитьСвоюФорму(Приложение);
Поле = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
ПроверитьСвоиЭлементы(Поле, Кнопка);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Исходный собственный опыт уже изменён; сначала выполните свой сброс";
КонецЕсли;
Поле.Активизировать();
Поле.ВвестиТекст("Учебная книга");
Кнопка.Активизировать();
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Настоящее введённое значение не подтвердилось";
КонецЕсли;
Кнопка.Нажать();
Если Не Кнопка.ТекущееПометка() Или Не Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Пометка кнопки и отдельное состояние ТолькоПросмотр поля не подтвердились";
КонецЕсли;
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Переключение режима не должно стирать собственные данные";
КонецЕсли;
Если Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Свою доступную кнопку нужно сохранить для обратного переключения";
КонецЕсли;
Кнопка.Нажать();
Если Кнопка.ТекущееПометка() Или Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Возврат в редактируемое состояние ещё не подтвердился";
КонецЕсли;
Итог = "Введён собственный учебный текст; пометка и ТолькоПросмотр проверены в обоих состояниях";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
ОшибкиЗавершения = ЗавершитьСвойТест(Приложение, СвояФорма, ИсходныйЛимит);
Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
Итог = "Тест не завершён успешно: " + ОшибкаТеста + " " + ОшибкиЗавершения;
ВызватьИсключение Итог;
КонецЕсли;
Итог = Итог + "; свой текст Книга и исходный режим восстановлены, реальный лимит восстановлен, соединение разорвано. Клиент не закрывался";
КонецПроцедуры
УчебныеПоля85
УчебныеПоляТестирования85 → Общие формы → УчебныеПоля85 → Модуль
Полный модуль собственной управляемой формы: серверное создание своих данных, два клиентских действия; данные только в памяти и настоящие собственные элементы формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
Отказ = Истина;
ВызватьИсключение "Только свой новый неразделённый стенд";
КонецЕсли;
ЭтотОбъект.АвтоЗаголовок = Ложь;
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтотОбъект.Заголовок = "Учебные поля85 " + МеткаСеанса;
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.Подсказка = "Введите только учебный текст без записи базы";
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьРежимПросмотра85(Команда)
РежимПросмотра = Не РежимПросмотра;
Элементы.УчебныйТекст85.ТолькоПросмотр = РежимПросмотра;
Элементы.РежимПросмотра85.Пометка = РежимПросмотра;
КонецПроцедуры
&НаКлиенте
Процедура СброситьСвойОпыт85(Команда)
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедурыОткрытьУчебныеПоля85
УчебныеПоляТестирования85 → Общие команды → ОткрытьУчебныеПоля85 → Модуль
Полный модуль своей общей команды без параметра: серверная функция возвращает фактическое имя конфигурации, клиент проверяет строку и открывает собственную подготовленную форму.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныеПоля85");
КонецПроцедуры
Разбор по шагам
Пара объектов получается через настоящий ТестируемоеПриложение и одну конкретную форму с реальным UUID-заголовком. Поле метки отдельно подтверждает идентичность источника; отсутствующая или дублирующая форма вызывает отказ.
Поле проверяется по внутреннему имени, действительному виду ПолеВвода и видимому заголовку. Видимость, доступность, видимость заголовка и ТолькоПросмотр — разные состояния, не один универсальный getter.
Подсказка сравнивается с реальным значением, заданным собственным fixture. Представление данных должно быть Книга; это отображаемая строка, не универсальное преобразование числа или даты.
Родители поля и кнопки получаются native-методами и сверяются с реально созданными ГруппаДанных85 и ПанельРежима85. Подчинённые возвращаются действительными фиксированными массивами; число не угадывается и пустая коллекция не подменяется объектами.
Кнопка должна иметь вид КнопкаКоманднойПанели, точный заголовок, видимость и доступность. ТекущееПометка проверяет реальное визуальное состояние; readonly-свойства тестируемого объекта не заполняются вручную.
Ввод выполняется в отдельном реальном поле, затем фактическая кнопка активизируется и забирает фокус. ПолучитьПредставлениеДанных подтверждает отображаемое значение перед нажатием; несуществующий метод ЗакончитьРедактирование у поля не выдумывается. Серверной записи текста в каталог товаров нет.
Настоящее нажатие запускает только собственную команду. Она меняет РежимПросмотра, свойство исходного ПолеФормы.ТолькоПросмотр и пометку исходного КнопкаФормы; тестируемые объекты остаются readonly-представлениями.
Проверяется пара переходов: пометка и запрет редактирования включены, затем выключены. Данные после включения не должны исчезнуть, а кнопка должна оставаться доступной для возврата.
Очистка нажимает только свой сброс, повторно подтверждает Книга, ТолькоПросмотр=Ложь и пометку=Ложь, затем независимо восстанавливает реальный лимит и разрывает соединение. Ошибка любой части не скрывается.
Как проверить результат
При иной конфигурации, версии, чужом порту, отсутствии /TESTMANAGER, неверной фактической метке или нескольких формах тест должен отказаться. Не изменяйте защиту ради работы в production.
Исходное отдельное поле видно, доступно, имеет видимый заголовок Учебный текст и точную собственную подсказку. Кнопка находится внутри своей командной панели и имеет требуемый вид.
После ввода представление равно Учебная книга. После первого нажатия пометка=Истина, ТолькоПросмотр=Истина, текст тот же; доступность кнопки сохраняется.
После второго нажатия оба состояния Ложь. Если проверка даёт неправильное значение, код выбрасывает исключение, а не просто печатает Ложь и объявляет успех.
После завершения снова Книга, режим редактируемый, пометка снята, действительный исходный лимит восстановлен и соединение разорвано. Форма остаётся открытой.
В полях и кнопках не присваиваются свойства ТестируемоеПолеФормы/ТестируемаяКнопкаФормы. При ошибке собственный сброс и разрыв соединения всё равно предпринимаются независимо.
Ожидаемый результат
В разрешённом ручном UI-тесте введён свой учебный текст, дважды проверено согласованное переключение режима и пометки, реальные исходные данные восстановлены и соединение разорвано. Здесь выполнены только статические проверки.
На что обратить внимание
Тестируемое поле — абстракция; дополнительные методы зависят от фактического Вид. ВводТекста и окончание редактирования здесь применяются только после подтверждения ПолеВвода, не к календарю, картинке или диаграмме.
Для колонки таблицы некоторые getters вызывают исключение вне режима редактирования. Этот fixture содержит отдельное поле, а не колонку, поэтому эти ограничения не обходятся неизвестным объектом.
ТекущееТолькоПросмотр возвращает Истина при запрете редактирования. Текст описания справки может быть сформулирован неоднозначно; в уроке сверяются возвращаемое значение, реальный изменённый OnlyView и поведение собственного поля.
Пометка исходной кнопки управляет кнопкой командной панели, не любой обычной кнопкой. Для теста специально выбран корректный вид и реальная группа-панель.
Readonly-представление тестируемого объекта не равнозначно неизменяемости самой формы: собственный обработчик меняет свои исходные элементы и данные, а менеджер только наблюдает их и выполняет подтверждённые UI-действия.
Пустые подчинённые коллекции у простых элементов нормальны. Поиск дочерних объектов не выдумывается и не считается выполненным только от существования самих методов; он требует отдельного подходящего fixture.
В установленной справке кнопка содержит две страницы Активизировать и две ТекстЗаголовка с одинаковой семантикой. Экспорт сохранил отдельные ключи с суффиксом; один настоящий вызов и реальное чтение применимы к обеим страницам, а не являются двумя разными действиями.
Метаданные.Имя, UUID и заголовок — диагностические ограждения, не криптографическая аутентификация клиента. Принадлежность порта и отсутствие чужой базы проверяет администратор до подключения.
Сброс восстанавливает заданный исходный fixture, а не произвольные чужие изменения. Перед тестом не редактируйте эту форму вручную; любые связанные с базой обработчики меняют условия и риск.
Код не запускался, runtimeVerifiedScenarios=0. 1С, сеть тестирования, окна, рабочие базы, файлы, резервные копии и архивы не менялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.