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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Решение проблемы с заполнением табличной части из документов

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

Для корректного сбора данных из нескольких документов РеализацияТоваровУслуг следует использовать механизм Запрос на сервере. Это позволяет эффективно выбрать нужные данные и выгрузить их в таблицу, которую 1С «поймет» и успешно загрузит в Объект.Товары.

Рассмотрим пример кода, который решает эту задачу:


&НаСервере
Функция ЗаполнитьТоварИзМассива(ДокМассив)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
        |    РеализацияТоваровУслугТовары.Количество КАК Количество,
        |    РеализацияТоваровУслугТовары.Склад КАК Склад
        |ИЗ
        |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        |ГДЕ
        |    РеализацияТоваровУслугТовары.Ссылка В(&Массив)";
    
    Запрос.УстановитьПараметр("Массив", ДокМассив);
    ТаблицаДанных = Запрос.Выполнить().Выгрузить();
    Объект.Товары.Загрузить(ТаблицаДанных);
КонецФункции

Как вывести данные в печатную форму, если пользователь уже изменил табличную часть

Часто возникает вопрос: нужно ли сохранять данные в базу данных, чтобы распечатать их? Ответ — нет. Если пользователь ввел данные во внешней обработке, они находятся в памяти формы. Чтобы получить их в печатной форме, нужно преобразовать данные формы в объект.

Для этого мы используем метод РеквизитФормыВЗначение("Объект"). Этот метод позволяет получить «живой» объект обработки, который содержит все текущие строки табличной части, включая те, что внес пользователь.

  1. Получение объекта на сервере: используем РеквизитФормыВЗначение("Объект").
  2. Перебор строк: обходим табличную часть полученного объекта через Для каждого СтрокаТЧ Из ОбъектОбработки.Товары Цикл.
  3. Заполнение макета: используем метод Параметры.Заполнить(СтрокаТЧ) для каждой области макета. Это значительно ускоряет разработку, так как имена колонок ТЧ и параметров макета при совпадении имен заполняются автоматически.

Важные рекомендации по архитектуре

Для эффективной работы в управляемом приложении всегда разделяйте логику на клиентскую и серверную части:

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

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

← На главную