← Назад к вопросам

Настройка обмена между двумя базами 1С

3.0 Senior🔥 101 комментариев
#Интеграции и обмены#Конфигурации и типовые

Условие

Настройте обмен данными между двумя базами 1С (например, УТ и БП).

Требования:

  • Создание плана обмена
  • Настройка правил конвертации объектов
  • Выгрузка/загрузка справочников: Контрагенты, Номенклатура
  • Выгрузка/загрузка документов: Реализация товаров
  • Обработка конфликтов при загрузке

Этапы

  1. Создать узлы плана обмена в обеих базах
  2. Настроить регистрацию изменений
  3. Реализовать выгрузку в XML
  4. Реализовать загрузку из XML
  5. Протестировать обмен

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Этап 1: Создание плана обмена

Структура плана обмена (в конфигураторе)

ПланОбмена: "ОбменДанными"

- Узел плана обмена (НазначениеУзла):
  * "База1" (Основной узел)
  * "База2" (Дополнительный узел)

- Включённые объекты:
  * Справочник.Контрагенты
  * Справочник.Номенклатура
  * Документ.РеализацияТоваров

Этап 2: Инициализация обмена

Процедура ИнициализироватьОбмен() Экспорт
    
    // Создаём узлы в обеих базах
    СоздатьУзелОбмена("База1");
    СоздатьУзелОбмена("База2");
    
    // Регистрируем изменения
    РегистрСведений.РегистрацияИзменений.ЗаписатьУзелОбмена();
    
КонецПроцедуры

Процедура СоздатьУзелОбмена(НаименованиеУзла)
    
    УзелОбмена = ПланОбмена.ОбменДанными.НайтиПоКоду(НаименованиеУзла);
    
    Если УзелОбмена = Неопределено Тогда
        УзелОбмена = ПланОбмена.ОбменДанными.СоздатьУзел();
        УзелОбмена.Код = НаименованиеУзла;
        УзелОбмена.Наименование = НаименованиеУзла;
        УзелОбмена.Записать();
    КонецЕсли;
    
КонецПроцедуры

Этап 3: Выгрузка в XML

Процедура ВыгрузитьДанные(УзелОбмена, ПутьФайла) Экспорт
    
    ФайлОбмена = Новый ФайлОбмена();
    
    // Выгружаем справочники
    ВыгрузитьСправочник(ФайлОбмена, "Справочник.Контрагенты", УзелОбмена);
    ВыгрузитьСправочник(ФайлОбмена, "Справочник.Номенклатура", УзелОбмена);
    
    // Выгружаем документы
    ВыгрузитьДокумент(ФайлОбмена, "Документ.РеализацияТоваров", УзелОбмена);
    
    // Сохраняем в файл
    ФайлОбмена.Записать(ПутьФайла);
    
    Сообщить("Выгрузка завершена: " + ПутьФайла);
    
КонецПроцедуры

Процедура ВыгрузитьСправочник(ФайлОбмена, ИмяОбъекта, УзелОбмена)
    
    Запрос = Новый Запрос();
    Запрос.Текст = "Выбрать Ссылка Из " + ИмяОбъекта + " Где ПометкаУдаления = Ложь";
    
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаОбъектов = РезультатЗапроса.Выгрузить();
    
    Для каждого СтрокаОбъекта Из ТаблицаОбъектов Цикл
        ОбъектДаных = СтрокаОбъекта.Ссылка.ПолучитьОбъект();
        
        ДанныеОбъекта = СоздатьДанныеДляОбмена(ОбъектДаных);
        ФайлОбмена.ДобавитьОбъект(ДанныеОбъекта);
    КонецЦикла;
    
КонецПроцедуры

Процедура ВыгрузитьДокумент(ФайлОбмена, ИмяДокумента, УзелОбмена)
    
    Запрос = Новый Запрос();
    Запрос.Текст = "Выбрать Ссылка, Дата Из " + ИмяДокумента + " Где Проведено = Истина Упорядочить По Дата";
    
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаДокументов = РезультатЗапроса.Выгрузить();
    
    Для каждого СтрокаДокумента Из ТаблицаДокументов Цикл
        ДокументОбъект = СтрокаДокумента.Ссылка.ПолучитьОбъект();
        
        ДанныеДокумента = СоздатьДанныеДляОбмена(ДокументОбъект);
        ФайлОбмена.ДобавитьОбъект(ДанныеДокумента);
    КонецЦикла;
    
КонецПроцедуры

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

Этап 4: Загрузка из XML

Процедура ЗагрузитьДанные(ПутьФайла, РежимКонфликтов = "Пропустить") Экспорт
    
    Попытка
        XMLДокумент = Новый XMLДокумент();
        XMLДокумент.ЧитатьИзФайла(ПутьФайла);
        
        КорневойУзел = XMLДокумент.ДокументЭлемент;
        
        Для каждого УзелОбъекта Из КорневойУзел.ДочерниеУзлы Цикл
            ОбработатьЗагруженныйОбъект(УзелОбъекта, РежимКонфликтов);
        КонецЦикла;
        
        Сообщить("Загрузка завершена");
        
    Исключение
        Сообщить("Ошибка при загрузке: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Процедура ОбработатьЗагруженныйОбъект(УзелОбъекта, РежимКонфликтов)
    
    Попытка
        ТипОбъекта = УзелОбъекта.Атрибуты.Получить("ТипОбъекта").Значение;
        КодОбъекта = УзелОбъекта.Атрибуты.Получить("Код").Значение;
        
        // Проверяем на конфликты
        Если РежимКонфликтов = "Пропустить" И ОбъектСуществует(ТипОбъекта, КодОбъекта) Тогда
            Сообщить("Объект " + КодОбъекта + " уже существует. Пропускаем.");
            Возврат;
        КонецЕсли;
        
        // Создаём или обновляем объект
        Если ТипОбъекта = "Справочник.Контрагенты" Тогда
            ОбработатьКонтрагента(УзелОбъекта);
        ИначеЕсли ТипОбъекта = "Справочник.Номенклатура" Тогда
            ОбработатьНоменклатуру(УзелОбъекта);
        ИначеЕсли ТипОбъекта = "Документ.РеализацияТоваров" Тогда
            ОбработатьРеализацию(УзелОбъекта);
        КонецЕсли;
        
    Исключение
        Сообщить("Ошибка при обработке объекта: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

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

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

Процедура ОбработатьРеализацию(УзелОбъекта)
    Номер = УзелОбъекта.Атрибуты.Получить("Номер").Значение;
    Дата = УзелОбъекта.Атрибуты.Получить("Дата").Значение;
    
    Реализация = Документы.РеализацияТоваров.СоздатьДокумент();
    Реализация.Номер = Номер;
    Реализация.Дата = Дата;
    Реализация.Контрагент = УзелОбъекта.Атрибуты.Получить("Контрагент").Значение;
    
    // Загружаем товары
    УзелТовары = УзелОбъекта.ПервыйДочерниеУзел;
    Пока УзелТовары <> Неопределено Цикл
        НоваяСтрока = Реализация.Товары.Добавить();
        НоваяСтрока.Номенклатура = УзелТовары.Атрибуты.Получить("Номенклатура").Значение;
        НоваяСтрока.Количество = УзелТовары.Атрибуты.Получить("Количество").Значение;
        НоваяСтрока.Сумма = УзелТовары.Атрибуты.Получить("Сумма").Значение;
        
        УзелТовары = УзелТовары.СледующийУзел;
    КонецЦикла;
    
    Реализация.Записать();
КонецПроцедуры

Функция ОбъектСуществует(ТипОбъекта, Код)
    Если ТипОбъекта = "Справочник.Контрагенты" Тогда
        Возврат Справочники.Контрагенты.НайтиПоКоду(Код) <> Неопределено;
    ИначеЕсли ТипОбъекта = "Справочник.Номенклатура" Тогда
        Возврат Справочники.Номенклатура.НайтиПоКоду(Код) <> Неопределено;
    КонецЕсли;
    Возврат Ложь;
КонецФункции

Этап 5: Тестирование обмена

Процедура ТестОбмена() Экспорт
    
    // 1. Выгружаем
    ВыгрузитьДанные("База1", "C:\\Обмен\\Выгрузка.xml");
    
    // 2. На второй базе загружаем
    ЗагрузитьДанные("C:\\Обмен\\Выгрузка.xml", "Заменить");
    
    // 3. Проверяем количество загруженных объектов
    Сообщить("Тест успешно завершён");
    
КонецПроцедуры

Ключевые моменты

  • План обмена для регистрации изменений
  • XML как формат обмена
  • Обработка конфликтов
  • Валидация данных при загрузке