Методы тестируемого поля инициируют реальные кнопки регулирования. Собственный обработчик учитывает направление +1/-1, ограничивает 0..5 и предотвращает двойную стандартную обработку.
Где и как запускать
Полный модуль своей формы МенеджерВвода85.Пульт: имя своей конфигурации возвращает отдельная серверная функция без контекста, UI выполняется в /TESTMANAGER, тонкий клиент 8.5.1.1343. Реальный собственный /TESTCLIENT этой же базы УчебныйВыборВвода85 на вручную проверенном 127.0.0.1:15383; ни один модуль не запускался.
Подготовка
Используйте только свою новую конфигурацию УчебныйВыборВвода85, язык Русский, управление Такси, платформа 8.5.1.1343. Создайте свой справочник УчебныеКниги85 по урокам выбора: иерархия групп и элементов, код Строка 10 без автонумерации, реквизиты МеткаСтенда и Секция типа Строка 30.
Только в своём стенде вручную подготовьте группу BOOKGROUP и элемент BOOK/Книга, МеткаСтенда = owned-input85, Секция = Книги. Тест не создаёт и не записывает даже собственную книгу: использует заранее подготовленную настоящую ссылку.
Создайте общую управляемую форму УчебныйВводТест85. Вставьте полный дополнительный модуль ниже и назначьте ПриСозданииНаСервере. Это испытуемая форма, основной модуль урока в неё не вставляйте.
Реквизиты испытуемой формы: МеткаСеанса, НазваниеКниги85, УчебныйВыпадающий85, УчебныйСписок85, ИтогВыбора85 и Карточка85 — Строка 100; УчебноеКоличество85, Открытий85, Созданий85 — Число 6.0; УчебнаяКнига85 — СправочникСсылка.УчебныеКниги85.
На испытуемой форме создайте отдельные поля ввода УчебныйВыпадающий85, УчебныйСписок85, УчебноеКоличество85 и УчебнаяКнига85 с одноимёнными ПутьКДанным. Это не колонки таблицы. Покажите МеткаСеанса, ИтогВыбора85, Открытий85 и Созданий85 как отдельные поля только для просмотра с одноимёнными путями.
Для числовых полей задайте Формат ЧГ=0;ЧДЦ=0, чтобы контрольные представления были 3, 4, 0, 1 без группировки и дробной части. Для редактируемых полей доступность/видимость включены, ТолькоПросмотр выключено.
Добавьте обычную группу КарточкаКниги85 и внутри поле Карточка85 только для просмотра. События Открытие/Создание показывают эту реальную собственную область и её данные; они не открывают стандартную форму записи каталога.
Создайте команду и кнопку СброситьСвойВвод85 с одноимённым действием, ИзменяетСохраняемыеДанные = Ложь. Другие события поля назначаются кодом fixture, вручную их не привязывайте.
Создайте собственную общую команду без параметра ОткрытьУчебныйВвод85 с дополнительным модулем запуска ниже; покажите её в единственной учебной подсистеме. Она открывает только подготовленную ОбщаяФорма.УчебныйВводТест85.
Создайте обработку МенеджерВвода85 с управляемой формой Пульт, реквизитами Согласие (Булево), МеткаСеанса (Строка 100), Итог (Строка неограниченной длины). Команда и кнопка ВыполнитьСвойТест85, действие ВыполнитьСвойТест85. Основной код урока — полный модуль этого менеджера; назначьте ПриОткрытии(Отказ).
Покажите флажок согласия, редактируемую фактическую метку и многострочный Итог только для просмотра. Для каждого урока используйте отдельную копию менеджера; одноимённые процедуры не вставляйте дважды.
Самостоятельно обновите только свой стенд. Если позже решите выполнить ручной UI-тест, запустите свои тонкие клиенты с /TESTCLIENT -TPort15383 и /TESTMANAGER. Свободный локальный порт 15383 должен принадлежать только этому собственному тестовому клиенту. Код клиентов не запускает и порт не меняет.
В своём /TESTCLIENT откройте испытуемую форму, скопируйте её настоящий UUID в менеджер, подтвердите согласие. Метку не создавайте в менеджере вместо источника. Не запускайте опыт в production или против чужого тестового приложения.
Эти модули здесь не выполнялись: runtimeVerifiedScenarios=0, никаких 1С, GUI, соединений и кликов не запускалось. Авторские проверки статические, фактический выбор и действия интерфейса ещё требуют отдельного разрешённого ручного теста.
При будущем ручном тесте меняются только данные и элементы собственной формы в памяти. Сброс и разрыв соединения предпринимаются независимо даже при ошибке; документы, файлы и книга справочника не записываются и не удаляются.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Подготовьте свой /TESTCLIENT и скопируйте реальный UUID формы";
КонецПроцедуры
&НаКлиенте
Функция СвоеПоле85(Форма, Имя)
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , Имя, 10);
Если Поле.Имя <> Имя Или Поле.Вид <> ВидПоляФормы.ПолеВвода Тогда
ВызватьИсключение "Нужно именно своё отдельное поле ввода";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Или Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Своё поле должно быть видно, доступно и редактируемо";
КонецЕсли;
Возврат Поле;
КонецФункции
&НаКлиенте
Функция СвоеПредставление85(Форма, Имя)
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , Имя, 10);
Возврат Поле.ПолучитьПредставлениеДанных();
КонецФункции
&НаКлиенте
Процедура ВыполнитьСвойТест85(Команда)
Если Не Согласие Тогда
ВызватьИсключение "Нужны свой стенд и явное согласие на UI-опыт только в своей форме";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Нужно точное фактическое значение UUID своей формы";
КонецЕсли;
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15383);
Форма = Неопределено;
Поле = Неопределено;
ИсходныйЛимит = Неопределено;
ОшибкаТеста = "";
ОшибкиЗавершения = "";
Итог = "Результат ещё не получен";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
Заголовок = "Учебный ввод85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Нужна ровно одна настоящая собственная форма этого сеанса";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если СвоеПредставление85(Форма, "МеткаСеанса") <> МеткаСеанса Тогда
ВызватьИсключение "Реальная метка источника не совпала";
КонецЕсли;
Если СвоеПредставление85(Форма, "УчебныйВыпадающий85") <> "Книга"
Или СвоеПредставление85(Форма, "ИтогВыбора85") <> "Книга"
Или СвоеПредставление85(Форма, "УчебноеКоличество85") <> "3"
Или СвоеПредставление85(Форма, "Открытий85") <> "0"
Или СвоеПредставление85(Форма, "Созданий85") <> "0" Тогда
ВызватьИсключение "Сначала вручную сбросьте собственный опыт; чужие изменения не затираются";
КонецЕсли;
Поле = СвоеПоле85(Форма, "УчебноеКоличество85");
Поле.УвеличитьЗначение();
Если Поле.ПолучитьПредставлениеДанных() <> "4" Тогда
ВызватьИсключение "Собственное увеличение 3→4 не подтвердилось";
КонецЕсли;
Поле.УменьшитьЗначение();
Если Поле.ПолучитьПредставлениеДанных() <> "3" Тогда
ВызватьИсключение "Собственное уменьшение 4→3 не подтвердилось";
КонецЕсли;
Для НомерШага = 1 По 4 Цикл
Поле.УвеличитьЗначение();
КонецЦикла;
Если Поле.ПолучитьПредставлениеДанных() <> "5" Тогда
ВызватьИсключение "Верхняя собственная граница 5 не удержана";
КонецЕсли;
Итог = "Проверены 3→4→3 и сохранение верхней границы 5";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
Если Поле <> Неопределено Тогда
Попытка
Если Поле.ВыпадающийСписокОткрыт() Тогда
Поле.ЗакрытьВыпадающийСписок();
КонецЕсли;
Исключение
ОшибкиЗавершения = "Закрытие своего списка не подтверждено: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если Форма <> Неопределено Тогда
Попытка
Сброс = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвойВвод85", 10);
Сброс.Нажать();
Если СвоеПредставление85(Форма, "УчебныйВыпадающий85") <> "Книга"
Или СвоеПредставление85(Форма, "ИтогВыбора85") <> "Книга"
Или СвоеПредставление85(Форма, "УчебноеКоличество85") <> "3"
Или СвоеПредставление85(Форма, "Открытий85") <> "0"
Или СвоеПредставление85(Форма, "Созданий85") <> "0" Тогда
ВызватьИсключение "Свои исходные данные не восстановлены";
КонецЕсли;
Исключение
ОшибкиЗавершения = ОшибкиЗавершения + " Не выполнен собственный сброс: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
ОшибкиЗавершения = ОшибкиЗавершения + " Не восстановлен лимит: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
ОшибкиЗавершения = ОшибкиЗавершения + " Разрыв соединения не подтверждён: " + ОписаниеОшибки();
КонецПопытки;
Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
Итог = "Опыт не завершён успешно: " + ОшибкаТеста + " " + ОшибкиЗавершения;
ВызватьИсключение Итог;
КонецЕсли;
Итог = Итог + "; свои данные восстановлены, лимит восстановлен, соединение разорвано; клиент остаётся открытым";
КонецПроцедуры
УчебныйВводТест85
УчебныйВыборВвода85 → Общие формы → УчебныйВводТест85 → Модуль
Полный модуль собственной испытуемой управляемой формы: серверная подготовка реальной ссылки и своих данных, клиентские события и собственный сброс. Нет записи объектов.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только собственный новый неразделённый стенд УчебныйВыборВвода85";
КонецЕсли;
УчебнаяКнига85 = Справочники.УчебныеКниги85.НайтиПоКоду("BOOK");
Если Не ЗначениеЗаполнено(УчебнаяКнига85) Тогда
ВызватьИсключение "Нужен свой заранее созданный BOOK";
КонецЕсли;
Если УчебнаяКнига85.ЭтоГруппа Или УчебнаяКнига85.МеткаСтенда <> "owned-input85" Тогда
ВызватьИсключение "BOOK должен быть своим учебным элементом";
КонецЕсли;
НазваниеКниги85 = УчебнаяКнига85.Наименование;
ЭтаФорма.АвтоЗаголовок = Ложь;
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтаФорма.Заголовок = "Учебный ввод85 " + МеткаСеанса;
УчебныйВыпадающий85 = "Книга";
УчебныйСписок85 = "Книга";
УчебноеКоличество85 = 3;
ИтогВыбора85 = "Книга";
Карточка85 = "Закрыта";
Открытий85 = 0;
Созданий85 = 0;
Элементы.КарточкаКниги85.Видимость = Ложь;
Поле = Элементы.УчебныйВыпадающий85;
Поле.РежимВыбораИзСписка = Истина;
Поле.СписокВыбора.Добавить("Книга", "Книга");
Поле.СписокВыбора.Добавить("Ручка", "Ручка");
Поле.КнопкаВыпадающегоСписка = Истина;
Поле.КнопкаОчистки = Истина;
Поле.АвтоОтображениеКнопкиОчистки = Ложь;
Поле = Элементы.УчебныйСписок85;
Поле.РежимВыбораИзСписка = Истина;
Поле.СписокВыбора.Добавить("Книга", "Книга");
Поле.СписокВыбора.Добавить("Ручка", "Ручка");
Поле.КнопкаВыбора = Истина;
Поле.КнопкаСпискаВыбора = Истина;
Поле.КнопкаОчистки = Истина;
Поле.АвтоОтображениеКнопкиОчистки = Ложь;
Поле.УстановитьДействие("НачалоВыбора", "НачатьСвойВыбор85");
Поле.УстановитьДействие("ПриИзменении", "СвойВыборИзменен85");
Поле = Элементы.УчебноеКоличество85;
Поле.КнопкаРегулирования = Истина;
Поле.Формат = "ЧГ=0;ЧДЦ=0";
Поле.УстановитьДействие("Регулирование", "ИзменитьСвоеКоличество85");
Поле = Элементы.УчебнаяКнига85;
Поле.КнопкаОткрытия = Истина;
Поле.АвтоОтображениеКнопкиОткрытия = Ложь;
Поле.КнопкаСоздания = Истина;
Поле.КнопкаВыпадающегоСписка = Истина;
Поле.УстановитьДействие("Открытие", "ПоказатьСвоюКарточку85");
Поле.УстановитьДействие("Создание", "НачатьСвойЧерновик85");
КонецПроцедуры
&НаКлиенте
Процедура НачатьСвойВыбор85(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ВыборДобавлением Тогда
ВызватьИсключение "Урок использует одиночное строковое поле, не добавление множественных значений";
КонецЕсли;
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.Добавить("Книга", "Книга");
ДанныеВыбора.Добавить("Ручка", "Ручка");
КонецПроцедуры
&НаКлиенте
Процедура СвойВыборИзменен85(Элемент)
ИтогВыбора85 = УчебныйСписок85;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьСвоеКоличество85(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Направление <> 1 И Направление <> -1 Тогда
ВызватьИсключение "Неожиданное направление собственного регулирования";
КонецЕсли;
НовоеКоличество = УчебноеКоличество85 + Направление;
Если НовоеКоличество >= 0 И НовоеКоличество <= 5 Тогда
УчебноеКоличество85 = НовоеКоличество;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСвоюКарточку85(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Открытий85 = Открытий85 + 1;
Карточка85 = "Просмотр: " + НазваниеКниги85;
Элементы.КарточкаКниги85.Видимость = Истина;
КонецПроцедуры
&НаКлиенте
Процедура НачатьСвойЧерновик85(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Созданий85 = Созданий85 + 1;
Карточка85 = "Новый учебный черновик без записи";
Элементы.КарточкаКниги85.Видимость = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СброситьСвойВвод85(Команда)
УчебныйВыпадающий85 = "Книга";
УчебныйСписок85 = "Книга";
УчебноеКоличество85 = 3;
ИтогВыбора85 = "Книга";
Карточка85 = "Закрыта";
Открытий85 = 0;
Созданий85 = 0;
Элементы.КарточкаКниги85.Видимость = Ложь;
КонецПроцедуры
ОткрытьУчебныйВвод85
УчебныйВыборВвода85 → Общие команды → ОткрытьУчебныйВвод85 → Модуль
Полный модуль собственной общей команды без параметра: серверная функция возвращает фактическое имя конфигурации, клиент проверяет строку и открывает только свою подготовленную форму.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныйВводТест85");
КонецПроцедуры
Разбор по шагам
УчебноеКоличество85 имеет настоящий числовой реквизит и поле с кнопкой регулирования. Формат заранее задаёт целочисленное представление без группировки.
УвеличитьЗначение и УменьшитьЗначение эмулируют нажатие кнопки, а не присваивают локальную переменную менеджера.
Событие Регулирование получает Элемент, Направление и СтандартнаяОбработка. По справке направления 1 и -1; иное значение явно отвергается.
СтандартнаяОбработка = Ложь предотвращает дополнительный стандартный шаг. Только собственный обработчик изменяет число в допустимом диапазоне.
Реальное представление проверяется после каждого первого перехода. Ещё четыре увеличения должны остановиться на 5, а не вывести 7.
Сброс возвращает своё исходное количество 3. Ошибки сброса, лимита и соединения не теряются.
Как проверить результат
Настоящие представления 4 после увеличения, 3 после уменьшения, 5 после четырёх дополнительных увеличений.
После завершения количество опять 3. Если значение не совпало, тест не успешен; никакого фактического запуска здесь не было.
Ожидаемый результат
Два метода регулирования разобраны в реальном ограниченном цикле с собственным событием и контролем результата.
На что обратить внимание
Кнопки регулирования предназначены для подходящего поля; не переносите пример на картинку, календарь или ссылочное поле.
Представление проверяется в заданном числовом формате собственного стенда; это не универсальный парсер локализованных чисел.
Граница формы не заменяет бизнес-правила рабочей базы. Урок вообще не пишет количество в документы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.