#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт
Результат = Новый Массив;
Результат.Добавить("РегламентноеЗаданиеGUID");
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура СоздатьСценарий(
УзелИнформационнойБазы,
Расписание = Неопределено,
ИспользоватьРегламентноеЗадание = Истина) Экспорт
Отказ = Ложь;
Наименование = НСтр("ru = 'Автоматическая синхронизация данных с %1'");
Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Наименование,
Строка(УзелИнформационнойБазы));
ИдентификаторТранспорта = ТранспортСообщенийОбмена.ТранспортПоУмолчанию(УзелИнформационнойБазы);
СценарийОбменаДанными = СоздатьЭлемент();
СценарийОбменаДанными.Наименование = Наименование;
СценарийОбменаДанными.ИспользоватьРегламентноеЗадание = ИспользоватьРегламентноеЗадание;
ОбновитьДанныеРегламентногоЗадания(Отказ, Расписание, СценарийОбменаДанными);
СтрокаТаблицы = СценарийОбменаДанными.НастройкиОбмена.Добавить();
СтрокаТаблицы.ИдентификаторТранспорта = ИдентификаторТранспорта;
СтрокаТаблицы.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных;
СтрокаТаблицы.УзелИнформационнойБазы = УзелИнформационнойБазы;
СтрокаТаблицы = СценарийОбменаДанными.НастройкиОбмена.Добавить();
СтрокаТаблицы.ИдентификаторТранспорта = ИдентификаторТранспорта;
СтрокаТаблицы.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных;
СтрокаТаблицы.УзелИнформационнойБазы = УзелИнформационнойБазы;
СценарийОбменаДанными.Записать();
КонецПроцедуры
Функция РасписаниеРегламентногоЗаданияПоУмолчанию() Экспорт
Месяцы = Новый Массив;
Месяцы.Добавить(1);
Месяцы.Добавить(2);
Месяцы.Добавить(3);
Месяцы.Добавить(4);
Месяцы.Добавить(5);
Месяцы.Добавить(6);
Месяцы.Добавить(7);
Месяцы.Добавить(8);
Месяцы.Добавить(9);
Месяцы.Добавить(10);
Месяцы.Добавить(11);
Месяцы.Добавить(12);
ДниНедели = Новый Массив;
ДниНедели.Добавить(1);
ДниНедели.Добавить(2);
ДниНедели.Добавить(3);
ДниНедели.Добавить(4);
ДниНедели.Добавить(5);
ДниНедели.Добавить(6);
ДниНедели.Добавить(7);
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ДниНедели = ДниНедели;
Расписание.ПериодПовтораВТечениеДня = 900;
Расписание.ПериодПовтораДней = 1;
Расписание.Месяцы = Месяцы;
Возврат Расписание;
КонецФункции
Функция ПолучитьРасписаниеВыполненияОбменаДанными(НастройкаВыполненияОбмена) Экспорт
РегламентноеЗаданиеОбъект = РегламентноеЗаданиеПоИдентификатору(НастройкаВыполненияОбмена.РегламентноеЗаданиеGUID);
Если РегламентноеЗаданиеОбъект <> Неопределено Тогда
РасписаниеРегламентногоЗадания = РегламентноеЗаданиеОбъект.Расписание;
Иначе
РасписаниеРегламентногоЗадания = Новый РасписаниеРегламентногоЗадания;
КонецЕсли;
Возврат РасписаниеРегламентногоЗадания;
КонецФункции
Процедура ОбновитьДанныеРегламентногоЗадания(Отказ, РасписаниеРегламентногоЗадания, ТекущийОбъект) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
Если ПустаяСтрока(ТекущийОбъект.Код) Тогда
ТекущийОбъект.УстановитьНовыйКод();
КонецЕсли;
Если ОбщегоНазначения.РазделениеВключено() Тогда
СоздатьОбновитьРегламентноеЗаданиеВСервисе(РасписаниеРегламентногоЗадания, ТекущийОбъект);
Иначе
РегламентноеЗаданиеОбъект = СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект);
УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект);
ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект);
ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(РегламентноеЗаданиеОбъект.УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
Функция СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект)
РегламентноеЗаданиеОбъект = РегламентноеЗаданиеПоИдентификатору(ТекущийОбъект.РегламентноеЗаданиеGUID);
Если РегламентноеЗаданиеОбъект = Неопределено Тогда
ПараметрыЗадания = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.СинхронизацияДанных);
РегламентноеЗаданиеОбъект = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания);
КонецЕсли;
Возврат РегламентноеЗаданиеОбъект;
КонецФункции
Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект)
ПараметрыРегламентногоЗадания = Новый Массив;
ПараметрыРегламентногоЗадания.Добавить(ТекущийОбъект.Код);
НаименованиеРегламентногоЗадания = НСтр("ru = 'Выполнение обмена по сценарию: %1'");
НаименованиеРегламентногоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НаименованиеРегламентногоЗадания, СокрЛП(ТекущийОбъект.Наименование));
РегламентноеЗаданиеОбъект.Наименование = Лев(НаименованиеРегламентногоЗадания, 120);
РегламентноеЗаданиеОбъект.Использование = ТекущийОбъект.ИспользоватьРегламентноеЗадание;
РегламентноеЗаданиеОбъект.Параметры = ПараметрыРегламентногоЗадания;
Если РасписаниеРегламентногоЗадания <> Неопределено Тогда
РегламентноеЗаданиеОбъект.Расписание = РасписаниеРегламентногоЗадания;
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект)
УстановитьПривилегированныйРежим(Истина);
Попытка
РегламентноеЗаданиеОбъект.Записать();
Исключение
СтрокаСообщения = НСтр("ru = 'Произошла ошибка при сохранении расписания выполнения обменов. Подробное описание ошибки: %1'");
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения,
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ);
КонецПопытки;
КонецПроцедуры
Процедура СоздатьОбновитьРегламентноеЗаданиеВСервисе(РасписаниеРегламентногоЗадания, ТекущийОбъект)
ЗаданиеОбъект = Неопределено;
Если ЗначениеЗаполнено(ТекущийОбъект.РегламентноеЗаданиеGUID) Тогда
ЗаданиеGUID = Новый УникальныйИдентификатор(ТекущийОбъект.РегламентноеЗаданиеGUID);
ЗаданиеОбъект = РегламентныеЗаданияСервер.Задание(ЗаданиеGUID);
КонецЕсли;
ОбластьДанных = ПараметрыСеанса["ОбластьДанныхЗначение"];
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
ЧасовойПояс = МодульРаботаВМоделиСервиса.ПолучитьЧасовойПоясОбластиДанных(ОбластьДанных);
ЗапланированныйМоментЗапуска = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс);
Если ЗаданиеОбъект = Неопределено Тогда
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(ТекущийОбъект.Код);
Ключ = ЗаданиеGUID;
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Ключ", Лев(Ключ, 120));
ПараметрыЗадания.Вставить("ИмяМетода" , "ОбменДаннымиВнутренняяПубликация.ВыполнитьОбменДаннымиПоСценарию");
ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных);
ПараметрыЗадания.Вставить("Использование", Истина);
ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ЗапланированныйМоментЗапуска);
ПараметрыЗадания.Вставить("Параметры", ПараметрыПроцедуры);
ПараметрыЗадания.Вставить("Использование", ТекущийОбъект.ИспользоватьРегламентноеЗадание);
Если РасписаниеРегламентногоЗадания <> Неопределено Тогда
ПараметрыЗадания.Вставить("Расписание", РасписаниеРегламентногоЗадания);
КонецЕсли;
МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
ЗаданиеОбъект = МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
ЗаданиеGUID = ЗаданиеОбъект.УникальныйИдентификатор();
Иначе
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Использование", ТекущийОбъект.ИспользоватьРегламентноеЗадание);
ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ЗапланированныйМоментЗапуска);
Если РасписаниеРегламентногоЗадания <> Неопределено Тогда
ПараметрыЗадания.Вставить("Расписание", РасписаниеРегламентногоЗадания);
КонецЕсли;
МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
МодульОчередьЗаданий.ИзменитьЗадание(ЗаданиеОбъект.Идентификатор, ПараметрыЗадания);
КонецЕсли;
ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(ЗаданиеGUID);
КонецПроцедуры
Функция РегламентноеЗаданиеПоИдентификатору(Знач УникальныйНомерЗадания) Экспорт
Если ПустаяСтрока(УникальныйНомерЗадания) Тогда
Возврат Неопределено;
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(УникальныйНомерЗадания));
УстановитьПривилегированныйРежим(Истина);
Задания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор);
Если Задания.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Задания[0];
КонецФункции
Процедура ОчиститьСсылкиНаУзелИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| СценарииОбменовДаннымиНастройкиОбмена.Ссылка КАК СценарийОбменаДанными
|ИЗ
| Справочник.СценарииОбменовДанными.НастройкиОбмена КАК СценарииОбменовДаннымиНастройкиОбмена
|ГДЕ
| СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы = &УзелИнформационнойБазы");
Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы);
ТаблицаСценарии = Запрос.Выполнить().Выгрузить();
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
ЭлементБлокировки.ИсточникДанных = ТаблицаСценарии;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "СценарийОбменаДанными");
Блокировка.Заблокировать();
Для Каждого СтрокаСценарии Из ТаблицаСценарии Цикл
ЗаблокироватьДанныеДляРедактирования(СтрокаСценарии.СценарийОбменаДанными);
СценарийОбменаДанными = СтрокаСценарии.СценарийОбменаДанными.ПолучитьОбъект();
УдалитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы);
УдалитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы);
СценарийОбменаДанными.Записать();
Если СценарийОбменаДанными.НастройкиОбмена.Количество() = 0 Тогда
СценарийОбменаДанными.Удалить();
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура УдалитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт
УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных);
КонецПроцедуры
Процедура УдалитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт
УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных);
КонецПроцедуры
Процедура ДобавитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт
Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
ЭлементБлокировки.УстановитьЗначение("Ссылка", СценарийОбменаДанными);
Блокировка.Заблокировать();
ЗаблокироватьДанныеДляРедактирования(СценарийОбменаДанными);
СценарийОбъект = СценарийОбменаДанными.ПолучитьОбъект();
ДобавитьСтрокиНастроекОбменаПоСценарию(
СценарийОбъект.НастройкиОбмена, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных);
СценарийОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Иначе
ДобавитьСтрокиНастроекОбменаПоСценарию(
СценарийОбменаДанными.НастройкиОбмена, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт
Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
ЭлементБлокировки.УстановитьЗначение("Ссылка", СценарийОбменаДанными);
Блокировка.Заблокировать();
ЗаблокироватьДанныеДляРедактирования(СценарийОбменаДанными);
СценарийОбъект = СценарийОбменаДанными.ПолучитьОбъект();
ДобавитьСтрокиНастроекОбменаПоСценарию(
СценарийОбъект.НастройкиОбмена, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных);
СценарийОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Иначе
ДобавитьСтрокиНастроекОбменаПоСценарию(
СценарийОбменаДанными.НастройкиОбмена, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьСтрокиНастроекОбменаПоСценарию(
НастройкиОбмена, УзелИнформационнойБазы, ВыполняемоеДействие)
ИдентификаторТранспорта = ТранспортСообщенийОбмена.ТранспортПоУмолчанию(УзелИнформационнойБазы);
Если ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда
МаксимальныйИндекс = НастройкиОбмена.Количество() - 1;
Для Индекс = 0 По МаксимальныйИндекс Цикл
ОбратныйИндекс = МаксимальныйИндекс - Индекс;
СтрокаТаблицы = НастройкиОбмена[ОбратныйИндекс];
Если СтрокаТаблицы.ВыполняемоеДействие = ВыполняемоеДействие Тогда
НоваяСтрока = НастройкиОбмена.Вставить(ОбратныйИндекс + 1);
НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы;
НоваяСтрока.ИдентификаторТранспорта = ИдентификаторТранспорта;
НоваяСтрока.ВыполняемоеДействие = ВыполняемоеДействие;
Прервать;
КонецЕсли;
КонецЦикла;
Отбор = Новый Структура("УзелИнформационнойБазы, ВыполняемоеДействие", УзелИнформационнойБазы, ВыполняемоеДействие);
Если НастройкиОбмена.НайтиСтроки(Отбор).Количество() = 0 Тогда
НоваяСтрока = НастройкиОбмена.Добавить();
НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы;
НоваяСтрока.ИдентификаторТранспорта = ИдентификаторТранспорта;
НоваяСтрока.ВыполняемоеДействие = ВыполняемоеДействие;
КонецЕсли;
ИначеЕсли ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда
Для каждого СтрокаТаблицы Из НастройкиОбмена Цикл
Если СтрокаТаблицы.ВыполняемоеДействие = ВыполняемоеДействие Тогда
НоваяСтрока = НастройкиОбмена.Вставить(НастройкиОбмена.Индекс(СтрокаТаблицы));
НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы;
НоваяСтрока.ИдентификаторТранспорта = ИдентификаторТранспорта;
НоваяСтрока.ВыполняемоеДействие = ВыполняемоеДействие;
Прервать;
КонецЕсли;
КонецЦикла;
Отбор = Новый Структура("УзелИнформационнойБазы, ВыполняемоеДействие", УзелИнформационнойБазы, ВыполняемоеДействие);
Если НастройкиОбмена.НайтиСтроки(Отбор).Количество() = 0 Тогда
НоваяСтрока = НастройкиОбмена.Вставить(0);
НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы;
НоваяСтрока.ИдентификаторТранспорта = ИдентификаторТранспорта;
НоваяСтрока.ВыполняемоеДействие = ВыполняемоеДействие;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, ДействиеПриОбмене)
Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
ЭлементБлокировки.УстановитьЗначение("Ссылка", СценарийОбменаДанными);
Блокировка.Заблокировать();
ЗаблокироватьДанныеДляРедактирования(СценарийОбменаДанными);
СценарийОбъект = СценарийОбменаДанными.ПолучитьОбъект();
УдалитьСтрокиНастроекОбменаИзСценария(СценарийОбъект.НастройкиОбмена, УзелИнформационнойБазы, ДействиеПриОбмене);
СценарийОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Иначе
УдалитьСтрокиНастроекОбменаИзСценария(СценарийОбменаДанными.НастройкиОбмена, УзелИнформационнойБазы, ДействиеПриОбмене)
КонецЕсли;
КонецПроцедуры
Процедура УдалитьСтрокиНастроекОбменаИзСценария(НастройкиОбмена, УзелИнформационнойБазы, ДействиеПриОбмене)
Сч = НастройкиОбмена.Количество() - 1;
Пока Сч >= 0 Цикл
СтрокаТаблицы = НастройкиОбмена[Сч];
Если СтрокаТаблицы.УзелИнформационнойБазы = УзелИнформационнойБазы
И СтрокаТаблицы.ВыполняемоеДействие = ДействиеПриОбмене Тогда
НастройкиОбмена.Удалить(Сч);
КонецЕсли;
Сч = Сч - 1;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецЕсли