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