В типовых конфигурациях 1С, таких как «Бухгалтерия предприятия 3.0», задача модификации печатных форм часто решается через механизм расширений. Это позволяет сохранить конфигурацию на поддержке и упростить процесс обновления. Однако при работе с печатными формами, которые вызываются из разных типов документов (например, печать счета-фактуры из самого документа СчетФактураВыданный и из документа РеализацияТоваровУслуг), программисты часто сталкиваются с техническими нюансами механизма БСП (Библиотеки стандартных подсистем). Проанализируем, как правильно реализовать такую задачу и избежать типичных ошибок.
Типичная ситуация: главный бухгалтер требует изменить данные в колонке 1а счета-фактуры. Вместо кода ТН ВЭД необходимо выводить внутренний код номенклатуры из базы 1С. Для этого нам необходимо:
Первым делом нам необходимо добавить команду в список доступных команд печати. Рассмотрим процедуру ДобавитьКомандыПечати. Обратите внимание, что для работы команды в разных формах (списках, документах реализации, авансовых отчетах) необходимо правильно заполнить свойство СписокФорм.
&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
// Добавляем новую команду печати в коллекцию
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "СчетФактура_Расширение";
КомандаПечати.Представление = НСтр("ru = 'Счет-фактура (с кодом товара)'");
КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
// Указываем формы, в которых должна появиться кнопка
КомандаПечати.СписокФорм = "ФормаСписка,ФормаДокументаНаРеализацию,ФормаДокументаКорректировочный";
КонецПроцедуры
Важный нюанс: если вы хотите, чтобы команда «Счет-фактура (расширение)» появилась в меню печати документа «Реализация товаров и услуг», процедуру ДобавитьКомандыПечати необходимо перехватить в модуле менеджера именно этого документа, а не только в модуле счета-фактуры.
После регистрации команды система будет искать процедуру Печать в модуле менеджера документа. Нам нужно использовать аннотацию &После, чтобы встроиться в стандартный механизм вывода табличных документов.
&После("Печать")
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// Проверяем, выбрана ли наша команда пользователем
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетФактура_Расширение") Тогда
// Формируем табличный документ с помощью своей функции
ТабДок = Расш1_СформироватьТабличныйДокументСчетаФактуры(МассивОбъектов, ОбъектыПечати);
// Выводим результат в коллекцию печатных форм
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СчетФактура_Расширение",
"Счет-фактура (расширение)",
ТабДок);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда при нажатии на кнопку печати возникает исключение. В типовом коде БСП это часто происходит в цикле обработки коллекции печатных форм, если процедура печати вернула «пустую» запись без сформированного табличного документа.
Выясним причину: при вызове печати СФ из «Реализации», в МассивОбъектов передаются ссылки на документы реализации, а не на счета-фактуры. Если ваша функция Расш1_СформироватьТабличныйДокументСчетаФактуры ожидает ссылки типа ДокументСсылка.СчетФактураВыданный, она не найдет данных и вернет пустой документ (или Неопределено).
Чтобы решить эту проблему, в начале процедуры печати необходимо проверить тип передаваемых объектов. Если передана «Реализация», нужно программно найти связанные с ней «Счета-фактуры» и уже их передавать в основной алгоритм формирования макета.
Рассмотрим вопрос производительности. Часто начинающие разработчики пытаются получить код номенклатуры прямо при заполнении области макета следующим образом:
// ПЛОХОЙ ПРИМЕР (вызывает запросы в цикле)
ОбластьМакета.Параметры.ТоварКодТНВЭД = ОбластьМакета.Параметры.Товар.Код;
Это крайне неэффективный подход. Обращение через точку к реквизиту Товар.Код в цикле по строкам документа заставляет систему выполнять отдельный SQL-запрос для каждой строки. Если в счете-фактуре 100 строк, формирование документа замедлится в десятки раз. Проанализируем правильный путь — модификацию запроса.
Найдем в коде формирование текста запроса (обычно это функция ТекстЗапросаПечатьСчетовФактур). Нам нужно добавить в выборку поле Код из справочника Номенклатура.
// В расширении заменяем или дополняем текст запроса
ТекстЗапроса =
"ВЫБРАТЬ
| Состав.Номенклатура.Код КАК ТоварКод,
| Состав.Номенклатура.Наименование КАК ТоварНаименование,
| ...
|ИЗ
| ВТ_СоставДокумента КАК Состав";
Затем при заполнении параметров области макета мы просто используем уже готовую переменную из выборки:
// ХОРОШИЙ ПРИМЕР
ОбластьМакета.Параметры.ТоварКодТНВЭД = ДанныеСтроки.ТоварКод;
Важно помнить, что колонка 1а («Код вида товара») жестко регламентирована постановлениями Правительства РФ (например, №1137). Она предназначена для кода ТН ВЭД ЕАЭС. Замена этого значения на внутренний код 1С может вызвать вопросы у налоговых органов при проверке. Тем не менее, если бизнес-процесс компании требует именно такого вывода, техническая реализация через расширение и правку запроса является наиболее «чистым» методом с точки зрения архитектуры 1С.
Для успешного расширения печатной формы счета-фактуры мы проделали следующие шаги:
&После("Печать") для перехвата управления.Такой подход гарантирует высокую скорость работы системы и стабильность при обновлениях конфигурации.