Как передать параметры во внешнюю печатную форму на базе БСП для выбора варианта макета?

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

При переходе со старых конфигураций 1С («ламповых», как выразился автор темы) на современные решения, построенные на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются с изменением привычных механизмов. Одним из таких изменений является работа с внешними печатными формами (ВПФ). Раньше мы могли легко передать произвольные параметры через ДополнительныеСвойства, но в БСП подход стал более структурированным и требует иного понимания архитектуры взаимодействия системы и внешней обработки.

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

Способ 1: Использование идентификаторов команд

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

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


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
    ПараметрыРегистрации.Наименование = "Групповое формирование доп. соглашений";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    // Добавляем первую команду
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Доп. соглашение (Аренда)";
    НоваяКоманда.Идентификатор = "ВариантАренда";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    // Добавляем вторую команду
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Доп. соглашение (Услуги)";
    НоваяКоманда.Идентификатор = "ВариантУслуги";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

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


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

Способ 2: Использование скрытых «Дополнительных параметров»

Иногда плодить десятки идентификаторов неудобно, особенно если логика должна меняться динамически или зависеть от настроек, которые администратор задает в интерфейсе справочника «Дополнительные отчеты и обработки». Посмотрим на колонку Дополнительные параметры в таблице команд.

Эта колонка позволяет хранить произвольную строку, которую можно использовать как хранилище настроек (например, в формате JSON). Рассмотрим пример, где мы передаем признак необходимости вывода подвала макета:


// В функции СведенияОВнешнейОбработке
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Счет с подписью";
НоваяКоманда.Идентификатор = "СчетНаОплату";
НоваяКоманда.ДополнительныеПараметры = "{""ВыводитьПодпись"": true, ""ТипЦены"": ""Оптовая""}";
// ...

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


Процедура Печать(МассивОбъектовНазначения, ПараметрыВыполнения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Извлекаем строку параметров
    СтрокаПараметров = ПараметрыВыполнения.ДополнительныеПараметры;
    
    // Если параметры переданы, прочитаем их (используя удобный механизм JSON)
    Если ЗначениеЗаполнено(СтрокаПараметров) Тогда
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(СтрокаПараметров);
        Настройки = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
        
        Если Настройки.ВыводитьПодпись Тогда
            // Логика вывода с подписью
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3: Интерактивный выбор через форму обработки

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

Разберем этот алгоритм по шагам:

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

Важный технический нюанс: при открытии формы внешняя обработка уже должна знать, для каких объектов она вызвана. Эти данные передаются в параметрах формы под ключом ОбъектыНазначения.

Способ 4: Использование «Дополнительных сведений» объекта

Часто бывает так, что логика печати зависит не от желания пользователя в момент нажатия кнопки, а от свойств самого документа (например, в документе есть доп. сведение «Вид договора»). В этом случае нам вообще не нужны параметры самой обработки. Мы можем в коде ВПФ обратиться к метаданным объекта.

Проанализируем пример получения дополнительного сведения в контексте печати:


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

Используя этот метод внутри цикла обработки МассивОбъектовНазначения, мы можем динамически менять макет для каждого конкретного документа в пачке печатных форм.

Особенности отладки параметров в БСП

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

Подведем итог нашему исследованию. Хотя старые «ламповые» ДополнительныеСвойства ушли в прошлое, БСП предоставляет гораздо более гибкий инструментарий. Мы можем использовать идентификаторы для разделения команд в интерфейсе, скрытые JSON-параметры для тонкой настройки логики администратором, интерактивные формы для выбора параметров пользователем или опираться на дополнительные сведения самих объектов печати. Выбор конкретного метода зависит от того, насколько часто должны меняться эти параметры и кто несет ответственность за их настройку.

← На главную