Расширение колонки табличного поля списка справочника

Типы · Catalog list table box column extension

Дополнительные свойства элемента управления КолонкаТабличногоПоля списка справочника.

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

Расширение колонки табличного поля списка справочника (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 здесь не выполнялись.

Подготовка

  1. Задача: подобрать собственный товар для своего склада и понять три разные вещи: начальные параметры обычной формы, политику поля ввода и фактическую переданную ссылку. У складаA свои блокнот3×250=750 и набор2×150=300, вместе5/1050. У складаB свой чай4×75=300. Полный набор9/1350 не изменяется кодом урока.

  2. Вручную создайте НОВУЮ пустую файловую ИБ только C:\1c-labs\OwnCatalogOwnerChoice85_cbe31510-34cd-4a3d-882c-9030164aceb8\IB. Конфигурация УчебныйВыборПоВладельцу85, РежимСовместимостиНеИспользовать, в Конфигураторе выберите Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска = «Управляемое приложение и обычное приложение»; свойство конфигурации ОсновнойРежимЗапуска = ОбычноеПриложение. Платформа Windows8.5.1.1343, толстый обычный клиент. UUID в пути — маркер этой лаборатории, не измеренный UUID ИБ. Нужна точная строка File="путь"; иной формат регистрации отказует.

  3. Создайте ровно два справочника. УчебныеВладельцы85: неиерархический, без владельцев и пользовательских реквизитов, Код Строка10, Наименование100, контроль уникальности кодаДа, автонумерацияНет. УчебныеТовары85: иерархия групп и элементов, единственный владелецУчебныеВладельцы85, Код Строка10/уникальностьДа/автонумерацияНет, Наименование100. Добавьте ровно три реквизита Количество85, Цена85, Сумма85 — единственный типЧисло15,2, использованиеДляГруппИЭлементов. Никаких табличных частей, предопределенных записей, расширений, заданий, подписок, обработчиков объекта/менеджера и других прикладных объектов хранения.

  4. Только в своем новом стенде ВРУЧНУЮ подготовьте семь записей, без пометок удаления. Владельцы: 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. Это будущая ручная подготовка: здесь записи не создавались. Код читает весь собственный набор, не создает/перезаписывает/удаляет его.

  5. Создайте свою роль Выбор85Администратор с административными правами только этой новой CF, затем единственного пользователя Выбор85Ученик. Административное право нужно для ПолучитьПользователей; Count1 и настоящий UUID текущего пользователя проверяются до чтения прикладных данных. Код не меняет пользователей или права.

  6. Общий модуль ВыборВладельцаПамять85: неглобальный, СерверДа, ВызовСервераДа, оба клиентских флагаНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Повторные чтения своего набора не должны брать кеш модуля. Вставьте полный supporting COMMON. Он проверяет реальные метаданные/владельцев через Количество+Содержит, не []/Получить для metadata value collection. После guards читает два справочника запросами, проверяет все строки, ссылки, родительские связи и числа; экспорт чтения товара отказывает до ПолучитьОбъект для любого неизвестного входа.

  7. УчебныеТовары85→Формы: создайте мастером ОБЫЧНЫЕ Список85 и Выбор85 соответствующего назначения и явно назначьте основными списком и выбором элемента. В обеих основной реквизит СписокТоваров85 имеет реальный типСправочникСписок.УчебныеТовары85. Табличное поле Список85 связано Данные=СписокТоваров85, ТолькоПросмотрДа, ДеревоНет/ИерархическийПросмотрНет. Пять колонок с именами Код85, Наименование85, Количество85, Цена85, Сумма85 связаны Данные=Код,Наименование,Количество85,Цена85,Сумма85. У Наименование85 явно задайте ОтображатьСтандартнуюКартинкуДа и ОтображатьИерархиюНет. Не добавляйте действия создания/записи/удаления.

  8. В обеих формах вставьте полный supporting CHILD, привяжите native ПередОткрытием(Отказ,СтандартнаяОбработка). Только в Выбор85 добавьте обычную кнопку Выбрать85 и ее действие Выбрать85(Кнопка). Это событиеКнопка.Нажатие0 плюс первыйЭлемент обычного расширения104, то есть handler1. Не привязывайте double-click/Enter/стандартные выборные команды: используется явно показанный native ОповеститьОВыборе(Ссылка). В Список85 выбор не выполняется; окно просмотра пользователь закрывает вручную.

  9. Создайте единственную обработку УчебныйПодбор85 с основной ОБЫЧНОЙ формой Пульт85. Реквизит Товар85 — единственный типСправочникСсылка.УчебныеТовары85, начальное значение настоящая пустая ссылка. ПолеВвода Товар85 связано Данные=Товар85, без своих событий и без собственного СпискаВыбора. СуммаБлокнота85/СуммаЧая85 — Число15,2 только для просмотра; Протокол85 — многострочная Строка. Добавьте пять обычных кнопок ПодготовитьA85, ПроверитьПоле85, СписокA85, ВыборB85, Завершить85 с одноименными действиями(Кнопка). Вставьте MAIN полностью и привяжите native ПриОткрытии0 и ОбработкаВыбора(ЗначениеВыбора,Источник)2. Последний callback принимает только собственную дочернюю форму, не предполагается для dropdown поля.

  10. Конфигурация→Открыть модуль обычного приложения: вставьте полный supporting APPLICATION; native ПриНачалеРаботыСистемы0 получает собственную форму пульта через менеджер своей обработки. Вручную обновите только новую учебную CF, проверьте модули в конфигураторе и запустите своего пользователя толстым обычным клиентом. Здесь обновление/компиляция/запуск/ИБ/UI не выполнялись.

  11. Ручной протокол: ПодготовитьA85 → выбрать BOOK85 в dropdown и закончить выбор/ввод → ПроверитьПоле85 → СписокA85 → посмотреть два собственных элемента и начальную BOOK85, закрыть окно → ВыборB85 → вручную выделить TEA85 в собственной форме и нажать ее Выбрать85 → после закрытия формы Завершить85. Любая отмена, неизвестный payload/текущая строка, изменение данных или исключение означает остановку; нет автоматического продолжения, повторов или слепого восстановления. Новый протокол начинайте новым собственным клиентом.

  12. Четыре параметра дочерней формы устанавливаются до Открыть. В дополнение наш 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 ключом";
    КонецЕсли;
    Окно.Открыть();
#Иначе
    ВызватьИсключение "Только свой толстый клиент обычного приложения";
#КонецЕсли
КонецПроцедуры

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

  1. Сервер проверяет точный свой File/version/NoUse, один реальный пользователь и полную метадатную схему. Читает ровно2владельца+5групп/товаров, проверяет каждый код, имя, ссылку, владельца, родителя и числовую ячейку. Native Итог полного набора9/1350, отдельные memory проекции A5/1050 и B4/300; они не заменяют измерение UI.

  2. MAIN получает настоящий ПолеВвода из собственной обычной формы, проверяет native Данные=Товар85 и единственный тип своей ссылки. Три свойства задаются для быстрого выбора элементов владельцаA, затем перечитываются. После ручного BOOK85 отдельная кнопка проверяет actual bound значение и настоящий объект3/250/750; callback формы для этого пути не обещается.

  3. Получаем свой закрытый список через менеджер каталога с явным именем, своим owner и новымUUID. Четыре начальных параметра назначаются до Открыть. CHILD доказывает реальный основной СправочникСписок, привязку поля и отдельно устанавливает фактический отбор источника. Позиционирование BOOK85 не является фильтром или гарантией доставки текущей строки.

  4. Колонка получена из native readonly Колонки собственного табличного поля списка. Наименование85 связано с реальным Наименование; признак стандартной картинки проходит подготовленный True→False→True с перечитыванием и полным owned-state guard перед возвратом. Нет восстановления после исключения и нет доказательства пикселей; на колонках иерархии native сохраняет стандартные картинки отдельно.

  5. После ручного закрытия спискаA переключаем свою политику поля наB и открываем отдельную собственную Выбор85. Ее кнопка берет actual native ТекущаяСтрока, требует TEA85/B, проверяет объект4/75/300 и единожды вызывает ОповеститьОВыборе. MAIN native ОбработкаВыбора2 принимает только этот Source/UUID/owner и собственную ссылку, не dropdown событие и не произвольный массив.

  6. После закрытия дочерней формы отдельная финальная кнопка проверяет оба scalar результата750/300, bound ссылку TEA85 и полный неизменный набор. Любой отказ/отмена/неизвестная строка останавливает протокол; частичные UI assignments не атомарны и не откатываются вслепую.

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

  1. Будущий ручной protocol: BOOK85 из быстрого bound поля дает3/250/750; TEA85 из своей дочерней формы дает4/75/300. Переходы0→1→2→3→4→5→6 происходят только через показанные свои кнопки и настоящее native событие; handler напрямую не вызывается.

  2. Полные query снимки всегда подтверждают семь тех же собственных ссылок и пользователя, источник9/1350, A5/1050, B4/300. Это readback собственных данных, не утверждение об автоматическом прочтении всех GUI-строк или атомарности нескольких запросов.

  3. При manual отмене формы, выборе группы/чужого товара, Unknown current row/payload, смене любого числового поля/owner/ref и любой ошибке ожидается отказ. Продолжения/retry/слепого rollback нет; native политика выбора не является системой прав.

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

Подготовлен полный собственный будущий ручной процесс: реальное bound полеA→блокнот750; отдельная native формаB→чай300; исходные9/1350 иA1050/B300 неизменны. Здесь проверены только текст и native контракты; работа в1С/UI и создание семи записей не выполнялись.

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

  1. Все три extension-типа получены только реальными базовыми объектами обычной формы: Форма с основным СправочникСписок, ПолеВвода со своей catalogRef-связью и КолонкаТабличногоПоля этого списка. Не создавайте extension через Новый, не подменяйте обычную форму managed формой или типом@alias.

  2. ПараметрОтборПоВладельцу — начальный параметр формы, ПараметрВыборПоВладельцу — значение для выбора; они не являются универсальным запретом выбора чужих данных. Собственная проверка полного payload/owner выполняется независимо. Явный source.Отбор в CHILD не выдается за автоматически измеренный эффект четырех параметров.

  3. Dropdown поля и дочерняя форма с владельцем-пультом — разные реальные пути. В уроке нет field-event предположения: dropdown проверяется отдельной кнопкой. Native Form.ОбработкаВыбора2 используется лишь после явного ОповеститьОВыборе собственной дочерней формы с ее Source.

  4. ПараметрТекущаяСтрока применяется при открытии/повторном открытии и имеет приоритет над НачальноеЗначениеВыбора. Getter этого параметра не доказывает actual native CurrentRow; перед отправкой выбранная строка отдельно проверяется, Undefined/другая ссылка отказует.

  5. При ОтображатьСтандартнуюКартинку=True native не использует КартинкиСтрок; в колонке иерархии стандартные изображения применяются для показа иерархии. Логический цикл флага не является screenshot/pixel проверкой. Настройки окон могут сохраняться платформой в собственном профиле, это не прикладная запись товара и не очистка чужих настроек.

  6. Справочники читаются несколькими запросами/чтением объекта без обещания атомарного снимка конкурентной базы. Учебные модули/подписки/задания пустые, но при любом несоответствии полный протокол прекращается. ТолькоПросмотр UI не заменяет права и не является sandbox рабочей конфигурации.

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

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

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

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

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