Как передать значение флажка из формы документа во внешнюю печатную форму 1С

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

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

Проблема контекста выполнения

Прежде всего, проанализируем ситуацию. Когда мы нажимаем кнопку «Печать», код внешней обработки обычно выполняется на сервере. В этот момент форма документа может быть уже недоступна напрямую, особенно если печать инициируется из списка документов. Если флажок ПечатьШапка — это просто реквизит формы, то он существует только «в памяти» этой конкретной открытой формы. Нам нужно найти надежный «мостик» для передачи этого значения в модуль внешней печатной формы (ВПФ).

Способ 1: Создание нескольких команд печати

Как справедливо отмечено в обсуждении, самый дружелюбный для пользователя и надежный с точки зрения кода вариант — это разделение одной команды на две. Вместо того чтобы заставлять пользователя сначала ставить галочку, а потом жать «Печать», мы предлагаем ему сразу выбрать нужный вариант в меню «Печать».

Рассмотрим, как это реализовать в модуле внешней обработки. В функции СведенияОВнешнейОбработке() мы регистрируем две разные команды:


ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();

НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать с шапкой";
НоваяКоманда.Идентификатор = "РеализацияСШапкой";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();

НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать БЕЗ шапки";
НоваяКоманда.Идентификатор = "РеализацияБезШапки";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();

Затем в процедуре Печать() мы просто анализируем Идентификатор команды:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    Для Каждого СтрокаКоллекции Из КоллекцияПечатныхФорм Цикл
        Если СтрокаКоллекции.ИмяМакета = "РеализацияСШапкой" Тогда
            СформироватьПечатнуюФорму(МассивОбъектов, Истина, СтрокаКоллекции.ТабличныйДокумент);
        ИначеЕсли СтрокаКоллекции.ИмяМакета = "РеализацияБезШапки" Тогда
            СформироватьПечатнуюФорму(МассивОбъектов, Ложь, СтрокаКоллекции.ТабличныйДокумент);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Этот метод исключает ошибки «объект не найден» или «реквизит формы недоступен», так как логика полностью инкапсулирована внутри обработки.

Способ 2: Использование структуры ДополнительныеПараметрыПечати (БСП)

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

Для этого в форме документа нам потребуется перехватить формирование параметров печати. Рассмотрим пример кода в модуле формы:


&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
    
    // Подготавливаем параметры печати
    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ПечатьШапка", ЭтаФорма.ПечатьШапка);
    
    // Передаем структуру в стандартный механизм БСП
    УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        "Документ.РеализацияТоваровУслуг",
        "ВнешняяПечатнаяФормаИмя",
        Объект.Ссылка,
        ЭтаФорма,
        ДополнительныеПараметры);
        
КонецПроцедуры

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

Способ 3: Доступ через ВладелецФормы

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

  1. В настройках ВПФ указываем тип вызова ОткрытиеФормы.
  2. В модуле формы внешней обработки в процедуре ПриСозданииНаСервере или в экспортном методе на клиенте пишем:

&НаКлиенте
Процедура СформироватьПечать()
    // Проверяем, что владельцем является форма документа
    Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") Тогда
        Попытка
            ЗначениеФлажка = ВладелецФормы.ПечатьШапка;
        Исключение
            ЗначениеФлажка = Ложь; // Значение по умолчанию
        КонецПопытки;
    КонецЕсли;
    // Далее передаем ЗначениеФлажка в серверную функцию печати
КонецПроцедуры

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

Способ 4: Реализация собственной формы настройки в ВПФ

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

  1. В составе внешней обработки создаем форму (например, ФормаНастройки).
  2. Добавляем на нее флажок ПечатьШапка и кнопку «Печать».
  3. При вызове команды из документа сначала открываем эту форму.
  4. Пользователь делает выбор, нажимает кнопку, и уже из этой формы запускается формирование ТабличныйДокумент.

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

Способ 5: Использование расширений (самый надежный способ)

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


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

Подведем итоги

Выбор метода зависит от ваших архитектурных предпочтений. Если вам нужна простота и стабильность — используйте Способ 1 (две команды). Если вы хотите сохранить интерфейс документа без изменений и передать данные «на лету» — используйте Способ 2 (параметры печати). Если же вы стремитесь к универсальности и независимости от изменений основной базы — Способ 4 (собственная форма настройки) будет лучшим выбором.

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

← На главную