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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто встречается ситуация, когда типовую конфигурацию не хотят снимать с поддержки или изменять визуально в конфигураторе. В таких случаях разработчики прибегают к программному добавлению элементов на форму. Однако при попытке вывести эти данные в печатную форму возникают сложности: данные «не видны» в модуле менеджера или обработке печати. Проанализируем эту ситуацию, выясним причины и найдем правильные способы решения проблемы.

Понимание природы данных: Реквизит формы против Реквизита объекта

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


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

Здесь мы видим использование метода Элементы.Добавить. Важно понимать: этот метод создает только визуальный элемент (колонку в таблице на экране). Чтобы этот элемент работал, свойство ПутьКДанным должно указывать на существующий реквизит в структуре данных.

Существует три варианта того, где на самом деле могут находиться данные:

  1. Реквизит добавлен в метаданные в конфигураторе: Поле реально существует в таблице базы данных (SQL), но его просто решили не выводить «мышкой» на форму, а добавить кодом.
  2. Реквизит добавлен программно через ИзменитьРеквизиты(): В этом случае поле создается динамически только в оперативной памяти формы. В базе данных его нет, и после закрытия формы данные исчезают.
  3. Данные хранятся в доп. сведениях или регистрах: Визуально это выглядит как колонка ТЧ, но программно данные подтягиваются из другого места.

Почему данных нет в модуле печати

Проанализируем работу механизмов печати (особенно в конфигурациях на базе БСП, таких как УНФ, УТ 11 или ERP). Когда вы нажимаете кнопку «Печать», система не берет данные из открытой вами формы. Вместо этого она обращается к модулю менеджера документа или специальной обработке печати.

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

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

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


ВЫБРАТЬ
    РасходнаяНакладнаяЗапасы.КоличествоПринятоПокупателем
ИЗ
    Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ГДЕ
    РасходнаяНакладнаяЗапасы.Ссылка = &Ссылка

Если система выдает ошибку «Поле не найдено», значит, реквизит является чисто экранным (динамическим) и в базе его нет. В этом случае печать из базы невозможна, пока вы не обеспечите сохранение этих данных в реальные таблицы (например, через механизм Дополнительных Реквизитов).

Шаг 2: Модификация запроса для печати

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

Рассмотрим пример того, как нужно дополнить запрос:


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

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

Шаг 3: Передача данных в макет

Теперь, когда данные получены из базы, проанализируем процесс заполнения параметров макета. Посмотрим на типовой код заполнения области:


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

Важно: Убедитесь, что в самом макете (таблице mxl) вы создали соответствующий параметр и назвали его точно так же, как поле в запросе (в нашем примере — КоличествоПринято).

Что делать, если поле существует только на форме?

Если выяснилось, что поле добавлено через ИзменитьРеквизиты() на форме и не сохраняется в базу, стандартный путь через запрос в модуле менеджера не сработает. В такой ситуации рассмотрим альтернативный вариант: Печать с контекстом формы.

В этом случае вы не вызываете серверную команду печати БСП, а формируете печатную форму прямо из модуля формы, передавая туда таблицу Объект.Запасы в качестве источника данных.


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

Однако помните, что это считается «плохим тоном» в архитектуре 1С, так как печатные формы должны быть независимы от состояния экрана пользователя. Правильным решением будет всё же создание реального реквизита в конфигурации или расширении.

Резюме для разработчика

Подведем итоги нашего исследования:

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

← На главную