Как добавить внешнюю печатную форму УПД по Постановлению №981 в устаревшую УНФ без обновления конфигурации?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Налоговый учет IT и автоматизация бизнеса
← На главную

При сопровождении программных продуктов на платформе 1С программисты часто сталкиваются с жестким ограничением заказчика: обновлять конфигурацию нельзя. Это может быть связано с сильной кастомизацией базы, наличием сложных интеграций или нежеланием прерывать рабочие процессы. Однако требования законодательства меняются регулярно, и появление новых постановлений (например, Постановления Правительства РФ №981, регулирующего форму УПД и счетов-фактур) заставляет оперативно внедрять изменения в старые релизы.

В этой статье мы подробно разберем, как решить задачу добавления новой печатной формы УПД в конфигурацию "1С:Управление нашей фирмой" (УНФ) версии 1.6.10.44 с помощью механизма внешних печатных форм (ВПФ), не затрагивая основную конфигурацию.

Выясняем логику работы УПД в конфигурации УНФ

Прежде чем приступать к программированию, нам необходимо четко понимать, в каких документах используется УПД в УНФ и как система определяет параметры для вывода на печать. Начиная с ранних версий УНФ, формирование печатной формы УПД доступно из следующих документов:

  1. Расходная накладная (в коде конфигурации это документ ДокументСсылка.РасходнаяНакладная).
  2. Заказ-наряд (используется для отражения сферы услуг и автосервисов).
  3. Акт выполненных работ.
  4. Счет-фактура выданный.

Система автоматически рассчитывает Статус УПД при формировании печатной формы:

Анализ структуры метаданных и разница в релизах

Выясним причину, по которой простой перенос кода из нового релиза в старый не сработает напрямую. Проведя сравнение старой конфигурации УНФ (1.6.10.44) и новой демонстрационной базы (например, 1.6.20.143), мы увидим архитектурное различие в хранении механизмов печати:

Если мы попытаемся перенести код формирования печатной формы "как есть", программа выдаст ошибки из-за отсутствия необходимых экспортных процедур, функций в общих модулях и новых реквизитов в метаданных (таких как идентификатор госконтракта или новые сведения об индивидуальном предпринимателе).

Разрабатываем стратегию создания внешней печатной формы

Для реализации задачи мы выберем наиболее стабильный и поддерживаемый путь: создание внешней печатной формы (ВПФ) на базе Библиотеки стандартных подсистем (БСП). Этот способ хорош тем, что логику формирования данных мы можем взять из старой конфигурации (она уже умеет собирать данные о товарах, ценах, контрагентах и НДС), а сам графический макет (табличный документ) и заголовки колонок обновить в соответствии с Постановлением №981.

Нам потребуется внести следующие изменения в макет:

  1. В шапке документа добавить поле для указания Идентификатора государственного контракта (при наличии).
  2. В табличной части изменить заголовок графы 11 с "Номер таможенной декларации" на "Регистрационный номер таможенной декларации".
  3. Обновить текст подвала в части реквизитов свидетельства государственной регистрации для индивидуальных предпринимателей.

Пошаговая реализация внешней печатной формы

Создадим новую внешнюю обработку в конфигураторе. Назовем ее, например, ВнешняяПечатнаяФормаУПД981. В модуле объекта этой обработки мы обязаны прописать стандартный программный интерфейс для интеграции с БСП.

Рассмотрим пример заполнения функции регистрации внешней обработки:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РасходнаяНакладная");
    МассивНазначений.Добавить("Документ.СчетФактураВыданный");
    МассивНазначений.Добавить("Документ.ЗаказНаряд");
    МассивНазначений.Добавить("Документ.АктВыполненныхРабот");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    
    ПараметрыРегистрации.Вставить("Наименование", "Универсальный передаточный документ (Пост. 981)");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Внешняя печатная форма УПД согласно Постановлению №981");
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    ДобавитьКоманду(ТаблицаКоманд,
                    "Универсальный передаточный документ (Пост. 981)",
                    "УПД_981",
                    "ВызовСерверногоМетода",
                    Истина,
                    "ПечатьMXL");
                    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

После прописывания регистрации БСП, нам необходимо реализовать основную процедуру Печать, которая вызывается платформой при нажатии пользователем кнопки печати.

Проанализируем структуру процедуры Печать:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    ПараметрыПечати = Новый Структура;
    
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "УПД_981");
    Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФормуУПД(МассивОбъектов, ОбъектыПечати);
        ПечатнаяФорма.СинонимМакета = "Универсальный передаточный документ (Пост. 981)";
    КонецЕсли;

КонецПроцедуры

Перенос макета и адаптация логики заполнения данных

Для того чтобы не писать процедуру получения данных с нуля, мы можем использовать следующую хитрость: скопировать стандартную процедуру печати УПД из общего модуля ПечатьУчетныхДокументов (или менеджера документа СчетФактураВыданный) нашей старой конфигурации 1.6.10.44 внутрь модуля нашей внешней обработки.

Посмотрим на алгоритм адаптации:

  1. Переносим макет УПД из нового релиза УНФ во внешнюю обработку в качестве макета с именем МакетУПД_981.
  2. В коде формирования печатной формы (внутри обработки) заменяем обращение к стандартному макету на обращение к макету нашей внешней обработки:
    
    Макет = ПолучитьМакет("МакетУПД_981");
    
  3. Проверяем, какие параметры ожидает новый макет. Например, если в макете появилась новая область или новый параметр строки (например, ИдентификаторГосконтракта), мы должны инициализировать этот параметр в коде заполнения шапки документа. Если в нашей старой конфигурации этого реквизита физически нет в документах, мы можем просто передавать туда пустую строку, чтобы избежать критической ошибки выполнения:
    
    ДанныеШапки.Вставить("ИдентификаторГосударственногоКонтракта", "");
    
    Такой подход позволит успешно вывести форму на печать, не вызывая сбоев из-за отсутствия метаданных.
  4. Убеждаемся, что код корректно обрабатывает вывод графы 11. Ранее там выводился номер ГТД. В новой форме логика вывода остается прежней, меняется только текстовое представление шапки таблицы в самом макете, поэтому программный код заполнения табличной части менять не придется.

Подключение и тестирование разработанного решения

После того как внешняя обработка успешно сохранена на диск в формате .epf, выполним ее подключение в базу данных:

  1. Перейдем в раздел КомпанияАдминистрированиеПечатные формы, отчеты и обработки.
  2. Установим флаг "Дополнительные отчеты и обработки" (если он не был установлен ранее) и перейдем по ссылке "Дополнительные отчеты и обработки".
  3. Нажмем кнопку "Добавить из файла" и выберем нашу созданную обработку.
  4. Программа автоматически заполнит список документов, к которым привязывается печатная форма (благодаря функции СведенияОВнешнейОбработке).
  5. Зададим размещение в нужных разделах и укажем пользователей, которым будет доступна данная форма.
  6. Нажмем "Записать и закрыть".

Теперь откроем любой документ "Расходная накладная", нажмем кнопку Печать и выберем наш новый пункт "Универсальный передаточный документ (Пост. 981)". Проверяем корректность вывода всех полей, адресов с индексами, измененного названия графы 11 и подвальной части для индивидуальных предпринимателей.

Этот простой, но эффективный метод позволяет программисту оперативно реагировать на изменения законодательства, сохраняя типовую конфигурацию заказчика на полной поддержке и гарантируя безопасность и стабильность работы учетной системы.

← На главную