При сопровождении программных продуктов на платформе 1С программисты часто сталкиваются с жестким ограничением заказчика: обновлять конфигурацию нельзя. Это может быть связано с сильной кастомизацией базы, наличием сложных интеграций или нежеланием прерывать рабочие процессы. Однако требования законодательства меняются регулярно, и появление новых постановлений (например, Постановления Правительства РФ №981, регулирующего форму УПД и счетов-фактур) заставляет оперативно внедрять изменения в старые релизы.
В этой статье мы подробно разберем, как решить задачу добавления новой печатной формы УПД в конфигурацию "1С:Управление нашей фирмой" (УНФ) версии 1.6.10.44 с помощью механизма внешних печатных форм (ВПФ), не затрагивая основную конфигурацию.
Прежде чем приступать к программированию, нам необходимо четко понимать, в каких документах используется УПД в УНФ и как система определяет параметры для вывода на печать. Начиная с ранних версий УНФ, формирование печатной формы УПД доступно из следующих документов:
ДокументСсылка.РасходнаяНакладная).Система автоматически рассчитывает Статус УПД при формировании печатной формы:
Выясним причину, по которой простой перенос кода из нового релиза в старый не сработает напрямую. Проведя сравнение старой конфигурации УНФ (1.6.10.44) и новой демонстрационной базы (например, 1.6.20.143), мы увидим архитектурное различие в хранении механизмов печати:
Документ.СчетФактура или находятся в общем модуле ПечатьУчетныхДокументов.Обработка.ПечатьСчетФактур.Если мы попытаемся перенести код формирования печатной формы "как есть", программа выдаст ошибки из-за отсутствия необходимых экспортных процедур, функций в общих модулях и новых реквизитов в метаданных (таких как идентификатор госконтракта или новые сведения об индивидуальном предпринимателе).
Для реализации задачи мы выберем наиболее стабильный и поддерживаемый путь: создание внешней печатной формы (ВПФ) на базе Библиотеки стандартных подсистем (БСП). Этот способ хорош тем, что логику формирования данных мы можем взять из старой конфигурации (она уже умеет собирать данные о товарах, ценах, контрагентах и НДС), а сам графический макет (табличный документ) и заголовки колонок обновить в соответствии с Постановлением №981.
Нам потребуется внести следующие изменения в макет:
Создадим новую внешнюю обработку в конфигураторе. Назовем ее, например, ВнешняяПечатнаяФормаУПД981. В модуле объекта этой обработки мы обязаны прописать стандартный программный интерфейс для интеграции с БСП.
Рассмотрим пример заполнения функции регистрации внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РасходнаяНакладная");
МассивНазначений.Добавить("Документ.СчетФактураВыданный");
МассивНазначений.Добавить("Документ.ЗаказНаряд");
МассивНазначений.Добавить("Документ.АктВыполненныхРабот");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Универсальный передаточный документ (Пост. 981)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Внешняя печатная форма УПД согласно Постановлению №981");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Универсальный передаточный документ (Пост. 981)",
"УПД_981",
"ВызовСерверногоМетода",
Истина,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
После прописывания регистрации БСП, нам необходимо реализовать основную процедуру Печать, которая вызывается платформой при нажатии пользователем кнопки печати.
Проанализируем структуру процедуры Печать:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "УПД_981");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФормуУПД(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = "Универсальный передаточный документ (Пост. 981)";
КонецЕсли;
КонецПроцедуры
Для того чтобы не писать процедуру получения данных с нуля, мы можем использовать следующую хитрость: скопировать стандартную процедуру печати УПД из общего модуля ПечатьУчетныхДокументов (или менеджера документа СчетФактураВыданный) нашей старой конфигурации 1.6.10.44 внутрь модуля нашей внешней обработки.
Посмотрим на алгоритм адаптации:
МакетУПД_981.
Макет = ПолучитьМакет("МакетУПД_981");
ИдентификаторГосконтракта), мы должны инициализировать этот параметр в коде заполнения шапки документа. Если в нашей старой конфигурации этого реквизита физически нет в документах, мы можем просто передавать туда пустую строку, чтобы избежать критической ошибки выполнения:
ДанныеШапки.Вставить("ИдентификаторГосударственногоКонтракта", "");
После того как внешняя обработка успешно сохранена на диск в формате .epf, выполним ее подключение в базу данных:
СведенияОВнешнейОбработке).Теперь откроем любой документ "Расходная накладная", нажмем кнопку Печать и выберем наш новый пункт "Универсальный передаточный документ (Пост. 981)". Проверяем корректность вывода всех полей, адресов с индексами, измененного названия графы 11 и подвальной части для индивидуальных предпринимателей.
Этот простой, но эффективный метод позволяет программисту оперативно реагировать на изменения законодательства, сохраняя типовую конфигурацию заказчика на полной поддержке и гарантируя безопасность и стабильность работы учетной системы.