ПолеФормы.КартинкаШапки

Свойства · HeaderPicture

Тип: Картинка. Картинка, отображаемая в шапке таблицы. Имеет смысл только для полей, расположенных в таблице (представляющих собой колонки).

Полное описание, параметры и ограничения

ПолеФормы.КартинкаШапки (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. Не выполнен.

Подготовка

  1. Только будущий ручной опыт в собственной VM/собственной учётной записи Windows и новой пустой FileИБ C:\1C85_OwnSearchLab\4c7f629b-8da2-4f04-af39-847f824a2810\Base на точной8.5.1.1343. В этой работе стенд, файлыEPF, процессы, порты, БД и UI не создавались и не запускались. GUID каталога не является UUIDИБ.

  2. CF с нуля УчебныйПоискИнтерфейс85: Управляемое приложение, совместимостьНеИспользовать, РежимсовместимостиинтерфейсаТакси (неВерсия8_5 и неТаксиРазрешить...). Ровно рольУченикПоиска85 и общий модульУчебныйПоискСтенд85; остальных объектов/общихформ/расширений/регламентныхзаданий/подписок0. ОбработкиSource/Manager ниже являются собственными вручную скомпилированными внешнимиEPF и не входят вCF.

  3. РольУченикПоиска85: Администрирование для soleUser проверки и право использовать только собственные внешние обработки. Единственный настоящий пользовательУченикПоиска85 с этой ролью. Код получает настоящий UUID пользователяИБ, не выдумывает UUID базы; производственные аккаунты запрещены.

  4. Общий модульУчебныйПоискСтенд85: СерверДа, ВызовСервераДа, Клиент(обычное приложение)Нет, Клиент(управляемое приложение)Нет, ГлобальныйНет, ПривилегированныйНет. Полный supporting PASSPORT в его модуль. Это разрешённый native RPC экспортПаспорт85, не клиентская имитация сервера.

  5. Собственная SourceПоиска25.epf: создайте вручную новую внешнюю обработку по полному supportingSOURCE, основная управляемая формаИсточник. Не загружайте чужуюEPF и не считайте filename/hash/metadata универсальным доказательством доверия: внешний код может выполняться при открытии. Используйте лишь свой вручную собранный исходник в собственнойVM.

  6. Source реквизиты формы: СписокДинамическийСписок; МеткаСеанса/Пользователь85Строка36; ПаспортСтендаСтрока100; ИмяПоиска85/ИмяСостояния85/ИмяУправления85Строка150; ИтогИсточника85Строка неограниченная; ЧислоСводок85Число5.0; Ошибка85Булево. Для всех кромеСписок/Ошибка85 добавьте одноимённые readonly поля. ЧислоСводок85 полеВвода сФорматЧДЦ=0;ЧГ=0;ЧН=0.

  7. Source один реальный элементТаблицаТоваровТаблицаФормы сПутьКДаннымСписок; ручныхколонок0. Полный SOURCE создаёт6колонок только своего списка и новое banner/его собственное пустое меню. СобытияПриСозданииНаСервере иПриОткрытии назначьте одноимённым процедурам; Clickbanner назначает реальный nativeSetAction. Не создавайте расширения конструктором.

  8. Query использует прежние4 собственных literal строки:1Книга/Канцелярия/3/250/750;2Ручка/Канцелярия/1/30/30;3Чай/Продукты/2/150/300;4Вода/Продукты/0/70/0. КлючЗначениеПоляУчебныйНомер, основная таблица пустая, динамическое считывание и автосохранение настроекЛожь, группировки0. Ни каталога товаров, ни записиБД нет.

  9. ActualC sourceУправлениеПоиском проверяется типомДополнениеЭлементаФормы иВидУправлениеПоиском; строка исостояние имеют свои readonly factories/kinds. PRIMARY длинные @EnglishApiName нужны только registry карточек, это НЕ имена дляТип() илиНовый. Manager используетТестируемоеДополнениеЭлементаФормы+actualkind+realname изreadonlysource.

  10. Оформление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 не доказывает видимые пиксели/рендеринг.

  11. Native4страницыColor/Font явно говорят «Не применяется в интерфейсе Версия8.5», НЕ «в платформе8.5». СобственнаяCF явноТакси, metadataguard проверяет это на сервере; каждый клиент дополнительно проверяет реальныйКлиентскоеПриложение.ТекущийВариантИнтерфейса(). Платформа остаётся8.5.1.1343. НаличиеArial/его фактическое изображение проверяется вручную; успехgetter не подменяет визуальную проверку.

  12. Banner выравниваниеВерх/Лево, SkipOnInputЛожь, Ctrl+Alt+F6 назначается конструкторомShortcut тольконаКлиенте. Его readonlyContextMenu используется как реальный родитель одной собственной кнопки. Header/Footer своейколонкиСумма используют толькоБиблиотекаКартинок.Информация (видИзБиблиотеки); nativeпрограммноразрешаеттолькоПустая/ИзБиблиотеки, никакихSVG/Absolute. Подвал явно «Все исходные строки:1080» и НЕ сумма отфильтрованногоGUI.

  13. ManagerПоиска25.epf: новая собственная внешняя обработка, основная управляемая формаПульт. РеквизитыСогласие85Булево/флажок, ПодтверждаюРучнойШаг85Булево/флажок, МеткаСеансаСтрока36/поле, Итог85Строка неограниченная/readonlyполе. Полный основной MANAGER в модуль; nativeПриОткрытии1 и все14команд/кнопок изmetadataSchema.manager_buttons к указанным nativecommandhandler1. Не заменять их вызовами событий вручную.

  14. Только вручную открыть два собственных тонких клиента той жеИБ: source/TESTCLIENT -TPort15383 иmanager/TESTMANAGER. Перед этим человек проверяет, что127.0.0.1:15383 свободен и принадлежит именно своим двум приложениям/этойVM; никаких автоматических launch/port/network команд в авторской проверке нет. В TestClient открыта только одна source-форма; перенесите её настоящий canonicalUUID вManager. Другие окна/чужие клиенты запрещены.

  15. Порядокконечныхкоманд: Начать85→ВвестиКнигу85 (НЕEnter)→ОтменитьКнигу85→ВвестиКнигуДляПоиска85→настоящий ручнойEnter в своейстроке поиска→флажок ручногошага→ПроверитьКнигу85→ОткрытьСвойChip85. ВвестиТекст только замещает editor; код не обещает универсального defaultcommit/auto-search. При неожиданном переходе прекращает опыт, не угадывает режим.

  16. НажатьChip0 разрешён только послеactualFixedArrayCount1 и реальныхBook3×250/750. Native может показать стандартныйdialog; осмотрите и закройте только этот собственныйdialog вручную без изменений. Не придумываем его caption/type/events/контракт или автоматическое закрытие. Затем подтвердите ручнойшаг иУдалитьСвойChip85: вновьтолькоoneSource и actualreturnedchipText; реальные4/1080/chips0/editorEmpty.

  17. ДалееВвестиЧай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.

  18. Послеочистки вручную в своём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.

  19. НажатьЗавершить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 не совпал с единственным собственным пользователем";
    КонецЕсли;
    Возврат Строка(Текущий.УникальныйИдентификатор);
КонецФункции

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

  1. Подготовить только свой emptyCF/soleuser/Такси/две manually compiledEPF. Source создаёт реальный буквальныйDynamicList,3автоматическихaddon,6колонок,ownbanner/одноownmenu; фабрики/context не подменяются.

  2. Подтвердить typed nativebaseline8props→knownownprofile→restoreonlyownexpected→baseline→finalprofile; фактическиеTaxiguards иlibraryonlycolumnpictures. Getterпрофиль не являетсяrendererproof.

  3. Реально подключиться к только своему TestClient, проверитьcanonicalUUID/user/stamp/exactoneform/editorEmpty/chips0 и все4GUIстроки1080. Limitbaseline измерен, явно10.

  4. InputBook безcommit→CancelEdit→InputBook/manualEnter→actualBook750/chip1. Нажатьconfirmedindex0, самостоятельно осмотреть/закрыть толькоownsystemdialog; delete пореальномучipText, GUI4/1080.

  5. InputTea/manualEnter→actualTea300/chip1→Clear→actualGUI4/1080/chips0. Все6фактическихполей проверяются поnativeCurrentRow, суммы складываются изреальныхtextvalues, не изQuery.

  6. Ручнойownshortcut→реальнаяtestedDecorationfocus иactual1; отдельноownnativeClick→ПроверитьНажатие85 actual2; только затемownmenu→ПроверитьСводку85 actual3. ПоследнееЗавершить13 guardedexactlimitrestore/disconnect, никакихUIcleanup послеfailure.

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

  1. Future manual: все4GUIстроки1/750,2/30,3/300,4/0; сумма1080. Booksearch ровно1/750,Teasearch ровно1/300; исходныйзапрос независимо всегда4/1080.

  2. ActualeditorInput/Cancel/Clear,FixedArraychip0/1/0,returnedchiptext/index0 послеCount1. Неизвестнаяформа/type/kind/identity/profile/field/phase останавливают процесс.

  3. Счётчикownfullsourcesummary actual1 вStart/focus, actual2 вПроверитьНажатие85 и actual3 вПроверитьСводку85 подтверждает отдельно настоящиеклавиатурныйClick/menu, но не UIрендеринг/тайминг/атомарность. Статическивэтойработе realcalls0, все runtimeпроверки только будущие.

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

Ожидаемый результат будущего ручного выполнения: настоящий editor/search/chip/shortcut/menu cycle с проверенными750/300/1080. Здесь только авторский исходник и статические проверки, не выполненный результат1С.

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

  1. NativeInputText не гарантируетпринятиепоиска. ManualEnter и actualGUI/chipreadback обязателен; unexpectedauto-search не маскируется фальшивымdefault.

  2. Запрос собственногоисточника не учитывает пользовательскийsearchfilter. Banner/Footer1080 прямообозначаютвсеисходныестроки, не поисковуювыборку.

  3. Color/Fontнеприменимы именно кinterfaceVersion8_5; рабочийcontext данногоownlesson явноTaxi наplatform8.5.1343. Width всимволах, font/colorbaseline не гарантияpixelrenderer.

  4. Readonlycontextmenu и3sourceaddon не присваиваются/не конструируются. Тольконативныеownfactories+basekind. Captionchips иstandarddialog не угадываются; чужие формы не закрываются.

  5. UIдействия неатомарны. Sticky-stop послеpartialfailure, неrestorefonts/search/defaultblind. Нет реальных1С/GUI/DB/network/process/files/backups действий при подготовке справочника.

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

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

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

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

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