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

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

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

Анализ распространенной ошибки

Рассмотрим ситуацию, с которой столкнулся пользователь: при открытии формы документа в процедуре ПриСозданииНаСервере выполняется попытка обращения к Объект.Книга. В момент вызова этой процедуры новый документ еще не записан и его реквизиты не заполнены, поэтому обращение к Объект.Книга возвращает пустое значение. Также важно понимать, что Объект содержит данные самого документа, а не те параметры, которые вы передали из предыдущей формы.

Шаг 1: Правильная передача параметров из команды

На первом этапе нам нужно корректно сформировать структуру параметров. В модуле команды формы справочника Книги мы используем метод ОткрытьФорму. Мы передаем данные в параметре ПараметрыФормы. Давайте сделаем это правильно:


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

Шаг 2: Получение данных в открываемой форме

Теперь перейдем в форму документа ВыдачаКниг. Самая важная деталь: данные, которые мы передали, доступны через свойство ЭтаФорма.Параметры. Мы должны проверить, был ли передан наш параметр, и если да — использовать его для заполнения табличной части Объект.Книги.

Разберем, как должен выглядеть код в процедуре ПриСозданииНаСервере:


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

Почему это решение является надежным?

При работе с управляемыми формами важно разделять данные самого Объекта (документа, справочника) и данные, которые управляют процессом открытия формы (Параметры).

  1. Изоляция данных: Использование Параметры позволяет не засорять реквизиты самого документа временными значениями.
  2. Проверка через Свойство: Использование метода Параметры.Свойство() страхует нас от ошибок в том случае, если форма открывается не через нашу команду, а обычным способом (без параметров).
  3. Гибкость: В структуру ПараметрыФормы можно положить не только одну ссылку, но и массив ссылок или любую другую структуру данных, что позволяет передавать неограниченный объем информации между формами.

Альтернативный и профессиональный подход

Если ваша задача — создать документ на основании другого объекта, то правильнее использовать механизм ОбработкаЗаполнения в модуле объекта документа. В этом случае вы передаете в ОткрытьФорму специальный параметр ЗначениеЗаполнения:


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

В этом случае платформа автоматически вызовет в модуле объекта документа ВыдачаКниг процедуру ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка), где вы сможете максимально чисто и логично заполнить все нужные реквизиты и табличные части. Это архитектурно более правильный подход, так как вся логика заполнения документа будет находиться внутри самого объекта.

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

← На главную