Создадим План обмена и два узла. В узел "Изменения" будут регистрироваться все изменения в базе источнике. В узел "Выгрузка" будем перед выгрузкой регистрировать изменения и очищать узел "Изменения". Делаю так, чтобы избежать блокировок и если что-то пойдет не так во время выгрузки, то в узле "Выгрузка" останутся объекты, которые небыли выгружены.
Создаем внешнюю обработку. В макет добавляем Правила обмена данными (Конвертация данных 2.1)
В модуле обработки описываем сведения о обработке. Тут важно указать НоваяКоманда.Использование = "ВызовСерверногоМетода";
Функция СведенияОВнешнейОбработке() Экспорт
ТЗКоманды = Новый ТаблицаЗначений;
ТЗКоманды.Колонки.Добавить("Представление");
ТЗКоманды.Колонки.Добавить("Идентификатор");
ТЗКоманды.Колонки.Добавить("Использование");
ТЗКоманды.Колонки.Добавить("ПоказыватьОповещение");
ТЗКоманды.Колонки.Добавить("Модификатор");
НоваяКоманда = ТЗКоманды.Добавить();
НоваяКоманда.Представление = "Выгрузка данных в базу Бухгалтерии";
НоваяКоманда.Идентификатор = "ВыгрузкаДанныхВБазуБух";
НоваяКоманда.Использование = "ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "";
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Наименование", "Выгрузка данных в базу Бухгалтерии");
ПараметрыРегистрации.Вставить("Информация", "");
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Команды", ТЗКоманды);
Возврат ПараметрыРегистрации;
КонецФункции
Добавляем процедуру ВыполнитьКоманду. Эта процедура и будет вызваться при Запуске по расписанию
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
КонецПроцедуры
Добавляем обработку в дополнительные обработки. Ставим галочку расписание и устанавливаем расписание.
В теле процедуры ВыполнитьКоманду:
1. - Определяем переменные, которые нам понадобятся.
- Запросом получаем "Дату запрета изменений" - эта дата будет датой начала выгрузки.
- Определяю массив выгружаемых объектов (по нему в цикле будем формировать текст запроса).
Запрос = Новый Запрос;
ДатаНачала = Дата(2019,1,1);
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ДОБАВИТЬКДАТЕ(ДатыЗапретаИзменения.ДатаЗапрета, ДЕНЬ, 1) КАК ДатаЗапрета
|ИЗ
| РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения
|ГДЕ
| ДатыЗапретаИзменения.Раздел = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка)
| И ДатыЗапретаИзменения.Объект = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка)
| И ДатыЗапретаИзменения.Пользователь = ЗНАЧЕНИЕ(перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДатаНачала = ВыборкаДетальныеЗаписи.ДатаЗапрета;
КонецЦикла;
ДатаОкончания = ТекущаяДата();
ДатаОкончанияКонецДня = КонецДня(ДатаОкончания)+1;
ДатаВыгрузки = Формат(ДатаОкончания, "ДФ=yyyy.MM.dd_hh.mm.ss");
ПутьНаДиске = "\\server1c\obmen\";
ФайлПравил = ПутьНаДиске + "ПравилаВыгрузкиBuh.xml";
ФайлДанных = ПутьНаДиске + ДатаВыгрузки + "_DataBuh.xml";
МассивВыгружаемыхОбъектов = Новый Массив;
МассивВыгружаемыхОбъектов.Добавить("Документ.РеализацияТоваровУслуг");
МассивВыгружаемыхОбъектов.Добавить("Документ.ПриобретениеТоваровУслуг");
МассивВыгружаемыхОбъектов.Добавить("Документ.ПеремещениеТоваров");
МассивВыгружаемыхОбъектов.Добавить("Справочник.ДоговорыКонтрагентов");
МассивВыгружаемыхОбъектов.Добавить("Справочник.Контрагенты");
МассивВыгружаемыхОбъектов.Добавить("Справочник.Номенклатура");
УзелВыгрузки = ПланыОбмена.ВыгрузкаВБазуБП.НайтиПоНаименованию("Выгрузка");
УзелИзменения = ПланыОбмена.ВыгрузкаВБазуБП.НайтиПоНаименованию("Изменения");
2. - Формирую запрос к изменениям в узле "Изменения". (намерено не пользуюсь функцией ВыбратьИзменения, чтобы избежать "Конфликта блокировок")
- Удаляю регистрацию с узла "Изменения" и регистрирую в узел "Выгрузка"
Запрос = Новый Запрос;
текстОбъединить = "";
Для Каждого текО Из МассивВыгружаемыхОбъектов Цикл
текстИзменения = "
|ВЫБРАТЬ
| тИзменения.Ссылка КАК Ссылка,
| тИзменения.Узел КАК УзелИзменений
|ИЗ
| %Объект%.Изменения КАК тИзменения
|ГДЕ
| тИзменения.Узел = &УзелИзменения
|";
текстИзменения = СтрЗаменить(текстИзменения, "%Объект%", текО);
Запрос.Текст = Запрос.Текст + текстОбъединить + текстИзменения;
текстОбъединить = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|";
КонецЦикла;
Запрос.УстановитьПараметр("УзелИзменения",УзелИзменения);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если НЕ ПланыОбмена.ИзменениеЗарегистрировано(УзелВыгрузки, ВыборкаДетальныеЗаписи.Ссылка) Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелВыгрузки, ВыборкаДетальныеЗаписи.Ссылка);
КонецЕсли;
ПланыОбмена.УдалитьРегистрациюИзменений(УзелИзменения, ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
3. -Сохраняю файл с Правилами обмена данными на диск
- Создаю Обработку УниверсальныйОбменДаннымиXML, заполняю необходимые для обмена параметры
- после выгрузки Удаляю файл с Правилами обмена с диска
ДвоичныеДанные = ПолучитьМакет("Правила");
Попытка
ДвоичныеДанные.Записать(ФайлПравил);
Исключение
ЗаписьЖурналаРегистрации("Выгрузка в бухгалтерию",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Обработки.УниверсальныйОбменДаннымиXML,
Неопределено,
ОписаниеОшибки());
Возврат;
КонецПопытки;
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ВыводВОкноСообщенийИнформационныхСообщений = Ложь;
Обработка.ДатаНачала = ДатаНачала;
Обработка.ДатаОкончания = ДатаОкончанияКонецДня;
Обработка.ИмяФайлаПравилОбмена = ФайлПравил;
Обработка.ИмяФайлаОбмена = ФайлДанных;
Обработка.ЗагрузитьПравилаОбмена();
Обработка.ВыполнитьВыгрузку();
Попытка
УдалитьФайлы(ФайлПравил);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
4. В Конвертации данных 2.1:
Перед выгрузкой данных определяем параметр узел "Выгрузка"
В правилах выгрузки данных каждого объекта (Перед обработкой):
В правилах конвертации объекто: в событии "При выгрузке" при удачной выгрузке удаляю регистрацию из узла "Выгрузка"
В итоге получаю файл с данными.
5. -Для загрузки файла в базе "Приемник" делаем такую же обработку. Также подключаем ее, чтобы она запускалась по расписанию.
-Для загрузки "Правила обмена данными" не нужны. Создаем Обработку УниверсальныйОбменДаннымиXML и загружаем файл.
-После удачной загрузки сам файл перемещаем в папку "Downloaded"
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
ПутьНаДиске = "\\server1c\obmen\";
табФ = Новый ТаблицаЗначений;
табФ.Колонки.Добавить("Путь");
табФ.Колонки.Добавить("Имя");
табФ.Колонки.Добавить("Диск");
МассивФайлов = НайтиФайлы(ПутьНаДиске, "*.xml", Ложь);
Если Не МассивФайлов.Количество() Тогда
Возврат;
КонецЕсли;
Для Каждого текФ Из МассивФайлов Цикл
НоваяСтр = табФ.Добавить();
НоваяСтр.Путь = текФ.Путь;
НоваяСтр.Имя = текФ.Имя;
НоваяСтр.Диск = текФ.ПолноеИмя;
КонецЦикла;
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Для Каждого текСтр Из табФ Цикл
Обработка.РежимОбмена = "Загрузка";
Обработка.ИмяФайлаОбмена = текСтр.Диск;
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
Обработка.ОбъектыПоСсылкеЗагружатьБезПометкиУдаления = Истина;
Обработка.ОптимизированнаяЗаписьОбъектов = Истина;
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка.ОбрезатьСтрокиСправа = Истина;
Обработка.ВыполнитьЗагрузку();
ПереместитьФайл(текСтр.Диск, текСтр.Путь + "Downloaded\" + текСтр.Имя);
КонецЦикла;
КонецПроцедуры