Автоматизация обмена между базами, используя обработку "Универсальный обмен данными в формате XML". Подумаем о регистрации объектов обмена

Данный материал является продолжением начатой мною темы относительно использования обработки «Универсальный обмен данными в формате XML» при организации регламентного обмена между различными базами (http://infostart.ru/public/86109/ ).

После построения простой схемы обмена всегда встает вопрос  относительно того, как регистрировать изменения в базе для обмена (в стандартном варианте для этого есть планы обмена, где определен состав объектов и способ их регистрации), в нашем варианте тоже возможна привязка к плану обмена и обработка позволяет это сделать. Также возможно создать свой план обмена и задействовать его, вот некий пример: http://www.kb.mista.ru/article.php?id=356 . Но я, не претендуя на уникальность, предлагаю свой вариант, идея которого, возможно, кому-либо и пригодится.

Итак…

Изменения будут регистрироваться в регистре сведений:

 

Также потребуется перечисление для установки текущих статусов документов: 

Напишем несколько функций в общем модуле (можно использовать имеющейся либо создать свой для этой цели). Там разместим помимо регламентных процедур загрузки и выгрузки описанных в предыдущей статье следующие функции:

//проверка статуса документа для принятия решения о обмену
Функция ПолучитьСтатусДокумента (Документ
) Экспорт
   
Запрос = Новый Запрос
;
   
Запрос.Текст
=
   
«ВЫБРАТЬ
    |   СтатусыДокументовДляВыгрузки.Статус
    |ИЗ
    |   РегистрСведений.СтатусыДокументовДляВыгрузки КАК СтатусыДокументовДляВыгрузки
    |ГДЕ
    |   СтатусыДокументовДляВыгрузки.Документ = &Документ»
;
   
Запрос.УстановитьПараметр(«Документ»,Документ
);
   
РезультатЗапроса = Запрос.Выполнить
();
    Если
РезультатЗапроса.Пустой
() Тогда
        Возврат Null;
    Иначе
        Возврат
РезультатЗапроса.Выгрузить()[0].Статус
;
    КонецЕсли;
КонецФункции

//установка нового статуса документа в системе обена
Процедура УстановитьСтатусДокумента (Документ, Статус
) Экспорт
    Если Не
ЗначениеЗаполнено(Документ) ИЛИ Не ЗначениеЗаполнено(Статус
) Тогда
        Возврат;
    КонецЕсли;

    МенеджерЗначенияСвойствОбъектов = РегистрыСведений.СтатусыДокументовДляВыгрузки.СоздатьМенеджерЗаписи();
   
МенеджерЗначенияСвойствОбъектов.Документ = Документ
;
   
МенеджерЗначенияСвойствОбъектов.Прочитать
();
   
МенеджерЗначенияСвойствОбъектов.Документ = Документ
;
   
МенеджерЗначенияСвойствОбъектов.Статус = Статус
;
   
МенеджерЗначенияСвойствОбъектов.Записать
();

КонецПроцедуры

//удаление документа из системы обмена
Процедура УдалитьСтатусДокумента (Документ
) Экспорт
    Если Не
ЗначениеЗаполнено(Документ
) Тогда
        Возврат;
    КонецЕсли;
   
МенеджерЗначенияСвойствОбъектов = РегистрыСведений.СтатусыДокументовДляВыгрузки.СоздатьМенеджерЗаписи
();
   
МенеджерЗначенияСвойствОбъектов.Документ = Документ
;
   
МенеджерЗначенияСвойствОбъектов.Прочитать
();
    Если
МенеджерЗначенияСвойствОбъектов.Выбран
() Тогда
       
МенеджерЗначенияСвойствОбъектов.Удалить
();
    КонецЕсли;

КонецПроцедуры

Теперь в актуальном для нас обработчике события отслеживаемого типа документа поместим логическую конструкцию для регистрации события записи… проведения и т п. в зависимости от ваших потребностей (например):

Если Ссылка.Дата > ‘20110525’ Тогда
        Если
Ссылка.СкладОтправитель = Справочники.Склады.НайтиПоКоду(«……»)
            ИЛИ
Ссылка.СкладПолучатель = Справочники.Склады.НайтиПоКоду(«…..») ТОГДА
               
Обмен.УстановитьСтатусДокумента (Ссылка, Перечисления.СтатусДокументов.НеВыгружено);
        КонецЕсли
КонецЕсли;

Процедура выгрузки несколько изменится, поскольку вместо одного документа мы теперь используем массив ссылок на документы (вот так теперь выглядит окончание):

Начитали список нужных нам документов:

    Структура = Новый СписокЗначений;
   
Запрос = Новый Запрос();
   
Запрос.Текст =
       
«ВЫБРАТЬ
        |   СтатусыДокументовДляВыгрузки.Документ,
        |   СтатусыДокументовДляВыгрузки.Статус
        |ИЗ
        |   РегистрСведений.СтатусыДокументовДляВыгрузки КАК СтатусыДокументовДляВыгрузки

        |ГДЕ
        |   СтатусыДокументовДляВыгрузки.Статус = &Статус»
;

    Запрос.УстановитьПараметр(«Статус», Перечисления.СтатусДокументов.НеВыгружено);
    Структура = Запрос.Выполнить().Выгрузить();

    ОтборДляПеремещения(ВременнаяТаблицаПравил, Структура);

    Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
   
Обработка.АрхивироватьФайл = Истина;

    Если Структура.Количество() > 0 ТОГДА
       
Обработка.ВыполнитьВыгрузку();

А после выгрузки соответственно меняем статус документов.

        Для Каждого Док Из Структура Цикл
           
УстановитьСтатусДокумента (Док.документ, Перечисления.СтатусДокументов.Выгружено);
        КонецЦикла;
    КонецЕсли;

Теперь создаем регламентные задания и подключаем их к нашим процедурам загрузки и выгрузки

Настраиваем расписание и можно на этом пока остановиться…

Поле для вариаций довольно широкое поэтому пробуйте… Удачи.

5 Comments

  1. wiranata

    Данный материал является продолжением начатой мною темы относительно использования обработки «Универсальный обмен данными в формате XML» при организации регламентного обмена между различными базами (http://infostart.ru/public/86109/ ).

    Перейти к публикации

    Reply
  2. ivanov660

    Зачем изобретать колесо?

    В 1С УПП, Бух и других уже реализован удобный инструмент регистрации изменений на основе правил сформированных в конфигурации «конвертация данных». Каждый раз менять конфу, когда что-то изменится и т.д. неэффективно.

    Reply
  3. wiranata

    (1)Это при условии что вы используете объект «План обмена» тогда вопрос регистрации не стоит (только регистрация объектов настраивается там не в «конвертации данных» и не в правилах обмена а в той же «конфе»).

    Я колесо не изобретал, читайте внимательно.

    Данная публикация развитие предыдущей там иная концепция.

    Reply
  4. RailMen

    У меня на реальном предприятии реализована регистрация измененных объектов тоже через РС, а не план обмена ввиду некоторых нюансов. В РС все проще — не нужно реквизита «Статус» типа перечисления. При записи элементов (справочников или документов) в базу происходит проверка на совпадение записываемого объекта с хранимой в базе ссылкой. Если объект был изменен или создан новый, то делается запись в РС. Выгрузка объектов в базы приемники (их много 😉 ) происходит в рег задании: каждые 5 минут делается запрос к РС, в котором хранятся ссылки на измененные объекты. Далее эти ссылки помещаем в отбор УниверсальногоОбменаДанными с прикрученными правилами обмена (они переписываются довольно часто ввиду развития всех конфигураций). Если выгрузка прошла успешно — то запись просто удаляем из РС. Если не успешно, то оставляем в РС до следующей попытки выгрузки данных. В РС есть реквизит — «Комментарии выгрузки», в который записываем описание ошибки при выгрузки. Вуаля!

    Reply
  5. wiranata

    Ну это писалось давно. Решений тут может быть масса в зависимости от специфики. И все это можно совершенствовать без предельно (зависит от полета фантазии и конкретной специфики).

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *