В процессе разработки внешних обработок на управляемых формах часто возникают вопросы, связанные с передачей данных между клиентом и сервером, а также с правильным заполнением табличных частей. Разберем по шагам, как решить проблему «Несоответствие типов» и как организовать вывод данных в печатную форму, если пользователь уже внес изменения в табличную часть.
Основная сложность, с которой столкнулся автор, заключалась в попытке использовать метод Загрузить() для массива. Важно помнить, что метод Загрузить() ожидает на вход таблицу значений, а не массив объектов.
Для корректного сбора данных из нескольких документов РеализацияТоваровУслуг следует использовать механизм Запрос на сервере. Это позволяет эффективно выбрать нужные данные и выгрузить их в таблицу, которую 1С «поймет» и успешно загрузит в Объект.Товары.
Рассмотрим пример кода, который решает эту задачу:
&НаСервере
Функция ЗаполнитьТоварИзМассива(ДокМассив)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровУслугТовары.Количество КАК Количество,
| РеализацияТоваровУслугТовары.Склад КАК Склад
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&Массив)";
Запрос.УстановитьПараметр("Массив", ДокМассив);
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
Объект.Товары.Загрузить(ТаблицаДанных);
КонецФункции
Часто возникает вопрос: нужно ли сохранять данные в базу данных, чтобы распечатать их? Ответ — нет. Если пользователь ввел данные во внешней обработке, они находятся в памяти формы. Чтобы получить их в печатной форме, нужно преобразовать данные формы в объект.
Для этого мы используем метод РеквизитФормыВЗначение("Объект"). Этот метод позволяет получить «живой» объект обработки, который содержит все текущие строки табличной части, включая те, что внес пользователь.
РеквизитФормыВЗначение("Объект").Для каждого СтрокаТЧ Из ОбъектОбработки.Товары Цикл.Параметры.Заполнить(СтрокаТЧ) для каждой области макета. Это значительно ускоряет разработку, так как имена колонок ТЧ и параметров макета при совпадении имен заполняются автоматически.Для эффективной работы в управляемом приложении всегда разделяйте логику на клиентскую и серверную части:
Использование РеквизитФормыВЗначение является наиболее правильным подходом при печати из обработок, так как это гарантирует, что в печатную форму попадут именно те данные, которые видит пользователь в данный момент на экране. При этом сохранение документа в базу (вызов Записать()) не требуется, что делает работу приложения быстрее и избавляет от необходимости создавать лишние записи в базе данных.
Помните, что для вывода печатных форм в типовых конфигурациях принято использовать подсистему УправлениеПечатью. Она ожидает на выходе сформированный ТабличныйДокумент, который вы можете передать в коллекцию печатных форм. Это стандарт, который делает вашу разработку совместимой с остальной частью конфигурации.