Как расширить печатную форму счета-фактуры при вызове из документа реализации в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В типовых конфигурациях 1С, таких как «Бухгалтерия предприятия 3.0», задача модификации печатных форм часто решается через механизм расширений. Это позволяет сохранить конфигурацию на поддержке и упростить процесс обновления. Однако при работе с печатными формами, которые вызываются из разных типов документов (например, печать счета-фактуры из самого документа СчетФактураВыданный и из документа РеализацияТоваровУслуг), программисты часто сталкиваются с техническими нюансами механизма БСП (Библиотеки стандартных подсистем). Проанализируем, как правильно реализовать такую задачу и избежать типичных ошибок.

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

Типичная ситуация: главный бухгалтер требует изменить данные в колонке 1а счета-фактуры. Вместо кода ТН ВЭД необходимо выводить внутренний код номенклатуры из базы 1С. Для этого нам необходимо:

  1. Создать расширение и добавить в него макет счета-фактуры.
  2. Зарегистрировать новую команду печати в менеджере документа.
  3. Обеспечить корректную работу команды как в самом счете-фактуре, так и в связанных документах реализации.

Добавление команды печати в расширение

Первым делом нам необходимо добавить команду в список доступных команд печати. Рассмотрим процедуру ДобавитьКомандыПечати. Обратите внимание, что для работы команды в разных формах (списках, документах реализации, авансовых отчетах) необходимо правильно заполнить свойство СписокФорм.


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    // Добавляем новую команду печати в коллекцию
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "СчетФактура_Расширение";
    КомандаПечати.Представление = НСтр("ru = 'Счет-фактура (с кодом товара)'");
    КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
    
    // Указываем формы, в которых должна появиться кнопка
    КомандаПечати.СписокФорм = "ФормаСписка,ФормаДокументаНаРеализацию,ФормаДокументаКорректировочный";
КонецПроцедуры

Важный нюанс: если вы хотите, чтобы команда «Счет-фактура (расширение)» появилась в меню печати документа «Реализация товаров и услуг», процедуру ДобавитьКомандыПечати необходимо перехватить в модуле менеджера именно этого документа, а не только в модуле счета-фактуры.

Реализация обработчика печати на сервере

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


&После("Печать")
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
    
    // Проверяем, выбрана ли наша команда пользователем
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетФактура_Расширение") Тогда
        
        // Формируем табличный документ с помощью своей функции
        ТабДок = Расш1_СформироватьТабличныйДокументСчетаФактуры(МассивОбъектов, ОбъектыПечати);
        
        // Выводим результат в коллекцию печатных форм
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "СчетФактура_Расширение", 
            "Счет-фактура (расширение)",
            ТабДок);
            
    КонецЕсли;
    
КонецПроцедуры

Разбор ошибки «ВременнаяПечатнаяФорма.ТабличныйДокумент = Неопределено»

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

Выясним причину: при вызове печати СФ из «Реализации», в МассивОбъектов передаются ссылки на документы реализации, а не на счета-фактуры. Если ваша функция Расш1_СформироватьТабличныйДокументСчетаФактуры ожидает ссылки типа ДокументСсылка.СчетФактураВыданный, она не найдет данных и вернет пустой документ (или Неопределено).

Чтобы решить эту проблему, в начале процедуры печати необходимо проверить тип передаваемых объектов. Если передана «Реализация», нужно программно найти связанные с ней «Счета-фактуры» и уже их передавать в основной алгоритм формирования макета.

Оптимизация вывода кода номенклатуры (Колонка 1а)

Рассмотрим вопрос производительности. Часто начинающие разработчики пытаются получить код номенклатуры прямо при заполнении области макета следующим образом:


// ПЛОХОЙ ПРИМЕР (вызывает запросы в цикле)
ОбластьМакета.Параметры.ТоварКодТНВЭД = ОбластьМакета.Параметры.Товар.Код; 

Это крайне неэффективный подход. Обращение через точку к реквизиту Товар.Код в цикле по строкам документа заставляет систему выполнять отдельный SQL-запрос для каждой строки. Если в счете-фактуре 100 строк, формирование документа замедлится в десятки раз. Проанализируем правильный путь — модификацию запроса.

Найдем в коде формирование текста запроса (обычно это функция ТекстЗапросаПечатьСчетовФактур). Нам нужно добавить в выборку поле Код из справочника Номенклатура.


// В расширении заменяем или дополняем текст запроса
ТекстЗапроса = 
"ВЫБРАТЬ
|   Состав.Номенклатура.Код КАК ТоварКод,
|   Состав.Номенклатура.Наименование КАК ТоварНаименование,
|   ...
|ИЗ
|   ВТ_СоставДокумента КАК Состав";

Затем при заполнении параметров области макета мы просто используем уже готовую переменную из выборки:


// ХОРОШИЙ ПРИМЕР
ОбластьМакета.Параметры.ТоварКодТНВЭД = ДанныеСтроки.ТоварКод;

Методологические риски

Важно помнить, что колонка 1а («Код вида товара») жестко регламентирована постановлениями Правительства РФ (например, №1137). Она предназначена для кода ТН ВЭД ЕАЭС. Замена этого значения на внутренний код 1С может вызвать вопросы у налоговых органов при проверке. Тем не менее, если бизнес-процесс компании требует именно такого вывода, техническая реализация через расширение и правку запроса является наиболее «чистым» методом с точки зрения архитектуры 1С.

Итоги

Для успешного расширения печатной формы счета-фактуры мы проделали следующие шаги:

  1. Зарегистрировали команду печати в менеджерах обоих документов (Счет-фактура и Реализация).
  2. Использовали аннотацию &После("Печать") для перехвата управления.
  3. Убедились, что табличный документ всегда заполняется в коллекции, чтобы избежать системных ошибок БСП.
  4. Оптимизировали код, перенеся получение данных из обращения «через точку» в основной текст SQL-запроса.

Такой подход гарантирует высокую скорость работы системы и стабильность при обновлениях конфигурации.

← На главную