Дополнительные свойства элемента управления КолонкаТабличногоПоля списка справочника.
Полное описание, параметры и ограничения
Расширение колонки табличного поля списка справочника (Catalog list table box column extension)
Расширение колонки табличного поля списка справочника (Catalog list table box column extension)
Доступен, начиная с версии 8.0.
Свойства:
ОтображатьСтандартнуюКартинку (DisplayDefaultPicture)
Описание:
Дополнительные свойства элемента управления КолонкаТабличногоПоля списка справочника.
Доступность:
Толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Подобрать свой товар по владельцу: dropdown и отдельная форма выбора без смешения событий
На собственном подчиненном иерархическом справочнике проверяем начальные параметры формы, три свойства поля ввода и признак картинки реальной колонки. Полный набор9/1350 неизменен, реальные результаты выбора750 и300 читаются после проверки ссылок.
Где и как запускать
Windows8.5.1.1343; толстый клиент обычного приложения своей новой File CF. MAIN — полный обычный Пульт85, supporting модули обязательны. Runtime1C/CF/GUI здесь не выполнялись.
Подготовка
Задача: подобрать собственный товар для своего склада и понять три разные вещи: начальные параметры обычной формы, политику поля ввода и фактическую переданную ссылку. У складаA свои блокнот3×250=750 и набор2×150=300, вместе5/1050. У складаB свой чай4×75=300. Полный набор9/1350 не изменяется кодом урока.
Вручную создайте НОВУЮ пустую файловую ИБ только C:\1c-labs\OwnCatalogOwnerChoice85_cbe31510-34cd-4a3d-882c-9030164aceb8\IB. Конфигурация УчебныйВыборПоВладельцу85, РежимСовместимостиНеИспользовать, в Конфигураторе выберите Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска = «Управляемое приложение и обычное приложение»; свойство конфигурации ОсновнойРежимЗапуска = ОбычноеПриложение. Платформа Windows8.5.1.1343, толстый обычный клиент. UUID в пути — маркер этой лаборатории, не измеренный UUID ИБ. Нужна точная строка File="путь"; иной формат регистрации отказует.
Создайте ровно два справочника. УчебныеВладельцы85: неиерархический, без владельцев и пользовательских реквизитов, Код Строка10, Наименование100, контроль уникальности кодаДа, автонумерацияНет. УчебныеТовары85: иерархия групп и элементов, единственный владелецУчебныеВладельцы85, Код Строка10/уникальностьДа/автонумерацияНет, Наименование100. Добавьте ровно три реквизита Количество85, Цена85, Сумма85 — единственный типЧисло15,2, использованиеДляГруппИЭлементов. Никаких табличных частей, предопределенных записей, расширений, заданий, подписок, обработчиков объекта/менеджера и других прикладных объектов хранения.
Только в своем новом стенде ВРУЧНУЮ подготовьте семь записей, без пометок удаления. Владельцы: A85/Свой склад A и B85/Свой склад B. Товары: GA85/Группа A — группа, владелецA, родительпусто, числа0/0/0; GB85/Группа B — группа, владелецB, родительпусто,0/0/0; BOOK85/Свой блокнот — элемент, A/GA85,3/250/750; PEN85/Свой набор — элемент, A/GA85,2/150/300; TEA85/Свой чай — элемент, B/GB85,4/75/300. Это будущая ручная подготовка: здесь записи не создавались. Код читает весь собственный набор, не создает/перезаписывает/удаляет его.
Создайте свою роль Выбор85Администратор с административными правами только этой новой CF, затем единственного пользователя Выбор85Ученик. Административное право нужно для ПолучитьПользователей; Count1 и настоящий UUID текущего пользователя проверяются до чтения прикладных данных. Код не меняет пользователей или права.
Общий модуль ВыборВладельцаПамять85: неглобальный, СерверДа, ВызовСервераДа, оба клиентских флагаНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Повторные чтения своего набора не должны брать кеш модуля. Вставьте полный supporting COMMON. Он проверяет реальные метаданные/владельцев через Количество+Содержит, не []/Получить для metadata value collection. После guards читает два справочника запросами, проверяет все строки, ссылки, родительские связи и числа; экспорт чтения товара отказывает до ПолучитьОбъект для любого неизвестного входа.
УчебныеТовары85→Формы: создайте мастером ОБЫЧНЫЕ Список85 и Выбор85 соответствующего назначения и явно назначьте основными списком и выбором элемента. В обеих основной реквизит СписокТоваров85 имеет реальный типСправочникСписок.УчебныеТовары85. Табличное поле Список85 связано Данные=СписокТоваров85, ТолькоПросмотрДа, ДеревоНет/ИерархическийПросмотрНет. Пять колонок с именами Код85, Наименование85, Количество85, Цена85, Сумма85 связаны Данные=Код,Наименование,Количество85,Цена85,Сумма85. У Наименование85 явно задайте ОтображатьСтандартнуюКартинкуДа и ОтображатьИерархиюНет. Не добавляйте действия создания/записи/удаления.
В обеих формах вставьте полный supporting CHILD, привяжите native ПередОткрытием(Отказ,СтандартнаяОбработка). Только в Выбор85 добавьте обычную кнопку Выбрать85 и ее действие Выбрать85(Кнопка). Это событиеКнопка.Нажатие0 плюс первыйЭлемент обычного расширения104, то есть handler1. Не привязывайте double-click/Enter/стандартные выборные команды: используется явно показанный native ОповеститьОВыборе(Ссылка). В Список85 выбор не выполняется; окно просмотра пользователь закрывает вручную.
Создайте единственную обработку УчебныйПодбор85 с основной ОБЫЧНОЙ формой Пульт85. Реквизит Товар85 — единственный типСправочникСсылка.УчебныеТовары85, начальное значение настоящая пустая ссылка. ПолеВвода Товар85 связано Данные=Товар85, без своих событий и без собственного СпискаВыбора. СуммаБлокнота85/СуммаЧая85 — Число15,2 только для просмотра; Протокол85 — многострочная Строка. Добавьте пять обычных кнопок ПодготовитьA85, ПроверитьПоле85, СписокA85, ВыборB85, Завершить85 с одноименными действиями(Кнопка). Вставьте MAIN полностью и привяжите native ПриОткрытии0 и ОбработкаВыбора(ЗначениеВыбора,Источник)2. Последний callback принимает только собственную дочернюю форму, не предполагается для dropdown поля.
Конфигурация→Открыть модуль обычного приложения: вставьте полный supporting APPLICATION; native ПриНачалеРаботыСистемы0 получает собственную форму пульта через менеджер своей обработки. Вручную обновите только новую учебную CF, проверьте модули в конфигураторе и запустите своего пользователя толстым обычным клиентом. Здесь обновление/компиляция/запуск/ИБ/UI не выполнялись.
Ручной протокол: ПодготовитьA85 → выбрать BOOK85 в dropdown и закончить выбор/ввод → ПроверитьПоле85 → СписокA85 → посмотреть два собственных элемента и начальную BOOK85, закрыть окно → ВыборB85 → вручную выделить TEA85 в собственной форме и нажать ее Выбрать85 → после закрытия формы Завершить85. Любая отмена, неизвестный payload/текущая строка, изменение данных или исключение означает остановку; нет автоматического продолжения, повторов или слепого восстановления. Новый протокол начинайте новым собственным клиентом.
Четыре параметра дочерней формы устанавливаются до Открыть. В дополнение наш CHILD явно задает native отбор самого источника по владельцу; это отдельное действие, не доказательство, что параметр формы автоматически переписал Отбор. ПараметрТекущаяСтрока задает начальную позицию, не условие отбора. Полный набор1350 и проекции1050/300 считаются по настоящим query ValueTables; они не измеряют весь экран или пиксели. Результаты750/300 читаются из реально выбранных собственных объектов после проверки их идентичности.
Перем СвойНабор85;
Перем СвойСписок85;
Перем СвойКлюч85;
Перем Этап85;
Перем Остановка85;
Процедура ПриОткрытии()
Если Этап85 <> Неопределено Или Остановка85 <> Неопределено Тогда
Остановка85 = Истина;
ВызватьИсключение "Не переинициализируем уже использованный собственный пульт";
КонецЕсли;
Этап85 = 0;
Остановка85 = Ложь;
СвойНабор85 = Неопределено;
СвойСписок85 = Неопределено;
КонецПроцедуры
Процедура ПроверитьНеизменныйНабор85()
Факт = ВыборВладельцаПамять85.ПрочитатьСвойНабор85();
Если СвойНабор85 = Неопределено Тогда
СвойНабор85 = Факт;
ИначеЕсли Факт.Пользователь <> СвойНабор85.Пользователь Или Факт.A <> СвойНабор85.A Или Факт.B <> СвойНабор85.B
Или Факт.GA <> СвойНабор85.GA Или Факт.GB <> СвойНабор85.GB Или Факт.Книга <> СвойНабор85.Книга
Или Факт.Ручка <> СвойНабор85.Ручка Или Факт.Чай <> СвойНабор85.Чай Тогда
ВызватьИсключение "Изменилась реальная идентичность своего пользователя или любой из семи записей";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСвоеПоле85()
Поле = ЭлементыФормы.Товар85;
Если ТипЗнч(Поле) <> Тип("ПолеВвода") Или Поле.Данные <> "Товар85"
Или Поле.ТипЗначения.Типы().Количество() <> 1 Или Не Поле.ТипЗначения.СодержитТип(Тип("СправочникСсылка.УчебныеТовары85")) Тогда
ВызватьИсключение "Нужно свое обычное поле, реально связанное с единственным типом своей ссылки";
КонецЕсли;
Возврат Поле;
КонецФункции
Процедура ПодготовитьA85(Кнопка)
Если Остановка85 Или Этап85 <> 0 Или Кнопка <> ЭлементыФормы.ПодготовитьA85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Начните только своей кнопкой и один раз";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
Поле = ПолучитьСвоеПоле85();
Если ТипЗнч(Товар85) <> Тип("СправочникСсылка.УчебныеТовары85") Или Не Товар85.Пустая() Или Поле.Значение <> Товар85 Тогда
ВызватьИсключение "Свое bound поле должно начать с настоящей пустой ссылки";
КонецЕсли;
Поле.БыстрыйВыбор = Истина;
Поле.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
Поле.ВыборПоВладельцу = СвойНабор85.A;
Если Не Поле.БыстрыйВыбор Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Поле.ВыборПоВладельцу <> СвойНабор85.A Тогда
ВызватьИсключение "Не перечитана собственная политика быстрого поля A";
КонецЕсли;
Этап85 = 1;
Протокол85 = "Теперь вручную выберите свой блокнот BOOK85 в выпадающем поле и нажмите ПроверитьПоле85. Setter не доказывает состав или отрисовку dropdown.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьПоле85(Кнопка)
Если Остановка85 Или Этап85 <> 1 Или Кнопка <> ЭлементыФормы.ПроверитьПоле85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Проверка поля допустима только после собственного ручного выбора";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
Поле = ПолучитьСвоеПоле85();
Если Не Поле.БыстрыйВыбор Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Поле.ВыборПоВладельцу <> СвойНабор85.A Или Поле.Значение <> Товар85 Или Товар85 <> СвойНабор85.Книга Тогда
ВызватьИсключение "Не принята ожидаемая реальная bound ссылка BOOK85 или изменилась политика поля";
КонецЕсли;
Выбор = ВыборВладельцаПамять85.ПрочитатьСвойТовар85(Товар85);
Если Выбор.Ссылка <> СвойНабор85.Книга Или Выбор.Владелец <> СвойНабор85.A
Или Выбор.Количество <> 3 Или Выбор.Цена <> 250 Или Выбор.Сумма <> 750 Тогда
ВызватьИсключение "Не совпало числовое чтение своего блокнота3/250/750";
КонецЕсли;
СуммаБлокнота85 = Выбор.Сумма;
Этап85 = 2;
Протокол85 = "Настоящее bound значение своего поля проверено отдельной кнопкой. Это не callback дочерней формы. Блокнот3x250=750; весь свой набор9/1350.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьСвоюФорму85(Окно, Владелец, Текущая, Выбор)
Если Окно = Неопределено Тогда
ВызватьИсключение "Native factory не создала свою форму";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Или Окно <> СвойСписок85 Или Окно.КлючУникальности <> СвойКлюч85
Или Окно.ВладелецФормы <> ЭтаФорма.ЭтаФорма Или Окно.РежимВыбора <> Выбор Тогда
ВызватьИсключение "Не совпали настоящая обычная форма, владелец, ключ или режим";
КонецЕсли;
Если Окно.ПараметрВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Окно.ПараметрВыборПоВладельцу <> Владелец Или Окно.ПараметрОтборПоВладельцу <> Владелец
Или Окно.ПараметрТекущаяСтрока <> Текущая Тогда
ВызватьИсключение "Не перечитаны все четыре собственных параметра формы";
КонецЕсли;
Окно.ПроверитьСвойИсточник85(Владелец);
КонецПроцедуры
Процедура ОткрытьСвойСписок85(Владелец, Текущая, Выбор)
Если СвойСписок85 <> Неопределено Тогда
Если СвойСписок85.Открыта() Тогда
ВызватьИсключение "Сначала закройте свое предыдущее окно вручную";
КонецЕсли;
КонецЕсли;
СвойКлюч85 = Новый УникальныйИдентификатор;
Если Выбор Тогда
Окно = Справочники.УчебныеТовары85.ПолучитьФормуВыбора("Выбор85", ЭтаФорма, СвойКлюч85);
Иначе
Окно = Справочники.УчебныеТовары85.ПолучитьФормуСписка("Список85", ЭтаФорма, СвойКлюч85);
КонецЕсли;
Если Окно = Неопределено Тогда
ВызватьИсключение "Не получена своя подготовленная обычная форма";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Или Окно.Открыта() Или Окно.КлючУникальности <> СвойКлюч85
Или Окно.ВладелецФормы <> ЭтаФорма.ЭтаФорма Тогда
ВызватьИсключение "До setters нужна новая закрытая собственная форма с точными ключом и владельцем";
КонецЕсли;
СвойСписок85 = Окно;
Окно.РежимВыбора = Выбор;
Окно.ЗакрыватьПриВыборе = Истина;
Окно.ТолькоПросмотр = Истина;
Окно.ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
Окно.ПараметрВыборПоВладельцу = Владелец;
Окно.ПараметрОтборПоВладельцу = Владелец;
Окно.ПараметрТекущаяСтрока = Текущая;
Окно.ПодготовитьСвойИсточник85(Владелец);
ПроверитьСвоюФорму85(Окно, Владелец, Текущая, Выбор);
ПолеСписка = Окно.ЭлементыФормы.Список85;
Колонка = ПолеСписка.Колонки.Наименование85;
Если ТипЗнч(Колонка) <> Тип("КолонкаТабличногоПоля") Или Колонка.Данные <> "Наименование"
Или Не Колонка.ОтображатьСтандартнуюКартинку Тогда
ВызватьИсключение "Нужна своя связанная колонка с явно подготовленной baseline картинкой";
КонецЕсли;
Колонка.ОтображатьСтандартнуюКартинку = Ложь;
Если Колонка.ОтображатьСтандартнуюКартинку Тогда
ВызватьИсключение "Не перечитан собственный выключенный признак картинки";
КонецЕсли;
ПроверитьСвоюФорму85(Окно, Владелец, Текущая, Выбор);
ПроверитьНеизменныйНабор85();
Если Колонка.Данные <> "Наименование" Или Колонка.ОтображатьСтандартнуюКартинку Тогда
ВызватьИсключение "Перед возвратом baseline нужно полностью подтвердить собственное измененное состояние";
КонецЕсли;
Колонка.ОтображатьСтандартнуюКартинку = Истина;
Если Не Колонка.ОтображатьСтандартнуюКартинку Тогда
ВызватьИсключение "Не возвращен собственный признак картинки; пиксели не измерялись";
КонецЕсли;
Окно.Открыть();
Если Не Окно.Открыта() Тогда
ВызватьИсключение "Открытие своего окна отказало";
КонецЕсли;
ПроверитьСвоюФорму85(Окно, Владелец, Текущая, Выбор);
КонецПроцедуры
Процедура СписокA85(Кнопка)
Если Остановка85 Или Этап85 <> 2 Или Кнопка <> ЭлементыФормы.СписокA85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Список A показываем после проверки собственного поля";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
ОткрытьСвойСписок85(СвойНабор85.A, СвойНабор85.Книга, Ложь);
Протокол85 = "Будущий ручной просмотр A: свои блокнот и набор5/1050. Начальная позиция BOOK85 не является отбором. Закройте окно вручную; затем ВыборB85.";
Этап85 = 3;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ВыборB85(Кнопка)
Если Остановка85 Или Этап85 <> 3 Или Кнопка <> ЭлементыФормы.ВыборB85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Выбор B открываем только в своей следующей фазе";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
Поле = ПолучитьСвоеПоле85();
Если Поле.Значение <> Товар85 Или Товар85 <> СвойНабор85.Книга Или СуммаБлокнота85 <> 750 Тогда
ВызватьИсключение "Исходный собственный выбор A изменился";
КонецЕсли;
Поле.БыстрыйВыбор = Ложь;
Поле.ВыборПоВладельцу = СвойНабор85.B;
Если Поле.БыстрыйВыбор Или Поле.ВыборПоВладельцу <> СвойНабор85.B
Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы Тогда
ВызватьИсключение "Не перечитана новая собственная политика поля B";
КонецЕсли;
Этап85 = 4;
ОткрытьСвойСписок85(СвойНабор85.B, СвойНабор85.Чай, Истина);
Протокол85 = "В своей форме Выбор85 вручную выделите TEA85 и нажмите ее Выбрать85. Ожидается нативное событие владельца от этой конкретной формы, не от dropdown поля.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если Остановка85 Или Этап85 <> 4 Или Источник <> СвойСписок85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Не принимаем повтор, другую фазу или неизвестный источник native выбора";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
ПроверитьСвоюФорму85(Источник, СвойНабор85.B, СвойНабор85.Чай, Истина);
Если ТипЗнч(ЗначениеВыбора) <> Тип("СправочникСсылка.УчебныеТовары85") Или ЗначениеВыбора <> СвойНабор85.Чай Тогда
ВызватьИсключение "Принимаем только реально переданную собственную ссылку TEA85, не группу/массив/чужой товар";
КонецЕсли;
Поле = ПолучитьСвоеПоле85();
Если Поле.БыстрыйВыбор Или Поле.ВыборПоВладельцу <> СвойНабор85.B
Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы Тогда
ВызватьИсключение "Собственная политика поля B изменилась до приема";
КонецЕсли;
Выбор = ВыборВладельцаПамять85.ПрочитатьСвойТовар85(ЗначениеВыбора);
Если Выбор.Ссылка <> СвойНабор85.Чай Или Выбор.Владелец <> СвойНабор85.B
Или Выбор.Количество <> 4 Или Выбор.Цена <> 75 Или Выбор.Сумма <> 300 Тогда
ВызватьИсключение "Не подтвержден собственный чай4/75/300";
КонецЕсли;
Товар85 = ЗначениеВыбора;
Если Поле.Значение <> Товар85 Тогда
ВызватьИсключение "Фактическое bound значение не совпало с принятым native payload";
КонецЕсли;
СуммаЧая85 = Выбор.Сумма;
Этап85 = 5;
Протокол85 = "Native payload своей дочерней формы принят ровно один раз: TEA85, владелецB,4x75=300. Для финальной проверки нажмите Завершить85 после ее закрытия.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Завершить85(Кнопка)
Если Остановка85 Или Этап85 <> 5 Или Кнопка <> ЭлементыФормы.Завершить85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Финиш допустим только после принятого собственного native выбора";
КонецЕсли;
Попытка
ПроверитьНеизменныйНабор85();
Если СвойСписок85.Открыта() Или Товар85 <> СвойНабор85.Чай Или СуммаБлокнота85 <> 750 Или СуммаЧая85 <> 300 Тогда
ВызватьИсключение "Не подтвердились закрытие собственного выбора и оба результата";
КонецЕсли;
Поле = ПолучитьСвоеПоле85();
Если Поле.Значение <> Товар85 Или Поле.БыстрыйВыбор Или Поле.ВыборПоВладельцу <> СвойНабор85.B
Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы Тогда
ВызватьИсключение "Финальное собственное поле изменено";
КонецЕсли;
Этап85 = 6;
Протокол85 = "Свой ручной протокол завершен: блокнот750, чай300; полный набор9/1350, A5/1050, B4/300 неизменен. Код не записывал данные. Getter-политика и payload не доказывают пиксели или универсальную безопасность UI.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный серверный модуль: проверка собственного набора и числовое чтение выбранного объекта
Общие → Общие модули → ВыборВладельцаПамять85 → Модуль
Серверный неглобальный общий модуль; вызов сервера разрешен, клиентские флаги выключены
Функция ПроверитьСвойСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnCatalogOwnerChoice85_cbe31510-34cd-4a3d-882c-9030164aceb8\IB"";" Тогда
ВызватьИсключение "Только свой точно подготовленный файловый стенд 8.5.1.1343";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 2 Или Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.Обработки.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "Нужны только два своих справочника, свой общий модуль и свой пульт";
КонецЕсли;
ТоварыМД = Метаданные.Справочники.Найти("УчебныеТовары85");
ВладельцыМД = Метаданные.Справочники.Найти("УчебныеВладельцы85");
Если ТоварыМД = Неопределено Или ВладельцыМД = Неопределено
Или Метаданные.ОбщиеМодули.Найти("ВыборВладельцаПамять85") = Неопределено
Или Метаданные.Обработки.Найти("УчебныйПодбор85") = Неопределено Тогда
ВызватьИсключение "Не найдены свои реальные метаданные";
КонецЕсли;
Если Не ТоварыМД.Иерархический Или ВладельцыМД.Иерархический
Или ТоварыМД.Владельцы.Количество() <> 1 Или Не ТоварыМД.Владельцы.Содержит(ВладельцыМД)
Или ВладельцыМД.Владельцы.Количество() <> 0 Или ВладельцыМД.Реквизиты.Количество() <> 0
Или ТоварыМД.Реквизиты.Количество() <> 3 Тогда
ВызватьИсключение "Не совпала собственная иерархия, единственный владелец или числовая схема";
КонецЕсли;
Имена = Новый Массив;
Имена.Добавить("Количество85");
Имена.Добавить("Цена85");
Имена.Добавить("Сумма85");
Для Каждого ИмяПоля Из Имена Цикл
ПолеМД = ТоварыМД.Реквизиты.Найти(ИмяПоля);
Если ПолеМД = Неопределено Тогда
ВызватьИсключение "Нет своего реквизита";
КонецЕсли;
Если ПолеМД.Тип.Типы().Количество() <> 1 Или Не ПолеМД.Тип.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Все три собственных реквизита должны иметь единственный тип Число";
КонецЕсли;
КонецЦикла;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Свой учебный стенд должен быть без расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
КонецЕсли;
Если Текущий.Имя <> "Выбор85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала собственная реальная идентичность пользователя";
КонецЕсли;
Возврат Текущий.УникальныйИдентификатор;
КонецФункции
Функция ПрочитатьСвойНабор85() Экспорт
Пользователь = ПроверитьСвойСтенд85();
ЗапросВладельцев = Новый Запрос("ВЫБРАТЬ Код, Наименование, Ссылка, ПометкаУдаления ИЗ Справочник.УчебныеВладельцы85");
Владельцы = ЗапросВладельцев.Выполнить().Выгрузить();
Если Владельцы.Количество() <> 2 Тогда
ВызватьИсключение "В базе должны оставаться ровно два своих владельца";
КонецЕсли;
A = Владельцы.Найти("A85", "Код");
B = Владельцы.Найти("B85", "Код");
Если A = Неопределено Или B = Неопределено Тогда
ВызватьИсключение "Нет обоих собственных владельцев";
КонецЕсли;
Если A.Наименование <> "Свой склад A" Или B.Наименование <> "Свой склад B" Или A.ПометкаУдаления Или B.ПометкаУдаления
Или ТипЗнч(A.Ссылка) <> Тип("СправочникСсылка.УчебныеВладельцы85") Или ТипЗнч(B.Ссылка) <> Тип("СправочникСсылка.УчебныеВладельцы85")
Или A.Ссылка.Пустая() Или B.Ссылка.Пустая() Или A.Ссылка = B.Ссылка Тогда
ВызватьИсключение "Не совпали полные данные и реальные ссылки собственных владельцев";
КонецЕсли;
ЗапросТоваров = Новый Запрос("ВЫБРАТЬ Код, Наименование, Ссылка, ЭтоГруппа, Владелец, Родитель, ПометкаУдаления, Количество85, Цена85, Сумма85 ИЗ Справочник.УчебныеТовары85");
Данные = ЗапросТоваров.Выполнить().Выгрузить();
Если Данные.Количество() <> 5 Тогда
ВызватьИсключение "Нужно ровно пять собственных записей: две группы и три товара";
КонецЕсли;
GA = Данные.Найти("GA85", "Код");
GB = Данные.Найти("GB85", "Код");
Книга = Данные.Найти("BOOK85", "Код");
Ручка = Данные.Найти("PEN85", "Код");
Чай = Данные.Найти("TEA85", "Код");
Если GA = Неопределено Или GB = Неопределено Или Книга = Неопределено Или Ручка = Неопределено Или Чай = Неопределено Тогда
ВызватьИсключение "Не найдены все пять разных собственных кодов";
КонецЕсли;
Для Каждого СтрокаДанных Из Данные Цикл
Если ТипЗнч(СтрокаДанных.Ссылка) <> Тип("СправочникСсылка.УчебныеТовары85") Или СтрокаДанных.Ссылка.Пустая()
Или СтрокаДанных.ПометкаУдаления Или ТипЗнч(СтрокаДанных.Количество85) <> Тип("Число")
Или ТипЗнч(СтрокаДанных.Цена85) <> Тип("Число") Или ТипЗнч(СтрокаДанных.Сумма85) <> Тип("Число") Тогда
ВызватьИсключение "Каждая собственная запись должна иметь реальную ссылку и три числовых значения";
КонецЕсли;
КонецЦикла;
Если Не GA.ЭтоГруппа Или Не GB.ЭтоГруппа Или GA.Наименование <> "Группа A" Или GB.Наименование <> "Группа B"
Или GA.Владелец <> A.Ссылка Или GB.Владелец <> B.Ссылка Или Не GA.Родитель.Пустая() Или Не GB.Родитель.Пустая()
Или GA.Количество85 <> 0 Или GA.Цена85 <> 0 Или GA.Сумма85 <> 0
Или GB.Количество85 <> 0 Или GB.Цена85 <> 0 Или GB.Сумма85 <> 0 Тогда
ВызватьИсключение "Не совпали полные данные обеих собственных корневых групп";
КонецЕсли;
Если Книга.ЭтоГруппа Или Книга.Наименование <> "Свой блокнот" Или Книга.Владелец <> A.Ссылка Или Книга.Родитель <> GA.Ссылка
Или Книга.Количество85 <> 3 Или Книга.Цена85 <> 250 Или Книга.Сумма85 <> 750
Или Ручка.ЭтоГруппа Или Ручка.Наименование <> "Свой набор" Или Ручка.Владелец <> A.Ссылка Или Ручка.Родитель <> GA.Ссылка
Или Ручка.Количество85 <> 2 Или Ручка.Цена85 <> 150 Или Ручка.Сумма85 <> 300
Или Чай.ЭтоГруппа Или Чай.Наименование <> "Свой чай" Или Чай.Владелец <> B.Ссылка Или Чай.Родитель <> GB.Ссылка
Или Чай.Количество85 <> 4 Или Чай.Цена85 <> 75 Или Чай.Сумма85 <> 300 Тогда
ВызватьИсключение "Не совпали все собственные товары, ссылки на владельцев/родителей и девять чисел";
КонецЕсли;
Для Каждого СтрокаДанных Из Данные Цикл
Если СтрокаДанных.Сумма85 <> СтрокаДанных.Количество85 * СтрокаДанных.Цена85 Тогда
ВызватьИсключение "У каждого своего товара и группы должна совпадать арифметика";
КонецЕсли;
КонецЦикла;
ПроекцияA = Данные.Скопировать(Новый Структура("Владелец", A.Ссылка));
ПроекцияB = Данные.Скопировать(Новый Структура("Владелец", B.Ссылка));
Если Данные.Итог("Количество85") <> 9 Или Данные.Итог("Сумма85") <> 1350
Или ПроекцияA.Количество() <> 3 Или ПроекцияA.Итог("Количество85") <> 5 Или ПроекцияA.Итог("Сумма85") <> 1050
Или ПроекцияB.Количество() <> 2 Или ПроекцияB.Итог("Количество85") <> 4 Или ПроекцияB.Итог("Сумма85") <> 300 Тогда
ВызватьИсключение "Native итоги полного своего набора должны быть9/1350, A5/1050, B4/300";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Пользователь,A,B,GA,GB,Книга,Ручка,Чай", Пользователь, A.Ссылка, B.Ссылка, GA.Ссылка, GB.Ссылка, Книга.Ссылка, Ручка.Ссылка, Чай.Ссылка);
КонецФункции
Функция ПрочитатьСвойТовар85(Ссылка) Экспорт
Набор = ПрочитатьСвойНабор85();
Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.УчебныеТовары85") Тогда
ВызватьИсключение "Выбор должен быть настоящей ссылкой своего справочника";
КонецЕсли;
Если Ссылка <> Набор.Книга И Ссылка <> Набор.Ручка И Ссылка <> Набор.Чай Тогда
ВызватьИсключение "Группы, неизвестные и чужие ссылки отвергаются до ПолучитьОбъект";
КонецЕсли;
Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
ВызватьИсключение "Свой ранее проверенный объект больше не существует";
КонецЕсли;
Если Объект.Ссылка <> Ссылка Или Объект.ЭтоГруппа Или Объект.ПометкаУдаления
Или ТипЗнч(Объект.Количество85) <> Тип("Число") Или ТипЗнч(Объект.Цена85) <> Тип("Число") Или ТипЗнч(Объект.Сумма85) <> Тип("Число")
Или Объект.Сумма85 <> Объект.Количество85 * Объект.Цена85 Тогда
ВызватьИсключение "Не подтвердился настоящий числовой объект собственного выбора";
КонецЕсли;
Если Ссылка = Набор.Книга Тогда
Если Объект.Владелец <> Набор.A Или Объект.Родитель <> Набор.GA Или Объект.Количество85 <> 3 Или Объект.Цена85 <> 250 Или Объект.Сумма85 <> 750 Тогда
ВызватьИсключение "Изменились данные собственного блокнота";
КонецЕсли;
ИначеЕсли Ссылка = Набор.Ручка Тогда
Если Объект.Владелец <> Набор.A Или Объект.Родитель <> Набор.GA Или Объект.Количество85 <> 2 Или Объект.Цена85 <> 150 Или Объект.Сумма85 <> 300 Тогда
ВызватьИсключение "Изменились данные собственного набора";
КонецЕсли;
Иначе
Если Объект.Владелец <> Набор.B Или Объект.Родитель <> Набор.GB Или Объект.Количество85 <> 4 Или Объект.Цена85 <> 75 Или Объект.Сумма85 <> 300 Тогда
ВызватьИсключение "Изменились данные собственного чая";
КонецЕсли;
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Ссылка,Владелец,Количество,Цена,Сумма", Ссылка, Объект.Владелец, Объект.Количество85, Объект.Цена85, Объект.Сумма85);
КонецФункцииПолный модуль каждой собственной обычной формы справочника
Справочники → УчебныеТовары85 → Формы → Список85 и Выбор85 → Модуль каждой формы
Толстый клиент, обычное приложение; одинаковый код вставьте отдельно в обе подготовленные формы
Перем СвойВладелец85;
Перем Подготовлена85;
Перем Передано85;
Перем Остановка85;
Процедура ПодготовитьСвойИсточник85(Владелец) Экспорт
Если Подготовлена85 <> Неопределено Или ЭтаФорма.Открыта() Тогда
ВызватьИсключение "Подготовка только своего нового закрытого окна";
КонецЕсли;
Набор = ВыборВладельцаПамять85.ПрочитатьСвойНабор85();
Если Владелец <> Набор.A И Владелец <> Набор.B Тогда
ВызватьИсключение "Владелец источника должен реально принадлежать собственному набору";
КонецЕсли;
Если ТипЗнч(СписокТоваров85) <> Тип("СправочникСписок.УчебныеТовары85") Тогда
ВызватьИсключение "Основной реквизит должен быть настоящим списком своего справочника";
КонецЕсли;
Поле = ЭлементыФормы.Список85;
Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "СписокТоваров85" Или Не Поле.ТолькоПросмотр Тогда
ВызватьИсключение "Нужно реальное связанное обычное табличное поле только для просмотра";
КонецЕсли;
Поле.АвтоОбновление = Ложь;
Поле.ВосстанавливатьТекущуюСтроку = Ложь;
Поле.Дерево = Ложь;
Поле.ИерархическийПросмотр = Ложь;
Поле.ПросмотрГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
Имена = Новый Массив;
Имена.Добавить("Код");
Имена.Добавить("Наименование");
Имена.Добавить("Количество85");
Имена.Добавить("Цена85");
Имена.Добавить("Сумма85");
Для Каждого ИмяПоля Из Имена Цикл
Если СписокТоваров85.Колонки.Найти(ИмяПоля) = Неопределено Тогда
СписокТоваров85.Колонки.Добавить(ИмяПоля);
КонецЕсли;
КонецЦикла;
СписокТоваров85.Отбор.Владелец.Установить(Владелец, Истина);
СписокТоваров85.Порядок.Установить("Код Возр");
СписокТоваров85.Обновить();
СвойВладелец85 = Владелец;
Подготовлена85 = Истина;
Передано85 = Ложь;
Остановка85 = Ложь;
ПроверитьСвойИсточник85(Владелец);
КонецПроцедуры
Процедура ПроверитьСвойИсточник85(Владелец) Экспорт
Если Остановка85 Или Не Подготовлена85 Или Владелец <> СвойВладелец85
Или ТипЗнч(СписокТоваров85) <> Тип("СправочникСписок.УчебныеТовары85") Тогда
ВызватьИсключение "Не подтвержден собственный настоящий источник";
КонецЕсли;
Поле = ЭлементыФормы.Список85;
Если Поле.Данные <> "СписокТоваров85" Или Не Поле.ТолькоПросмотр Или Поле.АвтоОбновление
Или Поле.ВосстанавливатьТекущуюСтроку Или Поле.Дерево Или Поле.ИерархическийПросмотр
Или Поле.ПросмотрГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Не СписокТоваров85.Отбор.Владелец.Использование Или СписокТоваров85.Отбор.Владелец.Значение <> Владелец Тогда
ВызватьИсключение "Полный свой профиль источника/поля изменен; это не политика доступа";
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если Остановка85 Или Не Подготовлена85 Или Не СтандартнаяОбработка Тогда
Остановка85 = Истина;
Отказ = Истина;
Возврат;
КонецЕсли;
Попытка
ПроверитьСвойИсточник85(СвойВладелец85);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Выбрать85(Кнопка)
Если Остановка85 Или Передано85 Или Не Подготовлена85 Или Не ЭтаФорма.РежимВыбора Или Кнопка <> ЭлементыФормы.Выбрать85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Выбор только своей кнопкой в подготовленном окне выбора, без повторов";
КонецЕсли;
Попытка
ПроверитьСвойИсточник85(СвойВладелец85);
Набор = ВыборВладельцаПамять85.ПрочитатьСвойНабор85();
Ссылка = ЭлементыФормы.Список85.ТекущаяСтрока;
Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.УчебныеТовары85") Или Ссылка <> Набор.Чай Или СвойВладелец85 <> Набор.B Тогда
ВызватьИсключение "Текущая native строка не является своим ожидаемым TEA85; вручную выделите его";
КонецЕсли;
Выбор = ВыборВладельцаПамять85.ПрочитатьСвойТовар85(Ссылка);
Если Выбор.Владелец <> Набор.B Или Выбор.Количество <> 4 Или Выбор.Цена <> 75 Или Выбор.Сумма <> 300 Тогда
ВызватьИсключение "Не подтвержден собственный товар перед передачей";
КонецЕсли;
Передано85 = Истина;
ОповеститьОВыборе(Ссылка);
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыНастоящий startup открывает свой обычный пульт
Конфигурация → Открыть модуль обычного приложения
Толстый клиент, обычное приложение
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
ВыборВладельцаПамять85.ПрочитатьСвойНабор85();
Ключ = Новый УникальныйИдентификатор;
Окно = Обработки.УчебныйПодбор85.ПолучитьФорму("Пульт85", , Ключ);
Если Окно = Неопределено Тогда
ВызватьИсключение "Не получен собственный пульт";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Или Окно.Открыта() Или Окно.КлючУникальности <> Ключ Тогда
ВызватьИсключение "Нужен свой новый обычный пульт с собственным UUID ключом";
КонецЕсли;
Окно.Открыть();
#Иначе
ВызватьИсключение "Только свой толстый клиент обычного приложения";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Сервер проверяет точный свой File/version/NoUse, один реальный пользователь и полную метадатную схему. Читает ровно2владельца+5групп/товаров, проверяет каждый код, имя, ссылку, владельца, родителя и числовую ячейку. Native Итог полного набора9/1350, отдельные memory проекции A5/1050 и B4/300; они не заменяют измерение UI.
MAIN получает настоящий ПолеВвода из собственной обычной формы, проверяет native Данные=Товар85 и единственный тип своей ссылки. Три свойства задаются для быстрого выбора элементов владельцаA, затем перечитываются. После ручного BOOK85 отдельная кнопка проверяет actual bound значение и настоящий объект3/250/750; callback формы для этого пути не обещается.
Получаем свой закрытый список через менеджер каталога с явным именем, своим owner и новымUUID. Четыре начальных параметра назначаются до Открыть. CHILD доказывает реальный основной СправочникСписок, привязку поля и отдельно устанавливает фактический отбор источника. Позиционирование BOOK85 не является фильтром или гарантией доставки текущей строки.
Колонка получена из native readonly Колонки собственного табличного поля списка. Наименование85 связано с реальным Наименование; признак стандартной картинки проходит подготовленный True→False→True с перечитыванием и полным owned-state guard перед возвратом. Нет восстановления после исключения и нет доказательства пикселей; на колонках иерархии native сохраняет стандартные картинки отдельно.
После ручного закрытия спискаA переключаем свою политику поля наB и открываем отдельную собственную Выбор85. Ее кнопка берет actual native ТекущаяСтрока, требует TEA85/B, проверяет объект4/75/300 и единожды вызывает ОповеститьОВыборе. MAIN native ОбработкаВыбора2 принимает только этот Source/UUID/owner и собственную ссылку, не dropdown событие и не произвольный массив.
После закрытия дочерней формы отдельная финальная кнопка проверяет оба scalar результата750/300, bound ссылку TEA85 и полный неизменный набор. Любой отказ/отмена/неизвестная строка останавливает протокол; частичные UI assignments не атомарны и не откатываются вслепую.
Как проверить результат
Будущий ручной protocol: BOOK85 из быстрого bound поля дает3/250/750; TEA85 из своей дочерней формы дает4/75/300. Переходы0→1→2→3→4→5→6 происходят только через показанные свои кнопки и настоящее native событие; handler напрямую не вызывается.
Полные query снимки всегда подтверждают семь тех же собственных ссылок и пользователя, источник9/1350, A5/1050, B4/300. Это readback собственных данных, не утверждение об автоматическом прочтении всех GUI-строк или атомарности нескольких запросов.
При manual отмене формы, выборе группы/чужого товара, Unknown current row/payload, смене любого числового поля/owner/ref и любой ошибке ожидается отказ. Продолжения/retry/слепого rollback нет; native политика выбора не является системой прав.
Ожидаемый результат
Подготовлен полный собственный будущий ручной процесс: реальное bound полеA→блокнот750; отдельная native формаB→чай300; исходные9/1350 иA1050/B300 неизменны. Здесь проверены только текст и native контракты; работа в1С/UI и создание семи записей не выполнялись.
На что обратить внимание
Все три extension-типа получены только реальными базовыми объектами обычной формы: Форма с основным СправочникСписок, ПолеВвода со своей catalogRef-связью и КолонкаТабличногоПоля этого списка. Не создавайте extension через Новый, не подменяйте обычную форму managed формой или типом@alias.
ПараметрОтборПоВладельцу — начальный параметр формы, ПараметрВыборПоВладельцу — значение для выбора; они не являются универсальным запретом выбора чужих данных. Собственная проверка полного payload/owner выполняется независимо. Явный source.Отбор в CHILD не выдается за автоматически измеренный эффект четырех параметров.
Dropdown поля и дочерняя форма с владельцем-пультом — разные реальные пути. В уроке нет field-event предположения: dropdown проверяется отдельной кнопкой. Native Form.ОбработкаВыбора2 используется лишь после явного ОповеститьОВыборе собственной дочерней формы с ее Source.
ПараметрТекущаяСтрока применяется при открытии/повторном открытии и имеет приоритет над НачальноеЗначениеВыбора. Getter этого параметра не доказывает actual native CurrentRow; перед отправкой выбранная строка отдельно проверяется, Undefined/другая ссылка отказует.
При ОтображатьСтандартнуюКартинку=True native не использует КартинкиСтрок; в колонке иерархии стандартные изображения применяются для показа иерархии. Логический цикл флага не является screenshot/pixel проверкой. Настройки окон могут сохраняться платформой в собственном профиле, это не прикладная запись товара и не очистка чужих настроек.
Справочники читаются несколькими запросами/чтением объекта без обещания атомарного снимка конкурентной базы. Учебные модули/подписки/задания пустые, но при любом несоответствии полный протокол прекращается. ТолькоПросмотр UI не заменяет права и не является sandbox рабочей конфигурации.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.