В процессе работы с программами на базе БСП (Библиотека стандартных подсистем), такими как БАС Бухгалтерия 2.1, часто возникает задача автоматизации вывода факсимиле (печати и подписи) на печатные формы. Трудность заключается в том, что разработчики часто пытаются либо полностью переписать логику формирования документа, либо сталкиваются с ошибками при попытке вызвать стандартные механизмы печати. Разберем подробно, как решить эту задачу эффективно.
Прежде чем приступать к программированию внешней печатной формы (ВПФ), проанализируем штатные возможности системы. В современных версиях БАС Бухгалтерия функционал печати и подписи уже заложен в логику большинства документов, включая «Акт об оказании услуг».
Организации, откроем нужную карточку и на закладке «Печать» загрузим заранее подготовленные файлы с изображением печати, подписи руководителя и логотипа.Если руководство требует именно внешнюю обработку, мы можем пойти по пути наименьшего сопротивления: не копировать весь код формирования макета в обработку, а вызвать экспортную процедуру Печать из менеджера документа. Это позволит получить уже заполненный ТабличныйДокумент, в который мы просто добавим нужные изображения.
Разберем структуру функции во внешней обработке. Основная проблема автора темы заключалась в ошибке «недостаточно фактических параметров». Это происходит из-за того, что в БСП процедура печати ожидает строго определенный набор аргументов.
Рассмотрим пример кода в модуле объекта внешней печатной формы:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Подготавливаем структуру для стандартной печати
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнительныеПараметры", Новый Структура);
// Важный момент: заставляем систему думать, что нужно выводить факсимиле
ПараметрыПечати.ДополнительныеПараметры.Вставить("ВыводитьПечатьИПодпись", Истина);
// Вызываем стандартную процедуру из менеджера документа
Документы.АктОбОказанииУслуг.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Теперь в КоллекцияПечатныхФорм уже лежит готовый Акт.
// Если нам нужно что-то подправить, мы можем извлечь его оттуда.
Для Каждого СтрокаФормы Из КоллекцияПечатныхФорм Цикл
Если СтрокаФормы.ИмяВКоллекции = "АктОбОказанииУслуг" Тогда
МодифицироватьТабличныйДокумент(СтрокаФормы.ТабличныйДокумент, МассивОбъектов[0]);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию, когда стандартный механизм почему-то не выводит картинку (например, если макет сильно изменен). В этом случае мы можем программно вставить объект РисунокТабличногоДокумента в сформированный ТабличныйДокумент. Выясним, как это сделать по шагам.
Для начала нам нужно получить двоичные данные картинки из справочника организации. Затем определим координаты для вставки. Рассмотрим пример функции:
Процедура МодифицироватьТабличныйДокумент(ТабДок, СсылкаНаДокумент)
Организация = СсылкаНаДокумент.Организация;
// Получаем файл печати из реквизитов организации (зависит от версии БАС)
ФайлПечати = Организация.ФайлПечати;
Если ФайлПечати.Пустая() Тогда
Возврат; // Печать не задана
КонецЕсли;
ДанныеКартинки = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлПечати);
Если ДанныеКартинки = Неопределено Тогда
Возврат;
КонецЕсли;
КартинкаПечати = Новый Картинка(ДанныеКартинки);
// Ищем область в документе, куда вставить печать. Обычно это "М.П."
ОбластьМП = ТабДок.НайтиТекст("М.П.");
Если ОбластьМП <> Неопределено Тогда
// Добавляем рисунок
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаПечати;
Рисунок.РазмерКартинки = РазмерКартинки.АвтоМасштаб;
// Позиционируем рисунок поверх текста М.П.
Рисунок.Верх = ОбластьМП.Верх;
Рисунок.Лево = ОбластьМП.Лево;
Рисунок.Ширина = 40; // Примерный размер в мм
Рисунок.Высота = 40;
// Делаем фон прозрачным
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСнизу = Ложь;
Рисунок.ГраницаСлева = Ложь;
Рисунок.ГраницаСправа = Ложь;
Рисунок.Узор = ТипУзораТабличногоДокумента.БезУзора;
КонецЕсли;
КонецПроцедуры
Разберем основные ошибки, которые могут возникнуть при реализации:
РаботаСФайлами или получение данных из БД не происходят на стороне клиента.ЦветФона у объекта рисунка, но лучше подготовить качественный исходник.Документы.АктОбОказанииУслуг.Печать(...) — это более устойчивый метод, чем копирование всего кода макета во внешнюю обработку. При обновлении конфигурации и изменении состава полей в акте, ваша ВПФ продолжит работать корректно, так как она вызывает актуальный код из самой системы.Рассмотрим еще один современный подход. Если задача стоит именно в модификации стандартной формы, то использование расширения конфигурации может быть предпочтительнее ВПФ. Мы можем применить аннотацию &После к процедуре формирования печатной формы в модуле менеджера или в соответствующем серверном модуле печати. Это позволит нам получить уже готовый ТабличныйДокумент непосредственно в момент его формирования системой и внедрить в него печать без создания лишних внешних файлов.
Резюмируя: для решения задачи в БАС Бухгалтерия оптимально либо использовать штатный механизм редактирования макетов, либо создать ВПФ, которая вызывает стандартную экспортную процедуру менеджера документа с передачей параметра ВыводитьПечатьИПодпись = Истина. Это обеспечит чистоту кода и минимизирует затраты на поддержку обработки при будущих обновлениях программы.