В процессе работы с крупными торговыми сетями или специфическими заказчиками часто возникает ситуация, когда клиент требует, чтобы в электронных документах (УПД), поступающих к нему по ЭДО, фигурировал не ваш внутренний артикул, а его собственный код товара. При этом менять артикул в вашей информационной базе (справочнике Номенклатура) нельзя, так как он завязан на складской учет или другие бизнес-процессы. Рассмотрим подробно, как реализовать подмену данных «на лету» при формировании исходящего документа в 1С:Управление торговлей 11.4.
Прежде чем приступать к программированию, разберем методологически верный способ, заложенный разработчиками 1С. В конфигурации 1С:УТ 11.4 существует специальный механизм для хранения соответствий между вашими товарами и товарами клиента. Это позволяет не «хардкодить» условия для каждого покупателя, а управлять данными через пользовательский интерфейс.
Алгоритм настройки:
Номенклатура контрагентов.Номенклатура контрагента создадим записи для необходимых товаров. Здесь можно указать наименование и артикул так, как их видит клиент.Если по каким-то причинам стандартный механизм не подставляет артикул в нужный тег XML (например, клиент требует его в специфическом поле ДопСведТов), перейдем к программным методам коррекции.
Как показывает практика и опыт участников форума, одной из наиболее эффективных точек входа для модификации данных УПД является общий модуль, отвечающий за заполнение данных первичных документов. Рассмотрим подробнее процедуру ЗаполнитьДанныеПервичногоДокументаУПД_2019.
В этом модуле происходит сбор данных из табличной части документа и их подготовка для формирования структуры XDTO. Чтобы подменить артикул, нам необходимо вмешаться в процесс формирования запроса или обработки его результатов. Выясним причину, по которой стандартный код берет именно ваш артикул: обычно это происходит в запросе к справочнику Номенклатура.
Пример реализации через расширение:
Для сохранения возможности обновления конфигурации крайне рекомендуем использовать механизм расширений. Мы можем перехватить данные в модуле менеджера или в процедурах заполнения коллекции текстов для визуализации.
&После("ЗаполнитьДанныеПервичногоДокументаУПД_2019")
Процедура ИТ_ЗаполнитьДанныеПервичногоДокументаУПД_2019(ДанныеДокумента, ПараметрыЗаполнения)
// Перебираем строки табличной части в структуре данных документа
Для Каждого СтрокаТЧ Из ДанныеДокумента.ТабличнаяЧасть Цикл
// Получаем артикул контрагента из регистра "НоменклатураКонтрагентов"
АртикулПокупателя = ПолучитьАртикулПокупателя(СтрокаТЧ.Номенклатура, ДанныеДокумента.Партнер);
Если ЗначениеЗаполнено(АртикулПокупателя) Тогда
// Подменяем значение артикула для выгрузки в ЭДО
СтрокаТЧ.Артикул = АртикулПокупателя;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В современных версиях УТ 11, использующих актуальную версию БЭД, существует более гибкий способ — использование обработчиков событий. Проанализируем ситуацию: нам нужно изменить данные непосредственно перед тем, как они превратятся в XML-файл. Для этого отлично подходит общий модуль ИнтеграцияЭДО и процедура ПриФормированииДанныхЭлектронногоДокумента.
Этот метод позволяет работать напрямую с XDTO-пакетом документа. Разберем по шагам, как это работает:
Рассмотрим пример кода в расширении:
Процедура ПриФормированииДанныхЭлектронногоДокумента(ИмяСобытия, Параметры, СтандартнаяОбработка) Экспорт
Если ИмяСобытия = "ОбщийМодуль.ЭлектронныйДокументооборот.СформироватьДанныеЭлектронногоДокумента" Тогда
ДанныеXDTO = Параметры.ОбъектXDTO;
// Здесь выполняется логика по поиску нужных узлов XML
// и замене текста в атрибутах, отвечающих за артикул.
КонецЕсли;
КонецПроцедуры
Если справочник Номенклатура контрагентов кажется избыточным (например, такой клиент всего один), можно пойти по упрощенному пути. Создадим Дополнительный реквизит для справочника Номенклатура с названием «Артикул для Клиента Х».
В коде формирования УПД (в модуле менеджера или общем модуле ЭлектронноеВзаимодействиеУТ) добавим проверку: если получателем документа является «Клиент Х», то в поле Артикул запроса подставляем значение этого доп. реквизита. Это позволяет избежать создания сложных связей в регистрах, но требует аккуратности при поддержке кода.
При реализации подобных «извращений» (как выразился автор темы), обязательно нужно учитывать последствия для дальнейшего документооборота:
1. Корректировки и возвраты:
Если вы отправили клиенту документ с подмененным артикулом, то при оформлении возврата клиент, скорее всего, пришлет вам документ с этим же «своим» кодом. Ваша система должна уметь распознать его и сопоставить с вашей реальной номенклатурой. Использование справочника Номенклатура контрагентов решает эту проблему автоматически, так как 1С умеет делать «обратный поиск». Если же вы просто подменили текст в запросе, входящий документ возврата придется сопоставлять вручную.
2. Визуализация документа:
Помните, что данные в XML-файле и данные в печатной форме (визуализации), которую видит пользователь в интерфейсе ЭДО, могут формироваться разными методами. Убедитесь, что подмена произошла и в самом файле (для автоматической обработки на стороне клиента), и в печатной форме (для удобства бухгалтера).
3. Формат УПД (Приказ 820):
Согласно формату ФНС, артикул может передаваться в разных тегах. Чаще всего это атрибут КодТов или дополнительные сведения ИнфПолФХЖ1. Перед внесением изменений согласуйте с техническим отделом клиента, в каком именно теге они ожидают увидеть свой внутренний код.
Подводя итог, можно сказать, что наиболее стабильным и правильным решением является использование штатного механизма Номенклатура контрагентов в сочетании с небольшим расширением, которое гарантирует попадание данных из этого регистра в нужные теги XML-файла УПД.