Проведение документов в базе-приемнике при переносе.
В этом случае необходимо передавать значение свойства «Проведен» в параметр «Проведен» и данный параметр анализировать в обработчике «После загрузки объекта».
1. «Перед загрузкой данных»
Создаем в параметрах Правил обмена один параметр, обзываем его "Таблица документов" в нем будут храниться значения которые загрузились в приемник.
Далее вставляем следующий код.
ТаблицаДокументов = Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Ссылка"); ТаблицаДокументов.Колонки.Добавить("Действие"); Параметры.Вставить("ТаблицаДокументов",ТаблицаДокументов);
2. «После загрузки объекта» После загрузки мы должны уже работать с объектами, которые еще не записаны в базе. Документы можно выделить по типу значения, а новый объект, перед внесением в таблицу параметра, необходимо предварительно записать. Не забываем установить параметр «ОбъектМодифицирован» в «Ложь».
Если ИмяТипаОбъекта = "Документ" И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда Если Не ОбъектНайден Тогда Объект.Записать(); ОбъектМодифицирован = Ложь; КонецЕсли; НоваяСтрока = Параметры.ТаблицаДокументов.Добавить(); НоваяСтрока.Ссылка = Объект.Ссылка; Если ПараметрыОбъекта.Получить("Проведен") Тогда НоваяСтрока.Действие = "Проведение"; ИначеЕсли ПараметрыОбъекта.Получить("ПометкаУдаления") Тогда НоваяСтрока.Действие = "Удаление"; Иначе НоваяСтрока.Действие = "Отмена"; КонецЕсли; КонецЕсли;
3. «После загрузки данных» После загрузки мы должны пропустить запись документа, если он не проведен в базе-источнике и в базе приемника. Также необходимо проследить за пометкой удаления.
ТекстСообщенияЗаписи = ""; ТекстСообщенияОшибки = ""; Для каждого СтрокаТч Из Параметры.ТаблицаДокументов Цикл Если СтрокаТч.Действие = "Отмена" И Не СтрокаТч.Ссылка.Проведен Тогда Если СтрокаТч.Ссылка.ПометкаУдаления Тогда //Для снятия пометки удаления Попытка ДокОбъект = СтрокаТч.Ссылка.ПолучитьОбъект(); ДокОбъект.ПометкаУдаления = Ложь; ДокОбъект.Записать(); Исключение КонецПопытки; КонецЕсли; Продолжить; КонецЕсли; Если СтрокаТч.Действие = "Проведение" Тогда РежимЗаписи = РежимЗаписиДокумента.Проведение; Иначе РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения; КонецЕсли; Попытка ДокОбъект = СтрокаТч.Ссылка.ПолучитьОбъект(); Если (СтрокаТч.Действие "Удаление" Или СтрокаТч.Ссылка.Проведен) Тогда ДокОбъект.Записать(РежимЗаписи); ТекстСообщенияЗаписи = ТекстСообщенияЗаписи +?(РежимЗаписи = РежимЗаписиДокумента.Проведение, "Проведен ","Отменено проведение ") + Строка(СтрокаТч.Ссылка) + Символы.ПС; КонецЕсли; Если СтрокаТч.Действие = "Удаление" Тогда ДокОбъект.ПометкаУдаления = Истина; ДокОбъект.Записать(); ИначеЕсли СтрокаТч.Ссылка.ПометкаУдаления Тогда ДокОбъект.ПометкаУдаления = Ложь; ДокОбъект.Записать(); КонецЕсли; Исключение ТекстСообщенияОшибки = ТекстСообщенияОшибки + Строка(СтрокаТч.Ссылка)+ " : "+ОписаниеОшибки()+ Символы.ПС; КонецПопытки; КонецЦикла;Если Не ПустаяСтрока(ТекстСообщенияЗаписи) Тогда Сообщить(ТекстСообщенияЗаписи); КонецЕсли;Если Не ПустаяСтрока(ТекстСообщенияОшибки) Тогда Сообщить("Ошибки при отмене проведения: "+ Символы.ПС + ТекстСообщенияОшибки); КонецЕсли; Параметры.Удалить("ТаблицаДокументов");
Вот в принципе и все, в итоге получили проведенные документы в базе приемнике.