Конвертация JSON в Объект 1С

29.05.23

Интеграция - Внешние источники данных

Расширение позволяет конвертировать JSON любого формата в Объект 1С. Расширение является автономным, встраивается в любую конфигурацию, не требует наличия подсистем БСП. Не требует экспертных знаний для внедрения в свой транспорт обмена. Позволяет менять правила в режиме 1С Предприятия.

Скачать файлы

Наименование Файл Версия Размер
Конвертация JSON в Объект 1С
.cfe 72,33Kb
14
.cfe 72,33Kb 14 Скачать
Демо база (DT) с примером правил конвертации и примером использования встроенного расширения.
.dt 371,92Kb
9
.dt 371,92Kb 9 Скачать

Достаточно нечасто можно встретить бизнес, где в качестве учетной системы используется ERP система, не требующая интеграции с другими программными комплексами. По большей части, всегда есть задача загрузить какие-то данные из сторонних программ, таких как например мобильная торговля или "дополнительная" ERP система. Задача по загрузке данных выглядит примерно так: 

«У нас есть 1С и есть сайт, с помощью которого наши клиенты покупают у нас товары. Нам необходимо, что бы данные о покупке товара загружались в 1С в документ "Заказ покупателя". Формат передачи данных JSON.»

В этой статье будет приведен пример реализации задачи конвертации JSON в объект 1С. Транспорт сообщений обмена, составление очередности и распараллеливание загрузки данных в этой статье рассмотрены не будут.

Итак, опишем как может выглядеть среднестатистический алгоритм решения задачи конвертации JSON в Объект 1С:

  1. С помощью объекта Новый ЧтениеJSON выполняем чтение JSON в соответствие/структуру (коллекция данных JSON);
  2. Получаем значения уникального идентификатора, загружаемого JSON;
  3. Ищем по полученному уникальному идентификатору уже загруженный ранее Объект 1С;
  4. Принимаем решение о перезаполнении и перезаписи найденного Объекта 1С, либо, если Объект 1С не найден, о создании и заполнении нового;
  5. Выполняем программный обход коллекции данных JSON с одновременным поиском значений для реквизитов ссылочного типа и заполнением реквизитов Объекта 1С (алгоритмы этого блока описаны в программном коде);
  6. Выполняем запись заполненного Объекта 1С.

На мой взгляд, этот алгоритм можно использовать если нам необходимо загрузить какой-то один Объект 1С. Но если у нас много загружаемых данных, и из разных систем, то мы можем столкнуться с проблемами вида:

  • Мы не контролируем состав ключей файла JSON (зависим от поставщика данных, который может внезапно добавить, убрать, переименовать какой-либо ключ данных JSON), что заставляет нас постоянно дорабатывать обмены в режиме конфигуратора;
  • У нас более одного поставщика данных JSON, которые шлют нам разные JSON для загрузки в один и тот же Объект 1С;
  • У нас ограниченные ресурсы в поддержке уже существующих загрузок и отсутствует возможность релизить тогда, когда нам удобно.

В качестве решения для описанных выше причин хорошо было бы иметь подсистему конвертации данных JSON в Объект 1С, где:

  • Правила конвертации можно было бы описать непосредственно в 1С предприятии;
  • Где был бы кэшируемый поиск значений для реквизитов ссылочного типа;
  • Где была бы возможность вклиниться в события записи Объекта 1С, например, такие как, после добавления строки табличной части, перед записью Объекта 1С, после записи Объекта 1С;

Подсистема конвертации данных JSON в Объект 1С должна быть отвязана от БСП, и не должна требовать каких-то экспертных знаний для внедрения ее в свой транспорт обмена.

Другими словами, нам нужен некий модуль конвертации данных который бы имел функциональность Конвертации данных 3.0, но при этом, для ее работы

  1. Нам не нужно было бы иметь и поддерживать XDTO пакет;
  2. Поддерживала загрузку из JSON;
  3. Позволяла менять правила в режиме 1С Предприятия;
  4. Имела лёгкий программный и пользовательский интерфейс.

В прикрепленных к данной статье файлах вы можете найти автономное расширение для конфигураций 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 в Объект 1С имеет следующий вид:

С помощью объекта Новый ЧтениеJSON считывается JSON в коллекцию данных типа Соответствие

 

Выполняется приведение полученной коллекции данных JSON к структуре метаданных 1С

Данные из вложенных коллекций переносятся на верхний уровень. Итог алгоритма – это Соответствие, где ключ это имя реквизита 1С, а значение это значение JSON этого ключа.

Выполняется поиск, или создаётся новый, объект приёмник 1С

В событии «При определении приемника данных» мы можем переопределить приёмник данных 1С, для этого в алгоритме есть:

Входящие данные

Параметры.ПолученныеДанные

Параметры.ПриемникДанных

Параметры.КэшПоискСсылок

Исходящие данные

Параметры.РезультатАлгоритма

РезультатАлгоритма - Структура, где ожидается элемент

             Ключ "Ссылка1С",

             Значение — это Ссылка, в объект, которой будут загружены полученные данные

 

Согласно настройкам правила конвертации - заполняются реквизиты объекта приемника 1С

Если у нас есть загружаемые табличные части, то каждую строку табличной части мы можем перезаполнить в событии «После добавления строки табличной части», где у нас есть данные о новой добавленной строке и данные строки JSON, от которой была создана новая строка:

Входящие данные

Параметры.ПолученныеДанные

Параметры.Объект1С

Параметры.СтрокаТЧ

Параметры.ДанныеСтрокиВД

 

Выполняется запись объекта

В событии «Перед записью приемника данных» мы можем произвести дополнительные изменения загружаемого Объекта 1С, или принимаем решение об отмене его записи:

Входящие данные

Параметры.ПолученныеДанные

Параметры.Объект1С

Параметры.ОтменитьЗапись

 

В событии «После записи приемника данных» мы можем изменить другие, связанные объекты базы данных:

Входящие данные

Параметры.Объект1С

 

 

Методы, которые рекомендуется использовать при создании алгоритмов конвертации данных:

УсловияПоиска = Новый Соответствие;

УсловияПоиска.Вставить("Номер", "00001");

НайденнаяСсылка = кдс_ОбщегоНазначения.ПоискСсылки(УсловияПоиска, "Документ.ПоступлениеТоваров", КэшПоискСсылок);

 

Поиск значения ссылочного типа рекомендуется выполнять с помощью метода кдс_ОбщегоНазначения.ПоискСсылки, где качестве параметров необходимо указать:

Параметр1, тип Соответствие, где ключ это ИмяРеквизита, а Значение это Значение условия отбора;

Параметр2, тип Строка, полное имя метаданных где нужно выполнить поиск элемента 1С;

Параметр3, тип Соответствие. Тут должна передаваться коллекция КэшПоискСсылок.

 

КэшПоискСсылок содержит в себе информацию об уже найденных ссылках в текущей итерации обмена. У качества ключа используется полное имя метаданных и условия поиска данных.

Использование этого метода избавляет от избыточного обращения к базе данных.

кдс_ОбщегоНазначения.УстановитьНовоеЗначениеРеквизита(

КудаУстановитьНовоеЗначение,

НовоеЗначение);

 

При присваивании нового значения реквизиту с помощью этого метода производится сравнение старого и нового значения реквизита. Если значения равны, то новое значение не будет устанавливаться, что в свою очередь не взведет флаг объекта Модифицированность, что не вызовет перезапись Объекта 1С.

 

Пример создания алгоритма для события перед записью Объекта 1С.

 

Для тестирования правил конвертации – необходимо воспользоваться обработкой «Пример загрузки данных»

 

Информация о результате конвертации накапливается в регистре сведений Протокол обмена

 

Краткое описание демо базы.

В демо базе вы найдете пример правил конвертации для загрузки 4 видов JSON.

На скриншоте показан состав демо конфигурации.

Номенклатура

 

Контрагент

 

Договор контрагента

 

Документ Поступление товаров

 

 

 

 

расширение транспорт json JSON конвертация правила обмен загрузка

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22460    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9217    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48712    96    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81584    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30006    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19136    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 749 15.05.23 19:16 Сейчас в теме
Да уж. Цены космос. Хорошо, что пока очистку РС за 10 см не выставляют )
maksa2005; Dmitri93; корум; siamagic; +4 3 Ответить
2. siamagic 16.05.23 10:41 Сейчас в теме
(1) Это у него ума еще не хватило вместо кодов уидов накидать и рекурсивно обходить объекты - там вообще цена в космос уйдет )))
3. nicxxx 254 25.05.23 13:45 Сейчас в теме
Недостатки все те же, что и у КД 2/3:
Нельзя версионировать. Ну т.е. можно, самому, в гите, но это неудобно.
Нельзя удобно задеплоить на несколько баз. Например, правила создаем в своей, разработческой, а деплоим на test, uat, prod - везде надо руками повторять создание элементов справочника. Можно, конечно, написать обработчик обновления, который создаст нужные правила в нужной базе. Можно воспользоваться сохранением в mxl в обработке xunitfor1c, но это опять же лишняя работа. Которую можно избежать, если правила будут в коде.
Т.е. если все равно надо писать код, а здесь это опять неудобно - в режиме Предприятия - то почему просто не написать код по выгрузке/загрузке?
Что-то вроде:
вот мы подготовили массив объектов, запишем его
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
	ЗаписьJson = Новый ЗаписьJSON;
	ЗаписьJson.ОткрытьФайл(FileName,"UTF-8",Ложь,ПараметрыЗаписиJSON);	
	СериализаторXDTO.ЗаписатьJSON(ЗаписьJson, Массив, НазначениеТипаXML.Неявное);
	ЗаписьJson.Закрыть();

а вот - на стороне получателя прочитаем и создадим объекты
	
	ЧтениеJSON2 = Новый ЧтениеJSON;
	ЧтениеJSON2.ОткрытьФайл(FileName);
	Рез = ПрочитатьJSON(ЧтениеJSON2, Истина);
	МассивКарт = Рез["#value"];
	Для каждого json Из МассивКарт Цикл
		карта = json.получить("#value");
		Реф = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(карта["Ref"]));
		Если не ЗначениеЗаполнено(Реф.ВерсияДанных) Тогда
			Если карта["IsFolder"] = true Тогда
				_Спр = Справочники.Контрагенты.СоздатьГруппу();
			Иначе 
				_Спр = Справочники.Контрагенты.СоздатьЭлемент();
			КонецЕсли; 
			_Спр.УстановитьСсылкуНового(Реф);
		Иначе 
			_Спр = Реф.ПолучитьОбъект();
		КонецЕсли; 
		// установка реквизитов
		_Спр.Код = карта["Code"];
		_Спр.Наименование = карта["Description"];
		_Спр.VATNumber = карта["VATNumber"];
		_Спр.RegistrationNumber = карта["RegistrationNumber"];
		_Спр.ContactPerson = карта["ContactPerson"];
		_Спр.TelephoneAndAddress = карта["TelephoneAndAddress"];
		_Спр.email = карта["email"];
		_Спр.OtherComments = карта["OtherComments"];
		_Спр.FullName = карта["FullName"];
...
Показать
PowerBoy; sstas007; +2 Ответить
4. kvartirant 21 29.05.23 11:40 Сейчас в теме
Тут все индивидуально.
Кто то может выкатывать релиз раз в 2 недели - поэтому удобнее писать правила в предприятии.
Кто то может катить релиз по 2 раза в день - им удобнее писать правила в предприятии.

Кому не удобно писать правила в предприятии в режиме блокнота, тем в помощь monaco + несложная доработка текущей конвертации.

Если хотите писать в режиме конфигуратора, со всеми преимуществами массовых деплоев и версионирования, то потребуется несходная доработка - нужно уйти от метода Выполнить и перейти на вызов правил из менеджера загружаемого объекта или из общего модуля

Суть моего решения:
JSON -> Соответствие -> Правило конвертации -> Объект 1С.

Не нужно описывать все правило руками. Достаточно в правилах указать соответствие ключа JSON реквизиту 1С (как минимум для примитивных типов)
Прикрепленные файлы:
Оставьте свое сообщение