При разработке пользовательских интерфейсов в 1С часто возникает необходимость перенести данные из табличной части текущего документа в открываемую форму другого документа. Рассмотрим, как правильно реализовать заполнение табличных частей, какие методы предлагает платформа 1С:Предприятие и как избежать распространенных ошибок при передаче данных между формами.
Разберем базовый способ, к которому часто прибегают разработчики на начальном этапе. Если форма другого документа уже получена или открыта, доступ к её табличной части осуществляется через свойство Объект формы. Коллекция табличной части содержит метод Добавить(), который создает новую строку и возвращает на нее ссылку.
Проанализируем пример кода на клиенте:
&НаКлиенте
Процедура ПеренестиСтроку(Команда)
// Получаем форму целевого документа
ФормаДокумента = ПолучитьФорму("Документ.ПараметрыНоменклатуры.Форма.ФормаДокумента");
// Добавляем новую строку в табличную часть Поставщики
НоваяСтрока = ФормаДокумента.Объект.Поставщики.Добавить();
// Заполняем реквизиты новой строки из текущих данных формы-источника
НоваяСтрока.Поставщик = Элементы.Поставщики.ТекущиеДанные.Поставщик;
// Открываем форму пользователю
ФормаДокумента.Открыть();
КонецПроцедуры
Важные особенности данного подхода:
ПолучитьФорму в управляемом приложении считается устаревшим. Стандарты разработки рекомендуют использовать функцию ОткрытьФорму.Более чистым и производительным решением в управляемом приложении является передача структуры данных через параметры при вызове функции ОткрытьФорму. В этом случае заполнение табличной части выполняется на сервере в момент создания формы.
Выясним, как устроена эта схема. На клиенте исходной формы формируется структура параметров с данными для переноса:
&НаКлиенте
Процедура ОткрытьИЗаполнить(Команда)
СтруктураСтроки = Новый Структура;
СтруктураСтроки.Вставить("Поставщик", Элементы.Поставщики.ТекущиеДанные.Поставщик);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ДанныеДляЗаполнения", СтруктураСтроки);
ОткрытьФорму("Документ.ПараметрыНоменклатуры.Форма.ФормаДокумента", ПараметрыОткрытия);
КонецПроцедуры
В целевой форме в обработчике события ПриСозданииНаСервере считываем переданный параметр и добавляем строки на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ДанныеДляЗаполнения") Тогда
Данные = Параметры.ДанныеДляЗаполнения;
НоваяСтрока = Объект.Поставщики.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Данные);
КонецЕсли;
КонецПроцедуры
Если требуется передать не одну строку, а всю табличную часть или массив из сотен строк, передавать их напрямую через параметры клиента неэффективно. В этом случае целесообразно использовать временное хранилище.
Рассмотрим алгоритм работы с временным хранилищем:
ТаблицуЗначений с помощью функции РеквизитФормыВЗначение.ПоместитьВоВременноеХранилище, а полученный адрес передается в параметрах открытия формы.ПриСозданииНаСервере данные извлекаются методом ПолучитьИзВременногоХранилища и загружаются в реквизит формы с помощью Загрузить или ЗначениеВРеквизитФормы.Платформа 1С поддерживает штатный параметр ЗначениеЗаполнения. При его использовании платформа автоматически вызывает процедуру ОбработкаЗаполнения модуля объекта на сервере.
Посмотрим на пример вызова формы с передачей значения заполнения:
&НаКлиенте
Процедура ЗаполнитьНаОснованииВыбранного(Команда)
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ИсточникДанных", Объект.Ссылка);
ПараметрыЗаполнения.Вставить("ОтборПоставщик", Элементы.Поставщики.ТекущиеДанные.Поставщик);
ПараметрыФормы = Новый Структура("ЗначениеЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Документ.ПараметрыНоменклатуры.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
В модуле объекта создаваемого документа в процедуре ОбработкаЗаполнения выполняется алгоритм выборки данных на сервере, что гарантирует высокий уровень производительности и корректное формирование документа.