Как изменить наименование номенклатуры в УПД через подключаемый модуль Контур.Диадок 4.16 в 1С?

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

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

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

Зачем использовать подключаемый модуль (ПМ)?

Прежде всего, давайте разберемся, почему именно подключаемый модуль является предпочтительным инструментом для подобных доработок. Подключаемый модуль — это внешняя обработка, которая содержит функции для обработки различных событий, возникающих при работе модуля интеграции Диадок. Он позволяет расширять функциональность стандартного модуля без прямого изменения кода основной конфигурации или модуля обмена, что значительно упрощает обновления и поддержку системы. Некоторые стандартные модули интеграции могут содержать обработчики, например, в модулях типа «ИнтеграцияУТ», но общепринятая и рекомендованная практика заключается в работе именно с ПМ. Отметим, что 99% подобных проблем эффективно решаются именно в ПМ, избегая необходимости трогать основную обработку интеграции.

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

Поиск и отладка нужного участка кода

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

  1. Точки останова: Самый надежный способ — это установка точек останова. Мы рекомендуем поставить точки останова во всех процедурах подключаемого модуля и затем сформировать тестовый УПД. Пошаговое выполнение кода позволит нам отследить, в какой момент и каким образом происходит заполнение данных табличной части документа, включая наименование номенклатуры.
  2. Поиск по подстроке: Часто структура УПД формируется в соответствии с приказом ФНС, например, 820-м. Поэтому мы можем выполнить поиск по подстроке Upd820 в коде подключаемого модуля или основного модуля интеграции. Это поможет нам найти процедуры, отвечающие за формирование XML-структуры УПД. Например, коллеги по цеху подтверждают, что этот метод успешно приводил к нужным процедурам, таким как в модуле «ИнтеграцияУТ», где также находились участки, связанные с Upd820.

Конкретная процедура, которая отвечает за заполнение элемента Item в формате 820 приказа, часто называется Заполнить_Item820. Именно в ней мы и найдем участки для модификации.

Метод 1: Использование события "ПослеПодготовкиПакета"

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

Давайте подробнее рассмотрим, как мы можем использовать это событие:

  1. Перехват события: В вашем подключаемом модуле найдите или создайте процедуру, которая будет обрабатывать событие ПослеПодготовкиПакета.
  2. Доступ к данным пакета: Когда событие ПослеПодготовкиПакета срабатывает, в его параметры передается структура, содержащая весь пакет документов. Эти данные заполнены и готовы к модификации, если в параметрах присутствует свойство Результат_ИМ со значением Истина. Это служит индикатором успешного формирования пакета.
  3. Доступ к табличной части УПД: Табличная часть документа, которая содержит наименования номенклатуры, обычно находится по следующему пути в структуре параметров: Параметры.Пакет.Документы[0].Content.Table.Items.
    • Параметры: это основной объект, передаваемый в событие, содержащий всю информацию о текущем пакете.
    • Пакет: коллекция или структура, представляющая собой сам пакет документов.
    • Документы[0]: поскольку УПД является первым (или единственным) документом в пакете, мы обращаемся к его первому элементу. Если в пакете несколько документов, нам может понадобиться итерация или более сложная логика для поиска нужного документа.
    • Content: это содержимое документа, обычно представленное в виде XDTO-структуры.
    • Table: коллекция, содержащая табличные данные документа.
    • Items: это коллекция элементов табличной части, где каждый элемент соответствует строке в таблице товаров УПД.
  4. Модификация наименования: Внутри коллекции Items мы можем итерироваться по каждой строке и изменять поле, отвечающее за наименование номенклатуры. Обычно это поле называется Product.

Например, мы можем представить логику следующим образом:


// Пример обработчика события ПослеПодготовкиПакета
Процедура ПослеПодготовкиПакета(Параметры) Экспорт

    Если Параметры.Свойство("Результат_ИМ") И Параметры.Результат_ИМ Тогда

        // Проверяем, что пакет содержит документы и это УПД (или похожий документ)
        Если Параметры.Пакет.Документы.Количество() > 0 Тогда

            // Допустим, нам нужен первый документ в пакете (часто это УПД)
            ДокументПакета = Параметры.Пакет.Документы[0];

            // Проверяем, что у документа есть содержимое и табличная часть
            Если ДокументПакета.Свойство("Content") И ДокументПакета.Content.Свойство("Table") И ДокументПакета.Content.Table.Свойство("Items") Тогда

                // Итерируемся по строкам табличной части
                Для Каждого СтрокаТЧ Из ДокументПакета.Content.Table.Items Цикл
                    // Получаем исходное наименование (предположим, оно есть)
                    ИсходноеНаименование = "";
                    Если СтрокаТЧ.Свойство("Product") Тогда
                        ИсходноеНаименование = СтрокаТЧ.Product;
                    КонецЕсли;

                    // Здесь мы можем получить дополнительные данные из учетной системы
                    // Например, из справочника Номенклатура по ИдентификаторуСтроки или Коду
                    // Пример: ДополнительныеСведения = ПолучитьДополнительныеДанныеПоНоменклатуре(СтрокаТЧ.ИдентификаторСтроки);
                    // НовоеНаименование = ИсходноеНаименование + " (доп. сведения: " + ДополнительныеСведения + ")";

                    // Для примера просто добавим префикс или суффикс
                    НовоеНаименование = ИсходноеНаименование + " (Изменено через ПМ)";

                    // Подменяем значение наименования номенклатуры
                    СтрокаТЧ.Product = НовоеНаименование;

                    // Если требуется изменить характеристику
                    Если СтрокаТЧ.Свойство("ItemCharact") И Не ПустаяСтрока(СтрокаТЧ.ItemCharact) Тогда
                        СтрокаТЧ.ItemCharact = СтрокаТЧ.ItemCharact + " (Измененная характеристика)";
                    КонецЕсли;

                КонецЦикла;

            КонецЕсли;

        КонецЕсли;

    КонецЕсли;

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

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

Метод 2: Прямое изменение в процедуре "Заполнить_Item820"

Другой, более прямой способ заключается в модификации процедуры, которая непосредственно отвечает за заполнение элемента Item в XDTO-структуре УПД. Как мы уже упоминали, это часто процедура Заполнить_Item820.

Давайте разберем этот метод:

  1. Локализация процедуры: Используя методы поиска и отладки, описанные выше, найдите процедуру Заполнить_Item820(Контент, Параметры) в вашем подключаемом модуле. Если ее нет, возможно, вам придется создать ее, если модуль интеграции вызывает внешнюю процедуру для заполнения этих данных.
  2. Понимание параметров:
    • Контент: это объект XDTO, представляющий собой часть XML-структуры, которая будет отправлена в Диадок. Именно этот объект мы будем модифицировать.
    • Параметры: структура, содержащая дополнительные данные и контекст, необходимые для заполнения.
  3. Изменение значения "Product": В этой процедуре мы найдем строки кода, где происходит заполнение значения Product, которое соответствует наименованию номенклатуры. Типичный вызов будет выглядеть так: УстановитьЗначениеXDTO(Контент, "Product", НаименованиеНоменклатуры); Здесь мы можем подменить переменную НаименованиеНоменклатуры на то значение, которое нам необходимо. Мы можем получить это значение, например, путем запроса к базе данных 1С, используя идентификатор номенклатуры, который, вероятно, доступен в структуре Параметры или Контент.
  4. Работа с характеристиками: Если в вашей учетной системе используется учет по характеристикам номенклатуры, то скорее всего, вы найдете поле ItemCharact, куда записывается наименование характеристики. Его также можно модифицировать аналогичным образом: УстановитьЗначениеXDTO(Контент, "ItemCharact", НаименованиеХарактеристики);

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

Понимание структуры данных XDTO

Для успешной доработки крайне важно понимать, что данные в Контур.Диадок часто представляются в виде XDTO-структур. XDTO — это XML Data Transfer Object, стандарт для описания и передачи данных в формате XML. Эти структуры могут быть преобразованы в универсальные коллекции типа "Структура" или "Массив" с помощью функции ОбъектXDTOВСтруктуру (или аналогичных) для более удобной работы в коде 1С.

Подробная документация по объекту Item820 (или Item в более общей документации Диадока) описывает все сведения об отгруженных товарах (работах, услугах), переданных имущественных правах, которые могут быть в составе УПД. В этом объекте также могут присутствовать свойства, такие как AdditionalProperty для дополнительной информации или CatalogCode для кода каталога товаров.

Общие рекомендации и лучшие практики

  1. Тестирование: Всегда тщательно тестируйте внесенные изменения на тестовой базе перед внедрением в рабочую. Проверяйте не только правильность вывода наименования, но и корректность формирования всего пакета документов, его отправку и получение в Диадоке.
  2. Версионирование: Используйте систему контроля версий для вашего подключаемого модуля. Это позволит отслеживать изменения и, при необходимости, легко откатиться к предыдущей версии.
  3. Документирование: Комментируйте свой код. Описывайте, для чего были внесены изменения, откуда берутся данные и какие условия их применения. Это значительно упростит дальнейшую поддержку.
  4. Учет приказа 820 ФНС: УПД в Контур.Диадок часто формируется в соответствии с форматом 820 приказа ФНС. Имейте в виду, что с 4 квартала 2020 года были внесены изменения в правила визуализации полей для наименования в печатных формах и превью документов в формате 820 приказа. В УПД в поле "Наименование товара, имущественного права" выводится только одно значение с приоритетом: наименование товара, артикул товара, характеристика товара. Код товара выводится в отдельном поле "Код товара/работ, услуг". Это важно учитывать при формировании конечного наименования, чтобы оно соответствовало требованиям законодательства и корректно отображалось.
  5. Альтернативные методы – Плагины: Диадок также предоставляет возможность использования плагинов для внесения изменений в контент исходящих документов, таких как УПД. Плагины позволяют без доступа к конфигуратору и написания подключаемого модуля изменять данные УПД, например, перезаполнять наименование товара, добавлять информационные поля или очищать определенные данные. Среди поддерживаемых сценариев плагинов есть "Изменение таблицы товаров УПД (УТ11), основные поля", который позволяет модифицировать данные в полях, таких как ItemVendorCode (код поставщика товара) и Product (наименование товара). Это может быть более простым решением, если требуются типовые изменения.
  6. API для глубокой интеграции: Для более глубокой интеграции и манипуляций с документами Контур.Диадок предоставляет API, который позволяет разрабатывать собственные решения и реализовывать необходимую функциональность. Этот подход подойдет для сложных и нестандартных сценариев.

Мы рассмотрели несколько эффективных способов изменения наименования номенклатуры в УПД через подключаемый модуль Контур.Диадок 4.16. Выбор конкретного метода будет зависеть от сложности вашей задачи, доступности данных и вашего предпочтения в архитектуре решения. Главное — помнить о необходимости тщательной отладки и документирования внесенных изменений. Если требуется готовый альтернативный вариант выгрузки документов без доработки подключаемого модуля, можно использовать обработку для выгрузки счетов-фактур и УПД в XML для Диадока.

← На главную