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