ТестируемоеПолеФормы.ПолучитьПредставлениеДанных

Методы · GetDataPresentation

Получает текстовое представление данных, связанных с объектом, если применимо. Если метод вызывается для поля, являющегося колонкой таблицы, которая не находится в режиме редактирования, будет сгенерирована ошибка.

Синтаксис

ПолучитьПредставлениеДанных()
Полное описание, параметры и ограничения

ТестируемоеПолеФормы.ПолучитьПредставлениеДанных (TestedFormField.GetDataPresentation)

ТестируемоеПолеФормы (TestedFormField)

ПолучитьПредставлениеДанных (GetDataPresentation)

Доступен, начиная с версии 8.3.1.

Синтаксис:
ПолучитьПредставлениеДанных()
Возвращаемое значение:
Тип: Строка.
Строка с текстовым представлением отображаемых объектом данных.
Описание:

Получает текстовое представление данных, связанных с объектом, если применимо.
Если метод вызывается для поля, являющегося колонкой таблицы, которая не находится в режиме редактирования, будет сгенерирована ошибка.

Доступность:

Тонкий клиент, толстый клиент.

Использование в версии:

Доступен, начиная с версии 8.3.1.

Методическая информация

Практические примеры

Проверить своё поле ввода и кнопку: реальные состояния, ввод текста, пометка и восстановление

Полный UI-тест отдельного поля строки и кнопки собственной командной панели. Контролируются реальная идентичность, вид, заголовок, родители, подсказка и видимость; после ввода свой обработчик переключает ТолькоПросмотр и пометку, затем собственные данные и режим восстанавливаются.

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

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

Подготовка

  1. Создайте с нуля отдельную пустую конфигурацию УчебныеПоляТестирования85 на платформе8.5.1.1343; Управляемое приложение, Такси. Без прикладных объектов, общих реквизитов-разделителей, расширений, подписок и чужих обработчиков. В рабочей базе тесты не запускайте.

  2. Общие формы → УчебныеПоля85, тип Управляемая. Вставьте полный дополнительный модуль fixture ниже и назначьте ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Не заменяйте реквизиты этой формы данными справочника или документа.

  3. Добавьте реквизиты МеткаСеанса типа Строка, УчебныйТекст85 типа Строка длиной100 и РежимПросмотра типа Булево. РежимПросмотра не показывайте пользователю; он меняется только собственным обработчиком кнопки.

  4. Добавьте группу ГруппаДанных85 обычного вертикального вида, заголовок Данные опыта. Внутри неё два отдельных поля ввода: МеткаСеанса только для просмотра и УчебныйТекст85 с заголовком Учебный текст, видимым заголовком и доступным редактированием. Это не колонки таблицы.

  5. Добавьте отдельную группу ПанельРежима85 вида Командная панель. Внутри неё кнопку РежимПросмотра85 вида КнопкаКоманднойПанели, заголовок Только просмотр, Пометка=Ложь. Не заменяйте её обычной кнопкой вне панели: свойство Пометка предназначено для командной панели.

  6. Создайте команду ПереключитьРежимПросмотра85 с одноимённым действием и свяжите с кнопкой РежимПросмотра85. Создайте команду СброситьСвойОпыт85 с одноимённым действием и кнопку именно СброситьСвойОпыт85. Обе команды ИзменяетСохраняемыеДанные=Ложь.

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

  8. Обработки → МенеджерПолей85 → управляемая форма Пульт. Добавьте Согласие типа Булево, МеткаСеанса типа Строка, Итог типа Строка неограниченной длины, команду и кнопку ВыполнитьСвойТест с одноимённым действием. Основной код урока — полный модуль именно менеджера.

  9. Назначьте менеджеру ПриОткрытии(Отказ). Покажите флажок согласия, поле ввода фактической метки и многострочный Итог только для просмотра. Никаких неизвестных входных объектов урок не требует.

  10. Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: здесь 1С, приложение, тестируемые окна и соединения не запускались. Статическая проверка не доказывает фактическое отображение элементов.

  11. Вручную запустите один тонкий клиент этой новой базы с /TESTCLIENT -TPort15382, другой с /TESTMANAGER. Администратор заранее выделяет этот собственный свободный локальный порт и убеждается, что его не занимает чужой клиент. Код ничего не запускает автоматически.

  12. В тестируемом клиенте откройте свою форму. Исходно видны Книга, выключенная пометка кнопки и разрешённое редактирование. Скопируйте реальную метку из поля в менеджер; не генерируйте UUID в менеджере вместо собственного источника.

  13. Установите согласие и выполните тест. На промежуточном шаге свой текст Учебная книга должен сохраниться при ТолькоПросмотр=Истина и пометке=Истина; повторное нажатие возвращает редактируемое состояние.

  14. В завершении отдельная собственная кнопка сбрасывает только данные этой формы к Книга и исходному режиму. При ошибке очистки нажмите СброситьСвойОпыт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");
КонецПроцедуры

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

  1. Пара объектов получается через настоящий ТестируемоеПриложение и одну конкретную форму с реальным UUID-заголовком. Поле метки отдельно подтверждает идентичность источника; отсутствующая или дублирующая форма вызывает отказ.

  2. Поле проверяется по внутреннему имени, действительному виду ПолеВвода и видимому заголовку. Видимость, доступность, видимость заголовка и ТолькоПросмотр — разные состояния, не один универсальный getter.

  3. Подсказка сравнивается с реальным значением, заданным собственным fixture. Представление данных должно быть Книга; это отображаемая строка, не универсальное преобразование числа или даты.

  4. Родители поля и кнопки получаются native-методами и сверяются с реально созданными ГруппаДанных85 и ПанельРежима85. Подчинённые возвращаются действительными фиксированными массивами; число не угадывается и пустая коллекция не подменяется объектами.

  5. Кнопка должна иметь вид КнопкаКоманднойПанели, точный заголовок, видимость и доступность. ТекущееПометка проверяет реальное визуальное состояние; readonly-свойства тестируемого объекта не заполняются вручную.

  6. Ввод выполняется в отдельном реальном поле, затем фактическая кнопка активизируется и забирает фокус. ПолучитьПредставлениеДанных подтверждает отображаемое значение перед нажатием; несуществующий метод ЗакончитьРедактирование у поля не выдумывается. Серверной записи текста в каталог товаров нет.

  7. Настоящее нажатие запускает только собственную команду. Она меняет РежимПросмотра, свойство исходного ПолеФормы.ТолькоПросмотр и пометку исходного КнопкаФормы; тестируемые объекты остаются readonly-представлениями.

  8. Проверяется пара переходов: пометка и запрет редактирования включены, затем выключены. Данные после включения не должны исчезнуть, а кнопка должна оставаться доступной для возврата.

  9. Очистка нажимает только свой сброс, повторно подтверждает Книга, ТолькоПросмотр=Ложь и пометку=Ложь, затем независимо восстанавливает реальный лимит и разрывает соединение. Ошибка любой части не скрывается.

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

  1. При иной конфигурации, версии, чужом порту, отсутствии /TESTMANAGER, неверной фактической метке или нескольких формах тест должен отказаться. Не изменяйте защиту ради работы в production.

  2. Исходное отдельное поле видно, доступно, имеет видимый заголовок Учебный текст и точную собственную подсказку. Кнопка находится внутри своей командной панели и имеет требуемый вид.

  3. После ввода представление равно Учебная книга. После первого нажатия пометка=Истина, ТолькоПросмотр=Истина, текст тот же; доступность кнопки сохраняется.

  4. После второго нажатия оба состояния Ложь. Если проверка даёт неправильное значение, код выбрасывает исключение, а не просто печатает Ложь и объявляет успех.

  5. После завершения снова Книга, режим редактируемый, пометка снята, действительный исходный лимит восстановлен и соединение разорвано. Форма остаётся открытой.

  6. В полях и кнопках не присваиваются свойства ТестируемоеПолеФормы/ТестируемаяКнопкаФормы. При ошибке собственный сброс и разрыв соединения всё равно предпринимаются независимо.

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

В разрешённом ручном UI-тесте введён свой учебный текст, дважды проверено согласованное переключение режима и пометки, реальные исходные данные восстановлены и соединение разорвано. Здесь выполнены только статические проверки.

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

  1. Тестируемое поле — абстракция; дополнительные методы зависят от фактического Вид. ВводТекста и окончание редактирования здесь применяются только после подтверждения ПолеВвода, не к календарю, картинке или диаграмме.

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

  3. ТекущееТолькоПросмотр возвращает Истина при запрете редактирования. Текст описания справки может быть сформулирован неоднозначно; в уроке сверяются возвращаемое значение, реальный изменённый OnlyView и поведение собственного поля.

  4. Пометка исходной кнопки управляет кнопкой командной панели, не любой обычной кнопкой. Для теста специально выбран корректный вид и реальная группа-панель.

  5. Readonly-представление тестируемого объекта не равнозначно неизменяемости самой формы: собственный обработчик меняет свои исходные элементы и данные, а менеджер только наблюдает их и выполняет подтверждённые UI-действия.

  6. Пустые подчинённые коллекции у простых элементов нормальны. Поиск дочерних объектов не выдумывается и не считается выполненным только от существования самих методов; он требует отдельного подходящего fixture.

  7. В установленной справке кнопка содержит две страницы Активизировать и две ТекстЗаголовка с одинаковой семантикой. Экспорт сохранил отдельные ключи с суффиксом; один настоящий вызов и реальное чтение применимы к обеим страницам, а не являются двумя разными действиями.

  8. Метаданные.Имя, UUID и заголовок — диагностические ограждения, не криптографическая аутентификация клиента. Принадлежность порта и отсутствие чужой базы проверяет администратор до подключения.

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

  10. Код не запускался, runtimeVerifiedScenarios=0. 1С, сеть тестирования, окна, рабочие базы, файлы, резервные копии и архивы не менялись.

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

Проверить настоящую строку поиска: свой UUID, доступность, иерархия и три результата отсутствующего поиска

Полная пара модулей создаёт собственный буквальный список и его настоящее автоматическое дополнение. Тест-менеджер находит его по реальному имени Source-формы, ограниченно проверяет доступность, исследует настоящую иерархию и различает пустой массив, Неопределено и исключение.

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

Полный клиентский модуль своей внешней обработки МенеджерПоиска85.Пульт в /TESTMANAGER; собственный тонкий /TESTCLIENT этой же пустой базы УчебноеТестированиеПоиска85 на вручную проверенном127.0.0.1:15383. Код в1С не выполнялся.

Подготовка

  1. НОВАЯ отдельная пустая файловая база точно8.5.1.1343. Конфигурация УчебноеТестированиеПоиска85, язык Русский, совместимость Не использовать; никаких бизнес-объектов, расширений, подписок, заданий или рабочих данных. Модули конфигурации вручную пустые. Не применять к БП/КА2/УТ/УНФ.

  2. Создайте внешнюю обработку SourceПоиска85 с одной пустой управляемой основной формой. Реквизиты: Список — ДинамическийСписок; МеткаСеанса, ПаспортСтенда, ИмяДополнения — Строка100; ПрофильПоиска — Строка30. Один ТаблицаФормы с именем ТаблицаТоваров и ПутьКДанным=Список. Колонки вручную НЕ добавлять: fixture создает ровно пять своих колонок.

  3. Покажите МеткаСеанса, ПаспортСтенда, ИмяДополнения, ПрофильПоиска отдельными полями ввода с одноименными ПутьКДанным и ТолькоПросмотр=Да. Полный дополнительный модуль ниже вставить в модуль Source-формы. Назначить ПриСозданииНаСервере одноименной процедуре. Он создает две свои кнопки, их вручную не дублировать.

  4. В Source-форме буквальный список: Книга3×250, Ручка1×30, Чай2×150, Вода0×70. ОсновнаяТаблица пустая, ключи УчебныйНомер1–4; автоматическое сохранение пользовательских настроек выключено. UUID и ИмяДополнения берутся именно от настоящей открытой Source-формы, не выдумываются менеджером.

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

  6. Будущая ручная подготовка: сохранить обе свои внешние обработки, сохранить пустую конфигурацию и обновить ТОЛЬКО свою базу F7. Самостоятельно запустить два своих тонких клиента этой же базы: /TESTCLIENT -TPort15383 и /TESTMANAGER. Сначала убедиться, что 127.0.0.1:15383 принадлежит только своему тестовому клиенту. Код не запускает клиентов, не выбирает другую базу и не меняет порт.

  7. В /TESTCLIENT вручную открыть SourceПоиска85. Убедиться в четырех буквальных строках и профиле Разрешен. Скопировать точное фактическое МеткаСеанса в свой МенеджерПоиска85 в /TESTMANAGER. Подтвердить Согласие. Во время опыта не редактировать и не закрывать Source-форму; менять только доступность ее собственными кнопками.

  8. runtimeVerifiedScenarios=0: никакие 1С, GUI, TCP-соединения, формы и клики здесь не выполнялись. Сверены исходники и установленная справка; настоящий переход состояний, состав иерархии, тексты подсказок, отсутствие объектов и ошибки еще нуждаются в разрешенном ручном тесте.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Согласие = Ложь;
    МеткаСеанса = "";
    Итог = "Вручную откройте свою source-форму в /TESTCLIENT и перенесите ее настоящий UUID";
КонецПроцедуры

&НаКлиенте
Функция СвойТекст85(Форма, Имя)
    Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , Имя, 10);
    Если Поле.Имя <> Имя Тогда
        ВызватьИсключение "Не совпало собственное контрольное поле";
    КонецЕсли;
    Возврат Поле.ПолучитьПредставлениеДанных();
КонецФункции

&НаКлиенте
Функция СвоеДополнение85(Форма, Имя)
    Найденные = Форма.НайтиОбъекты(Тип("ТестируемоеДополнениеЭлементаФормы"), , Имя, 10);
    Если ТипЗнч(Найденные) <> Тип("ФиксированныйМассив") Или Найденные.Количество() <> 1 Тогда
        ВызватьИсключение "Нужно ровно одно реальное собственное дополнение с именем из source-формы";
    КонецЕсли;
    Поиск = Найденные[0];
    Если ТипЗнч(Поиск) <> Тип("ТестируемоеДополнениеЭлементаФормы") Или Поиск.Имя <> Имя
        Или Поиск.Вид <> ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска Тогда
        ВызватьИсключение "Получен не собственный объект строки поиска";
    КонецЕсли;
    Возврат Поиск;
КонецФункции

&НаКлиенте
Функция СобственныйПоискДостигПрофиля85(ПараметрыПроверки) Экспорт
    Если СвойТекст85(ПараметрыПроверки.Форма, "МеткаСеанса") <> ПараметрыПроверки.Метка
        Или СвойТекст85(ПараметрыПроверки.Форма, "ПаспортСтенда") <> "own-tested-search85-four-literals-no-business-data" Тогда
        ВызватьИсключение "Источник ожидания перестал быть собственным сеансом";
    КонецЕсли;
    Поиск = СвоеДополнение85(ПараметрыПроверки.Форма, ПараметрыПроверки.Имя);
    Возврат СвойТекст85(ПараметрыПроверки.Форма, "ПрофильПоиска") = ПараметрыПроверки.Профиль
        И Поиск.ТекущаяДоступность() = ПараметрыПроверки.Разрешен;
КонецФункции

&НаКлиенте
Функция ОписатьСвойТестовыйОбъект85(Объект)
    Если Объект = Неопределено Тогда
        Возврат "Неопределено: объект не предоставлен";
    КонецЕсли;
    ВидОбъекта = ТипЗнч(Объект);
    Если ВидОбъекта = Тип("ТестируемаяГруппаФормы") Или ВидОбъекта = Тип("ТестируемоеПолеФормы") Тогда
        Возврат Строка(ВидОбъекта) + ": " + Объект.Имя + "; " + Объект.ТекстЗаголовка;
    КонецЕсли;
    Возврат "Реальный тип: " + Строка(ВидОбъекта);
КонецФункции

&НаКлиенте
Функция ОписатьСвоюИерархию85(Поиск, Метка)
    Дочерние = Поиск.ПолучитьПодчиненныеОбъекты();
    Если ТипЗнч(Дочерние) <> Тип("ФиксированныйМассив") Или Дочерние.Количество() > 64 Тогда
        ВызватьИсключение "Неожиданная коллекция дочерних объектов собственного дополнения";
    КонецЕсли;
    Отчет = "Дочерних UI-объектов: " + Строка(Дочерние.Количество()) + Символы.ПС;
    Для Каждого Дочерний Из Дочерние Цикл
        Отчет = Отчет + ОписатьСвойТестовыйОбъект85(Дочерний) + Символы.ПС;
    КонецЦикла;
    Родитель = Поиск.ПолучитьРодителя();
    Отчет = Отчет + "Родитель: " + ОписатьСвойТестовыйОбъект85(Родитель) + Символы.ПС;
    ОтсутствующееИмя = "Уч85Отсутствует_" + Метка;
    НетОбъектов = Поиск.НайтиОбъекты(, , ОтсутствующееИмя, 1);
    Если ТипЗнч(НетОбъектов) <> Тип("ФиксированныйМассив") Или НетОбъектов.Количество() <> 0 Тогда
        ВызватьИсключение "Отрицательный контроль встретил реальный объект: опыт прекращен";
    КонецЕсли;
    Если Поиск.НайтиОбъект(, , ОтсутствующееИмя, 1) <> Неопределено Тогда
        ВызватьИсключение "НайтиОбъект должен вернуть Неопределено для подтвержденного отсутствующего имени";
    КонецЕсли;
    ОшибкаОтсутствия = "";
    НеожиданныйРезультат = Неопределено;
    Попытка
        НеожиданныйРезультат = Поиск.ПолучитьОбъект(, , ОтсутствующееИмя, 1);
    Исключение
        ОшибкаОтсутствия = ОписаниеОшибки();
    КонецПопытки;
    Если ОшибкаОтсутствия = "" Тогда
        ВызватьИсключение "ПолучитьОбъект не сообщил об отсутствии: " + Строка(ТипЗнч(НеожиданныйРезультат));
    КонецЕсли;
    Отчет = Отчет + "Отрицательный поиск: пустой массив, Неопределено, исключение ПолучитьОбъект" + Символы.ПС;
    Отчет = Отчет + "Реальный текст исключения: " + ОшибкаОтсутствия + Символы.ПС;
    Попытка
        Панель = Поиск.ПолучитьКоманднуюПанель();
        Отчет = Отчет + "Командная панель: " + ОписатьСвойТестовыйОбъект85(Панель) + Символы.ПС;
    Исключение
        Отчет = Отчет + "Панель НЕ получена для этого вида дополнения: " + ОписаниеОшибки() + Символы.ПС;
    КонецПопытки;
    Попытка
        Меню = Поиск.ПолучитьКонтекстноеМеню();
        Отчет = Отчет + "Контекстное меню: " + ОписатьСвойТестовыйОбъект85(Меню) + Символы.ПС;
    Исключение
        Отчет = Отчет + "Меню НЕ получено для этого вида дополнения: " + ОписаниеОшибки() + Символы.ПС;
    КонецПопытки;
    Возврат Отчет;
КонецФункции

&НаКлиенте
Процедура ВыполнитьСвойТест85(Команда)
    Если Не Согласие Тогда
        ВызватьИсключение "Нужны собственный пустой стенд и явное согласие на проверку своей формы";
    КонецЕсли;
    UUID = Новый УникальныйИдентификатор(МеткаСеанса);
    Если Строка(UUID) <> МеткаСеанса Тогда
        ВызватьИсключение "Передайте точный UUID настоящей source-формы, не придуманную метку";
    КонецЕсли;
    Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15383);
    ИсходныйЛимит = Неопределено;
    Разрешить = Неопределено;
    ДанныеОжидания = Неопределено;
    ОшибкаТеста = "";
    ОшибкиЗавершения = "";
    Итог = "Тест еще не завершен";
    Попытка
        Приложение.УстановитьСоединение();
        ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
        Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
        Заголовок = "Уч85ТестПоиска " + МеткаСеанса;
        Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
        Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
            ВызватьИсключение "Нужна единственная собственная форма этого UUID";
        КонецЕсли;
        Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
        Если СвойТекст85(Форма, "МеткаСеанса") <> МеткаСеанса
            Или СвойТекст85(Форма, "ПаспортСтенда") <> "own-tested-search85-four-literals-no-business-data"
            Или СвойТекст85(Форма, "ПрофильПоиска") <> "Разрешен" Тогда
            ВызватьИсключение "Источник или исходный собственный профиль не совпал; чужие состояния не сбрасываются";
        КонецЕсли;
        Имя = СвойТекст85(Форма, "ИмяДополнения");
        Если Имя = "" Или СтрНайти(Имя, "*") > 0 Или СтрНайти(Имя, "?") > 0 Тогда
            ВызватьИсключение "Нужно точное реальное имя дополнения без поисковых шаблонов";
        КонецЕсли;
        Поиск = СвоеДополнение85(Форма, Имя);
        Если Не Поиск.ТекущаяВидимость() Или Не Поиск.ТекущаяДоступность() Тогда
            ВызватьИсключение "Собственная строка поиска должна быть видна и доступна до начала опыта";
        КонецЕсли;
        ДанныеОжидания = Новый Структура("Форма,Метка,Имя,Профиль,Разрешен", Форма, МеткаСеанса, Имя, "Разрешен", Истина);
        Разрешить = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "КнопкаРазрешитьПоиск85", 10);
        Запретить = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "КнопкаЗапретитьПоиск85", 10);
        Поиск.Активизировать();
        ЗаголовокПоиска = Поиск.ТекстЗаголовка;
        Подсказка = Поиск.ПолучитьТекстПодсказки();
        ТолькоПросмотр = Поиск.ТекущееТолькоПросмотр();
        Если ТипЗнч(ЗаголовокПоиска) <> Тип("Строка") Или ТипЗнч(Подсказка) <> Тип("Строка")
            Или ТипЗнч(ТолькоПросмотр) <> Тип("Булево") Тогда
            ВызватьИсключение "Не совпали документированные типы реального UI-дополнения";
        КонецЕсли;
        Отчет = "Собственное имя: " + Поиск.Имя + Символы.ПС;
        Отчет = Отчет + "Реальный заголовок: " + ЗаголовокПоиска + Символы.ПС;
        Отчет = Отчет + "Реальная подсказка: " + Подсказка + Символы.ПС;
        Отчет = Отчет + "Только просмотр по API: " + Строка(ТолькоПросмотр) + Символы.ПС;
        Отчет = Отчет + ОписатьСвоюИерархию85(Поиск, МеткаСеанса);
        Запретить.Нажать();
        ДанныеОжидания.Профиль = "Запрещен";
        ДанныеОжидания.Разрешен = Ложь;
        Условие = Новый ОписаниеОповещения("СобственныйПоискДостигПрофиля85", ЭтотОбъект, ДанныеОжидания);
        Если Не Приложение.ОжидатьСостояния(Условие, 5) Тогда
            ВызватьИсключение "В пределах собственного ожидания недоступность не подтверждена";
        КонецЕсли;
        Разрешить.Нажать();
        ДанныеОжидания.Профиль = "Разрешен";
        ДанныеОжидания.Разрешен = Истина;
        Если Не Приложение.ОжидатьСостояния(Условие, 5) Тогда
            ВызватьИсключение "Обратная доступность собственной строки не подтверждена";
        КонецЕсли;
        Итог = Отчет + "Обязательные проверки исходного профиля, отрицательного поиска и двух переходов завершены";
    Исключение
        ОшибкаТеста = ОписаниеОшибки();
    КонецПопытки;
    Если Разрешить <> Неопределено И ДанныеОжидания <> Неопределено Тогда
        Попытка
            Разрешить.Нажать();
            ДанныеОжидания.Профиль = "Разрешен";
            ДанныеОжидания.Разрешен = Истина;
            Восстановление = Новый ОписаниеОповещения("СобственныйПоискДостигПрофиля85", ЭтотОбъект, ДанныеОжидания);
            Если Не Приложение.ОжидатьСостояния(Восстановление, 5) Тогда
                ВызватьИсключение "Исходная доступность собственного дополнения не восстановлена";
            КонецЕсли;
        Исключение
            ОшибкиЗавершения = "Восстановление НЕ подтверждено: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
        Попытка
            Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
        Исключение
            ОшибкиЗавершения = ОшибкиЗавершения + " Лимит НЕ восстановлен: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Попытка
        Приложение.РазорватьСоединение();
    Исключение
        ОшибкиЗавершения = ОшибкиЗавершения + " Соединение НЕ разорвано: " + ОписаниеОшибки();
    КонецПопытки;
    Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
        Итог = "Опыт НЕ завершен: " + ОшибкаТеста + " " + ОшибкиЗавершения;
        ВызватьИсключение Итог;
    КонецЕсли;
    Итог = Итог + Символы.ПС + "Исходная доступность и лимит восстановлены; соединение разорвано. Диагностика меню/панели не доказывает их поддержку";
КонецПроцедуры
SourceПоиска85

УчебноеТестированиеПоиска85 → Своя внешняя обработка SourceПоиска85 → Управляемая основная форма → Модуль

Полный модуль собственной Source-формы: серверная защита пустого стенда и буквальный список, клиентские кнопки и настоящий автоматический поиск; без бизнес-чтений/записи.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойПустойСтенд();
    Список.ПроизвольныйЗапрос = Истина;
    Список.ОсновнаяТаблица = "";
    Список.ДинамическоеСчитываниеДанных = Ложь;
    Список.АвтоЗаполнениеДоступныхПолей = Истина;
    Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
    Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
    КлючевыеПоля = Новый Массив;
    КлючевыеПоля.Добавить("УчебныйНомер");

    Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
    Список.ТекстЗапроса = "ВЫБРАТЬ
|    1 КАК УчебныйНомер,
|    ""Книга"" КАК Наименование,
|    ""Канцелярия"" КАК Категория,
|    3 КАК Количество,
|    250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
    Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
    МеткаСеанса = Строка(Новый УникальныйИдентификатор);
    ПаспортСтенда = "own-tested-search85-four-literals-no-business-data";
    ЭтаФорма.АвтоЗаголовок = Ложь;
    ЭтаФорма.Заголовок = "Уч85ТестПоиска " + МеткаСеанса;
    Элементы.ТаблицаТоваров.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Верх;
    ДобавитьСвоюКнопку85("РазрешитьПоиск85", "Разрешить собственный поиск");
    ДобавитьСвоюКнопку85("ЗапретитьПоиск85", "Запретить собственный поиск");

    Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Список." + ИмяПоля;
        Колонка.Заголовок = ИмяПоля;
    КонецЦикла;
    УстановитьСвойПоиск85(Истина);
КонецПроцедуры

&НаСервере
Процедура ДобавитьСвоюКнопку85(Имя, Заголовок)
    Команда = Команды.Добавить(Имя);
    Команда.Действие = Имя;
    Команда.Заголовок = Заголовок;
    Кнопка = Элементы.Добавить("Кнопка" + Имя, Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = Имя;
КонецПроцедуры

&НаСервере
Процедура УстановитьСвойПоиск85(Разрешен)
    ПроверитьСвойПустойСтенд();
    Если ТипЗнч(Разрешен) <> Тип("Булево") Или ПаспортСтенда <> "own-tested-search85-four-literals-no-business-data" Тогда
        ВызватьИсключение "Нужен собственный буквальный стенд и логический профиль";
    КонецЕсли;
    Поиск = Элементы.ТаблицаТоваров.ОтображениеСтрокиПоиска;
    Если ТипЗнч(Поиск) <> Тип("ДополнениеЭлементаФормы")
        Или Поиск.Вид <> ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска Тогда
        ВызватьИсключение "Нужно реальное автоматическое дополнение собственной таблицы";
    КонецЕсли;
    ИмяДополнения = Поиск.Имя;
    Если ИмяДополнения = "" Тогда
        ВызватьИсключение "Платформа не предоставила имя собственного дополнения";
    КонецЕсли;
    Поиск.Заголовок = "Уч85ПоискЧетырехСтрок";
    Поиск.Подсказка = "Только Книга, Ручка, Чай, Вода из собственного буквального списка";
    Поиск.ОтображениеПодсказки = ОтображениеПодсказки.Всплывающая;
    Поиск.Доступность = Разрешен;
    Если Поиск.Доступность <> Разрешен Тогда
        ВызватьИсключение "Сервер не сохранил собственный профиль доступности";
    КонецЕсли;
    ПрофильПоиска = ?(Разрешен, "Разрешен", "Запрещен");
КонецПроцедуры

&НаКлиенте
Процедура РазрешитьПоиск85(Команда)
    УстановитьСвойПоиск85(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗапретитьПоиск85(Команда)
    УстановитьСвойПоиск85(Ложь);
КонецПроцедуры


&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. Source-модуль сам создаёт уникальный UUID, точный заголовок, собственный паспорт, список четырех констант, пять колонок и две кнопки. Это действительное дополнение ТаблицаТоваров.ОтображениеСтрокиПоиска с видом ОтображениеСтрокиПоиска, не произвольный ИсходныйОбъект и не Новый тестируемый элемент.

  2. До соединения менеджер проверяет явное согласие. После соединения ограничивает действия10секундами и требует ровно одну форму с UUID, совпадающие контрольные поля и исходный разрешенный профиль. Только потом получает дополнение по фактическому имени без * и ?.

  3. Имя и Вид — readonly-паспорт тестового объекта. Активизировать работает только с идентифицированной собственной строкой. ТекстЗаголовка, реальная подсказка и ТолькоПросмотр читаются с проверкой типов; их содержание выводится фактически, а не заменяется заранее обещанным текстом виджета.

  4. ПолучитьПодчиненныеОбъекты возвращает ФиксированныйМассив UI-объектов. Число дочерних элементов не равно числу товаров. Родитель диагностируется по реальному типу: в коде нет обязательного предположения, что он всегда таблица или группа.

  5. Отрицательное имя содержит действительный UUID. Сначала НайтиОбъекты подтверждает пустой фиксированный массив; НайтиОбъект затем должен дать Неопределено. ПолучитьОбъект проверяется отдельной Попыткой: отсутствие должно вызвать исключение. Реальный текст ошибки выводится, но не сравнивается посимвольно и не подменяется выдуманным кодом ошибки.

  6. ПолучитьКоманднуюПанель и ПолучитьКонтекстноеМеню — отдельные диагностические запросы возможностей именно этого вида. Возвращённые объекты/Неопределено/исключения сохраняются в отчёте. Фраза НЕ получено означает неуспешное получение; она не превращается в доказательство поддержки панели или меню.

  7. Две собственные кнопки вызывают серверную смену Доступность и отдельное текстовое состояние Source-формы. Экспортная функция ОписаниеОповещения проверяет и фактическую ТекущаяДоступность, и профиль, и неизменные UUID/паспорт. ОжидатьСостояния с5секундами не заменяется бесконечным циклом или немедленным обещанием результата после нажатия.

  8. Даже после ошибки отдельно предпринимаются восстановление исходной доступности, исходного лимита действий и разрыв соединения. Их ошибки сохраняются, вызывается итоговое исключение. Клиент и обе формы остаются открытыми; данные списка, текст поиска, бизнес-объекты и файлы тест не изменяет.

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

  1. Будущий ручной контроль: source-таблица показывает именно Книга/Ручка/Чай/Вода; тестовый менеджер получает ее действительный UUID и имя дополнения, не другой клиент или форму.

  2. Обязательные проверки: исходная видимость/доступность; пустой массив по отсутствующему UUID-имени; Неопределено у НайтиОбъект; настоящее исключение ПолучитьОбъект; переход Разрешен→Запрещен→Разрешен и независимое восстановление перед разрывом соединения.

  3. Диагностика: фактические заголовок, подсказка, ТолькоПросмотр, количество дочерних UI-объектов, тип родителя и возможности меню/панели. Не требуйте заранее придуманного числа дочерних объектов, фиксированного родителя или обязательного наличия панели.

  4. Отрицательный ручной контроль: другой UUID или выключенное Согласие должны остановить тест. Если перед началом Source-профиль Запрещен, менеджер отклоняет его и не нажимает восстановление. После начала собственных изменений можно временно исказить ожидаемый профиль в менеджере: ограниченное ожидание должно завершиться ошибкой, а отдельная ветка завершения вернуть доступность.

  5. runtimeVerifiedScenarios=0: никакого утверждения, что реальный UI-тест уже прошёл. Неуспешное получение диагностической панели/меню не считается успешной проверкой этих возможностей.

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

Есть полный воспроизводимый Source-стенд и тест-менеджер с реальным объектом, контролем принадлежности сеансу, ограниченными проверками, явным отчетом возможностей и независимым завершением.

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

  1. ТестируемоеДополнениеЭлементаФормы — абстракция существующего виджета; конструктора нет, свойства не записываются. Вид определяется источником. Доступная функциональность зависит от вида дополнения, поэтому отчёт возможностей нельзя выдавать за доказательство успешного получения всех объектов.

  2. НайтиОбъект и ПолучитьОбъект по одному отсутствующему имени ведут себя по-разному. У второго проверяется исключение, а не только Неопределено. Оба поиска ограничены1секундой, остальные10секундами;0 в таймауте поиска означает неограниченное ожидание и здесь не используется.

  3. ТекстЗаголовка/подсказка отражают тестовый интерфейс; он может не показывать весь текст настроек Source-объекта. ТолькоПросмотр не является правом доступа к данным, а Доступность не фильтрует товары.

  4. Метка источника не секрет аутентификации и не защита общего TCP-порта. Порт должен быть заранее проверен вручную; этот урок предназначен только своему локальному стенду, не удалённому/чужому клиенту.

  5. ПолучитьРодителя не обещает определенный тип для любого дополнения. Описатель читает Имя/ТекстЗаголовка только у проверенных тестовых группы/поля; другим объектам не приписывает чужой API.

  6. Ожидаемое исключение отсутствующего поиска — отрицательный контрактный опыт, не общий способ подавления ошибок. Остальные основные ошибки прекращают тест; ошибки меню/панели явно отмечают неподтвержденную возможность.

  7. В учебный код не добавлены ввод текста, очистка пользовательского поиска, сохранение настроек, закрытие формы/клиента или запись базы. Восстановление возвращает только заранее подтвержденный собственный разрешенный профиль.

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

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

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

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

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