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

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

При разработке интерфейсов в 1С часто возникает задача: пользователь открывает форму справочника (например, «Автомобили»), видит список связанных данных в регистре сведений (например, «Пропуска») и при нажатии кнопки Создать в этом списке ожидает, что поле «Автомобиль» в новой записи заполнится автоматически. Это не только ускоряет работу, но и минимизирует риск ошибок ввода.

Рассмотрим подробнее несколько способов решения этой задачи — от стандартных настроек метаданных до программного управления параметрами формы.

Способ 1. Использование свойства «Заполнять из данных заполнения»

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

Разберем по шагам, что для этого нужно сделать:

  1. В конфигураторе найдите ваш РегистрСведений.
  2. Перейдите на вкладку Данные и откройте свойства измерения (например, Автомобиль).
  3. Установите флажок у свойства Заполнять из данных заполнения.

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

Способ 2. Использование «Ведущего» измерения

Выясним причину, по которой опытные разработчики часто выбирают установку свойства Ведущее для измерений регистра. Если в регистре сведений измерение Автомобиль помечено как ведущее, это дает сразу несколько преимуществ:

  1. Регистр автоматически появляется в панели навигации формы справочника.
  2. При создании записи из этой панели 1С автоматически подставляет ссылку на справочник-владелец.
  3. Обеспечивается целостность данных: при удалении автомобиля из базы данных автоматически удалятся и все записи в регистре, связанные с ним.

Однако стоит помнить, что этот метод подходит не всегда. Если вам критически важно хранить историю пропусков даже после удаления записи об автомобиле (что бывает редко), свойство Ведущее использовать не стоит.

Способ 3. Программная передача параметров через «ЗначенияЗаполнения»

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

Посмотрим на пример кода, который можно разместить в обработчике команды на форме справочника:


&НаКлиенте
Процедура СоздатьЗаписьРегистра(Команда)
    
    // Подготовим структуру со значениями, которые должны быть заполнены в новой форме
    ПараметрыЗаполнения = Новый Структура;
    ПараметрыЗаполнения.Вставить("Автомобиль", Объект.Ссылка);
    
    // Поместим структуру в специальный параметр формы "ЗначенияЗаполнения"
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
    
    // Открываем форму записи регистра
    ОткрытьФорму("РегистрСведений.ПропускаНаТС.ФормаЗаписи", ПараметрыФормы);
    
КонецПроцедуры

При использовании этого метода крайне важно убедиться, что основной объект (Автомобиль) уже записан в базу данных. Если объект новый и ещё не имеет ссылки, Объект.Ссылка будет пустой. В таких случаях перед открытием формы регистра следует вызвать Записать() или проверить Объект.Ссылка.Пустая().

Способ 4. Работа с набором записей непосредственно на форме

Проанализируем альтернативный подход, предложенный в обсуждении. Вместо того чтобы открывать отдельную форму записи для каждой строки, можно разместить РегистрСведенийНаборЗаписей прямо на форме справочника как реквизит формы.

Это позволит пользователю редактировать список пропусков прямо в таблице на форме автомобиля. Рассмотрим пример серверного кода для работы с таким набором:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализируем набор записей с отбором по текущему объекту
    Если Не Объект.Ссылка.Пустая() Тогда
        НаборЗаписей = РегистрыСведений.ПропускаНаТС.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Автомобиль.Установить(Объект.Ссылка);
        НаборЗаписей.Прочитать();
        
        // Заполняем реквизит формы (Таблицу) данными из набора
        ЗначениеВРеквизитФормы(НаборЗаписей, "НаборЗаписейПропуска");
    КонецЕсли;
    
КонецПроцедуры

Для сохранения данных в этом случае используется метод РеквизитФормыВЗначение. Посмотрим, как может выглядеть процедура записи:


&НаСервере
Функция ЗаписатьЗаписиРегистраНаСервере()
    
    Записи = РеквизитФормыВЗначение("НаборЗаписейПропуска");
    
    // Обязательно устанавливаем отбор перед записью, чтобы не затереть лишние данные
    Записи.Отбор.Автомобиль.Установить(Объект.Ссылка);
    
    Попытка
        Записи.Записать();
        Возврат Истина;
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Этот метод удобен тем, что данные регистра сохраняются в контексте работы с основным объектом, и пользователю не нужно открывать лишние окна.

Способ 5. Обработка заполнения в модуле менеджера

Для обеспечения максимальной надежности, разберем способ реализации логики на стороне сервера в модуле самого регистра. Мы можем использовать обработчик ОбработкаЗаполнения в модуле объекта регистра сведений.

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


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

Использование этого метода гарантирует, что даже если другой программист в будущем решит добавить создание записей из другой части системы, ваша логика автозаполнения продолжит работать корректно.

Резюме и рекомендации

Мы рассмотрели различные подходы к автоматизации ввода данных. Подведем итоги:

Выбор конкретного метода зависит от требований к интерфейсу и сложности вашей бизнес-логики. Главное — помнить о проверке записи основного объекта, чтобы не передавать в регистр пустую ссылку.

← На главную