Источник — настоящая собственная ссылка BOOK. Методы инициируют реальные события поля; собственные обработчики отменяют стандартное открытие/создание и показывают подготовленную область карточки в этой форме.
Где и как запускать
Полный модуль своей формы МенеджерВвода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");
Поле.Открыть();
Если СвоеПредставление85(Форма, "Открытий85") <> "1"
Или СвоеПредставление85(Форма, "Карточка85") <> "Просмотр: Книга" Тогда
ВызватьИсключение "Реальное открытие своей области просмотра не подтвердилось";
КонецЕсли;
Поле.Создать();
Если СвоеПредставление85(Форма, "Созданий85") <> "1"
Или СвоеПредставление85(Форма, "Карточка85") <> "Новый учебный черновик без записи" Тогда
ВызватьИсключение "Реальная собственная команда черновика не подтвердилась";
КонецЕсли;
Итог = "Собственная область показала просмотр и новый черновик; стандартная запись каталога не вызывалась";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
Если Поле <> Неопределено Тогда
Попытка
Если Поле.ВыпадающийСписокОткрыт() Тогда
Поле.ЗакрытьВыпадающийСписок();
КонецЕсли;
Исключение
ОшибкиЗавершения = "Закрытие своего списка не подтверждено: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если Форма <> Неопределено Тогда
Попытка
Сброс = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвойВвод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");
КонецПроцедуры
Разбор по шагам
На сервере найдена настоящая собственная BOOK и проверена её метка. НазваниеКниги85 берётся из неё на сервере: клиентские события не читают серверные реквизиты ссылки.
Открыть эмулирует кнопку открытия поля. Свой обработчик получает Элемент и СтандартнаяОбработка, отключает стандартное действие и показывает реально созданную группу КарточкаКниги85.
Карточка85 содержит Просмотр: Книга, а Открытий85 увеличивается. Менеджер читает оба фактических результата, не объявляет само наличие метода открытой карточкой.
Создать инициирует собственное Создание. Обработчик отключает стандартное открытие формы нового элемента и показывает свой черновик в той же области.
Новый учебный черновик — текст и состояние собственной формы в памяти, не созданная ссылка или сохранённая книга. УчебнаяКнига85 остаётся подготовленной BOOK.
Сброс скрывает карточку и возвращает оба счётчика к 0; клиент и сама форма не закрываются.
Как проверить результат
После Открыть: Открытий85 = 1 и фактическая Карточка85 = Просмотр: Книга.
После Создать: Созданий85 = 1 и фактическая карточка черновика. После завершения оба счётчика 0, область скрыта.
В своём каталоге не появляется новый элемент: в обоих событиях СтандартнаяОбработка = Ложь и вызова Записать нет.
Ожидаемый результат
Методы открытия и создания получили настоящие собственные события и видимый результат без подмены учебного черновика сохранённым объектом базы.
На что обратить внимание
Если удалить отмену стандартной обработки, платформа может открыть стандартную карточку записи. Это меняет условия и риск урока; так делать не следует.
Создать не выдаётся за сохранение каталога. Здесь специально переопределена команда создания собственного интерфейса.
Открыть имеет специальное поведение для колонки вне редактирования в интерфейсе Версия 8.5; наш стенд использует отдельное поле в Такси, не такую колонку.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.