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

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

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

Общая концепция решения через клиентский метод

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

Шаг 1. Регистрация внешней печатной формы

Первым делом проанализируем функцию СведенияОВнешнейОбработке в модуле объекта нашей обработки. Здесь критически важно правильно заполнить таблицу команд. Основное отличие заключается в колонке Использование.


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

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

Шаг 2. Создание формы ввода параметров

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

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


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

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

Шаг 3. Получение параметров на стороне сервера

Теперь выясним, как получить эти данные в модуле объекта при формировании табличного документа. В БСП процедура Печать имеет определенную сигнатуру. Среди входящих аргументов есть ПараметрыПечати. Именно туда система поместит ту структуру, которую мы упаковали на клиенте.


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

Дополнительные рекомендации по удобству работы

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

  1. Сохранение настроек. Чтобы пользователю не приходилось вводить свою фамилию при каждой печати, воспользуемся хранилищем общих настроек. В обработчике формы ПриСозданииНаСервере мы можем прочитать сохраненные значения, а при нажатии на кнопку печати — сохранить их обратно. Используйте метод ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить.
  2. Использование временного хранилища. Если пользователь передает сложные данные (например, таблицу значений или массив структур), их лучше не передавать напрямую через параметры формы (т.к. есть ограничения на объем передаваемых данных в URL или структурах вызова). В этом случае на клиенте данные помещаются в хранилище через ПоместитьВоВременноеХранилище, а передается только строковый адрес.
  3. Проверка заполнения. Не забывайте проверять обязательные поля прямо в форме параметров. Нет смысла открывать пустую форму печати, если пользователь забыл указать ключевой параметр. Используйте стандартный механизм ПроверитьЗаполнение().
  4. Интеграция с БСП. Обратите внимание, что при использовании ОбщаяФорма.ПечатьДокументов вы сохраняете пользователю весь привычный функционал: возможность отправить документ по e-mail, сохранить его в PDF или отредактировать перед печатью.

Типичные ошибки при реализации

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

Разберем пример такой процедуры в модуле формы:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    
    // Заполняем служебные реквизиты формы, чтобы знать, что мы печатаем
    Объект.ОбъектыНазначенияСписок.Очистить();
    Для Каждого Ссылка Из ОбъектыНазначения Цикл
        Объект.ОбъектыНазначенияСписок.Добавить(Ссылка);
    КонецЦикла;
    
    // Если объект один, можно заполнить основной реквизит для удобства
    Если ОбъектыНазначения.Количество() > 0 Тогда
        Объект.СсылкаНаОбъект = ОбъектыНазначения[0];
    КонецЕсли;
    
    // Теперь форма открыта, пользователь видит её и может заполнить поля
КонецПроцедуры

Подводя итог, можно сказать, что механизм передачи параметров во внешние печатные формы является гибким инструментом. Главное — четко разделять клиентский контекст (ввод данных пользователем) и серверный контекст (формирование ТабличныйДокумент на основе макета). Использование стандартных форм БСП (ПечатьДокументов) гарантирует единообразие интерфейса системы и корректную работу всех вспомогательных сервисов программы. При необходимости можно взять за основу готовую печатную форму с запросом данных в форму «Печать документов».

← На главную