При разработке внешних обработок часто возникает задача интеграции с типовыми механизмами конфигурации. Одной из самых востребованных функций является печать документов, в частности, договоров контрагентов. В современных конфигурациях 1С (таких как Бухгалтерия предприятия 3.0, Управление торговлей 11 или ERP), работающих на базе Библиотеки стандартных подсистем (БСП), этот процесс унифицирован, но имеет свои нюансы. Разберем по шагам, как реализовать печать договора программно.
Прежде чем приступать к написанию кода, проанализируем, как устроена печать в управляемых формах. В большинстве случаев печать инициируется через общие модули управления печатью. Нам не нужно заново описывать макет или логику заполнения параметров — достаточно правильно вызвать существующий в конфигурации обработчик. Основная логика печати обычно сосредоточена в модуле менеджера объекта (в нашем случае — Справочник.ДоговорыКонтрагентов) и специализированных клиентских модулях.
Рассмотрим два основных пути решения задачи: использование универсальной команды БСП и прямой вызов обработчика печати текста договора.
Это наиболее правильный и "чистый" метод с точки зрения архитектуры БСП. Мы вызываем общую процедуру, которая сама определяет, какие формы доступны для объекта, и выводит их пользователю. Выясним, как это выглядит в коде формы вашей внешней обработки.
Предположим, на форме вашей обработки есть реквизит ВыбранныйДоговор с типом СправочникСсылка.ДоговорыКонтрагентов. Для печати нам потребуется создать массив, так как механизмы печати всегда ориентированы на коллективную работу с объектами.
&НаКлиенте
Процедура ПечатьДоговора(Команда)
// Проверим, выбран ли договор на форме
Если НЕ ЗначениеЗаполнено(Объект.ВыбранныйДоговор) Тогда
Сообщить("Пожалуйста, выберите договор для печати!");
Возврат;
КонецЕсли;
// Механизмы печати БСП всегда принимают массив ссылок
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.ВыбранныйДоговор);
// Параметры печати (могут быть пустыми)
ПараметрыПечати = Новый Структура;
// Вызов стандартной команды печати
// Идентификатор "Договор" соответствует имени команды в модуле менеджера
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Справочник.ДоговорыКонтрагентов",
"Договор",
МассивОбъектов,
ЭтаФорма,
ПараметрыПечати);
КонецПроцедуры
В данном примере функция УправлениеПечатьюКлиент.ВыполнитьКомандуПечати берет на себя всю работу по открытию формы печати, формированию табличного документа или документа Word/OpenOffice.
В некоторых конфигурациях, например в "Бухгалтерии предприятия", договоры печатаются по особым правилам (через шаблоны). В этом случае полезно рассмотреть возможность вызова конкретного обработчика. Проанализируем пример кода из типового модуля, который отвечает за формирование текста договора.
Для реализации этого метода нам понадобится обратиться к модулю ПечатьДоговоровКлиент. Выясним причину использования именно этого способа: он позволяет более гибко управлять процессом, если стандартная команда по каким-то причинам не подходит.
&НаКлиенте
Процедура РаспечататьТекстДоговора(Команда)
МассивДоговоров = Новый Массив;
МассивДоговоров.Добавить(Объект.ВыбранныйДоговор);
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("Источник", ЭтаФорма);
// Прямой вызов обработчика печати текста
ПечатьДоговоровКлиент.ВыполнитьКомандуПечатиТекстаДоговора(МассивДоговоров, ПараметрыВыполнения);
КонецПроцедуры
Иногда требуется не просто нажать кнопку "Печать", но и предварительно подготовить данные или проверить их корректность. Посмотрим на пример функции, которая подготавливает параметры для печати. Этот код обычно располагается в модуле менеджера справочника, но понимание его работы поможет вам при отладке.
Проанализируем структуру подготовки данных:
// Функция из модуля менеджера (пример логики)
Функция ПодготовитьПараметрыПечатиТекстаДоговора(ДоговорКонтрагента) Экспорт
// Получаем основные реквизиты договора
РеквизитыДоговора = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДоговорКонтрагента,
"Владелец, Организация, Дата, Номер, СрокДействия, ВидДоговора");
// Добавляем вычисляемые поля, например ФИО руководителя
// Это важно для правильного заполнения шаблона Word
РеквизитыДоговора.Вставить("РуководительФИО", "");
// Здесь может быть логика получения ответственных лиц организации
// ...
Возврат РеквизитыДоговора;
КонецФункции
Важный момент: Если вы столкнулись с тем, что договор не печатается, проверьте права доступа. Как правило, система проверяет право Чтение на справочник ШаблоныДоговоров. Без этого права механизмы печати могут отрабатывать "вхолостую".
При создании внешней обработки придерживайтесь следующих правил для стабильной работы печати:
УправлениеПечатьюКлиент приведет к ошибке выполнения.ДоговорыКонтрагентов и найдите процедуру ДобавитьКомандыПечати. Там вы увидите точные строковые идентификаторы команд (например, "Договор", "ПечатьСПриложением" и т.д.), которые нужно передавать вторым параметром.Клиент возможен только в клиентских процедурах &НаКлиенте.Таким образом, мы разобрали, что для печати договора из внешней обработки не нужно изобретать велосипед. Достаточно использовать мощь встроенной библиотеки БСП и типовых модулей печати, что обеспечит корректное заполнение всех реквизитов и использование актуальных шаблонов организации.