Как реализовать односторонний обмен справочниками из «1С:Бухгалтерия 8» в самописную конфигурацию?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке собственных решений на платформе 1С часто возникает задача синхронизации данных с типовыми конфигурациями, такими как «1С:Бухгалтерия». Одной из самых распространенных проблем является несовпадение метаданных: в одной базе реквизит называется ЕдИзм, а в другой — ЕдиницаИзмерения. Простое использование обработки «Универсальный обмен данными в формате XML» без заранее подготовленных правил в таких случаях выдает ошибку «неверный формат файла выгрузки». Рассмотрим подробно, как организовать надежный процесс передачи данных из базы-источника (обычные формы) в базу-приемник (управляемые формы).

Причины возникновения ошибок при обмене

Разберем ситуацию: почему стандартная выгрузка XML не загружается «сама собой»? Формат файла XML жестко привязан к структуре метаданных конкретной конфигурации. Проанализируем основные факторы:

  1. Различие в именовании реквизитов: Если в «Бухгалтерии» справочник имеет определенный набор полей (тип, длина, имя), а в вашей конфигурации они отличаются хотя бы на один символ, стандартный механизм загрузки не сможет сопоставить данные автоматически.
  2. Ссылочные типы: Справочник Номенклатура содержит ссылки на другие объекты (например, ЕдиницыИзмерения, НоменклатурныеГруппы). Если этих объектов нет в базе-приемнике, простая загрузка прервется или создаст пустые ссылки (битые ссылки).
  3. Разные версии платформы или режимов интерфейса: Обычные и управляемые формы по-разному могут обрабатывать стандартные сериализаторы XML.

Способ 1. Использование планов обмена и регламентных заданий

Это наиболее профессиональный и масштабируемый подход. Проанализируем ситуацию: если данных много (6000 позиций) и они добавляются ежедневно, нам не нужно каждый раз выгружать весь справочник. Нам нужны только изменения.

Рассмотрим шаги по реализации этого метода:

  1. Создание Плана обмена: В обеих конфигурациях создаем объект ПланОбмена. В составе плана обмена указываем справочник Номенклатура и ставим признак «Авторегистрация».
  2. Регистрация изменений: Теперь, как только пользователь изменит товар в «Бухгалтерии», платформа автоматически пометит этот объект для выгрузки.
  3. Программная выгрузка: Напишем процедуру, которая выбирает зарегистрированные изменения и записывает их в XML. Рассмотрим пример логики:

ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелПриемник, НомерСообщения);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();

Пока ВыборкаИзменений.Следующий() Цикл
    Данные = ВыборкаИзменений.Получить();
    ЗаписатьXML(ЗаписьXML, Данные);
КонецЦикла;

ЗаписьXML.Закрыть();

Важный момент: После успешной загрузки в базе-приемнике необходимо отправить «подтверждение», чтобы база-источник сбросила регистрацию изменений для этих объектов. Это предотвратит повторную выгрузку одних и тех же данных.

Способ 2. Программный обмен через XML/JSON (ручной метод)

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

  1. В базе-источнике (Бухгалтерия): Создаем запрос, который выбирает нужные реквизиты (Код, Артикул, Наименование, ПолноеНаименование).
  2. Формирование структуры: Для каждой строки результата запроса создаем Структура, куда помещаем данные. Также обязательно передаем строковое представление GUID (Уникального идентификатора), чтобы в приемнике не плодить дубли.
  3. Сериализация: Записываем массив структур в файл XML или JSON.

Пример кода для выгрузки:


Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Код, Наименование, Артикул ИЗ Справочник.Номенклатура");
Результат = Запрос.Выполнить().Выгрузить();
МассивДанных = Новый Массив;

Для Каждого Строка ИЗ Результат Цикл
    ДанныеОбъекта = Новый Структура;
    ДанныеОбъекта.Вставить("УИД", Строка(Строка.Ссылка.УникальныйИдентификатор()));
    ДанныеОбъекта.Вставить("Наименование", Строка.Наименование);
    ДанныеОбъекта.Вставить("Артикул", Строка.Артикул);
    МассивДанных.Добавить(ДанныеОбъекта);
КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Exchange\data.json");
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
ЗаписьJSON.Закрыть();
  1. В базе-приемнике (Самописная): Читаем файл и ищем объект по полученному GUID. Если объект не найден — создаем новый. Если найден — обновляем реквизиты.

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Exchange\data.json");
МассивДанных = ПрочитатьJSON(ЧтениеJSON);

Для Каждого Данные ИЗ МассивДанных Цикл
    СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(Данные.УИД));
    Объект = СсылкаНаОбъект.ПолучитьОбъект();
    
    Если Объект = Неопределено Тогда
        Объект = Справочники.Номенклатура.СоздатьЭлемент();
        Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
    КонецЕсли;
    
    Объект.Наименование = Данные.Наименование;
    Объект.Артикул = Данные.Артикул;
    Объект.Записать();
КонецЦикла;

Способ 3. Интеграция через OData (REST API)

Современный способ, позволяющий базе-приемнику напрямую «заглядывать» в базу «Бухгалтерии» без участия файлов. Проанализируем этот механизм. Начиная с платформы 8.3.5, 1С умеет автоматически публиковать данные через стандартный интерфейс OData.

Как это настроить:

Этот метод идеален для запроса пользователя: «чтобы при входе в базу данные уже были обновлены». В модуле управляемого приложения можно прописать фоновый вызов HTTP-сервиса, который заберет последние изменения.

Работа со ссылочными типами (Единицы измерения)

Особое внимание уделим реквизитам типа СправочникСсылка. При обмене 6 реквизитами (Код, Артикул, Наименование, Полное наименование, Класс ТМЦ, Базовая ед. изм.) важно понимать, что Класс ТМЦ и ЕдиницаИзмерения сами являются объектами. Рассмотрим два пути их синхронизации:

  1. Поиск по коду/наименованию: Если в «Бухгалтерии» единица измерения «шт», то в приемнике мы ищем элемент с наименованием «шт». Если не находим — создаем.
  2. Синхронизация по классификаторам: Для единиц измерения лучше использовать КодОКЕИ. Это гарантирует точность сопоставления, даже если наименования в базах слегка отличаются.

Рекомендации по автоматизации

Чтобы обмен работал «самостоятельно», разберем настройку Регламентных заданий:

  1. В базе-источнике создайте регламентное задание, которое будет срабатывать раз в 10-15 минут (или раз в сутки ночью, в зависимости от нагрузки). Оно будет выполнять процедуру выгрузки.
  2. В базе-приемнике настройте аналогичное задание для мониторинга папки обмена или вызова HTTP-сервиса.
  3. Используйте Общие модули с установленными флагами Сервер и Вызов сервера для размещения логики обмена.

Проанализировав все способы, можно сделать вывод: для новичка проще всего начать с ручной выгрузки в JSON/XML с поиском по GUID, но для стабильной промышленной эксплуатации лучше один раз разобраться с ПланыОбмена или технологией Enterprise Data (Конвертация данных 3.0), которая позволит в будущем легко подключить к обмену третью или четвертую базу без переписывания кода.

← На главную