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

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

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

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

Способ 1. Автоматическое заполнение силами платформы (Без кода)

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

Давайте разберем этот процесс по шагам:

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

Как это работает на практике: Когда пользователь работает в форме элемента справочника и нажимает стандартную кнопку «Создать» в командной панели динамического списка, платформа анализирует установленные отборы этого списка. Видя, что список отфильтрован по конкретному элементу справочника, и зная, что у соответствующего измерения регистра включено свойство «Заполнять из данных заполнения», 1С автоматически передает это значение в создаваемую запись и заполняет поле на форме. Нам не пришлось писать ни одной строчки кода!

Способ 2. Программное открытие через стандартный параметр «ЗначенияЗаполнения»

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

Для реализации этого метода в управляемом приложении существует стандартный предопределенный параметр формы — ЗначенияЗаполнения. Рассмотрим этот метод подробнее.

Нам потребуется написать код только на стороне вызывающей формы (в форме элемента справочника). В открываемой форме записи регистра писать код не потребуется вообще — платформа все сделает сама.

Разберем пример кода на клиенте в форме справочника:


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

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

Способ 3. Передача произвольных параметров и ручная обработка

Иногда логика заполнения формы является сложной и зависит от условий, которые нельзя описать простой передачей структуры «поле-значение». В таком случае мы можем передать в открываемую форму произвольный параметр, перехватить его на сервере и выполнить необходимый алгоритм.

Сначала настроим вызывающую сторону (форму справочника). Нам нужно сформировать структуру с произвольным именем ключа и передать ее при открытии формы:


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

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


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

Обратите внимание, что в форме записи регистра сведений рабочие данные находятся в реквизите Запись (для регистров сведений это стандартный основной реквизит формы, имеющий тип РегистрСведенийМенеджерЗаписи.[ИмяРегистра]). Поэтому заполнение полей мы выполняем через обращение к свойствам этого реквизита.

Анализ распространенных ошибок разработчиков

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

Ошибка №1. Попытка передать элемент управления формы вместо значения данных.

Часто в коде можно встретить следующую конструкцию:


// ОШИБОЧНЫЙ КОД!
Пр = Элементы.ПредметЛизинга; 
П = Новый Структура("ПредметЛизинга", Пр);
ОткрытьФорму("РегистрСведений.История.ФормаЗаписи", П);

Выясним причину ошибки. В данном случае разработчик пытается передать в структуру элемент формы (тип ПолеФормы), то есть визуальный элемент интерфейса (кнопку, поле ввода и т.д.). Элементы формы не содержат самих данных, они лишь отображают их и связаны с ними через путь к данным. При передаче элемента в другую форму он теряет контекст связи и становится абсолютно бесполезным. Передавать нужно всегда данные (значения реквизитов), например: Объект.ПредметЛизинга или непосредственно саму ссылку на объект: Объект.Ссылка.

Ошибка №2. Использование устаревших синхронных методов.

В старых конфигурациях и на обычных формах (в 1С 8.1 и 8.2) была популярна конструкция с использованием методов ПолучитьФорму() и ОткрытьМодально(). В современных управляемых формах использование этих методов считается грубой ошибкой. Модальные окна блокируют интерфейс программы, не поддерживаются в веб-клиенте и на мобильных платформах. Современный стандарт разработки требует использовать исключительно асинхронный метод ОткрытьФорму(), который корректно работает во всех средах исполнения.

Ошибка №3. Непонимание разницы между формами списка и формами записи.

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

← На главную