Как правильно добавить и вывести новый реквизит в макет печатной формы документа в 1С:Предприятие 8

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

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

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

Критическая архитектурная ошибка: Реквизит формы против Реквизита объекта

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

Разберем подробно разницу между этими понятиями:

  1. Реквизит формы — это временный элемент интерфейса. Он создается исключительно для отображения информации на экране пользователя в конкретном сеансе работы с формой. Этот реквизит существует в оперативной памяти клиента (или во временном контексте сервера формы) только до тех пор, пока диалоговое окно документа открыто. При закрытии формы данные бесследно исчезают, они не записываются в базу данных.
  2. Реквизит объекта (метаданных) — это постоянное поле базы данных. Оно создается в конфигураторе внутри структуры конкретного документа (например, в ветке Реквизиты документа РеализацияТоваровУслуг). Данные этого поля записываются в физическую таблицу СУБД и хранятся там постоянно.

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

Правильное решение: Чтобы значение реквизита гарантированно попало на печать, его необходимо добавить в список реквизитов самого объекта конфигурации (документа), вынести на форму для заполнения пользователем, сохранить документ в базу данных и только после этого приступать к доработке алгоритма печати.

Безопасные методы доработки печатных форм

Если мы работаем с типовой конфигурацией (например, 1C:Бухгалтерия, 1С:ERP Управление предприятием или 1С:Управление торговлей), крайне не рекомендуется вносить изменения напрямую в основную конфигурацию. Это усложнит поддержку и автоматическое обновление системы. Рассмотрим три безопасных альтернативных пути решения задачи.

Вариант А. Использование расширения конфигурации (Рекомендуемый способ)

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

  1. Создаем новое расширение в конфигураторе (меню КонфигурацияРасширения конфигурации).
  2. Находим в основной конфигурации наш документ, кликаем по нему правой кнопкой мыши и выбираем Добавить в расширение.
  3. В расширении добавляем к заимствованному документу новый собственный реквизит (он автоматически получит префикс расширения, например, расш_МойНовыйРеквизит).
  4. Заимствуем макет печатной формы и модуль менеджера документа в наше расширение.
  5. В модуле менеджера расширения перехватываем процедуру печати. Для этого используется аннотация &Вместо или &После в зависимости от структуры кода БСП (Библиотеки стандартных подсистем).

Вариант Б. Внешняя печатная форма

Этот метод идеален, когда изменения вносятся локально и основную базу вообще нельзя трогать (даже через расширения). Мы создаем внешнюю обработку (файл с расширением .epf), переносим туда макет печатной формы и код ее заполнения. Подключение такой формы выполняется в режиме «1С:Предприятие» через справочник Дополнительные отчеты и обработки. Единственный минус — новый реквизит все равно придется где-то хранить (либо добавлять его в саму базу, либо использовать механизм дополнительных реквизитов).

Вариант В. Дополнительные реквизиты БСП (Без программирования)

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

Пошаговый технический алгоритм вывода реквизита в макет

Предположим, мы уже добавили реквизит МойНовыйРеквизит (тип Строка) в метаданные документа и заполнили его на форме. Теперь рассмотрим подробнее, как программно вывести его в подвал печатной формы.

Шаг 1. Редактирование макета табличного документа

Откроем макет печатной формы в конфигураторе и выполним следующие действия:

  1. Найдем область, отвечающую за вывод подвала документа. Обычно эта область называется Подвал, Итого или ПодвалТаблицы.
  2. Выберем ячейку в табличном документе макета, где должен отображаться наш текст.
  3. Введем имя будущего параметра, например: МойДополнительныйТекст.
  4. Выделим эту ячейку, нажмем клавишу F4 для открытия палитры свойств.
  5. В свойстве Заполнение изменим значение со стандартного Текст на значение Параметр. Теперь платформа понимает, что вместо написанного слова в эту ячейку нужно подставить реальные данные из кода.

Шаг 2. Модернизация запроса в процедуре печати

Большинство современных печатных форм в системе «1С» формируются пакетным методом с помощью запросов к базе данных. Нам необходимо убедиться, что наш новый реквизит выбирается запросом.

Найдем в модуле менеджера документа процедуру, отвечающую за формирование печатной формы (например, СформироватьПечатнуюФорму() или ПечатьДокумента()). Найдем внутри этой процедуры текст запроса и добавим наше поле:


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

Шаг 3. Заполнение параметров макета в коде

После того как данные получены из базы данных с помощью запроса, нам нужно передать их в параметры области макета непосредственно перед выводом на экран или на печать.

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


// Выполняем запрос и начинаем выборку данных
ВыборкаДокументов = Запрос.Выполнить().Выбрать();

Пока ВыборкаДокументов.Следующий() Цикл
    
    // Создаем результирующий табличный документ, если он еще не создан
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    // 1. Получаем область подвала из макета
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    
    // 2. Передаем значение нашего реквизита в параметр макета
    ОбластьПодвал.Параметры.МойДополнительныйТекст = ВыборкаДокументов.МойНовыйРеквизит;
    
    // (Альтернативный вариант: если печать строится без запроса, напрямую через объект)
    // ОбластьПодвал.Параметры.МойДополнительныйТекст = СсылкаНаДокумент.МойНовыйРеквизит;
    
    // 3. Выводим заполненную область в итоговый документ
    ТабличныйДокумент.Вывести(ОбластьПодвал);
    
КонецЦикла;

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

Резюме и рекомендации

Подводя итоги, повторим ключевые правила успешного вывода новых реквизитов в печатные формы:

← На главную