Открыть свою карточку и показать новый черновик без записи каталога

Учебные задачи

Источник — настоящая собственная ссылка BOOK. Методы инициируют реальные события поля; собственные обработчики отменяют стандартное открытие/создание и показывают подготовленную область карточки в этой форме.

Где и как запускать

Полный модуль своей формы МенеджерВвода85.Пульт: имя своей конфигурации возвращает отдельная серверная функция без контекста, UI выполняется в /TESTMANAGER, тонкий клиент 8.5.1.1343. Реальный собственный /TESTCLIENT этой же базы УчебныйВыборВвода85 на вручную проверенном 127.0.0.1:15383; ни один модуль не запускался.

Подготовка

  1. Используйте только свою новую конфигурацию УчебныйВыборВвода85, язык Русский, управление Такси, платформа 8.5.1.1343. Создайте свой справочник УчебныеКниги85 по урокам выбора: иерархия групп и элементов, код Строка 10 без автонумерации, реквизиты МеткаСтенда и Секция типа Строка 30.

  2. Только в своём стенде вручную подготовьте группу BOOKGROUP и элемент BOOK/Книга, МеткаСтенда = owned-input85, Секция = Книги. Тест не создаёт и не записывает даже собственную книгу: использует заранее подготовленную настоящую ссылку.

  3. Создайте общую управляемую форму УчебныйВводТест85. Вставьте полный дополнительный модуль ниже и назначьте ПриСозданииНаСервере. Это испытуемая форма, основной модуль урока в неё не вставляйте.

  4. Реквизиты испытуемой формы: МеткаСеанса, НазваниеКниги85, УчебныйВыпадающий85, УчебныйСписок85, ИтогВыбора85 и Карточка85 — Строка 100; УчебноеКоличество85, Открытий85, Созданий85 — Число 6.0; УчебнаяКнига85 — СправочникСсылка.УчебныеКниги85.

  5. На испытуемой форме создайте отдельные поля ввода УчебныйВыпадающий85, УчебныйСписок85, УчебноеКоличество85 и УчебнаяКнига85 с одноимёнными ПутьКДанным. Это не колонки таблицы. Покажите МеткаСеанса, ИтогВыбора85, Открытий85 и Созданий85 как отдельные поля только для просмотра с одноимёнными путями.

  6. Для числовых полей задайте Формат ЧГ=0;ЧДЦ=0, чтобы контрольные представления были 3, 4, 0, 1 без группировки и дробной части. Для редактируемых полей доступность/видимость включены, ТолькоПросмотр выключено.

  7. Добавьте обычную группу КарточкаКниги85 и внутри поле Карточка85 только для просмотра. События Открытие/Создание показывают эту реальную собственную область и её данные; они не открывают стандартную форму записи каталога.

  8. Создайте команду и кнопку СброситьСвойВвод85 с одноимённым действием, ИзменяетСохраняемыеДанные = Ложь. Другие события поля назначаются кодом fixture, вручную их не привязывайте.

  9. Создайте собственную общую команду без параметра ОткрытьУчебныйВвод85 с дополнительным модулем запуска ниже; покажите её в единственной учебной подсистеме. Она открывает только подготовленную ОбщаяФорма.УчебныйВводТест85.

  10. Создайте обработку МенеджерВвода85 с управляемой формой Пульт, реквизитами Согласие (Булево), МеткаСеанса (Строка 100), Итог (Строка неограниченной длины). Команда и кнопка ВыполнитьСвойТест85, действие ВыполнитьСвойТест85. Основной код урока — полный модуль этого менеджера; назначьте ПриОткрытии(Отказ).

  11. Покажите флажок согласия, редактируемую фактическую метку и многострочный Итог только для просмотра. Для каждого урока используйте отдельную копию менеджера; одноимённые процедуры не вставляйте дважды.

  12. Самостоятельно обновите только свой стенд. Если позже решите выполнить ручной UI-тест, запустите свои тонкие клиенты с /TESTCLIENT -TPort15383 и /TESTMANAGER. Свободный локальный порт 15383 должен принадлежать только этому собственному тестовому клиенту. Код клиентов не запускает и порт не меняет.

  13. В своём /TESTCLIENT откройте испытуемую форму, скопируйте её настоящий UUID в менеджер, подтвердите согласие. Метку не создавайте в менеджере вместо источника. Не запускайте опыт в production или против чужого тестового приложения.

  14. Эти модули здесь не выполнялись: runtimeVerifiedScenarios=0, никаких 1С, GUI, соединений и кликов не запускалось. Авторские проверки статические, фактический выбор и действия интерфейса ещё требуют отдельного разрешённого ручного теста.

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Согласие = Ложь;
    МеткаСеанса = "";
    Итог = "Подготовьте свой /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");
КонецПроцедуры

Разбор по шагам

  1. На сервере найдена настоящая собственная BOOK и проверена её метка. НазваниеКниги85 берётся из неё на сервере: клиентские события не читают серверные реквизиты ссылки.

  2. Открыть эмулирует кнопку открытия поля. Свой обработчик получает Элемент и СтандартнаяОбработка, отключает стандартное действие и показывает реально созданную группу КарточкаКниги85.

  3. Карточка85 содержит Просмотр: Книга, а Открытий85 увеличивается. Менеджер читает оба фактических результата, не объявляет само наличие метода открытой карточкой.

  4. Создать инициирует собственное Создание. Обработчик отключает стандартное открытие формы нового элемента и показывает свой черновик в той же области.

  5. Новый учебный черновик — текст и состояние собственной формы в памяти, не созданная ссылка или сохранённая книга. УчебнаяКнига85 остаётся подготовленной BOOK.

  6. Сброс скрывает карточку и возвращает оба счётчика к 0; клиент и сама форма не закрываются.

Как проверить результат

  1. После Открыть: Открытий85 = 1 и фактическая Карточка85 = Просмотр: Книга.

  2. После Создать: Созданий85 = 1 и фактическая карточка черновика. После завершения оба счётчика 0, область скрыта.

  3. В своём каталоге не появляется новый элемент: в обоих событиях СтандартнаяОбработка = Ложь и вызова Записать нет.

Ожидаемый результат

Методы открытия и создания получили настоящие собственные события и видимый результат без подмены учебного черновика сохранённым объектом базы.

На что обратить внимание

  1. Если удалить отмену стандартной обработки, платформа может открыть стандартную карточку записи. Это меняет условия и риск урока; так делать не следует.

  2. Создать не выдаётся за сохранение каталога. Здесь специально переопределена команда создания собственного интерфейса.

  3. Открыть имеет специальное поведение для колонки вне редактирования в интерфейсе Версия 8.5; наш стенд использует отдельное поле в Такси, не такую колонку.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.