Зачастую перед разработчиками встает задача переноса определенных документов (например, Чек ККМ) из одной базы 1С в другую (например, Бухгалтерия 3.0) без настройки сложных правил конвертации. Рассмотрим, как создать гибкую и наглядную систему выгрузки с использованием формата JSON.
Для начала разберем, как подготовить данные документа. Мы будем использовать СериализаторXDTO, который позволяет удобно преобразовывать объекты 1С в структуру JSON. Это решение обеспечивает высокую скорость и простоту чтения файлов на стороне приемника.
Рассмотрим код для формирования массива данных из табличной части документа:
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл(ПутьКФайлу);
Данные = Новый Массив;
Для каждого стр Из ТаблицаДокументовВыгрузка Цикл
ДанныеДокумента = Новый Массив;
ЧекККМ = стр.СсылкаНаДокумент;
Для каждого СтрокаТабличнойЧасти Из ЧекККМ.Товары Цикл
СтрокаДокумента = Новый Структура("Номенклатура, Количество, Цена, Сумма, НоменклатураМетаданные");
ЗаполнитьЗначенияСвойств(СтрокаДокумента, СтрокаТабличнойЧасти);
// Получаем метаданные для последующей обработки ссылочных типов
МетаданныеЗначения = СтрокаТабличнойЧасти.Номенклатура.Метаданные();
ЗначениеСтруктурой = Новый Структура;
Значение = СтрокаТабличнойЧасти.Номенклатура;
Для каждого Реквизит Из МетаданныеЗначения.Реквизиты Цикл
Если ЗначениеЗаполнено(Значение[Реквизит.Имя]) Тогда
ЗначениеСтруктурой.Вставить(Реквизит.Имя, Значение[Реквизит.Имя]);
КонецЕсли;
КонецЦикла;
СтрокаДокумента.НоменклатураМетаданные = ЗначениеСтруктурой;
ДанныеДокумента.Добавить(СтрокаДокумента);
КонецЦикла;
Если ДанныеДокумента.Количество() > 0 Тогда
Данные.Добавить(ДанныеДокумента);
КонецЕсли;
КонецЦикла;
СериализаторXDTO.ЗаписатьJSON(Запись, Данные);
Запись.Закрыть();
Ключевой сложностью при обмене является поиск объектов (например, номенклатуры) в базе-приемнике. Если объект не найден по своей ссылке (UUID), нам необходимо проверить его наличие или создать новый. Для этого мы можем использовать функции для проверки существования записи в базе данных:
// Проверяет физическое наличие записи в информационной базе
Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ [ИмяТаблицы] ГДЕ Ссылка = &Ссылка";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка));
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
// Возвращает полное имя объекта метаданных
Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт
Возврат Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();
КонецФункции
НоменклатураМетаданные, которые мы упаковали в JSON. Вы можете программно создать новый элемент справочника, используя метод СоздатьЭлемент().Номенклатура) есть свои ссылочные реквизиты (Вид номенклатуры, Единица измерения), их также потребуется проверять или создавать, двигаясь вглубь структуры.Пометка (булево) и статусы выгрузки, чтобы пользователь мог самостоятельно выбирать нужные документы перед нажатием кнопки Выгрузить.Конвертации данных 3.0. Она позволит управлять соответствиями реквизитов через правила, а не через жестко закодированные структуры, что упростит поддержку системы при изменении конфигураций.Используя этот подход, вы создадите надежный и понятный инструмент, который позволит гибко переносить документы между любыми базами данных, сохраняя контроль над процессом на каждом этапе.