Столкнулся с проблемой выгрузки реквизитов из заказа. Перечитал подобные обращения на форуме, но универсального механизма так и не нашел. Вариантов выгрузки масса: начиная от создания произвольного плана обмена в 1с, регистрации изменений и выгрузке данных в формате csv на сайт, заканчивая полной переработкой обмена.
Чем дальше изучал исходники модуля обмена в 1С, тем больше убеждался, что скорее всего разработчики 1С-Битрикс, хотели реализовать что-то подобное, но времени на это не хватило. Взять тот же механизм импорта пользовательских справочников, по сути, мы можем любой объект 1с разложить на составляющие и компонента на сайте сама все сделает: проверит выгружаемый объект, создаст недостающие поля и импортирует все на сайт.
Вот тут и пришла идея, а что если модулю обмена в 1С, подсунуть документ и сказать, что это не документ, а справочник, и тогда система сама все сделает. В итоге получилось расширение для 1С (для справки, это внешняя доработка, которая не требует обновления базы, а подключается как внешнее дополнение к модулю обмена от Битрикс). Модуль добавляет в список выбора документы, для которых включена регистрация в плане обмена.
Список документов:
Заказ клиента
Реализация товаров и услуг
Приходный кассовый ордер
Операция по платежной карте
Поступление безналичных денежных средств
В рабочей базе это выглядит так:
Переопределив несколько процедур, выгрузка пошла на сайт, система сама создала HL блок и поля.
Но связать выгруженный заказ из 1С с заказом на сайте оказалось не просто, общий реквизит Б_Идентификатор несет в себе ID заказа, но не является прямым реквизитом объекта и потому не доступен для выбора. В расширении добавил возможность выгружать общие реквизиты как для документов, так и для справочников.
Все, общий реквизит выгружается. Дальше, чтобы обновить свойство заказа на сайте подписываемся на событие OnAfterUpdate и через поле B_IDENTIFIKATOR находим заказ в базе и обновляем его свойства.
Кажется, все отлично и инструмент получился универсальным и кода много не написано, все на базе типовых функций обмена, а что делать если требуется выгрузить динамический реквизит, к примеру, причину отмены заказа, которая в явном виде не хранится, а собирается из записей в табличной части заказа.
Для этих целей в форму настройки выгрузки добавил возможность указывать произвольный алгоритм расчета, подобный механизм реализован при загрузке заказов с сайта, выгрузке свойств номенклатуры и обязательно должен быть в нашем модуле.
Пример алгоритма дополнительного реквизита, который выгружает причину отмены:
// Параметр, возвращающий результат [Результат] // // Параметр на данные [СсылкаНаОбъект]
//ПРОСТЕНЬКИЙ ПРИМЕР.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказКлиентаТовары.Ссылка КАК Ссылка, | СУММА(1) КАК КоличествоСтрок |ПОМЕСТИТЬ втКоличествоСтрокЗаказа |ИЗ | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары |ГДЕ | ЗаказКлиентаТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ЗаказКлиентаТовары.Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказКлиентаТовары.Ссылка КАК Ссылка, | СУММА(1) КАК КоличествоОтмененныхСтрок, | МАКСИМУМ(ЗаказКлиентаТовары.ПричинаОтмены) КАК ПричинаОтмены |ПОМЕСТИТЬ втОтмененныеСтроки |ИЗ | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары |ГДЕ | ЗаказКлиентаТовары.Ссылка = &Ссылка | И ЗаказКлиентаТовары.Отменено = ИСТИНА | |СГРУППИРОВАТЬ ПО | ЗаказКлиентаТовары.Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | втКоличествоСтрокЗаказа.Ссылка КАК Ссылка, | ВЫБОР | КОГДА ЕСТЬNULL(втКоличествоСтрокЗаказа.КоличествоСтрок, 0) <> 0 | И ЕСТЬNULL(втКоличествоСтрокЗаказа.КоличествоСтрок, 0) = ЕСТЬNULL(втОтмененныеСтроки.КоличествоОтмененныхСтрок, 0) | И ЕСТЬNULL(втОтмененныеСтроки.КоличествоОтмененныхСтрок, 0) <> 0 | ТОГДА втОтмененныеСтроки.ПричинаОтмены | КОНЕЦ КАК ПричинаОтмены |ИЗ | втКоличествоСтрокЗаказа КАК втКоличествоСтрокЗаказа | ЛЕВОЕ СОЕДИНЕНИЕ втОтмененныеСтроки КАК втОтмененныеСтроки | ПО втКоличествоСтрокЗаказа.Ссылка = втОтмененныеСтроки.Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ втКоличествоСтрокЗаказа |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ втОтмененныеСтроки"; Запрос.УстановитьПараметр("Ссылка", [СсылкаНаОбъект]); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл [Результат] = ВыборкаДетальныеЗаписи.ПричинаОтмены; КонецЦикла;
|
В итоге получился универсальный модуль, который расширяет возможности модуля обмена от 1С-Битрикс и позволяет:
Выгружать документы в HL блоки
Импортировать общие реквизиты
Передавать динамические (собирательные) реквизиты с произвольным алгоритмом
Такой вот инструмент получился в итоге, буду рад если кому-то упростит настройку синхронизации.
P.S. Тестировал на конфигурации Управление торговлей, редакция 11 (11.4.2.109) Платформа: 1С:Предприятие 8.3 (8.3.10.2650)