При разработке собственных решений на платформе 1С часто возникает задача синхронизации данных с типовыми конфигурациями, такими как «1С:Бухгалтерия». Одной из самых распространенных проблем является несовпадение метаданных: в одной базе реквизит называется ЕдИзм, а в другой — ЕдиницаИзмерения. Простое использование обработки «Универсальный обмен данными в формате XML» без заранее подготовленных правил в таких случаях выдает ошибку «неверный формат файла выгрузки». Рассмотрим подробно, как организовать надежный процесс передачи данных из базы-источника (обычные формы) в базу-приемник (управляемые формы).
Разберем ситуацию: почему стандартная выгрузка XML не загружается «сама собой»? Формат файла XML жестко привязан к структуре метаданных конкретной конфигурации. Проанализируем основные факторы:
Номенклатура содержит ссылки на другие объекты (например, ЕдиницыИзмерения, НоменклатурныеГруппы). Если этих объектов нет в базе-приемнике, простая загрузка прервется или создаст пустые ссылки (битые ссылки).Это наиболее профессиональный и масштабируемый подход. Проанализируем ситуацию: если данных много (6000 позиций) и они добавляются ежедневно, нам не нужно каждый раз выгружать весь справочник. Нам нужны только изменения.
Рассмотрим шаги по реализации этого метода:
ПланОбмена. В составе плана обмена указываем справочник Номенклатура и ставим признак «Авторегистрация».
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелПриемник, НомерСообщения);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
Пока ВыборкаИзменений.Следующий() Цикл
Данные = ВыборкаИзменений.Получить();
ЗаписатьXML(ЗаписьXML, Данные);
КонецЦикла;
ЗаписьXML.Закрыть();
Важный момент: После успешной загрузки в базе-приемнике необходимо отправить «подтверждение», чтобы база-источник сбросила регистрацию изменений для этих объектов. Это предотвратит повторную выгрузку одних и тех же данных.
Если вы не хотите связываться со сложной настройкой планов обмена, можно реализовать обмен через промежуточный файл структуры. Выясним алгоритм действий:
Структура, куда помещаем данные. Также обязательно передаем строковое представление GUID (Уникального идентификатора), чтобы в приемнике не плодить дубли.Пример кода для выгрузки:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Код, Наименование, Артикул ИЗ Справочник.Номенклатура");
Результат = Запрос.Выполнить().Выгрузить();
МассивДанных = Новый Массив;
Для Каждого Строка ИЗ Результат Цикл
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("УИД", Строка(Строка.Ссылка.УникальныйИдентификатор()));
ДанныеОбъекта.Вставить("Наименование", Строка.Наименование);
ДанныеОбъекта.Вставить("Артикул", Строка.Артикул);
МассивДанных.Добавить(ДанныеОбъекта);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Exchange\data.json");
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
ЗаписьJSON.Закрыть();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Exchange\data.json");
МассивДанных = ПрочитатьJSON(ЧтениеJSON);
Для Каждого Данные ИЗ МассивДанных Цикл
СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(Данные.УИД));
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Объект = Справочники.Номенклатура.СоздатьЭлемент();
Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
КонецЕсли;
Объект.Наименование = Данные.Наименование;
Объект.Артикул = Данные.Артикул;
Объект.Записать();
КонецЦикла;
Современный способ, позволяющий базе-приемнику напрямую «заглядывать» в базу «Бухгалтерии» без участия файлов. Проанализируем этот механизм. Начиная с платформы 8.3.5, 1С умеет автоматически публиковать данные через стандартный интерфейс OData.
Как это настроить:
HTTPСоединение, чтобы получить данные простым GET-запросом к URL вида http://server/base/odata/standard.odata/Catalog_Номенклатура.Этот метод идеален для запроса пользователя: «чтобы при входе в базу данные уже были обновлены». В модуле управляемого приложения можно прописать фоновый вызов HTTP-сервиса, который заберет последние изменения.
Особое внимание уделим реквизитам типа СправочникСсылка. При обмене 6 реквизитами (Код, Артикул, Наименование, Полное наименование, Класс ТМЦ, Базовая ед. изм.) важно понимать, что Класс ТМЦ и ЕдиницаИзмерения сами являются объектами. Рассмотрим два пути их синхронизации:
КодОКЕИ. Это гарантирует точность сопоставления, даже если наименования в базах слегка отличаются.Чтобы обмен работал «самостоятельно», разберем настройку Регламентных заданий:
Сервер и Вызов сервера для размещения логики обмена.Проанализировав все способы, можно сделать вывод: для новичка проще всего начать с ручной выгрузки в JSON/XML с поиском по GUID, но для стабильной промышленной эксплуатации лучше один раз разобраться с ПланыОбмена или технологией Enterprise Data (Конвертация данных 3.0), которая позволит в будущем легко подключить к обмену третью или четвертую базу без переписывания кода.