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