Переход с управляемых форм конфигурации «1С:Бухгалтерия предприятия 3.0» на обычные формы «1С:Бухгалтерия предприятия 2.0» (работающей на платформе 1С:Предприятие 8.2 или в режиме совместимости на 8.3) часто вызывает вопросы у разработчиков. Механизмы интеграции внешних печатных форм (ВПФ) в этих версиях существенно различаются. В этой статье мы подробно разберем, как создать внешнюю печатную форму для БП 2.0, зарегистрировать ее в системе и реализовать ее вызов по отдельной кнопке прямо на форме документа.
В конфигурации «Бухгалтерия предприятия 2.0» не используется Библиотека стандартных подсистем (БСП) в том виде, в каком она представлена в БП 3.0. Здесь вы не найдете привычной экспортной функции СведенияОВнешнейОбработке(). Вместо этого вся работа с внешними печатными формами строится на использовании справочника ВнешниеОбработки и функций общего модуля УниверсальныеМеханизмы.
Для того чтобы система распознала файл обработки как внешнюю печатную форму, он должен соответствовать строго определенной структуре метаданных и программного кода.
Давайте создадим внешнюю обработку с нуля и подготовим ее структуру. Для этого нам потребуется выполнить три обязательных шага:
СсылкаНаОбъект. Тип этого реквизита должен строго соответствовать ссылочному типу документа, для которого разрабатывается форма (например, ДокументСсылка.РеализацияТоваровУслуг). Если форма должна быть универсальной и подходить для разных документов, можно настроить составной тип данных.Печать(). Именно ее вызывает типовой механизм при нажатии пользователем кнопки печати. Функция должна возвращать сформированный табличный документ.Параметры_Авторегистрации.Рассмотрим пример программного кода в модуле объекта нашей внешней печатной формы:
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояПечатнаяФорма";
// Получаем макет, сохраненный в нашей внешней обработке
Макет = ПолучитьМакет("МакетПечати");
// Получаем области макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Заполняем параметры шапки на основе реквизита СсылкаНаОбъект
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаОбъект.Номер;
ОбластьШапка.Параметры.ДатаДокумента = Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy");
ОбластьШапка.Параметры.Организация = СсылкаНаОбъект.Организация;
ОбластьШапка.Параметры.Контрагент = СсылкаНаОбъект.Контрагент;
ТабДокумент.Вывести(ОбластьШапка);
// Пример обхода табличной части документа
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, СтрокаТЧ);
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
// Заполняем подвал
ОбластьПодвал.Параметры.Всего = СсылкаНаОбъект.Товары.Итог("Сумма");
ТабДокумент.Вывести(ОбластьПодвал);
Возврат ТабДокумент;
КонецФункции
В макете авторегистрации Параметры_Авторегистрации создайте простую таблицу из двух колонок: «Полное имя объекта» (например, Документ.РеализацияТоваровУслуг) и «Имя табличной части» (оставьте пустым для обычной печатной формы).
Если перед вами стоит задача сделать вызов печатной формы максимально удобным и быстрым для пользователя, стандартное меню «Печать» может не подойти. Гораздо удобнее разместить отдельную кнопку непосредственно на форме документа. Обратите внимание, что такое решение требует изменения формы документа (если она типовая, ее придется снять с поддержки или разрешить редактирование).
Рассмотрим пошагово алгоритм, который должен выполняться при нажатии на нашу новую кнопку:
ВнешниеОбработки по его наименованию или коду.СсылкаНаОбъект передается ссылка на текущий документ.Печать(), которая возвращает табличный документ.Проанализируем пример программного кода обработчика нажатия кнопки на форме документа:
Процедура ДействияФормыКнопкаМояПечать(Кнопка)
// Проверим, записан ли документ. Печать незаписанного документа невозможна.
Если ЭтотОбъект.Ссылка.Пустая() Тогда
Предупреждение("Перед печатью документ необходимо записать!");
Возврат;
КонецЕсли;
// 1. Поиск обработки в справочнике по точному наименованию
ИмяПечатнойФормы = "Моя Внешняя Печатная Форма";
СсылкаНаВПФ = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяПечатнойФормы);
Если СсылкаНаВПФ.Пустая() Тогда
ВызватьИсключение "В справочнике 'Внешние обработки' не найдена печатная форма '" + ИмяПечатнойФормы + "'!";
КонецЕсли;
Попытка
// 2. Получение двоичных данных из хранилища значения
ДвоичныеДанныеОбработки = СсылкаНаВПФ.ХранилищеВнешнейОбработки.Получить();
// Формирование пути к временному файлу
ИмяФайла = КаталогВременныхФайлов() + СсылкаНаВПФ.УникальныйИдентификатор() + ".epf";
// Запись файла на диск
ДвоичныеДанныеОбработки.Записать(ИмяФайла);
// 3. Создание объекта внешней обработки
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
// 4. Инициализация реквизита ссылки на документ
ОбработкаОбъект.СсылкаНаОбъект = ЭтотОбъект.Ссылка;
// 5. Вызов функции печати и получение табличного документа
ТабДокумент = ОбработкаОбъект.Печать();
// 6. Вывод печатной формы на экран с помощью встроенного механизма БП 2.0
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 1, Ложь, "Печать: " + ЭтотОбъект.Метаданные().Синоним);
// 7. Обязательное удаление временного файла
УдалитьФайлы(ИмяФайла);
Исключение
Сообщить("Произошла ошибка при выполнении внешней печати: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Одной из главных проблем при разработке внешних печатных форм является процесс их отладки. Если при каждом изменении кода вам приходится заходить в режим Предприятия, открывать справочник «Внешние обработки», заменять файл и проводить тест — вы теряете много времени. Существует простой способ обойти это ограничение.
Реализуем механизм самоотладки внутри самой обработки:
СсылкаНаОбъект. Настройте тип поля ввода в соответствии с типом вашего документа.
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Предупреждение("Пожалуйста, выберите документ для отладки!");
Возврат;
КонецЕсли;
// Вызываем процедуру печати напрямую из модуля объекта
ТабДокумент = Печать();
// Выводим полученный результат на экран
ТабДокумент.Показать("Отладка печатной формы");
КонецПроцедуры
Теперь вам достаточно открыть вашу обработку через стандартное меню Файл - Открыть в режиме Предприятия, выбрать тестовый документ и нажать кнопку. Код будет выполняться напрямую, а в конфигураторе вы сможете полноценно использовать точки останова для пошаговой отладки алгоритма заполнения параметров макета.
Когда отладка будет полностью завершена, вам не нужно удалять форму отладки или менять свойства — встроенный механизм авторегистрации проигнорирует основную форму обработки, а при вызове из документа будет задействована исключительно экспортная функция Печать().