Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 дек 2023, 23:07

Обмен данными между двумя несвязанными базами

Автор acelysRX, 14 ноя 2023, 13:47

0 Пользователей и 1 гость просматривают эту тему.

acelysRX

Всем доброго дня!
У меня есть две базы и между ними надо сделать обмен данными с выгрузкой XML.
В состав первой базы входит документ к2ЗаказКлиента
В состав второй базы входит тоже ЗаказКлиента, только с измененной структурой
Мне нужно выгружать реквизит Контрагента из первой базы, и табличную часть, номенклатура, количество, сумма, цена, суммандс
Написал код для выгрузки, подскажите что нужно исправить
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗаказКлиентаМЕС.Ссылка КАК Ссылка,
| ЗаказКлиентаМЕС.Код КАК Код
|ИЗ
| ПланОбмена.ЗаказКлиентаМЕС КАК ЗаказКлиентаМЕС
|ГДЕ
| НЕ ЗаказКлиентаМЕС.ЭтотУзел";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ЭтотУзел = ПланыОбмена.ЗаказКлиентаМЕС.ЭтотУзел();
СтруктураНоменклатурыПолучателя = Новый Структура("Клиент, Date, Number");
СтруктураТабличнойЧасти = Новый Структура("Номенклатура, Количество, Цена, СуммаНДС");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ТекУзел = ВыборкаДетальныеЗаписи.Ссылка;

ЗаписьXML = Новый ЗаписьXML();
ИмяФайла = "\\ts3\public\IT\!\бп\" + "zakaz.xml";
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, ТекУзел);
Выборка = ПланыОбмена.ВыбратьИзменения(ТекУзел, ЗаписьСообщения.НомерСообщения);

Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
Если ТипЗнч(Данные) = Тип("ДокументОбъект.к2ЗаказКлиента") Тогда
ЗаполнитьЗначенияСвойств(СтруктураНоменклатурыПолучателя, Данные);
СтруктураНоменклатурыПолучателя.Клиент = Данные.Контрагент;
Мета = Метаданные.Документы.к2ЗаказКлиента.ТабличныеЧасти.Товары.Реквизиты;
ЗаполнитьЗначенияСвойств(СтруктураТабличнойЧасти, Мета);
СтруктураТабличнойЧасти.Номенклатура = Мета.Номенклатура;
СтруктураТабличнойЧасти.Количество = Мета.Количество;
СтруктураТабличнойЧасти.Цена = Мета.Цена;
СтруктураТабличнойЧасти.СуммаНДС = Мета.СуммаНДС;
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтруктураНоменклатурыПолучателя);
Иначе
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
КонецЕсли;
КонецЦикла;

ЗаписьСообщения.ЗакончитьЗапись();

КонецЦикла;

LexaK

идеально для вашего случая подходит КД2.1
(если осилите/разберетесь)
(примечание: внутри КД2 есть инструкция)
если помогло нажмите: Спасибо!

acelysRX

LexaK, мне надо все програмно сделать и регламентным заданием

LexaK

Цитата: acelysRX от 14 ноя 2023, 14:13LexaK, мне надо все програмно сделать и регламентным заданием
ааа, очередной велосипед с квадратными колесиками....

в 1С есть такой механизм как ПланОбмена, попробуйте его подключить к решению своей задачи
если помогло нажмите: Спасибо!

acelysRX

LexaK, подключен выше)
у нас директор такой, только и умеет велосипед с квадратными колесами задавать)

acelysRX

LexaK, может есть какой-то выход из ситуации с этим кодом?

Максим75

кстати, есть еще такой механизм обмена через OData.
но там надо базу публиковать.

LexaK

Цитата: acelysRX от 14 ноя 2023, 14:38LexaK, может есть какой-то выход из ситуации с этим кодом?
один из основных вариантов
1.с помощью КД2 формируют правила обмена
(по любому вам надо как-то формализовать какие реквизиты выгружать и как они должны заполнять документы другой структуры)
2.есть обработка Универсальный обмен данными, из нее можно вытащить код, который по этим правилам
Выгружает и Загружает данные (там есть вариант обмена и через файл ХМЛ и через Внешнее подключение к базе получателя)
если помогло нажмите: Спасибо!

acelysRX


LexaK

            Если ТипЗнч(Данные) = Тип("ДокументОбъект.к2ЗаказКлиента") Тогда
                ЗаполнитьЗначенияСвойств(СтруктураНоменклатурыПолучателя, Данные);
                СтруктураНоменклатурыПолучателя.Клиент = Данные.Контрагент;
                Мета = Метаданные.Документы.к2ЗаказКлиента.ТабличныеЧасти.Товары.Реквизиты;
                ЗаполнитьЗначенияСвойств(СтруктураТабличнойЧасти, Мета);
                СтруктураТабличнойЧасти.Номенклатура = Мета.Номенклатура;
                СтруктураТабличнойЧасти.Количество = Мета.Количество;
                СтруктураТабличнойЧасти.Цена = Мета.Цена;
                СтруктураТабличнойЧасти.СуммаНДС = Мета.СуммаНДС;
                СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтруктураНоменклатурыПолучателя);
вот здесь вообще не понятно (зачем так) отрабатывает, вроде как свою структуру данных готовите...

            Иначе
                СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
            КонецЕсли;
здесь нормально отрабатывает сериализатор,

на выходе получаете огромный файл-кашу! что потом с ним делать будете?
Одной командой загрузить(), в базу с отличающейся структурой - не получится!
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск