Как вывести реквизит документа в печатную форму 1С 8.3?

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

Переход с платформы 1С 7.7 на 8.3 часто вызывает вопросы у разработчиков, так как механизмы работы с печатными формами претерпели значительные изменения. Одной из базовых задач является вывод значения реквизита документа (например, перечисления или ссылки на справочник) в ячейку табличного документа. Разберем по шагам, как правильно настроить макет и написать программный код для заполнения параметров.

Анализ ситуации: почему ячейка остается пустой

Проанализируем типичную ситуацию: в документе есть реквизит НомерДень с типом ПеречислениеСсылка.КалендарьДень. В макете печатной формы создана ячейка, для которой в свойстве "Заполнение" выбрано значение Параметр, а сам параметр назван КалендарьДень. Однако при выводе на печать поле остается пустым.

Выясним причину: в отличие от версии 7.7, где связь между переменными макета и данными могла быть более жесткой, в 8.3 табличный документ — это объект, который нужно наполнять данными программно. Просто создать параметр в макете недостаточно, необходимо передать в него значение из кода перед тем, как область будет выведена в итоговый документ.

Настройка макета (MXL)

Прежде чем переходить к коду, проверим настройки в самом макете. Рассмотрим основные моменты:

  1. Выделим нужную ячейку.
  2. В палитре свойств найдем раздел Макет.
  3. Установим свойство Заполнение в значение Параметр.
  4. В поле Параметр впишем имя, например, КалендарьДень.

Важно помнить: если вы хотите вывести текст вместе с параметром (например, "День № 3"), следует выбрать тип заполнения Шаблон и использовать квадратные скобки: День № [КалендарьДень].

Программное заполнение параметров

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


// 1. Получаем макет из метаданных документа
Макет = ПолучитьМакет("Печать");

// 2. Получаем конкретную область (например, Шапка)
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");

// 3. Заполняем параметр конкретным значением из реквизита документа
// Предположим, что ТекущийОбъект — это ссылка на наш документ
ОбластьМакета.Параметры.КалендарьДень = Ссылка.НомерДень;

// 4. Выводим заполненную область в итоговый табличный документ
ТабДок.Вывести(ОбластьМакета);

Обратите внимание на объект Параметры. Это коллекция, которая содержит все именованные параметры, созданные вами в данной области макета. Если вы пропустите шаг присвоения значения ОбластьМакета.Параметры.ИмяПараметра = Значение, 1С не "догадается" сама подставить данные, даже если имена совпадают.

Особенности работы с перечислениями

Если реквизит имеет тип ПеречислениеСсылка, то при простой передаче ссылки в параметр (как в примере выше), 1С автоматически выведет Синоним этого значения. Рассмотрим ситуацию, когда вам нужно вывести не синоним, а внутреннее имя значения перечисления. Для этого проанализируем следующий метод:


ЗначениеПеречисления = Ссылка.НомерДень;
ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;
ИндексЗначения = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначения].Имя;

ОбластьМакета.Параметры.КалендарьДень = ИмяЗначения;

Однако в большинстве бизнес-задач достаточно стандартного вывода через ОбластьМакета.Параметры.Заполнить(Ссылка). Этот метод автоматически сопоставляет имена реквизитов документа и имена параметров в макете, значительно сокращая объем кода.

Использование модуля менеджера и запросов

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


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

Использование запроса позволяет избежать лишних обращений к базе данных "через точку" (например, Ссылка.Организация.Наименование) и обеспечивает высокую производительность системы.

Типичные ошибки, которые стоит проверить

Если после выполнения всех инструкций ячейка всё еще пуста, проанализируем следующие моменты:

  1. Область получения макета: Проверьте, что вы получаете макет именно того объекта (документа или обработки), в котором он создан. Команда ПолучитьМакет() ищет его в текущем объекте.
  2. Порядок вывода: Параметры должны быть заполнены ДО вызова метода Вывести(). Изменения в параметрах области после вывода в ТабДок не отобразятся в итоговой форме.
  3. Свойства ячейки: Убедитесь, что в макете не установлен белый цвет шрифта или слишком узкая колонка, которая скрывает текст.
  4. Пустая ссылка: Если реквизит в документе не выбран (пустая ссылка), то и в печатной форме будет пустота. Для отладки можно принудительно присвоить строку: Область.Параметры.КалендарьДень = "Тест".

Таким образом, мы выяснили, что ключ к успеху в 8.3 — это явное управление параметрами области макета через коллекцию Параметры и понимание жизненного цикла формирования табличного документа.

← На главную