← Назад к вопросам
Настройка обмена между двумя базами 1С
3.0 Senior🔥 101 комментариев
#Интеграции и обмены#Конфигурации и типовые
Условие
Настройте обмен данными между двумя базами 1С (например, УТ и БП).
Требования:
- Создание плана обмена
- Настройка правил конвертации объектов
- Выгрузка/загрузка справочников: Контрагенты, Номенклатура
- Выгрузка/загрузка документов: Реализация товаров
- Обработка конфликтов при загрузке
Этапы
- Создать узлы плана обмена в обеих базах
- Настроить регистрацию изменений
- Реализовать выгрузку в XML
- Реализовать загрузку из XML
- Протестировать обмен
Комментарии (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 как формат обмена
- Обработка конфликтов
- Валидация данных при загрузке