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