При работе с системой электронного документооборота Контур.Диадок в конфигурации 1С часто возникает задача по корректировке данных, отправляемых в Универсальном передаточном документе (УПД). Одной из наиболее распространенных модификаций является изменение или дополнение наименования номенклатуры, которое выводится в документе. Это может быть необходимо для добавления артикула, характеристики, особенностей упаковки или других сведений, которые не предусмотрены типовым заполнением.
В этом руководстве мы подробно рассмотрим, как решить эту задачу, используя возможности доработки подключаемого модуля Контур.Диадок версии 4.16, фокусируясь на ключевых событиях и процедурах.
Прежде всего, давайте разберемся, почему именно подключаемый модуль является предпочтительным инструментом для подобных доработок. Подключаемый модуль — это внешняя обработка, которая содержит функции для обработки различных событий, возникающих при работе модуля интеграции Диадок. Он позволяет расширять функциональность стандартного модуля без прямого изменения кода основной конфигурации или модуля обмена, что значительно упрощает обновления и поддержку системы. Некоторые стандартные модули интеграции могут содержать обработчики, например, в модулях типа «ИнтеграцияУТ», но общепринятая и рекомендованная практика заключается в работе именно с ПМ. Отметим, что 99% подобных проблем эффективно решаются именно в ПМ, избегая необходимости трогать основную обработку интеграции.
Подключаемый модуль добавляет новые сценарии при нехватке функционала стандартного модуля. Новые подключаемые модули обычно создаются с использованием Генератора ПМ, который доступен в расширенных настройках Диадок, что обеспечивает правильную структуру и набор стандартных обработчиков событий.
Прежде чем приступать к доработкам, нам необходимо локализовать участок кода, отвечающий за формирование наименования номенклатуры в УПД. Для этого мы можем использовать следующие подходы:
Upd820 в коде подключаемого модуля или основного модуля интеграции. Это поможет нам найти процедуры, отвечающие за формирование XML-структуры УПД. Например, коллеги по цеху подтверждают, что этот метод успешно приводил к нужным процедурам, таким как в модуле «ИнтеграцияУТ», где также находились участки, связанные с Upd820.Конкретная процедура, которая отвечает за заполнение элемента Item в формате 820 приказа, часто называется Заполнить_Item820. Именно в ней мы и найдем участки для модификации.
Одним из наиболее гибких и удобных способов для изменения данных в УПД является доработка события ПослеПодготовкиПакета в подключаемом модуле. Это событие вызывается после того, как модуль интеграции уже сформировал предварительный пакет документов, но до его окончательной отправки.
Давайте подробнее рассмотрим, как мы можем использовать это событие:
ПослеПодготовкиПакета.ПослеПодготовкиПакета срабатывает, в его параметры передается структура, содержащая весь пакет документов. Эти данные заполнены и готовы к модификации, если в параметрах присутствует свойство Результат_ИМ со значением Истина. Это служит индикатором успешного формирования пакета.Параметры.Пакет.Документы[0].Content.Table.Items.
Параметры: это основной объект, передаваемый в событие, содержащий всю информацию о текущем пакете.Пакет: коллекция или структура, представляющая собой сам пакет документов.Документы[0]: поскольку УПД является первым (или единственным) документом в пакете, мы обращаемся к его первому элементу. Если в пакете несколько документов, нам может понадобиться итерация или более сложная логика для поиска нужного документа.Content: это содержимое документа, обычно представленное в виде XDTO-структуры.Table: коллекция, содержащая табличные данные документа.Items: это коллекция элементов табличной части, где каждый элемент соответствует строке в таблице товаров УПД.Items мы можем итерироваться по каждой строке и изменять поле, отвечающее за наименование номенклатуры. Обычно это поле называется Product.Например, мы можем представить логику следующим образом:
// Пример обработчика события ПослеПодготовкиПакета
Процедура ПослеПодготовкиПакета(Параметры) Экспорт
Если Параметры.Свойство("Результат_ИМ") И Параметры.Результат_ИМ Тогда
// Проверяем, что пакет содержит документы и это УПД (или похожий документ)
Если Параметры.Пакет.Документы.Количество() > 0 Тогда
// Допустим, нам нужен первый документ в пакете (часто это УПД)
ДокументПакета = Параметры.Пакет.Документы[0];
// Проверяем, что у документа есть содержимое и табличная часть
Если ДокументПакета.Свойство("Content") И ДокументПакета.Content.Свойство("Table") И ДокументПакета.Content.Table.Свойство("Items") Тогда
// Итерируемся по строкам табличной части
Для Каждого СтрокаТЧ Из ДокументПакета.Content.Table.Items Цикл
// Получаем исходное наименование (предположим, оно есть)
ИсходноеНаименование = "";
Если СтрокаТЧ.Свойство("Product") Тогда
ИсходноеНаименование = СтрокаТЧ.Product;
КонецЕсли;
// Здесь мы можем получить дополнительные данные из учетной системы
// Например, из справочника Номенклатура по ИдентификаторуСтроки или Коду
// Пример: ДополнительныеСведения = ПолучитьДополнительныеДанныеПоНоменклатуре(СтрокаТЧ.ИдентификаторСтроки);
// НовоеНаименование = ИсходноеНаименование + " (доп. сведения: " + ДополнительныеСведения + ")";
// Для примера просто добавим префикс или суффикс
НовоеНаименование = ИсходноеНаименование + " (Изменено через ПМ)";
// Подменяем значение наименования номенклатуры
СтрокаТЧ.Product = НовоеНаименование;
// Если требуется изменить характеристику
Если СтрокаТЧ.Свойство("ItemCharact") И Не ПустаяСтрока(СтрокаТЧ.ItemCharact) Тогда
СтрокаТЧ.ItemCharact = СтрокаТЧ.ItemCharact + " (Измененная характеристика)";
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом примере мы демонстрируем, как можно получить доступ к каждой строке табличной части и модифицировать ее свойства. Реальная логика получения нового наименования будет зависеть от вашей бизнес-задачи и источников данных в вашей конфигурации 1С.
Другой, более прямой способ заключается в модификации процедуры, которая непосредственно отвечает за заполнение элемента Item в XDTO-структуре УПД. Как мы уже упоминали, это часто процедура Заполнить_Item820.
Давайте разберем этот метод:
Заполнить_Item820(Контент, Параметры) в вашем подключаемом модуле. Если ее нет, возможно, вам придется создать ее, если модуль интеграции вызывает внешнюю процедуру для заполнения этих данных.Контент: это объект XDTO, представляющий собой часть XML-структуры, которая будет отправлена в Диадок. Именно этот объект мы будем модифицировать.Параметры: структура, содержащая дополнительные данные и контекст, необходимые для заполнения.Product, которое соответствует наименованию номенклатуры. Типичный вызов будет выглядеть так:
УстановитьЗначениеXDTO(Контент, "Product", НаименованиеНоменклатуры);
Здесь мы можем подменить переменную НаименованиеНоменклатуры на то значение, которое нам необходимо. Мы можем получить это значение, например, путем запроса к базе данных 1С, используя идентификатор номенклатуры, который, вероятно, доступен в структуре Параметры или Контент.ItemCharact, куда записывается наименование характеристики. Его также можно модифицировать аналогичным образом:
УстановитьЗначениеXDTO(Контент, "ItemCharact", НаименованиеХарактеристики);
Этот метод позволяет внести изменения непосредственно в момент формирования XDTO-структуры, что может быть более эффективно, если все необходимые данные для формирования наименования доступны на этом этапе.
Для успешной доработки крайне важно понимать, что данные в Контур.Диадок часто представляются в виде XDTO-структур. XDTO — это XML Data Transfer Object, стандарт для описания и передачи данных в формате XML. Эти структуры могут быть преобразованы в универсальные коллекции типа "Структура" или "Массив" с помощью функции ОбъектXDTOВСтруктуру (или аналогичных) для более удобной работы в коде 1С.
Контент: В контексте Диадока, Контент — это обычно корневой или промежуточный XDTO-объект, который содержит все данные, предназначенные для формирования XML-файла документа. Он имеет иерархическую структуру, соответствующую XML-схеме документа (например, УПД).Product: Это свойство XDTO-объекта, которое предназначено для хранения наименования товара, работы или услуги в рамках элемента строки табличной части документа. Именно его мы будем изменять.ItemCharact: Это свойство используется для передачи наименования характеристики товара, если такой учет ведется. Если ваша задача включает модификацию характеристик, то работа с этим полем будет аналогична работе с Product.Подробная документация по объекту Item820 (или Item в более общей документации Диадока) описывает все сведения об отгруженных товарах (работах, услугах), переданных имущественных правах, которые могут быть в составе УПД. В этом объекте также могут присутствовать свойства, такие как AdditionalProperty для дополнительной информации или CatalogCode для кода каталога товаров.
ItemVendorCode (код поставщика товара) и Product (наименование товара). Это может быть более простым решением, если требуются типовые изменения.Мы рассмотрели несколько эффективных способов изменения наименования номенклатуры в УПД через подключаемый модуль Контур.Диадок 4.16. Выбор конкретного метода будет зависеть от сложности вашей задачи, доступности данных и вашего предпочтения в архитектуре решения. Главное — помнить о необходимости тщательной отладки и документирования внесенных изменений. Если требуется готовый альтернативный вариант выгрузки документов без доработки подключаемого модуля, можно использовать обработку для выгрузки счетов-фактур и УПД в XML для Диадока.