Тип: Картинка. Картинка, отображаемая в шапке таблицы. Имеет смысл только для полей, расположенных в таблице (представляющих собой колонки).
Полное описание, параметры и ограничения
ПолеФормы.КартинкаШапки (FormField.HeaderPicture)
ПолеФормы (FormField)
КартинкаШапки (HeaderPicture)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Картинка.
Картинка, отображаемая в шапке таблицы. Имеет смысл только для полей, расположенных в таблице (представляющих собой колонки).
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Если картинка задается программно, может быть установлена картина вида Пустая или ИзБиблиотеки.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Подготовить доступный собственный поиск Такси:8свойств,typedbaseline и сводку всех4/1080
Полный Source создаёт настоящие автоматические дополнения, собственную клавиатурно доступную сводку/меню и информативную колонкуСумма. ПоисковыйGUI проверяет полный поддерживающий Manager, не query вместо поиска.
Где и как запускать
Полный модуль собственной managedформы SourceПоиска25.Источник. Серверные nativefactories/layout/guardedstylecycle, клиентские actualTaxi/Shortcut/nativeClick; WindowsThinTaxi. Не выполнен.
Подготовка
Только будущий ручной опыт в собственной VM/собственной учётной записи Windows и новой пустой FileИБ C:\1C85_OwnSearchLab\4c7f629b-8da2-4f04-af39-847f824a2810\Base на точной8.5.1.1343. В этой работе стенд, файлыEPF, процессы, порты, БД и UI не создавались и не запускались. GUID каталога не является UUIDИБ.
CF с нуля УчебныйПоискИнтерфейс85: Управляемое приложение, совместимостьНеИспользовать, РежимсовместимостиинтерфейсаТакси (неВерсия8_5 и неТаксиРазрешить...). Ровно рольУченикПоиска85 и общий модульУчебныйПоискСтенд85; остальных объектов/общихформ/расширений/регламентныхзаданий/подписок0. ОбработкиSource/Manager ниже являются собственными вручную скомпилированными внешнимиEPF и не входят вCF.
РольУченикПоиска85: Администрирование для soleUser проверки и право использовать только собственные внешние обработки. Единственный настоящий пользовательУченикПоиска85 с этой ролью. Код получает настоящий UUID пользователяИБ, не выдумывает UUID базы; производственные аккаунты запрещены.
Общий модульУчебныйПоискСтенд85: СерверДа, ВызовСервераДа, Клиент(обычное приложение)Нет, Клиент(управляемое приложение)Нет, ГлобальныйНет, ПривилегированныйНет. Полный supporting PASSPORT в его модуль. Это разрешённый native RPC экспортПаспорт85, не клиентская имитация сервера.
Собственная SourceПоиска25.epf: создайте вручную новую внешнюю обработку по полному supportingSOURCE, основная управляемая формаИсточник. Не загружайте чужуюEPF и не считайте filename/hash/metadata универсальным доказательством доверия: внешний код может выполняться при открытии. Используйте лишь свой вручную собранный исходник в собственнойVM.
Source реквизиты формы: СписокДинамическийСписок; МеткаСеанса/Пользователь85Строка36; ПаспортСтендаСтрока100; ИмяПоиска85/ИмяСостояния85/ИмяУправления85Строка150; ИтогИсточника85Строка неограниченная; ЧислоСводок85Число5.0; Ошибка85Булево. Для всех кромеСписок/Ошибка85 добавьте одноимённые readonly поля. ЧислоСводок85 полеВвода сФорматЧДЦ=0;ЧГ=0;ЧН=0.
Source один реальный элементТаблицаТоваровТаблицаФормы сПутьКДаннымСписок; ручныхколонок0. Полный SOURCE создаёт6колонок только своего списка и новое banner/его собственное пустое меню. СобытияПриСозданииНаСервере иПриОткрытии назначьте одноимённым процедурам; Clickbanner назначает реальный nativeSetAction. Не создавайте расширения конструктором.
Query использует прежние4 собственных literal строки:1Книга/Канцелярия/3/250/750;2Ручка/Канцелярия/1/30/30;3Чай/Продукты/2/150/300;4Вода/Продукты/0/70/0. КлючЗначениеПоляУчебныйНомер, основная таблица пустая, динамическое считывание и автосохранение настроекЛожь, группировки0. Ни каталога товаров, ни записиБД нет.
ActualC sourceУправлениеПоиском проверяется типомДополнениеЭлементаФормы иВидУправлениеПоиском; строка исостояние имеют свои readonly factories/kinds. PRIMARY длинные @EnglishApiName нужны только registry карточек, это НЕ имена дляТип() илиНовый. Manager используетТестируемоеДополнениеЭлементаФормы+actualkind+realname изreadonlysource.
Оформление8свойств: типизированный фактический baseline→свой24/40/цвета/Arial11→readback→restore только при полном совпадении currentOwnprofile→baselineReadback→финальныйOwnprofile. Всё в одном native serverподготовительном вызове; после частичного setterошибки автоматического restore нет. Color/Font nativeXML-сериализуются: helper пишет только эти два разрешённых значения в память черезXMLWriter.SetString/XDTO.WriteXML/Close, не в файл и неmetadata. Так различаются инеабсолютныецвета/шрифты: RGB/Size=-1 сами по себе не доказывают идентичность styleelement. Width в символах,0авто;MaxWidth0безограничения, HorizontalStretch допускаетUndefined. Серверный readback не доказывает видимые пиксели/рендеринг.
Native4страницыColor/Font явно говорят «Не применяется в интерфейсе Версия8.5», НЕ «в платформе8.5». СобственнаяCF явноТакси, metadataguard проверяет это на сервере; каждый клиент дополнительно проверяет реальныйКлиентскоеПриложение.ТекущийВариантИнтерфейса(). Платформа остаётся8.5.1.1343. НаличиеArial/его фактическое изображение проверяется вручную; успехgetter не подменяет визуальную проверку.
Banner выравниваниеВерх/Лево, SkipOnInputЛожь, Ctrl+Alt+F6 назначается конструкторомShortcut тольконаКлиенте. Его readonlyContextMenu используется как реальный родитель одной собственной кнопки. Header/Footer своейколонкиСумма используют толькоБиблиотекаКартинок.Информация (видИзБиблиотеки); nativeпрограммноразрешаеттолькоПустая/ИзБиблиотеки, никакихSVG/Absolute. Подвал явно «Все исходные строки:1080» и НЕ сумма отфильтрованногоGUI.
ManagerПоиска25.epf: новая собственная внешняя обработка, основная управляемая формаПульт. РеквизитыСогласие85Булево/флажок, ПодтверждаюРучнойШаг85Булево/флажок, МеткаСеансаСтрока36/поле, Итог85Строка неограниченная/readonlyполе. Полный основной MANAGER в модуль; nativeПриОткрытии1 и все14команд/кнопок изmetadataSchema.manager_buttons к указанным nativecommandhandler1. Не заменять их вызовами событий вручную.
Только вручную открыть два собственных тонких клиента той жеИБ: source/TESTCLIENT -TPort15383 иmanager/TESTMANAGER. Перед этим человек проверяет, что127.0.0.1:15383 свободен и принадлежит именно своим двум приложениям/этойVM; никаких автоматических launch/port/network команд в авторской проверке нет. В TestClient открыта только одна source-форма; перенесите её настоящий canonicalUUID вManager. Другие окна/чужие клиенты запрещены.
Порядокконечныхкоманд: Начать85→ВвестиКнигу85 (НЕEnter)→ОтменитьКнигу85→ВвестиКнигуДляПоиска85→настоящий ручнойEnter в своейстроке поиска→флажок ручногошага→ПроверитьКнигу85→ОткрытьСвойChip85. ВвестиТекст только замещает editor; код не обещает универсального defaultcommit/auto-search. При неожиданном переходе прекращает опыт, не угадывает режим.
НажатьChip0 разрешён только послеactualFixedArrayCount1 и реальныхBook3×250/750. Native может показать стандартныйdialog; осмотрите и закройте только этот собственныйdialog вручную без изменений. Не придумываем его caption/type/events/контракт или автоматическое закрытие. Затем подтвердите ручнойшаг иУдалитьСвойChip85: вновьтолькоoneSource и actualreturnedchipText; реальные4/1080/chips0/editorEmpty.
ДалееВвестиЧай85→настоящий ручнойEnter→новое подтверждение→ПроверитьЧай85: realGUI2×150/300, actualchip1. ОчиститьСвойПоиск85 должен дать4/1080/chips0/editorEmpty. NativeWaitForCondition явно5секунд, callback толькоactualeditor/chips/currentownidentity, без цикла ожидания и без измененияUI; при истечении времени STOP, не обещание тайминга. СверкаGUI отдельно перебирает настоящие currentrow maps максимум5переходов с6полями/ключами/явным целочисленнымФормат, не используетQuery вместофильтрованныхстрок и не угадывает decimal locale.
Послеочистки вручную в своёмTestClient Ctrl+Alt+F6 (НЕEnter), подтвердить иПроверитьКлавиши85: actualTestedForm.GetCurrentItem должен бытьТестируемаяДекорацияФормыСводка85, actualsourcecounter1 подтвержден отдельно и вНачать85. ОбычныйCurrentItem формы не используем какproofдляDecorator. Затем сноваCtrl+Alt+F6+Enter одинраз: realbannerClick; подтвердить иПроверитьНажатие85 обязана отдельно получить actual2. Только после этого егоowncontextmenu→Сверить все четыре исходные строки одинраз; подтвердить иПроверитьСводку85 обязана получить actual3. Промежуточный2 не заменяется проверкой лишь конечного3.
НажатьЗавершить85 только после13фазного собственного процесса: actualcurrentlim10→originalexactlimit readback→разрыв только своего testingtransport. Приошибке sticky-stop, sourceUI могчастичноизмениться; неclear/restore/reset/retry. Закройте свои TestClient/Manager вручную после отдельной проверки, не чужиеокна. ИсходнаяEPF/CF/данные не удаляются и backups не создаются.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
Список.ПроизвольныйЗапрос = Истина;
Список.ОсновнаяТаблица = "";
Список.ДинамическоеСчитываниеДанных = Ложь;
Список.АвтоЗаполнениеДоступныхПолей = Истина;
Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
КлючевыеПоля = Новый Массив;
КлючевыеПоля.Добавить("УчебныйНомер");
Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
Список.ТекстЗапроса = "ВЫБРАТЬ Д.УчебныйНомер, Д.Наименование, Д.Категория, Д.Количество, Д.Цена, Д.Количество * Д.Цена КАК Сумма ИЗ (ВЫБРАТЬ
| 1 КАК УчебныйНомер,
| ""Книга"" КАК Наименование,
| ""Канцелярия"" КАК Категория,
| 3 КАК Количество,
| 250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70) КАК Д";
Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
Пользователь85 = УчебныйПоискСтенд85.Паспорт85();
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ПаспортСтенда = "own-search-ui25-four-literals-1080-taxi";
Ошибка85 = Ложь;
ЧислоСводок85 = 0;
ИтогИсточника85 = "";
ЭтаФорма.АвтоЗаголовок = Ложь;
ЭтаФорма.Заголовок = "Уч85Поиск25 " + МеткаСеанса;
Элементы.ТаблицаТоваров.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Верх;
Элементы.ТаблицаТоваров.ПоложениеСостоянияПросмотра = ПоложениеСостоянияПросмотра.Верх;
Элементы.ТаблицаТоваров.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.КоманднаяПанель;
Группа = Элементы.Добавить("СводкаГруппа85", Тип("ГруппаФормы"));
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Сводка = Элементы.Добавить("Сводка85", Тип("ДекорацияФормы"), Группа);
Сводка.Вид = ВидДекорацииФормы.Надпись;
Сводка.Заголовок = "Все исходные строки:4; сумма1080. Сводка не является суммой отобранных строк";
Сводка.Гиперссылка = Истина;
Сводка.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Верх;
Сводка.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево;
Сводка.ПропускатьПриВводе = Ложь;
Сводка.УстановитьДействие("Нажатие", "Сводка85Нажатие");
Меню = Сводка.КонтекстноеМеню;
Если ТипЗнч(Меню) <> Тип("ГруппаФормы") Или Меню.ПодчиненныеЭлементы.Количество() <> 0 Тогда
ВызватьИсключение "OWN-SEARCH-MENU: нужен только собственный пустой контейнер нового banner";
КонецЕсли;
Команда = Команды.Добавить("СводкаМеню85");
Команда.Действие = "СводкаМеню85";
Команда.Заголовок = "Сверить все четыре исходные строки";
КнопкаМеню = Элементы.Добавить("КнопкаСводкаМеню85", Тип("КнопкаФормы"), Меню);
КнопкаМеню.ИмяКоманды = "СводкаМеню85";
Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена,Сумма", ",") Цикл
Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
Колонка.Вид = ВидПоляФормы.ПолеВвода;
Колонка.ПутьКДанным = "Список." + ИмяПоля;
Колонка.Заголовок = ИмяПоля;
КонецЦикла;
ЗавершитьПодготовку85();
Исключение
Ошибка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция СнимокОформления85(Управление)
Если ТипЗнч(Управление) <> Тип("ДополнениеЭлементаФормы") Или Управление.Вид <> ВидДополненияЭлементаФормы.УправлениеПоиском Тогда
ВызватьИсключение "OWN-SEARCH-STYLE: источник только настоящее управление поиском своей таблицы";
КонецЕсли;
Снимок = Новый Структура("Авто,Максимум,Растяжение,Ширина,Рамка,Текст,Фон,Шрифт",
Управление.АвтоМаксимальнаяШирина, Управление.МаксимальнаяШирина, Управление.РастягиватьПоГоризонтали,
Управление.Ширина, Управление.ЦветРамки, Управление.ЦветТекста, Управление.ЦветФона, Управление.Шрифт);
Если ТипЗнч(Снимок.Авто) <> Тип("Булево") Или ТипЗнч(Снимок.Максимум) <> Тип("Число") Или ТипЗнч(Снимок.Ширина) <> Тип("Число")
Или (ТипЗнч(Снимок.Растяжение) <> Тип("Булево") И Снимок.Растяжение <> Неопределено)
Или ТипЗнч(Снимок.Рамка) <> Тип("Цвет") Или ТипЗнч(Снимок.Текст) <> Тип("Цвет") Или ТипЗнч(Снимок.Фон) <> Тип("Цвет") Или ТипЗнч(Снимок.Шрифт) <> Тип("Шрифт") Тогда
ВызватьИсключение "OWN-SEARCH-STYLE: типизированный исходный профиль не подтвержден";
КонецЕсли;
Снимок.Вставить("XMLРамка", XMLОформления85(Снимок.Рамка));
Снимок.Вставить("XMLТекст", XMLОформления85(Снимок.Текст));
Снимок.Вставить("XMLФон", XMLОформления85(Снимок.Фон));
Снимок.Вставить("XMLШрифт", XMLОформления85(Снимок.Шрифт));
Возврат Снимок;
КонецФункции
&НаСервере
Функция XMLОформления85(Значение)
Если ТипЗнч(Значение) <> Тип("Цвет") И ТипЗнч(Значение) <> Тип("Шрифт") Тогда
ВызватьИсключение "OWN-SEARCH-STYLE: XML только своего serializableColor/Font, никаких данных/metadata";
КонецЕсли;
Писатель = Новый ЗаписьXML;
Писатель.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Писатель, Значение);
Возврат Писатель.Закрыть();
КонецФункции
&НаСервере
Процедура СверитьОформление85(Управление, Ожидание)
Факт = СнимокОформления85(Управление);
Если Факт.Авто <> Ожидание.Авто Или Факт.Максимум <> Ожидание.Максимум Или Факт.Растяжение <> Ожидание.Растяжение Или Факт.Ширина <> Ожидание.Ширина
Или Факт.XMLРамка <> XMLОформления85(Ожидание.Рамка) Или Факт.XMLТекст <> XMLОформления85(Ожидание.Текст)
Или Факт.XMLФон <> XMLОформления85(Ожидание.Фон) Или Факт.XMLШрифт <> XMLОформления85(Ожидание.Шрифт) Тогда
ВызватьИсключение "OWN-SEARCH-STYLE: фактический профиль не совпал, слепое восстановление запрещено";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрименитьОформление85(Управление, ОжиданиеДо, Новое)
СверитьОформление85(Управление, ОжиданиеДо);
Управление.АвтоМаксимальнаяШирина = Новое.Авто;
Управление.МаксимальнаяШирина = Новое.Максимум;
Управление.РастягиватьПоГоризонтали = Новое.Растяжение;
Управление.Ширина = Новое.Ширина;
Управление.ЦветРамки = Новое.Рамка;
Управление.ЦветТекста = Новое.Текст;
Управление.ЦветФона = Новое.Фон;
Управление.Шрифт = Новое.Шрифт;
СверитьОформление85(Элементы.ТаблицаТоваров.УправлениеПоиском, Новое);
КонецПроцедуры
&НаСервере
Функция СвойПрофиль85()
Возврат Новый Структура("Авто,Максимум,Растяжение,Ширина,Рамка,Текст,Фон,Шрифт", Ложь, 40, Истина, 24,
Новый Цвет(0, 72, 96), Новый Цвет(0, 40, 60), Новый Цвет(235, 249, 250), Новый Шрифт("Arial", 11, Истина, Ложь, Ложь, Ложь, 100));
КонецФункции
&НаСервере
Процедура ЗавершитьПодготовку85()
УчебныйПоискСтенд85.Паспорт85();
Поиск = Элементы.ТаблицаТоваров.ОтображениеСтрокиПоиска;
Состояние = Элементы.ТаблицаТоваров.ОтображениеСостоянияПросмотра;
Управление = Элементы.ТаблицаТоваров.УправлениеПоиском;
Если ТипЗнч(Поиск) <> Тип("ДополнениеЭлементаФормы") Или Поиск.Вид <> ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска
Или ТипЗнч(Состояние) <> Тип("ДополнениеЭлементаФормы") Или Состояние.Вид <> ВидДополненияЭлементаФормы.ОтображениеСостоянияПросмотра
Или ТипЗнч(Управление) <> Тип("ДополнениеЭлементаФормы") Или Управление.Вид <> ВидДополненияЭлементаФормы.УправлениеПоиском Тогда
ВызватьИсключение "OWN-SEARCH-FACTORY: нужны три настоящих автоматически сформированных дополнения своей таблицы";
КонецЕсли;
ИмяПоиска85 = Поиск.Имя;
ИмяСостояния85 = Состояние.Имя;
ИмяУправления85 = Управление.Имя;
Если ИмяПоиска85 = "" Или ИмяСостояния85 = "" Или ИмяУправления85 = "" Или ИмяПоиска85 = ИмяСостояния85 Или ИмяПоиска85 = ИмяУправления85 Или ИмяСостояния85 = ИмяУправления85 Тогда
ВызватьИсключение "OWN-SEARCH-FACTORY: нужны три разных реальных имени без подмены";
КонецЕсли;
Поиск.Доступность = Истина;
Состояние.Доступность = Истина;
Управление.Доступность = Истина;
База = СнимокОформления85(Управление);
Новое = СвойПрофиль85();
ПрименитьОформление85(Управление, База, Новое);
ПрименитьОформление85(Управление, Новое, База);
ПрименитьОформление85(Управление, База, Новое);
Для Каждого Имя Из СтрРазделить("УчебныйНомер,Количество,Цена,Сумма", ",") Цикл
Элементы["Товары" + Имя].Формат = "ЧДЦ=0;ЧГ=0;ЧН=0";
КонецЦикла;
КолонкаСуммы = Элементы.ТоварыСумма;
Если КолонкаСуммы.Родитель <> Элементы.ТаблицаТоваров Или КолонкаСуммы.ПутьКДанным <> "Список.Сумма" Тогда
ВызватьИсключение "OWN-SEARCH-PICTURE: картинки разрешены только своей реальной колонке суммы";
КонецЕсли;
КолонкаСуммы.ОтображатьВШапке = Истина;
КолонкаСуммы.ОтображатьВПодвале = Истина;
КолонкаСуммы.ТекстПодвала = "Все исходные строки:1080";
КолонкаСуммы.КартинкаШапки = БиблиотекаКартинок.Информация;
КолонкаСуммы.КартинкаПодвала = БиблиотекаКартинок.Информация;
Если КолонкаСуммы.КартинкаШапки.Вид <> ВидКартинки.ИзБиблиотеки Или КолонкаСуммы.КартинкаПодвала.Вид <> ВидКартинки.ИзБиблиотеки Тогда
ВызватьИсключение "OWN-SEARCH-PICTURE: native позволяет только Пустая/ИзБиблиотеки, не абсолютную или произвольный SVG";
КонецЕсли;
СверитьИсточникНаСервере85();
КонецПроцедуры
&НаСервере
Процедура СверитьИсточникНаСервере85()
Если Ошибка85 Или Пользователь85 <> УчебныйПоискСтенд85.Паспорт85() Или ПаспортСтенда <> "own-search-ui25-four-literals-1080-taxi" Тогда
ВызватьИсключение "OWN-SEARCH-STOP: собственный исходник изменен или ранее завершился ошибкой";
КонецЕсли;
СверитьОформление85(Элементы.ТаблицаТоваров.УправлениеПоиском, СвойПрофиль85());
Если Не Элементы.ТаблицаТоваров.ТолькоПросмотр Или Элементы.ТаблицаТоваров.ПутьКДанным <> "Список"
Или Список.ОсновнаяТаблица <> "" Или Список.ДинамическоеСчитываниеДанных
Или Список.АвтоматическоеСохранениеПользовательскихНастроек Или Список.Группировка.Элементы.Количество() <> 0
Или Список.ВидКлюча <> ВидКлючаДинамическогоСписка.ЗначениеПоля
Или Список.ПоляКлюча.Количество() <> 1 Или Список.ПоляКлюча.Получить(0) <> "УчебныйНомер" Тогда
ВызватьИсключение "OWN-SEARCH-SOURCE: изменена собственная политика буквального списка";
КонецЕсли;
Если Список.ТекстЗапроса <> "ВЫБРАТЬ Д.УчебныйНомер, Д.Наименование, Д.Категория, Д.Количество, Д.Цена, Д.Количество * Д.Цена КАК Сумма ИЗ (ВЫБРАТЬ
| 1 КАК УчебныйНомер,
| ""Книга"" КАК Наименование,
| ""Канцелярия"" КАК Категория,
| 3 КАК Количество,
| 250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70) КАК Д" Тогда
ВызватьИсключение "OWN-SEARCH-SOURCE: неизвестный текст запроса не исполняем даже ради проверки итога";
КонецЕсли;
Данные = Новый Запрос(Список.ТекстЗапроса);
Таблица = Данные.Выполнить().Выгрузить();
Если Таблица.Количество() <> 4 Или Таблица.Колонки.Количество() <> 6 Или Таблица.Итог("Сумма") <> 1080 Тогда
ВызватьИсключение "OWN-SEARCH-MATH: полный исходный запрос не дал свои4/1080";
КонецЕсли;
Для Номер = 1 По 4 Цикл
Строки = Таблица.НайтиСтроки(Новый Структура("УчебныйНомер", Номер));
Если Строки.Количество() <> 1 Тогда
ВызватьИсключение "OWN-SEARCH-MATH: неизвестный ключ или дубль";
КонецЕсли;
Товар = Строки[0];
ОжидаемоеИмя = ?(Номер = 1, "Книга", ?(Номер = 2, "Ручка", ?(Номер = 3, "Чай", "Вода")));
ОжидаемаяКатегория = ?(Номер <= 2, "Канцелярия", "Продукты");
ОжидаемоеКоличество = ?(Номер = 1, 3, ?(Номер = 2, 1, ?(Номер = 3, 2, 0)));
ОжидаемаяЦена = ?(Номер = 1, 250, ?(Номер = 2, 30, ?(Номер = 3, 150, 70)));
Если ТипЗнч(Товар.УчебныйНомер) <> Тип("Число") Или ТипЗнч(Товар.Количество) <> Тип("Число") Или ТипЗнч(Товар.Цена) <> Тип("Число") Или ТипЗнч(Товар.Сумма) <> Тип("Число")
Или Товар.Наименование <> ОжидаемоеИмя Или Товар.Категория <> ОжидаемаяКатегория Или Товар.Количество <> ОжидаемоеКоличество
Или Товар.Цена <> ОжидаемаяЦена Или Товар.Сумма <> ОжидаемоеКоличество * ОжидаемаяЦена Тогда
ВызватьИсключение "OWN-SEARCH-MATH: все фактические поля должны совпасть, один итог недостаточен";
КонецЕсли;
КонецЦикла;
ЧислоСводок85 = ЧислоСводок85 + 1;
ИтогИсточника85 = "4/1080; полный запрос, не строки текущего поискового показа";
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Попытка
Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
ВызватьИсключение "OWN-SEARCH-INTERFACE: требуется фактический Такси, а не интерфейс Версия8_5";
КонецЕсли;
Элементы.Сводка85.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.F6, Истина, Истина, Ложь);
Сочетание = Элементы.Сводка85.СочетаниеКлавиш;
Если Сочетание.Клавиша <> Клавиша.F6 Или Не Сочетание.Alt Или Не Сочетание.Ctrl Или Сочетание.Shift Тогда
ВызватьИсключение "OWN-SEARCH-SHORTCUT: собственное Ctrl+Alt+F6 не подтверждено";
КонецЕсли;
Исключение
Ошибка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Сводка85Нажатие(Элемент)
Если Элемент <> Элементы.Сводка85 Или ТипЗнч(Элемент) <> Тип("ДекорацияФормы") Тогда
ВызватьИсключение "OWN-SEARCH-BANNER: неизвестная декорация";
КонецЕсли;
ПоказатьСводку85();
КонецПроцедуры
&НаКлиенте
Процедура СводкаМеню85(Команда)
Если Команда <> Команды.СводкаМеню85 Тогда
ВызватьИсключение "OWN-SEARCH-MENU: неизвестная команда";
КонецЕсли;
ПоказатьСводку85();
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСводку85()
Если Ошибка85 Тогда
ВызватьИсключение "OWN-SEARCH-STOP: после ошибки повтор и слепое восстановление запрещены";
КонецЕсли;
Попытка
Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
ВызватьИсключение "OWN-SEARCH-INTERFACE: текущий интерфейс изменен";
КонецЕсли;
СверитьИсточникНаСервере85();
Исключение
Ошибка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Полный TestManager реального editor/GUI/chip/shortcut/menu процесса
Своя внешняя обработка ManagerПоиска25 → Управляемая форма Пульт → Модуль
WindowsThin /TESTMANAGER; native typedtestingfactories, explicitmanualcommit/dialog/focus/menu steps. Не выполнен.
Перем Тест85;
Перем Лимит85;
Перем Этап85;
Перем Ошибка85;
Перем СвойПользователь85;
Перем Заголовок85;
Перем Подключался85;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Этап85 = 0;
Ошибка85 = Ложь;
Подключался85 = Ложь;
Согласие85 = Ложь;
ПодтверждаюРучнойШаг85 = Ложь;
МеткаСеанса = "";
Итог85 = "Откройте только собственный Source. Перенесите реальный UUID формы. Ручные Enter/собственный dialog не заменяются вызовом события";
КонецПроцедуры
&НаКлиенте
Функция КонтрольныйТекст85(Форма, Имя)
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , Имя, 3);
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> Имя Тогда
ВызватьИсключение "OWN-SEARCH-CONTROL: неверное настоящее контрольное поле";
КонецЕсли;
Возврат Поле.ПолучитьПредставлениеДанных();
КонецФункции
&НаКлиенте
Функция СвояФорма85()
Если Ошибка85 Или Тест85 = Неопределено Или СвойПользователь85 <> УчебныйПоискСтенд85.Паспорт85()
Или КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
ВызватьИсключение "OWN-SEARCH-STOP: чужая ИБ/пользователь/интерфейс или предыдущая ошибка";
КонецЕсли;
Формы = Тест85.НайтиОбъекты(Тип("ТестируемаяФорма"), , , 3);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "OWN-SEARCH-FORMS: нужен только один собственный Source, никаких чужих/диалоговых форм";
КонецЕсли;
Форма = Формы[0];
Если ТипЗнч(Форма) <> Тип("ТестируемаяФорма") Или Форма.ТекстЗаголовка <> Заголовок85
Или КонтрольныйТекст85(Форма, "МеткаСеанса") <> МеткаСеанса
Или КонтрольныйТекст85(Форма, "Пользователь85") <> СвойПользователь85
Или КонтрольныйТекст85(Форма, "ПаспортСтенда") <> "own-search-ui25-four-literals-1080-taxi"
Или КонтрольныйТекст85(Форма, "ИтогИсточника85") <> "4/1080; полный запрос, не строки текущего поискового показа" Тогда
ВызватьИсключение "OWN-SEARCH-IDENTITY: источник и весь его исходный набор не подтверждены";
КонецЕсли;
Возврат Форма;
КонецФункции
&НаКлиенте
Функция Дополнение85(Форма, ПолеИмени, Вид)
Имя = КонтрольныйТекст85(Форма, ПолеИмени);
Если Имя = "" Или СтрНайти(Имя, "*") > 0 Или СтрНайти(Имя, "?") > 0 Тогда
ВызватьИсключение "OWN-SEARCH-ADDITION: нужно настоящее точное имя из собственной source-формы";
КонецЕсли;
Найденные = Форма.НайтиОбъекты(Тип("ТестируемоеДополнениеЭлементаФормы"), , Имя, 3);
Если ТипЗнч(Найденные) <> Тип("ФиксированныйМассив") Или Найденные.Количество() <> 1 Тогда
ВызватьИсключение "OWN-SEARCH-ADDITION: нужно ровно одно собственное дополнение";
КонецЕсли;
Дополнение = Найденные[0];
Если ТипЗнч(Дополнение) <> Тип("ТестируемоеДополнениеЭлементаФормы") Или Дополнение.Имя <> Имя Или Дополнение.Вид <> Вид
Или Не Дополнение.ТекущаяВидимость() Или Не Дополнение.ТекущаяДоступность() Тогда
ВызватьИсключение "OWN-SEARCH-ADDITION: неверный вид/имя/фактическая доступность";
КонецЕсли;
Возврат Дополнение;
КонецФункции
&НаКлиенте
Процедура СверитьРедактор85(Поиск, Текст)
Факт = Поиск.ПолучитьТекстРедактирования();
Если ТипЗнч(Факт) <> Тип("Строка") Или Факт <> Текст Тогда
ВызватьИсключение "OWN-SEARCH-EDIT: фактический редактор не совпал; ввод не объявляется принятым поиском";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СверитьСостояние85(Состояние, Количество)
Тексты = Состояние.ПолучитьТекстыЭлементовСостоянияПросмотра();
Если ТипЗнч(Тексты) <> Тип("ФиксированныйМассив") Или Тексты.Количество() <> Количество Тогда
ВызватьИсключение "OWN-SEARCH-CHIPS: фактические состояния просмотра не совпали с этапом";
КонецЕсли;
Для Каждого Текст Из Тексты Цикл
Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
ВызватьИсключение "OWN-SEARCH-CHIPS: нужен реальный непустой текст, не угаданный заголовок";
КонецЕсли;
КонецЦикла;
Возврат Тексты;
КонецФункции
&НаКлиенте
Функция СвоёСостояниеГотово85(Контроль) Экспорт
Форма = СвояФорма85();
Поиск = Дополнение85(Форма, "ИмяПоиска85", ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска);
Состояние = Дополнение85(Форма, "ИмяСостояния85", ВидДополненияЭлементаФормы.ОтображениеСостоянияПросмотра);
Тексты = Состояние.ПолучитьТекстыЭлементовСостоянияПросмотра();
Если ТипЗнч(Тексты) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "OWN-SEARCH-WAIT: неверный native тип, а не ожидаемая задержка";
КонецЕсли;
Возврат (Контроль.Редактор = Неопределено Или Поиск.ПолучитьТекстРедактирования() = Контроль.Редактор)
И (Контроль.Чипов = Неопределено Или Тексты.Количество() = Контроль.Чипов);
КонецФункции
&НаКлиенте
Процедура ДождатьсяСвоегоСостояния85(Редактор, Чипов)
Условие = Новый ОписаниеОповещения("СвоёСостояниеГотово85", ЭтотОбъект, Новый Структура("Редактор,Чипов", Редактор, Чипов));
Если Не Тест85.ОжидатьСостояния(Условие, 5) Тогда
ВызватьИсключение "OWN-SEARCH-WAIT: фактический editor/chips не достигнуты за5секунд; не обещаем тайминга или auto-commit";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СверитьСтроки85(Форма, НомерТовара)
Таблица = Форма.ПолучитьОбъект(Тип("ТестируемаяТаблицаФормы"), , "ТаблицаТоваров", 3);
Если ТипЗнч(Таблица) <> Тип("ТестируемаяТаблицаФормы") Или Таблица.Имя <> "ТаблицаТоваров" Тогда
ВызватьИсключение "OWN-SEARCH-GUI: нужна реальная собственная таблица, не исходный запрос";
КонецЕсли;
Таблица.ПерейтиКПервойСтроке(Ложь);
Ключи = Новый Массив;
Сумма = 0;
Для Индекс = 0 По 4 Цикл
Данные = Таблица.ПолучитьТекущуюСтроку();
Если Данные = Неопределено Тогда
Прервать;
КонецЕсли;
Если ТипЗнч(Данные) <> Тип("Соответствие") Или Данные.Количество() <> 6 Тогда
ВызватьИсключение "OWN-SEARCH-GUI: неизвестный фактический состав колонок текущей строки";
КонецЕсли;
НомерТекст = Данные.Получить("УчебныйНомер");
Если НомерТекст <> "1" И НомерТекст <> "2" И НомерТекст <> "3" И НомерТекст <> "4" Тогда
ВызватьИсключение "OWN-SEARCH-GUI: неизвестный фактический целочисленный ключ";
КонецЕсли;
Номер = Число(НомерТекст);
Если Ключи.Найти(Номер) <> Неопределено Тогда
Прервать;
КонецЕсли;
Если НомерТовара <> 0 И Номер <> НомерТовара Тогда
ВызватьИсключение "OWN-SEARCH-GUI: поисковый показ содержит не свой ожидаемый товар";
КонецЕсли;
Имя = ?(Номер = 1, "Книга", ?(Номер = 2, "Ручка", ?(Номер = 3, "Чай", "Вода")));
Категория = ?(Номер <= 2, "Канцелярия", "Продукты");
Количество = ?(Номер = 1, 3, ?(Номер = 2, 1, ?(Номер = 3, 2, 0)));
Цена = ?(Номер = 1, 250, ?(Номер = 2, 30, ?(Номер = 3, 150, 70)));
Если Данные.Получить("Наименование") <> Имя Или Данные.Получить("Категория") <> Категория
Или Данные.Получить("Количество") <> Формат(Количество, "ЧДЦ=0;ЧГ=0;ЧН=0")
Или Данные.Получить("Цена") <> Формат(Цена, "ЧДЦ=0;ЧГ=0;ЧН=0")
Или Данные.Получить("Сумма") <> Формат(Количество * Цена, "ЧДЦ=0;ЧГ=0;ЧН=0") Тогда
ВызватьИсключение "OWN-SEARCH-GUI: реальные тексты всех колонок не совпали с собственной арифметикой";
КонецЕсли;
Ключи.Добавить(Номер);
Сумма = Сумма + Число(Данные.Получить("Сумма"));
Таблица.ПерейтиКСледующейСтроке(Ложь);
КонецЦикла;
ОжидаемоеКоличество = ?(НомерТовара = 0, 4, 1);
ОжидаемаяСумма = ?(НомерТовара = 0, 1080, ?(НомерТовара = 1, 750, 300));
Если Ключи.Количество() <> ОжидаемоеКоличество Или Сумма <> ОжидаемаяСумма Тогда
ВызватьИсключение "OWN-SEARCH-GUI: не все реальные строки доставлены или показ не совпал; повтор автоматически не выполняется";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Начать85(Команда)
Если Этап85 <> 0 Или Подключался85 Или Ошибка85 Или Не Согласие85 Тогда
ВызватьИсключение "OWN-SEARCH-BEGIN: нужно одно отдельное согласие на собственный TestClient";
КонецЕсли;
Согласие85 = Ложь;
Подключался85 = Истина;
Попытка
СвойПользователь85 = УчебныйПоискСтенд85.Паспорт85();
UUID = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUID) <> МеткаСеанса Тогда
ВызватьИсключение "OWN-SEARCH-UUID: нужен точный реальный UUID Source, не новый придуманный UUID";
КонецЕсли;
Заголовок85 = "Уч85Поиск25 " + МеткаСеанса;
Тест85 = Новый ТестируемоеПриложение("127.0.0.1", 15383);
Тест85.УстановитьСоединение();
Лимит85 = Тест85.ПолучитьМаксимальноеВремяВыполненияДействия();
Если ТипЗнч(Лимит85) <> Тип("Число") Или Лимит85 < 0 Тогда
ВызватьИсключение "OWN-SEARCH-LIMIT: фактический исходный лимит не подтвержден";
КонецЕсли;
Тест85.УстановитьМаксимальноеВремяВыполненияДействия(10);
Форма = СвояФорма85();
Поиск = Дополнение85(Форма, "ИмяПоиска85", ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска);
Состояние = Дополнение85(Форма, "ИмяСостояния85", ВидДополненияЭлементаФормы.ОтображениеСостоянияПросмотра);
СверитьРедактор85(Поиск, "");
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
Если КонтрольныйТекст85(Форма, "ЧислоСводок85") <> "1" Тогда
ВызватьИсключение "OWN-SEARCH-SUMMARY: свежий Source должен подтвердить ровно один собственный подготовительный вызов";
КонецЕсли;
Этап85 = 1;
Итог85 = "Исходный настоящий GUI4/1080, editorEmpty/chips0 подтверждены. Далее ВвестиКнигу85 без Enter";
Исключение
Ошибка85 = Истина;
Итог85 = "Остановлено: " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВвестиКнигу85(Команда)
ИсполнитьШаг85(1);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьКнигу85(Команда)
ИсполнитьШаг85(2);
КонецПроцедуры
&НаКлиенте
Процедура ВвестиКнигуДляПоиска85(Команда)
ИсполнитьШаг85(3);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКнигу85(Команда)
ИсполнитьШаг85(4);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьСвойChip85(Команда)
ИсполнитьШаг85(5);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьСвойChip85(Команда)
ИсполнитьШаг85(6);
КонецПроцедуры
&НаКлиенте
Процедура ВвестиЧай85(Команда)
ИсполнитьШаг85(7);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЧай85(Команда)
ИсполнитьШаг85(8);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьСвойПоиск85(Команда)
ИсполнитьШаг85(9);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКлавиши85(Команда)
ИсполнитьШаг85(10);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСводку85(Команда)
ИсполнитьШаг85(12);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНажатие85(Команда)
ИсполнитьШаг85(11);
КонецПроцедуры
&НаКлиенте
Процедура Завершить85(Команда)
ИсполнитьШаг85(13);
КонецПроцедуры
&НаКлиенте
Процедура ИсполнитьШаг85(НомерШага)
Если Ошибка85 Или Этап85 <> НомерШага Тогда
ВызватьИсключение "OWN-SEARCH-PHASE: предыдущая ошибка или неверный конечный этап; не сбрасывать и не повторять";
КонецЕсли;
Попытка
Если НомерШага = 4 Или НомерШага = 6 Или НомерШага = 8 Или НомерШага = 10 Или НомерШага = 11 Или НомерШага = 12 Тогда
Если Не ПодтверждаюРучнойШаг85 Тогда
ВызватьИсключение "OWN-SEARCH-MANUAL: сначала настоящий ручной Enter/закрытие своего диалога/shortcut/menu, затем отдельное подтверждение";
КонецЕсли;
КонецЕсли;
ПодтверждаюРучнойШаг85 = Ложь;
Форма = СвояФорма85();
Поиск = Дополнение85(Форма, "ИмяПоиска85", ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска);
Состояние = Дополнение85(Форма, "ИмяСостояния85", ВидДополненияЭлементаФормы.ОтображениеСостоянияПросмотра);
Если НомерШага = 1 Или НомерШага = 3 Или НомерШага = 7 Тогда
СверитьРедактор85(Поиск, "");
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
Поиск.Активизировать();
Поиск.ВвестиТекст(?(НомерШага = 7, "Чай", "Книга"));
ДождатьсяСвоегоСостояния85(?(НомерШага = 7, "Чай", "Книга"), Неопределено);
СверитьРедактор85(Поиск, ?(НомерШага = 7, "Чай", "Книга"));
Итог85 = "Введен лишь фактический редактор. Не выдаём это за принятый поиск. Для этапа3/7 вручную нажмите Enter именно в своей строке поиска";
ИначеЕсли НомерШага = 2 Тогда
СверитьРедактор85(Поиск, "Книга");
Поиск.ОтменитьРедактирование();
ДождатьсяСвоегоСостояния85("", 0);
СверитьРедактор85(Поиск, "");
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
Итог85 = "Отмена настоящего редактора подтверждена. При неожиданном auto-search остановиться, не объяснять его выдуманным default";
ИначеЕсли НомерШага = 4 Или НомерШага = 8 Тогда
ДождатьсяСвоегоСостояния85(Неопределено, 1);
Тексты = СверитьСостояние85(Состояние, 1);
СверитьСтроки85(Форма, ?(НомерШага = 4, 1, 3));
Итог85 = "После настоящего ручного Enter проверен GUI: " + ?(НомерШага = 4, "Книга3×250=750", "Чай2×150=300") + "; фактический chip: " + Тексты[0];
ИначеЕсли НомерШага = 5 Тогда
СверитьСостояние85(Состояние, 1);
СверитьСтроки85(Форма, 1);
Состояние.НажатьНаЭлементСостоянияПросмотра(0);
Итог85 = "Нажат настоящий единственный chip по подтвержденному индексу0. Возможный стандартный dialog осмотрите и закройте вручную только у своего TestClient; ничего не меняйте. Следующий этап проверяет вновь одну source-форму";
ИначеЕсли НомерШага = 6 Тогда
Тексты = СверитьСостояние85(Состояние, 1);
СверитьСтроки85(Форма, 1);
Состояние.УдалитьЭлементСостоянияПросмотра(Тексты[0]);
ДождатьсяСвоегоСостояния85("", 0);
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
СверитьРедактор85(Поиск, "");
Итог85 = "Удалён реальный chip по фактически полученному тексту. GUI4/1080 восстановлен, исходный query всё время4/1080";
ИначеЕсли НомерШага = 9 Тогда
СверитьСостояние85(Состояние, 1);
СверитьСтроки85(Форма, 3);
Поиск.Очистить();
ДождатьсяСвоегоСостояния85("", 0);
СверитьРедактор85(Поиск, "");
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
Итог85 = "Очистить вернул реальный GUI4/1080/chips0. Вручную Ctrl+Alt+F6 фокусирует ownbanner; НЕ нажимайте Enter до ПроверитьКлавиши85";
ИначеЕсли НомерШага = 10 Тогда
Если КонтрольныйТекст85(Форма, "ЧислоСводок85") <> "1" Тогда
ВызватьИсключение "OWN-SEARCH-SUMMARY: до своего nativeClick нужен исходный фактический счетчик1";
КонецЕсли;
Текущий = Форма.ПолучитьТекущийЭлемент();
Если ТипЗнч(Текущий) <> Тип("ТестируемаяДекорацияФормы") Или Текущий.Имя <> "Сводка85" Тогда
ВызватьИсключение "OWN-SEARCH-SHORTCUT: настоящий Ctrl+Alt+F6 не привёл к своей декорации; setter-readback не доказательство UI";
КонецЕсли;
СверитьСтроки85(Форма, 0);
Итог85 = "Реальный фокус banner и исходный счетчик1 подтверждены. Вручную нажмите Ctrl+Alt+F6 и Enter один раз, затем подтвердите ручной шаг и ПроверитьНажатие85. Собственное меню пока НЕ нажимать";
ИначеЕсли НомерШага = 11 Тогда
Если КонтрольныйТекст85(Форма, "ЧислоСводок85") <> "2" Тогда
ВызватьИсключение "OWN-SEARCH-SUMMARY: один настоящий nativeClick не дал независимый фактический переход1до2";
КонецЕсли;
СверитьСтроки85(Форма, 0);
СверитьСостояние85(Состояние, 0);
Итог85 = "NativeClick отдельно подтвержден actual2. Теперь только собственное контекстное меню banner → Сверить все четыре исходные строки один раз; подтвердите ручной шаг и ПроверитьСводку85";
ИначеЕсли НомерШага = 12 Тогда
Если КонтрольныйТекст85(Форма, "ЧислоСводок85") <> "3" Тогда
ВызватьИсключение "OWN-SEARCH-SUMMARY: настоящий callback+ownmenu не дали ожидаемые два независимых срабатывания";
КонецЕсли;
СверитьСтроки85(Форма, 0);
СверитьСостояние85(Состояние, 0);
Итог85 = "Два ручных ownUI вызова полной исходной сводки подтверждены. Header/Footer картинка из библиотеки и geometry/color/font readback не выдаются за доказанный renderer";
ИначеЕсли НомерШага = 13 Тогда
СверитьРедактор85(Поиск, "");
СверитьСостояние85(Состояние, 0);
СверитьСтроки85(Форма, 0);
Если Тест85.ПолучитьМаксимальноеВремяВыполненияДействия() <> 10 Тогда
ВызватьИсключение "OWN-SEARCH-LIMIT: текущий лимит не наш, слепое восстановление запрещено";
КонецЕсли;
Тест85.УстановитьМаксимальноеВремяВыполненияДействия(Лимит85);
Если Тест85.ПолучитьМаксимальноеВремяВыполненияДействия() <> Лимит85 Тогда
ВызватьИсключение "OWN-SEARCH-LIMIT: исходный фактический лимит не восстановлен";
КонецЕсли;
Тест85.РазорватьСоединение();
Итог85 = "Конечный собственный процесс подтверждён ручным пользователем: GUI4/1080, Book750, Tea300, actualeditor/chips/focus/menu. Закрытия чужих окон и данных нет. Это сообщение возникает только при будущем реальном исполнении, не при статической сборке справочника";
КонецЕсли;
Этап85 = НомерШага + 1;
Исключение
Ошибка85 = Истина;
Итог85 = "Опыт остановлен без повторного изменения/слепой очистки/восстановления: " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный собственный serverpassport soleuser/File/metadata/Taxi
Собственная CF → Общие модули → УчебныйПоискСтенд85
ServerДа/CallServerДа, managedclient/ordinaryclient/global/privilegedНет; native readonly metadata/currentuser proof.
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция Паспорт85() Экспорт
ПроверитьСвойПустойСтенд();
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnSearchLab\4c7f629b-8da2-4f04-af39-847f824a2810\Base"";"
Или Метаданные.РежимСовместимостиИнтерфейса <> РежимСовместимостиИнтерфейса.Такси
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.ОбщиеМодули.Найти("УчебныйПоискСтенд85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Не РольДоступна("УченикПоиска85") Тогда
ВызватьИсключение "OWN-SEARCH-PASSPORT: разрешены только собственная новая FileИБ и явно настроенный Такси";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
ВызватьИсключение "OWN-SEARCH-USER: нужен единственный настоящий пользователь своей ИБ";
КонецЕсли;
Если Пользователи[0].Имя <> "УченикПоиска85" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "OWN-SEARCH-USER: currentUUID не совпал с единственным собственным пользователем";
КонецЕсли;
Возврат Строка(Текущий.УникальныйИдентификатор);
КонецФункцииРазбор по шагам
Подготовить только свой emptyCF/soleuser/Такси/две manually compiledEPF. Source создаёт реальный буквальныйDynamicList,3автоматическихaddon,6колонок,ownbanner/одноownmenu; фабрики/context не подменяются.
Подтвердить typed nativebaseline8props→knownownprofile→restoreonlyownexpected→baseline→finalprofile; фактическиеTaxiguards иlibraryonlycolumnpictures. Getterпрофиль не являетсяrendererproof.
Реально подключиться к только своему TestClient, проверитьcanonicalUUID/user/stamp/exactoneform/editorEmpty/chips0 и все4GUIстроки1080. Limitbaseline измерен, явно10.
InputBook безcommit→CancelEdit→InputBook/manualEnter→actualBook750/chip1. Нажатьconfirmedindex0, самостоятельно осмотреть/закрыть толькоownsystemdialog; delete пореальномучipText, GUI4/1080.
InputTea/manualEnter→actualTea300/chip1→Clear→actualGUI4/1080/chips0. Все6фактическихполей проверяются поnativeCurrentRow, суммы складываются изреальныхtextvalues, не изQuery.
Ручнойownshortcut→реальнаяtestedDecorationfocus иactual1; отдельноownnativeClick→ПроверитьНажатие85 actual2; только затемownmenu→ПроверитьСводку85 actual3. ПоследнееЗавершить13 guardedexactlimitrestore/disconnect, никакихUIcleanup послеfailure.
Как проверить результат
Future manual: все4GUIстроки1/750,2/30,3/300,4/0; сумма1080. Booksearch ровно1/750,Teasearch ровно1/300; исходныйзапрос независимо всегда4/1080.
ActualeditorInput/Cancel/Clear,FixedArraychip0/1/0,returnedchiptext/index0 послеCount1. Неизвестнаяформа/type/kind/identity/profile/field/phase останавливают процесс.
Счётчикownfullsourcesummary actual1 вStart/focus, actual2 вПроверитьНажатие85 и actual3 вПроверитьСводку85 подтверждает отдельно настоящиеклавиатурныйClick/menu, но не UIрендеринг/тайминг/атомарность. Статическивэтойработе realcalls0, все runtimeпроверки только будущие.
Ожидаемый результат
Ожидаемый результат будущего ручного выполнения: настоящий editor/search/chip/shortcut/menu cycle с проверенными750/300/1080. Здесь только авторский исходник и статические проверки, не выполненный результат1С.
На что обратить внимание
NativeInputText не гарантируетпринятиепоиска. ManualEnter и actualGUI/chipreadback обязателен; unexpectedauto-search не маскируется фальшивымdefault.
Запрос собственногоисточника не учитывает пользовательскийsearchfilter. Banner/Footer1080 прямообозначаютвсеисходныестроки, не поисковуювыборку.
Color/Fontнеприменимы именно кinterfaceVersion8_5; рабочийcontext данногоownlesson явноTaxi наplatform8.5.1343. Width всимволах, font/colorbaseline не гарантияpixelrenderer.
Readonlycontextmenu и3sourceaddon не присваиваются/не конструируются. Тольконативныеownfactories+basekind. Captionchips иstandarddialog не угадываются; чужие формы не закрываются.
UIдействия неатомарны. Sticky-stop послеpartialfailure, неrestorefonts/search/defaultblind. Нет реальных1С/GUI/DB/network/process/files/backups действий при подготовке справочника.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.