Переход от обмена данными, реализованного на базе «Конвертации Данных 2.1» (КД 2.1), к полностью кодовому обмену с использованием формата JSON через 1С:Шина — это масштабная и комплексная задача. Она требует не только технических знаний, но и глубокого понимания бизнес-процессов, а также тщательного планирования архитектуры решения. Мы рассмотрим, как подойти к этой задаче, учитывая опыт и рекомендации коллег.
Прежде чем приступать к технической реализации, критически важно выяснить истинные цели, которые заказчик хочет достичь, отказываясь от КД. Просто «уйти от КД» — это не цель, а способ ее достижения. Возможно, заказчик стремится к:
Без четкого понимания целей, мы рискуем получить «обратный эффект», потратив ресурсы на создание решения, которое не принесет желаемых выгод. Возможно, КД 3.1 или даже доработанная КД 2.1 могли бы быть жизнеспособными альтернативами, если бы истинные цели были другими.
Далее, мы должны провести глубокий анализ текущих правил обмена КД 2.1. Они могут быть крайне сложными, содержать множество обработчиков, алгоритмов и специфической логики, которая формировалась годами. Этот этап требует значительных временных и бюджетных затрат. Мы должны:
Когда цели определены и текущие правила проанализированы, мы приступаем к проектированию новой архитектуры. Начнем с простого, как с «Привет мир!», чтобы понять основные механизмы взаимодействия с 1С:Шина и JSON.
Платформа 1С, начиная с версии 8.3.6, предоставляет мощные встроенные средства для работы с JSON. Мы можем использовать:
ПрочитатьJSON() и ЗаписатьJSON(): Эти функции позволяют легко сериализовать и десериализовать примитивные типы, коллекции (Массивы, Структуры, Соответствия) и прикладные типы 1С (ссылки, объекты, наборы записей) через XDTO-сериализацию. Это удобно для простых JSON-документов.ЧтениеJSON и ЗаписьJSON: Они предназначены для потоковой работы с JSON, что оптимально для больших объемов данных, так как не требует формирования всего документа в памяти.Рассмотрим пример формирования JSON-объекта для выгрузки:
// Пример формирования JSON для выгрузки объекта "Контрагент"
Функция СформироватьJSONКонтрагента(КонтрагентСсылка) Экспорт
СтруктураДанных = Новый Соответствие();
СтруктураДанных.Вставить("Идентификатор", Строка(КонтрагентСсылка.УникальныйИдентификатор()));
СтруктураДанных.Вставить("Код", КонтрагентСсылка.Код);
СтруктураДанных.Вставить("Наименование", КонтрагентСсылка.Наименование);
СтруктураДанных.Вставить("ИНН", КонтрагентСсылка.ИНН);
СтруктураДанных.Вставить("КПП", КонтрагентСсылка.КПП);
СтруктураДанных.Вставить("ПолноеНаименование", КонтрагентСсылка.ПолноеНаименование);
МассивАдресов = Новый Массив();
Для Каждого КонтактнаяИнформация Из КонтрагентСсылка.КонтактнаяИнформация Цикл
Если КонтактнаяИнформация.Вид.Наименование = "Юридический адрес" Тогда
Адрес = Новый Соответствие();
Адрес.Вставить("ТипАдреса", "Юридический");
Адрес.Вставить("Представление", КонтактнаяИнформация.Представление);
МассивАдресов.Добавить(Адрес);
КонецЕсли;
КонецЦикла;
СтруктураДанных.Вставить("Адреса", МассивАдресов);
СтрокаJSON = ЗаписатьJSON(СтруктураДанных, , Истина); // Истина для форматирования
Возврат СтрокаJSON;
КонецФункции
// Пример использования ЗаписьJSON для потоковой записи (для больших объемов)
Функция СформироватьJSONДокументаПотоково(ДокументСсылка) Экспорт
Запись = Новый ЗаписьJSON();
Запись.УстановитьСтроку();
Запись.НачатьЗаписьОбъекта(); // {
Запись.ЗаписатьИмяСвойства("Идентификатор");
Запись.ЗаписатьЗначение(Строка(ДокументСсылка.УникальныйИдентификатор()));
Запись.ЗаписатьИмяСвойства("Номер");
Запись.ЗаписатьЗначение(ДокументСсылка.Номер);
Запись.ЗаписатьИмяСвойства("Дата");
Запись.ЗаписатьЗначение(Формат(ДокументСсылка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss")); // ISO 8601
Запись.ЗаписатьИмяСвойства("Контрагент");
Запись.НачатьЗаписьОбъекта(); // {
Запись.ЗаписатьИмяСвойства("Идентификатор");
Запись.ЗаписатьЗначение(Строка(ДокументСсылка.Контрагент.УникальныйИдентификатор()));
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение(ДокументСсылка.Контрагент.Наименование);
Запись.ЗакончитьЗаписьОбъекта(); // }
Запись.ЗаписатьИмяСвойства("СуммаДокумента");
Запись.ЗаписатьЗначение(ДокументСсылка.СуммаДокумента);
Запись.ЗаписатьИмяСвойства("ТабличнаяЧасть");
Запись.НачатьЗаписьМассива(); // [
Для Каждого СтрокаТЧ Из ДокументСсылка.Товары Цикл
Запись.НачатьЗаписьОбъекта(); // {
Запись.ЗаписатьИмяСвойства("Номенклатура");
Запись.НачатьЗаписьОбъекта(); // {
Запись.ЗаписатьИмяСвойства("Идентификатор");
Запись.ЗаписатьЗначение(Строка(СтрокаТЧ.Номенклатура.УникальныйИдентификатор()));
Запись.ЗаписатьИмяСвойства("Артикул");
Запись.ЗаписатьЗначение(СтрокаТЧ.Номенклатура.Артикул);
Запись.ЗакончитьЗаписьОбъекта(); // }
Запись.ЗаписатьИмяСвойства("Количество");
Запись.ЗаписатьЗначение(СтрокаТЧ.Количество);
Запись.ЗаписатьИмяСвойства("Цена");
Запись.ЗаписатьЗначение(СтрокаТЧ.Цена);
Запись.ЗаписатьИмяСвойства("Сумма");
Запись.ЗаписатьЗначение(СтрокаТЧ.Сумма);
Запись.ЗакончитьЗаписьОбъекта(); // }
КонецЦикла;
Запись.ЗакончитьЗаписьМассива(); // ]
Запись.ЗакончитьЗаписьОбъекта(); // }
Возврат Запись.Закрыть();
КонецФункции
// Пример чтения JSON-строки
Функция ПрочитатьJSONКонтрагента(СтрокаJSON) Экспорт
ДанныеJSON = ПрочитатьJSON(СтрокаJSON); // ДанныеJSON будет Соответствие
// Получаем значение по ключу, например, Наименование
Если ДанныеJSON.Свойство("Наименование") Тогда
Возврат ДанныеJSON.Наименование;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Для загрузки данных из JSON-строки, полученной из 1С:Шина, мы будем использовать схожий подход, но в обратном порядке. Сначала преобразуем JSON в структуру данных 1С, а затем будем сопоставлять и создавать/обновлять объекты.
Один из самых сложных и критичных аспектов при отказе от КД — это реализация механизмов сопоставления объектов. КД делает это "из коробки", а в коде нам придется продумать каждый сценарий.
УникальныйИдентификатор.Артикул, Наименование.ИНН, КПП, Наименование.ИмяПользователя, E-mail.Важно помнить, что поиск по ключевым реквизитам должен быть быстрым, поэтому желательно, чтобы эти реквизиты были индексированы.
СоответствияОбъектовИнформационныхБаз), в котором храним соответствие уникальных идентификаторов объектов разных баз.
// Пример структуры регистра сведений "СоответствияОбъектовИнформационныхБаз"
// Измерение: ИдентификаторИсточника (Строка 36, GUID)
// Измерение: ТипОбъектаИсточника (Строка, например, "Справочник.Контрагенты")
// Ресурс: ИдентификаторПриемника (Строка 36, GUID)
// Ресурс: ТипОбъектаПриемника (Строка, например, "Справочник.Контрагенты")
Логика работы:
ИдентификаторИсточника.ИдентификаторПриемника и по нему находим объект в текущей базе.УникальныйИдентификатор и ИдентификаторИсточника в регистр соответствий. Обновляем данные объекта.УникальныйИдентификатор и ИдентификаторИсточника в регистр соответствий.Работа с ссылочными данными (например, когда в документе указан Контрагент или Номенклатура) требует особого внимания. При сериализации прикладных типов 1С в JSON, ссылки могут быть преобразованы в их УникальныеИдентификаторы.
При загрузке JSON мы должны выполнить "разрешение" этих ссылок:
УникальныйИдентификатор ссылочного объекта из JSON.Для автоматизации этого процесса можно разработать универсальные функции, которые будут принимать УникальныйИдентификатор из JSON и возвращать соответствующую ссылку на объект 1С, используя регистр соответствий или прямой поиск.
Работа с коллекциями данных (табличные части документов, наборы записей регистров) аналогична. В JSON они обычно представляются массивами объектов. При загрузке мы должны перебрать элементы массива, сопоставить или создать их, а затем заполнить соответствующие табличные части или наборы записей.
Хотя идея использования OpenCode или LLM для прямой конвертации правил КД в код 1С для JSON-обмена звучит заманчиво, на практике готовых, широко используемых решений для полной автоматизации такого процесса пока нет. Однако мы можем использовать эти подходы для:
Встроенные средства 1С для JSON, такие как ЧтениеJSON и ЗаписьJSON, являются нашими основными инструментами. Мы уже рассмотрели их функциональность. Подчеркнем, что для сложных или объемных JSON-структур потоковая запись/чтение через ЗаписьJSON/ЧтениеJSON значительно эффективнее, чем полная загрузка/выгрузка в память через ПрочитатьJSON()/ЗаписатьJSON().
Переход на кодовый обмен упрощает отладку. Вся логика обмена находится непосредственно в конфигурации или расширении, что позволяет использовать стандартные средства отладчика 1С. Мы можем ставить точки останова, пошагово проходить код, инспектировать значения переменных – всё это гораздо удобнее, чем отладка обработчиков в КД, которая часто требовала выгрузки кода в файл и его специфичного выполнения.
Управление версиями правил обмена становится частью общего процесса управления версиями исходного кода. Мы будем использовать стандартные системы контроля версий (например, Git с плагинами для 1С) для отслеживания изменений в общих модулях, формах и регистрах, связанных с обменом. Это обеспечивает прозрачность изменений, возможность отката к предыдущим версиям и удобную командную разработку.
Помимо полного переписывания на кодовый JSON-обмен, стоит рассмотреть и другие варианты, которые могут быть более подходящими в зависимости от конкретных условий и бюджета:
Переход от КД 2.1 к кодовому JSON-обмену через 1С:Шина предоставляет значительную гибкость, полный контроль над процессом и потенциальное улучшение производительности. Однако он требует тщательного проектирования, глубокой проработки каждого аспекта (от сопоставления данных до обработки ошибок) и готовности к инвестициям в разработку и поддержку. Использование расширений, встроенных средств 1С для работы с JSON, продуманные механизмы сопоставления и системный подход к отладке и управлению версиями — это ключевые факторы успеха в этом непростом, но перспективном проекте.