В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП) (таких как Управление торговлей 11, ERP Управление предприятием, Комплексная автоматизация 2, Управление нашей фирмой), старые методы работы с внешними печатными формами (ВПФ) более не применимы — для удобного управления ими есть конструктор печатных форм в пользовательском режиме. В БСП механизмы печати стандартизированы, и прямое обращение к файлам обработок заменяется вызовами специализированных общих модулей.
В этой статье мы подробно разберем, как программно запустить печать внешней печатной формы в управляемых формах. Мы рассмотрим два основных сценария: вывод печатной формы на экран в стандартное окно предварительного просмотра БСП и получение готового табличного документа на сервере (например, для последующей отправки по электронной почте или сохранения в файл) без отображения интерфейса.
Если нам необходимо показать пользователю готовый макет для просмотра и последующей отправки на принтер, лучшим решением будет использование штатной общей формы БСП ОбщаяФорма.ПечатьДокументов. Этот способ хорош тем, что система автоматически применит все стандартные настройки, права доступа и параметры вывода.
Для реализации этого сценария нам потребуется передать структуру параметров в форму печати. Разберем по шагам, как написать такой обработчик на клиенте и сервере.
&НаКлиенте
Процедура Расш3_КомандаПечатьВнешнейФормы(Команда)
// Шаг 1. Находим ссылку на зарегистрированную ВПФ в справочнике БСП
СсылкаНаВПФ = НайтиВнешнююПечатнуюФормуСервер("Документ на склад");
Если СсылкаНаВПФ.Пустая() Тогда
ВызватьИсключение "Внешняя печатная форма 'Документ на склад' не найдена в справочнике Дополнительные отчеты и обработки!";
КонецЕсли;
// Шаг 2. Формируем массив объектов, которые мы хотим распечатать
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.Ссылка); // Ссылка на текущий документ
// Шаг 3. Инициализируем параметры открытия формы предпросмотра
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = СсылкаНаВПФ;
// Важно передать правильный идентификатор команды, который зарегистрирован в модуле ВПФ
ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыИсточника.ИдентификаторКоманды = "ВнешняяОбработка.ДокументНаСклад";
ПараметрыИсточника.ОбъектыНазначения = МассивОбъектов;
ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
// Шаг 4. Открываем стандартное окно предварительного просмотра БСП
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиВнешнююПечатнуюФормуСервер(НаименованиеВПФ)
Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеВПФ);
КонецФункции
Обратите внимание на важную деталь: в свойстве ИдентификаторКоманды необходимо указывать точное имя команды, прописанное в функции СведенияОВнешнейОбработке() самой ВПФ. В ряде версий БСП перед идентификатором команды требуется добавлять префикс типа обработки, например, ВнешняяОбработка.ДокументНаСклад вместо простого ДокументНаСклад. Если форма открывается пустой, проверьте именно этот параметр.
Вместо того чтобы вручную конструировать структуры параметров и вызывать ОткрытьФорму, мы можем воспользоваться готовым программным интерфейсом БСП. Метод общего модуля УправлениеПечатьюКлиент.ВыполнитьКомандуПечати берет на себя всю рутину по подготовке параметров и открытию окон.
Рассмотрим пример использования этого метода:
&НаКлиенте
Процедура ПечатьЧерезИнтерфейсБСП(Команда)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.Ссылка);
// Вызываем штатный метод БСП, который сам определит тип команды и выведет форму
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Справочник.ДополнительныеОтчетыИОбработки", // Менеджер печати (для ВПФ это всегда справочник доп. отчетов)
"ВнешняяОбработка.ДокументНаСклад", // Идентификатор команды ВПФ
МассивОбъектов, // Массив ссылок на документы
ЭтотОбъект // Владелец формы
);
КонецПроцедуры
Этот способ является наиболее предпочтительным с точки зрения стандартов разработки фирмы «1С», так как он обеспечивает максимальную совместимость при обновлении конфигурации и корректно обрабатывает фоновое выполнение длительных операций печати.
Часто перед разработчиком встает задача фоновой обработки документов. Например, нужно регламентным заданием сформировать печатную форму в формате PDF и отправить её клиенту на почту — для этой задачи есть модуль автоматической массовой рассылки печатных форм для БСП. В этом случае открывать клиентские формы нельзя, так как код выполняется на сервере в неинтерфейсном режиме.
Для решения этой задачи мы можем напрямую обратиться к механизму генерации печатных платформ БСП на сервере. Рассмотрим два способа реализации.
Это самый простой и лаконичный серверный способ. БСП берет на себя создание объекта обработки, инициализацию всех коллекций и запуск процедуры печати:
&НаСервереБезКонтекста
Функция ПолучитьТабличныйДокументВнешнейПечати(СсылкаНаДокумент, НаименованиеВПФ)
СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеВПФ);
Если СсылкаНаВПФ.Пустая() Тогда
ЗаписьЖурналаРегистрации("Печать", УровеньЖурналаРегистрации.Ошибка, , , "Не найдена ВПФ: " + НаименованиеВПФ);
Возврат Неопределено;
КонецЕсли;
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
// Подготовка параметров источника
ПараметрыИсточника = Новый Структура;
ПараметрыИсточника.Вставить("ИдентификаторКоманды", "ДокументНаСклад"); // Без префикса для серверного вызова
ПараметрыИсточника.Вставить("ОбъектыНазначения", МассивОбъектов);
// Инициализируем пустые структуры для результатов печати
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРСП", Новый ОписаниеТипов("Строка")); // Имя макета
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент", Новый ОписаниеТипов("ТабличныйДокумент"));
КоллекцияПечатныхФорм.Колонки.Добавить("Экземпляров", Новый ОписаниеТипов("Число"));
КоллекцияПечатныхФорм.Колонки.Добавить("ПутьКМакету", Новый ОписаниеТипов("Строка"));
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Вызов формирования печатной формы на сервере
УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
СсылкаНаВПФ,
ПараметрыИсточника,
КоллекцияПечатныхФорм,
ОбъектыПечати,
ПараметрыВывода
);
// Если форма успешно сформирована, возвращаем первый табличный документ
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
Возврат КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Если вам требуется переопределить логику или выполнить тонкую настройку перед запуском печати, вы можете загрузить объект ВПФ во временную память сервера напрямую из хранилища двоичных данных БСП с помощью функции ОбъектВнешнейОбработки():
&НаСервереБезКонтекста
Функция СформироватьПечатьНапрямуюИзОбъекта(СсылкаНаДокумент, СсылкаНаВПФ)
// Получаем готовый объект обработки из безопасного хранилища БСП
ВПФОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаВПФ);
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
// Инициализируем стандартные коллекции параметров БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ДокументНаСклад");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем экспортную процедуру "Печать" из модуля внешней обработки
ВПФОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Проверяем результат работы процедуры
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
Возврат КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Этот способ наиболее гибок, так как он не обращается к глобальным механизмам регистрации команд БСП напрямую, а работает с интерфейсом самой обработки. Главное условие — процедура Печать в модуле объекта ВПФ должна иметь стандартную директиву Экспорт и принимать ровно 4 описанных параметра. Для дополнительной настройки и доработки уже сформированных макетов можно применить инструмент постобработки печатных форм БСП.
При использовании программного вызова печатных форм обязательно учитывайте изменения, которые вносятся в новые версии Библиотеки стандартных подсистем:
ВнешниеОбработки.Подключить() платформа может заблокировать выполнение кода. Использование штатной функции ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки() гарантирует, что обработка подключится с теми разрешениями безопасности, которые ей были назначены администратором при регистрации в справочнике.КоллекцияПечатныхФорм при передаче между сервером и клиентом может отличаться от привычной ТаблицыЗначений (она может преобразовываться в массив структур для совместимости с веб-клиентом). При ручном написании алгоритмов печати всегда используйте конструктор УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм() вместо ручного создания таблиц.Применяя описанные подходы, мы сохраняем стабильность кода при обновлениях типовых конфигураций и обеспечиваем корректную работу механизмов печати в полном соответствии со стандартами разработки БСП.