После построения простой схемы обмена всегда встает вопрос относительно того, как регистрировать изменения в базе для обмена (в стандартном варианте для этого есть планы обмена, где определен состав объектов и способ их регистрации), в нашем варианте тоже возможна привязка к плану обмена и обработка позволяет это сделать. Также возможно создать свой план обмена и задействовать его, вот некий пример: http://www.kb.mista.ru/article.php?id=356 . Но я, не претендуя на уникальность, предлагаю свой вариант, идея которого, возможно, кому-либо и пригодится.
Итак…
Изменения будут регистрироваться в регистре сведений:
Также потребуется перечисление для установки текущих статусов документов:
Напишем несколько функций в общем модуле (можно использовать имеющейся либо создать свой для этой цели). Там разместим помимо регламентных процедур загрузки и выгрузки описанных в предыдущей статье следующие функции:
//проверка статуса документа для принятия решения о обмену
Функция ПолучитьСтатусДокумента (Документ) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| СтатусыДокументовДляВыгрузки.Статус
|ИЗ
| РегистрСведений.СтатусыДокументовДляВыгрузки КАК СтатусыДокументовДляВыгрузки
|ГДЕ
| СтатусыДокументовДляВыгрузки.Документ = &Документ»;
Запрос.УстановитьПараметр(«Документ»,Документ);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Null;
Иначе
Возврат РезультатЗапроса.Выгрузить()[0].Статус;
КонецЕсли;
КонецФункции
//установка нового статуса документа в системе обена
Процедура УстановитьСтатусДокумента (Документ, Статус) Экспорт
Если Не ЗначениеЗаполнено(Документ) ИЛИ Не ЗначениеЗаполнено(Статус) Тогда
Возврат;
КонецЕсли;
МенеджерЗначенияСвойствОбъектов = РегистрыСведений.СтатусыДокументовДляВыгрузки.СоздатьМенеджерЗаписи();
МенеджерЗначенияСвойствОбъектов.Документ = Документ;
МенеджерЗначенияСвойствОбъектов.Прочитать();
МенеджерЗначенияСвойствОбъектов.Документ = Документ;
МенеджерЗначенияСвойствОбъектов.Статус = Статус;
МенеджерЗначенияСвойствОбъектов.Записать();
КонецПроцедуры
//удаление документа из системы обмена
Процедура УдалитьСтатусДокумента (Документ) Экспорт
Если Не ЗначениеЗаполнено(Документ) Тогда
Возврат;
КонецЕсли;
МенеджерЗначенияСвойствОбъектов = РегистрыСведений.СтатусыДокументовДляВыгрузки.СоздатьМенеджерЗаписи();
МенеджерЗначенияСвойствОбъектов.Документ = Документ;
МенеджерЗначенияСвойствОбъектов.Прочитать();
Если МенеджерЗначенияСвойствОбъектов.Выбран() Тогда
МенеджерЗначенияСвойствОбъектов.Удалить();
КонецЕсли;
КонецПроцедуры
Теперь в актуальном для нас обработчике события отслеживаемого типа документа поместим логическую конструкцию для регистрации события записи… проведения и т п. в зависимости от ваших потребностей (например):
Если Ссылка.Дата > ‘20110525’ Тогда
Если Ссылка.СкладОтправитель = Справочники.Склады.НайтиПоКоду(«……»)
ИЛИ Ссылка.СкладПолучатель = Справочники.Склады.НайтиПоКоду(«…..») ТОГДА
Обмен.УстановитьСтатусДокумента (Ссылка, Перечисления.СтатусДокументов.НеВыгружено);
КонецЕсли
КонецЕсли;
Процедура выгрузки несколько изменится, поскольку вместо одного документа мы теперь используем массив ссылок на документы (вот так теперь выглядит окончание):
Начитали список нужных нам документов:
Структура = Новый СписокЗначений;
Запрос = Новый Запрос();
Запрос.Текст =
«ВЫБРАТЬ
| СтатусыДокументовДляВыгрузки.Документ,
| СтатусыДокументовДляВыгрузки.Статус
|ИЗ
| РегистрСведений.СтатусыДокументовДляВыгрузки КАК СтатусыДокументовДляВыгрузки
|ГДЕ
| СтатусыДокументовДляВыгрузки.Статус = &Статус»;
Запрос.УстановитьПараметр(«Статус», Перечисления.СтатусДокументов.НеВыгружено);
Структура = Запрос.Выполнить().Выгрузить();
ОтборДляПеремещения(ВременнаяТаблицаПравил, Структура);
Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
Обработка.АрхивироватьФайл = Истина;
Если Структура.Количество() > 0 ТОГДА
Обработка.ВыполнитьВыгрузку();
А после выгрузки соответственно меняем статус документов.
Для Каждого Док Из Структура Цикл
УстановитьСтатусДокумента (Док.документ, Перечисления.СтатусДокументов.Выгружено);
КонецЦикла;
КонецЕсли;
Теперь создаем регламентные задания и подключаем их к нашим процедурам загрузки и выгрузки
Настраиваем расписание и можно на этом пока остановиться…
Поле для вариаций довольно широкое поэтому пробуйте… Удачи.
Данный материал является продолжением начатой мною темы относительно использования обработки «Универсальный обмен данными в формате XML» при организации регламентного обмена между различными базами (http://infostart.ru/public/86109/ ).
Перейти к публикации
Зачем изобретать колесо?
В 1С УПП, Бух и других уже реализован удобный инструмент регистрации изменений на основе правил сформированных в конфигурации «конвертация данных». Каждый раз менять конфу, когда что-то изменится и т.д. неэффективно.
(1)Это при условии что вы используете объект «План обмена» тогда вопрос регистрации не стоит (только регистрация объектов настраивается там не в «конвертации данных» и не в правилах обмена а в той же «конфе»).
Я колесо не изобретал, читайте внимательно.
Данная публикация развитие предыдущей там иная концепция.
У меня на реальном предприятии реализована регистрация измененных объектов тоже через РС, а не план обмена ввиду некоторых нюансов. В РС все проще — не нужно реквизита «Статус» типа перечисления. При записи элементов (справочников или документов) в базу происходит проверка на совпадение записываемого объекта с хранимой в базе ссылкой. Если объект был изменен или создан новый, то делается запись в РС. Выгрузка объектов в базы приемники (их много 😉 ) происходит в рег задании: каждые 5 минут делается запрос к РС, в котором хранятся ссылки на измененные объекты. Далее эти ссылки помещаем в отбор УниверсальногоОбменаДанными с прикрученными правилами обмена (они переписываются довольно часто ввиду развития всех конфигураций). Если выгрузка прошла успешно — то запись просто удаляем из РС. Если не успешно, то оставляем в РС до следующей попытки выгрузки данных. В РС есть реквизит — «Комментарии выгрузки», в который записываем описание ошибки при выгрузки. Вуаля!
Ну это писалось давно. Решений тут может быть масса в зависимости от специфики. И все это можно совершенствовать без предельно (зависит от полета фантазии и конкретной специфики).