Расширение формы списка справочника.ПараметрТекущаяСтрока

Свойства · CurrentLineParameter

Тип: СправочникСсылка.<Имя справочника>. Осуществляет позиционирование на строку содержащегося в форме списка, отображающую устанавливаемое значение. Позиционирование происходит при открытии или повторном открытии формы. Если форма используется для выбора или подбора, данная установка имеет более высокий приоритет, чем свойство формы НачальноеЗначениеВыбора.

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

Расширение формы списка справочника.ПараметрТекущаяСтрока (Catalog list form extension.CurrentLineParameter)

Расширение формы списка справочника (Catalog list form extension)

ПараметрТекущаяСтрока (CurrentLineParameter)

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

Использование:
Чтение и запись.
Описание:
Тип: СправочникСсылка.<Имя справочника>.
Осуществляет позиционирование на строку содержащегося в форме списка, отображающую устанавливаемое значение. Позиционирование происходит при открытии или повторном открытии формы. Если форма используется для выбора или подбора, данная установка имеет более высокий приоритет, чем свойство формы НачальноеЗначениеВыбора.
Доступность:

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

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

Доступен, начиная с версии 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С» и не аффилирован с ней.