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