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