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

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

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

1. Прямое добавление строк в объекте открытой формы

Разберем базовый способ, к которому часто прибегают разработчики на начальном этапе. Если форма другого документа уже получена или открыта, доступ к её табличной части осуществляется через свойство Объект формы. Коллекция табличной части содержит метод Добавить(), который создает новую строку и возвращает на нее ссылку.

Проанализируем пример кода на клиенте:


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

Важные особенности данного подхода:

  1. Метод ПолучитьФорму в управляемом приложении считается устаревшим. Стандарты разработки рекомендуют использовать функцию ОткрытьФорму.
  2. Построчный перенос большого количества строк на клиенте в цикле создает дополнительную нагрузку и снижает производительность приложения.

2. Передача данных через параметры формы (Рекомендуемый стандарт)

Более чистым и производительным решением в управляемом приложении является передача структуры данных через параметры при вызове функции ОткрытьФорму. В этом случае заполнение табличной части выполняется на сервере в момент создания формы.

Выясним, как устроена эта схема. На клиенте исходной формы формируется структура параметров с данными для переноса:


&НаКлиенте
Процедура ОткрытьИЗаполнить(Команда)
    СтруктураСтроки = Новый Структура;
    СтруктураСтроки.Вставить("Поставщик", Элементы.Поставщики.ТекущиеДанные.Поставщик);
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ДанныеДляЗаполнения", СтруктураСтроки);
    
    ОткрытьФорму("Документ.ПараметрыНоменклатуры.Форма.ФормаДокумента", ПараметрыОткрытия);
КонецПроцедуры

В целевой форме в обработчике события ПриСозданииНаСервере считываем переданный параметр и добавляем строки на сервере:


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

3. Передача больших массивов данных через временное хранилище

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

Рассмотрим алгоритм работы с временным хранилищем:

  1. На сервере формы-источника табличная часть выгружается в ТаблицуЗначений с помощью функции РеквизитФормыВЗначение.
  2. Таблица значений помещается во временное хранилище методом ПоместитьВоВременноеХранилище, а полученный адрес передается в параметрах открытия формы.
  3. В целевой форме в процедуре ПриСозданииНаСервере данные извлекаются методом ПолучитьИзВременногоХранилища и загружаются в реквизит формы с помощью Загрузить или ЗначениеВРеквизитФормы.

4. Использование стандартного механизма заполнения и ввода на основании

Платформа 1С поддерживает штатный параметр ЗначениеЗаполнения. При его использовании платформа автоматически вызывает процедуру ОбработкаЗаполнения модуля объекта на сервере.

Посмотрим на пример вызова формы с передачей значения заполнения:


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

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

← На главную