Как реализовать автоматическое заполнение измерения регистра сведений при переходе из формы справочника

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача связать подчиненный регистр сведений с основным справочником (например, регистр сведений КурсыВалют и справочник Валюты). При этом требуется, чтобы команда открытия регистра появлялась в панели навигации формы элемента («Перейти»), а при создании новой записи поле с ссылкой на текущий объект заполнялось автоматически без написания лишнего кода. Разберем по шагам, как устроен этот механизм на уровне платформы и метаданных.

Базовый механизм: свойства метаданных измерения регистра

Для того чтобы платформа автоматически организовала связь и автозаполнение, достаточно корректно настроить свойства измерения в дереве метаданных. Проанализируем ключевые флаги:

  1. Флаг «Ведущее» (Leading): Указывает платформе, что запись регистра не имеет смысла без объекта, на который она ссылается. Установка этого свойства решает сразу две задачи:

    – Обеспечивает целостность данных (каскадное удаление записей регистра при физическом удалении элемента справочника).

    – Автоматически выводит команду перехода к списку записей регистра в панель навигации (группа «Перейти») управляемой формы справочника.

  2. Флаг «ЗаполнятьИзДанныхЗаполнения» (FillFromFillingData): Указывает, что значение данного измерения должно считываться из переданных параметров при создании новой записи. При установке флага «Ведущее» платформа 1С автоматически взводит и этот флаг.

Когда пользователь переходит по ссылке из панели навигации, платформа открывает форму списка регистра и накладывает системный отбор по текущему элементу справочника (вид сравнения Равно). При создании новой записи значение этого отбора передается в структуру данных заполнения и подставляется в измерение.

Как работает передача данных под капотом

Рассмотрим подробнее внутренний алгоритм платформы при открытии формы списка с отбором и создании новой записи:

  1. При переходе по навигационной ссылке открывается форма списка регистра сведений, где в свойство динамического списка Список.Отбор передается условие: Валюта Равно <ТекущаяВалюта>.
  2. При нажатии кнопки «Создать» форма списка передает установленный отбор в параметре формы ЗначенияЗаполнения.
  3. Для создаваемого объекта инициируется системное событие ОбработкаЗаполнения.
  4. Если свойство «ЗаполнятьИзДанныхЗаполнения» включено (или включено «Ведущее»), стандартная обработка автоматически считывает поле из структуры и подставляет его значение в измерение.

Важные ограничения стандартного механизма

Выясним причины, по которым автоматическое заполнение может не сработать в нестандартных сценариях:

  1. Вид сравнения в отборе: Автоматическая подстановка работает только тогда, когда отбор динамического списка установлен с видом сравнения «Равно». Если применен отбор «В списке», «Не равно» или диапазон, платформа не сможет определить конкретное значение для заполнения.
  2. Отборы в тексте запроса: Если фильтрация данных динамического списка реализована через параметры запроса в секции ГДЕ, а не через коллекцию Отбор, платформа не связывает параметр запроса с данными заполнения.
  3. Редактирование в диалоге и в списке: При вводе строки непосредственно в таблице списка отбор текущей строки подставляется платформой напрямую. При открытии отдельной формы записи решающую роль играет именно флаг «ЗаполнятьИзДанныхЗаполнения».

Программные способы управления заполнением

Если требуется открыть форму регистра вручную из произвольной кнопки или переопределить логику заполнения, рассмотрим программные варианты реализации.

Вариант 1. Явное открытие формы с передачей значений заполнения:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", Новый Структура("Валюта", Объект.Ссылка));
ОткрытьФорму("РегистрСведений.КурсыВалют.ФормаЗаписи", ПараметрыОткрытия, ЭтотОбъект);

Вариант 2. Обработка в модуле набора или менеджера записи:

В модуле объекта регистра сведений можно гибко обработать входные данные в процедуре ОбработкаЗаполнения:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
    ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Валюты") Тогда
        ЭтотОбъект.Валюта = ДанныеЗаполнения;
    КонецЕсли;
КонецПроцедуры

Таким образом, для типового поведения достаточно активировать свойство «Ведущее» у соответствующего измерения регистра. Для нестандартных интерфейсных решений используются параметры формы ЗначенияЗаполнения и переопределение обработчика ОбработкаЗаполнения.

← На главную