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

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

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

Выясним причину: почему данные формы недоступны при печати

Рассмотрим, как устроена архитектура управляемого приложения в платформе «1С:Предприятие 8.3». Печать документов выполняется на стороне сервера — в модуле менеджера объекта или в специализированных общих модулях подсистемы печати. На сервере формируется табличный документ на основе данных, прочитанных из базы данных.

Существует несколько принципиальных причин, почему нельзя обращаться к данным формы при формировании печатной формы:

  1. Клиент-серверное разделение: Контекст управляемой формы (элементы формы, их текущие значения и локальные реквизиты формы) существует исключительно на клиенте. В серверных процедурах печати ссылка на форму или её элемент недоступна.
  2. Печать без открытия формы: В реальной работе пользователи часто вызывают печать из списков документов или выполняют групповую печать (пакетную печать нескольких выделенных документов). В этот момент форма документа вообще не создается и не открывается в оперативной памяти.
  3. Динамические (вторичные) данные: Значения, которые рассчитываются на форме «на лету» (например, при открытии или изменении других реквизитов), не сохраняются в физических таблицах базы данных. Поэтому стандартный запрос печати, выбирающий данные документа из базы, о них «не знает».

Способ 1. Воспроизведение алгоритма расчета в процедуре печати

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

Рассмотрим пошаговый порядок действий:

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

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


// Функция в модуле менеджера документа
Функция РассчитатьВторичныеДанные(СсылкаНаДокумент) Экспорт

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

    Возврат РасчитанныеДанные;

КонецФункции

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

Способ 2. Передача параметров печати из формы (архитектура БСП)

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

Если печать вызывается непосредственно из интерактивного сеанса с открытой формой, мы можем сформировать структуру дополнительных параметров и передать её на сервер. Однако важно предусмотреть фолбэк (резервный расчет) на случай, если печать запускается из списка документов, когда форма не открыта:


// В процедуре формирования печатной формы
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("РасчетныйПоказатель") Тогда
    // Используем готовое значение, переданное из формы
    ЗначениеДляПечати = ПараметрыПечати.РасчетныйПоказатель;
Иначе
    // Форма не была открыта — выполняем серверный расчет на основе данных БД
    ЗначениеДляПечати = РассчитатьЗначениеПоБазе(СсылкаНаДокумент);
КонецЕсли;

Способ 3. Сохранение данных в структуре объекта или регистрах

Если реквизиты, отображаемые на форме, имеют юридическую или финансовую значимость для печатного документа, рассчитывать их динамически в момент печати может быть рискованно. Если со временем изменится документ-источник или нормативные справочники, повторная печать старого документа сформирует искаженные данные.

В таких ситуациях проанализируем архитектурные альтернативы:

  1. Добавление реквизита в конфигураторе: Если конфигурация находится в разработке, реквизит следует добавить непосредственно в объект метаданных (документ) и записывать его при проведении или сохранении формы.
  2. Использование дополнительных реквизитов (БСП): Если конфигурация типовая и находится на поддержке, можно использовать механизмы дополнительных реквизитов и сведений.
  3. Запись в регистр сведений: Зафиксируем данные в независимом или подчиненном регистре сведений при проведении документа, после чего легко прочитаем их запросом в процедуре печати.

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

← На главную