Достаточно нечасто можно встретить бизнес, где в качестве учетной системы используется ERP система, не требующая интеграции с другими программными комплексами. По большей части, всегда есть задача загрузить какие-то данные из сторонних программ, таких как например мобильная торговля или "дополнительная" ERP система. Задача по загрузке данных выглядит примерно так:
«У нас есть 1С и есть сайт, с помощью которого наши клиенты покупают у нас товары. Нам необходимо, что бы данные о покупке товара загружались в 1С в документ "Заказ покупателя". Формат передачи данных JSON.»
В этой статье будет приведен пример реализации задачи конвертации JSON в объект 1С. Транспорт сообщений обмена, составление очередности и распараллеливание загрузки данных в этой статье рассмотрены не будут.
Итак, опишем как может выглядеть среднестатистический алгоритм решения задачи конвертации JSON в Объект 1С:
- С помощью объекта Новый ЧтениеJSON выполняем чтение JSON в соответствие/структуру (коллекция данных JSON);
- Получаем значения уникального идентификатора, загружаемого JSON;
- Ищем по полученному уникальному идентификатору уже загруженный ранее Объект 1С;
- Принимаем решение о перезаполнении и перезаписи найденного Объекта 1С, либо, если Объект 1С не найден, о создании и заполнении нового;
- Выполняем программный обход коллекции данных JSON с одновременным поиском значений для реквизитов ссылочного типа и заполнением реквизитов Объекта 1С (алгоритмы этого блока описаны в программном коде);
- Выполняем запись заполненного Объекта 1С.
На мой взгляд, этот алгоритм можно использовать если нам необходимо загрузить какой-то один Объект 1С. Но если у нас много загружаемых данных, и из разных систем, то мы можем столкнуться с проблемами вида:
- Мы не контролируем состав ключей файла JSON (зависим от поставщика данных, который может внезапно добавить, убрать, переименовать какой-либо ключ данных JSON), что заставляет нас постоянно дорабатывать обмены в режиме конфигуратора;
- У нас более одного поставщика данных JSON, которые шлют нам разные JSON для загрузки в один и тот же Объект 1С;
- У нас ограниченные ресурсы в поддержке уже существующих загрузок и отсутствует возможность релизить тогда, когда нам удобно.
В качестве решения для описанных выше причин хорошо было бы иметь подсистему конвертации данных JSON в Объект 1С, где:
- Правила конвертации можно было бы описать непосредственно в 1С предприятии;
- Где был бы кэшируемый поиск значений для реквизитов ссылочного типа;
- Где была бы возможность вклиниться в события записи Объекта 1С, например, такие как, после добавления строки табличной части, перед записью Объекта 1С, после записи Объекта 1С;
Подсистема конвертации данных JSON в Объект 1С должна быть отвязана от БСП, и не должна требовать каких-то экспертных знаний для внедрения ее в свой транспорт обмена.
Другими словами, нам нужен некий модуль конвертации данных который бы имел функциональность Конвертации данных 3.0, но при этом, для ее работы
- Нам не нужно было бы иметь и поддерживать XDTO пакет;
- Поддерживала загрузку из JSON;
- Позволяла менять правила в режиме 1С Предприятия;
- Имела лёгкий программный и пользовательский интерфейс.
В прикрепленных к данной статье файлах вы можете найти автономное расширение для конфигураций 1С, режим совместимости которых выше 8.3.6.
Что бы начать использовать данное расширение в своем транспорте обмена, вам достаточно в режиме 1С Предприятие создать правило конвертации JSON в Объект 1С, а в программном коде обратиться к функции конвертации, которая в качестве входных параметров принимает JSON и правило конвертации этого JSON в Объект 1С.
Расширение позволяет нам конвертировать JSON любого формата в Объект 1С. Под любым форматом JSON имеется ввиду JSON, который может содержать данные в виде Ключ – Значение, где в качестве значения может выступать как примитивный тип, так и массив данных, или, массив массивов данных.
Например,
Перед нами стоит задача загрузить JSON в Объект 1С. В файле JSON мы видим 4 табличных части:
Хотелось обратить ваше внимание на состав ключа данных JSON ТабличныеЧасти – это своего рода табличная часть с данными табличных частей (массив массивов). |
|
Метаданные загружаемого Объекта 1С содержит 3 ссылочных реквизита и одну табличную часть. |
|
Для создания правил конвертации JSON в Объект 1С нам потребуется создать элемент справочника «Правила конвертации», где, на примере загружаемых данных JSON система создаст нам список всех ключей JSON. Нам необходимо отметить поля, которые мы собираемся использовать при создании Объекта 1С. Выделить поле которое будет выступать в качестве уникального идентификатора данных. На заключительном шаге указываем в какой реквизит нам нужно занести то или иное значение.
|
|
После выполнения команды кдс_ОбщегоНазначения.ЗагрузитьДанные( JSON, ПравилоКонвертации); где, JSON – данные которые надо загрузить в 1С, а ПравилоКонвертации – по какому правилу конвертации эти данные необходимо загрузить. в базу данных будет добавлен новый элемент справочника, который наполнен данными JSON. |
|
С помощью объекта Новый ЧтениеJSON считывается JSON в коллекцию данных типа Соответствие |
|
||||
Выполняется приведение полученной коллекции данных JSON к структуре метаданных 1С |
Данные из вложенных коллекций переносятся на верхний уровень. Итог алгоритма – это Соответствие, где ключ это имя реквизита 1С, а значение это значение JSON этого ключа. |
||||
Выполняется поиск, или создаётся новый, объект приёмник 1С |
В событии «При определении приемника данных» мы можем переопределить приёмник данных 1С, для этого в алгоритме есть:
|
||||
Согласно настройкам правила конвертации - заполняются реквизиты объекта приемника 1С |
Если у нас есть загружаемые табличные части, то каждую строку табличной части мы можем перезаполнить в событии «После добавления строки табличной части», где у нас есть данные о новой добавленной строке и данные строки JSON, от которой была создана новая строка:
|
||||
Выполняется запись объекта |
В событии «Перед записью приемника данных» мы можем произвести дополнительные изменения загружаемого Объекта 1С, или принимаем решение об отмене его записи:
В событии «После записи приемника данных» мы можем изменить другие, связанные объекты базы данных:
|
Методы, которые рекомендуется использовать при создании алгоритмов конвертации данных:
УсловияПоиска = Новый Соответствие; УсловияПоиска.Вставить("Номер", "00001"); НайденнаяСсылка = кдс_ОбщегоНазначения.ПоискСсылки(УсловияПоиска, "Документ.ПоступлениеТоваров", КэшПоискСсылок);
|
Поиск значения ссылочного типа рекомендуется выполнять с помощью метода кдс_ОбщегоНазначения.ПоискСсылки, где качестве параметров необходимо указать: Параметр1, тип Соответствие, где ключ это ИмяРеквизита, а Значение это Значение условия отбора; Параметр2, тип Строка, полное имя метаданных где нужно выполнить поиск элемента 1С; Параметр3, тип Соответствие. Тут должна передаваться коллекция КэшПоискСсылок.
КэшПоискСсылок содержит в себе информацию об уже найденных ссылках в текущей итерации обмена. У качества ключа используется полное имя метаданных и условия поиска данных. Использование этого метода избавляет от избыточного обращения к базе данных. |
кдс_ОбщегоНазначения.УстановитьНовоеЗначениеРеквизита( КудаУстановитьНовоеЗначение, НовоеЗначение);
|
При присваивании нового значения реквизиту с помощью этого метода производится сравнение старого и нового значения реквизита. Если значения равны, то новое значение не будет устанавливаться, что в свою очередь не взведет флаг объекта Модифицированность, что не вызовет перезапись Объекта 1С. |
Пример создания алгоритма для события перед записью Объекта 1С.
Для тестирования правил конвертации – необходимо воспользоваться обработкой «Пример загрузки данных»
Информация о результате конвертации накапливается в регистре сведений Протокол обмена
Краткое описание демо базы.
В демо базе вы найдете пример правил конвертации для загрузки 4 видов JSON. На скриншоте показан состав демо конфигурации. |
|
Номенклатура
|
Контрагент
|
Договор контрагента
|
Документ Поступление товаров
|