Выполнить обмен данными по сценарию обмена данными. Выполняет процесс обмена данными отдельно для каждой строки настройки обмена.
// Выполняет процесс обмена данными отдельно для каждой строки настройки обмена.
// Процесс обмена данными состоит из двух стадий:
// - инициализация обмена - подготовка подсистемы обмена данными к процессу обмена
// - обмен данными - процесс зачитывания файла сообщения с последующей загрузкой этих данных в ИБ
// или выгрузки изменений в файл сообщения.
// Стадия инициализации выполняется один раз за сеанс и сохраняется в кэше сеанса на сервере
// до перезапуска сеанса или сброса повторно-используемых значений подсистемы обмена данными.
// Сброс повторно-используемых значений происходит при изменении данных, влияющих на процесс обмена данными
// (настройки транспорта, настройка выполнения обмена, настройка отборов на узлах планов обмена).
//
// Обмен может быть выполнен полностью для всех строк сценария,
// а может быть выполнен для отдельной строки ТЧ сценария обмена.
//
// Параметры:
// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки при выполнении сценария.
// НастройкаВыполненияОбмена - СправочникСсылка.СценарииОбменовДанными - элемент справочника,
// по значениям реквизитов которого будет выполнен обмен данными.
// НомерСтроки - Число - Номер строки по которой будет выполнен обмен данными.
// Если не указан, то обмен данными будет выполнен для всех строк.
//
Процедура ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, НастройкаВыполненияОбмена, НомерСтроки = Неопределено) Экспорт
ПроверитьВозможностьВыполненияОбменов();
ПроверитьИспользованиеОбменаДанными();
УстановитьПривилегированныйРежим(Истина);
ТекстЗапроса = "
|ВЫБРАТЬ
| НастройкиВыполненияОбменаНастройкиОбмена.Ссылка КАК НастройкаВыполненияОбмена,
| НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки КАК НомерСтроки,
| НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие,
| НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена КАК ВидТранспортаОбмена,
| НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
|
| ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.COM)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ОбменЧерезВнешнееСоединение,
|
| ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.WS)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ОбменЧерезВебСервис,
|
| ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.ВнешняяСистема)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ОбменСВнешнейСистемой
|ИЗ
| Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена
|ГДЕ
| НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена
| [УсловиеПоНомеруСтроки]
|УПОРЯДОЧИТЬ ПО
| НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки
|";
УсловиеПоНомеруСтроки = ?(НомерСтроки = Неопределено, "", "И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеПоНомеруСтроки]", УсловиеПоНомеруСтроки);
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НастройкаВыполненияОбмена", НастройкаВыполненияОбмена);
Запрос.УстановитьПараметр("НомерСтроки", НомерСтроки);
Выборка = Запрос.Выполнить().Выбрать();
ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления =
ЭтоПодчиненныйУзелРИБ() И ТребуетсяУстановкаОбновления();
Пока Выборка.Следующий() Цикл
ОтказПоСтрокеСценария = Ложь;
Если ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления
И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Выборка.УзелИнформационнойБазы) Тогда
// Обмен по расписанию не выполняется.
Продолжить;
ИначеЕсли Не НастройкаСинхронизацииЗавершена(Выборка.УзелИнформационнойБазы)
И Не Выборка.ОбменСВнешнейСистемой Тогда
Продолжить;
КонецЕсли;
Если Выборка.ОбменЧерезВнешнееСоединение Тогда
ПроверитьВозможностьВнешнегоСоединения();
КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(Выборка.ВыполняемоеДействие);
ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(ОтказПоСтрокеСценария,
Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, КоличествоЭлементовВТранзакции);
ИначеЕсли Выборка.ОбменЧерезВебСервис Тогда
ПараметрыОбмена = ПараметрыОбмена();
ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(ОтказПоСтрокеСценария,
Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, ПараметрыОбмена);
Иначе
// ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ
СтруктураНастроекОбмена = НастройкиОбменаДанными(Выборка.НастройкаВыполненияОбмена, Выборка.НомерСтроки);
// Если настройка содержит ошибки, то обмен не производим; статус "Отменено".
Если СтруктураНастроекОбмена.Отказ Тогда
ОтказПоСтрокеСценария = Истина;
// Фиксируем в ЖР лог по обмену данными.
ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
Продолжить;
КонецЕсли;
СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено;
// Добавляем в ЖР информацию о процессе обмена данными.
СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными по настройке %1'", ОбщегоНазначения.КодОсновногоЯзыка());
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.НастройкаВыполненияОбменаНаименование);
ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена);
// ОБМЕН ДАННЫМИ
ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена);
// Фиксируем в ЖР лог по обмену данными.
ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда
ОтказПоСтрокеСценария = Истина;
КонецЕсли;
КонецЕсли;
Если ОтказПоСтрокеСценария Тогда
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ВыполнитьОбменДаннымиПоСценариюОбменаДанными (БСП)
ВыполнитьОбменДаннымиПоРегламентномуЗаданию (БСП)
ВыполнитьДействиеСценарияОбменаДаннымиВПервойИнформационнойБазе (БСП)
ВыполнитьДействиеСценарияОбменаДаннымиВоВторойИнформационнойБазе (БСП)
ВыполнитьДействиеСценарияОбменаДаннымиВоВторойИнформационнойБазеИзНеразделенногоСеанса (БСП)
ВыполнитьДействиеСценарияОбменаДаннымиВПервойИнформационнойБазеИзНеразделенногоСеанса (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)