Внешняя печатная форма подключается к типовой конфигурации без изменения самой конфигурации: файл обработки регистрируется в справочнике дополнительных обработок и появляется в меню «Печать» нужного документа. Механизм даёт Библиотека стандартных подсистем, поэтому код одинаков для Бухгалтерии, УНФ и других типовых на БСП.
Что должно быть в обработке
- Экспортная функция
СведенияОВнешнейОбработке— «паспорт» обработки: вид, назначение, список команд. - Экспортная процедура
Печать— точка входа, которую вызывает механизм печати. - Макет табличного документа.
Обработка создаётся в конфигураторе как внешняя (Файл → Новый → Внешняя обработка), сохраняется в .epf.
Паспорт обработки
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.1.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Наименование = "Счёт на оплату с реквизитами и печатью";
ПараметрыРегистрации.Версия = "1.0.3";
ПараметрыРегистрации.БезопасныйРежим = Истина;
ПараметрыРегистрации.Информация = "Печатает счёт с факсимиле подписи и печати организации.";
ПараметрыРегистрации.Назначение.Добавить("Документ.СчетНаОплатуПокупателю");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Счёт на оплату (с печатью)";
Команда.Идентификатор = "СчетСПечатью";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Два момента, на которых чаще всего спотыкаются:
- версия БСП в первой строке должна быть не выше той, что установлена в базе. Иначе при подключении обработка будет отклонена;
- идентификатор команды — произвольная строка, но именно по ней потом определяется, какую форму печатать, если команд в обработке несколько.
Процедура печати
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетСПечатью") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекциюПечатныхФорм(
КоллекцияПечатныхФорм,
"СчетСПечатью",
"Счёт на оплату (с печатью)",
СформироватьСчет(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
КонецПроцедуры
Дальше — формирование самого табличного документа. Данные берутся одним запросом по всем объектам сразу, а не в цикле по документам: печать пачки из полусотни счетов запросом в цикле работает недопустимо долго.
Функция СформироватьСчет(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетСПечатью";
Макет = ПолучитьМакет("Счет");
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Счет.Ссылка КАК Ссылка,
| Счет.Номер КАК Номер,
| Счет.Дата КАК Дата,
| Счет.Контрагент КАК Контрагент,
| Счет.Организация КАК Организация,
| Счет.СуммаДокумента КАК СуммаДокумента,
| Товары.НомерСтроки КАК НомерСтроки,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК Счет
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю.Товары КАК Товары
| ПО Товары.Ссылка = Счет.Ссылка
|ГДЕ
| Счет.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Ссылка,
| НомерСтроки
|ИТОГИ ПО
| Ссылка";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
ВыборкаПоДокументам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоДокументам.Следующий() Цикл
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
ОбластьШапки.Параметры.Заполнить(ВыборкаПоДокументам);
ТабличныйДокумент.Вывести(ОбластьШапки);
ВыборкаПоСтрокам = ВыборкаПоДокументам.Выбрать();
Пока ВыборкаПоСтрокам.Следующий() Цикл
ОбластьСтроки.Параметры.Заполнить(ВыборкаПоСтрокам);
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
ОбластьПодвала.Параметры.Заполнить(ВыборкаПоДокументам);
ТабличныйДокумент.Вывести(ОбластьПодвала);
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ВыборкаПоДокументам.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
ЗадатьОбластьПечатиДокумента — не украшение: именно она связывает области табличного документа с конкретными документами. Без неё не работает отправка печатной формы по электронной почте и сохранение по документам.
Подключение в базе
- «Администрирование → Печатные формы, отчёты и обработки» — включить использование дополнительных отчётов и обработок.
- В списке дополнительных обработок создать новую, загрузить файл
.epf. - Проверить, что размещение и команда подтянулись из паспорта обработки, при необходимости указать раздел размещения.
- Настроить права: кто видит команду печати.
После этого команда появляется в меню «Печать» документа.
Отладка
Отладка внешней обработки включается в настройках базы: разрешить отладку и запуск отладчика. Удобный приём — отладка через «Подключиться к предмету отладки» с указанием внешней обработки, точки останова ставятся прямо в её модуле.
Если команда не появилась: почти всегда дело в назначении (Назначение.Добавить) — имя объекта метаданных должно совпадать точно, включая регистр, а сама обработка должна быть отмечена как используемая.