Выгрузка и загрузка документов с движениями

Публикация № 1116480

Управление - Не имеет значения

правил загрузка документов движения

13
Возникла задача перенести документы с движениями, но подменив организацию. Наткнулся на проблему с выгрузкой движений, опишу свой опыт.

Открываем конфигурацию Конвертация 2.0, туда загружаем базу.

Главное, что при получении описания метаданных конфигурации поставить флаг - выгружать движения по регистрам.


Далее создаем все правила автоматически, т.к. это предлагает сделать Конвертация 2.0

Также автоматом создаем все правила выгрузки данных.

Вроде все сделано правильно и движения должны переноситься, но увы этого недостаточно.

Начинаем разбираться в коде и в видим, что после загрузке документы с движениями, но в момент записи документа все движения затираются.

Необходимо "после загрузке в глобальном контексте" добавить немного кода (подсказал  duhh):

Всё, статья получилась маленькая, но, надеюсь, полезная))

 

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

 

13

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. duhh 185 03.09.19 09:52 Сейчас в теме
Для того чтобы меньше копипастить (не добавлять в каждый обработчик документа), код нужно добавить в "глобальный" обработчик с проверкой на метаданные Документ. (ПРИМЕР МетаданныеОбъекта = Объект.Метаданные(); Если Метаданные.Документы.Содержит(МетаданныеОбъекта)
)
human_new; +1 Ответить
2. human_new 343 03.09.19 11:09 Сейчас в теме
(1) Спасибо, поменял статью со ссылкой на вас
3. alest 08.09.19 10:59 Сейчас в теме
А отказ от типовой обработки не нужен разве? При выполнении обработчика взводится ведь ОбъектМодифицирован и НужноЗаписатьОбъект, после чего идет Записать(Проведение)...
4. human_new 343 09.09.19 12:29 Сейчас в теме
(3) Так это же обмен, он и так в режиме ОбменДанными.загрузка = истина
5. alest 09.09.19 14:56 Сейчас в теме
(4) Хм, во внешней обработке обмена стоит
РежимОбменДанными = РежимЗаписи = РежимЗаписиДокумента.Запись; 
т.к. иначе упадет.
В обработке из конфы стоит явно ОтменитьПроведениеОбъектаВИБ с постановкой в очередь отложенного проведения.

В любом случае, это же впустую второй раз запишется.
6. human_new 343 09.09.19 15:27 Сейчас в теме
(5) Вы хотите сказать, что надо сделать как-то вот так:
// сначала надо определить мы загрузили новый документ или обновили старый,
//1) Если новый то тогда надо присвоить ему ссылку
НоваяСсылка = Документы.НужныйТип.ПолучитьСсылку(Новый УникальныйИдентификатор());
Объект.УстановитьСсылкуНовго(НоваяСсылка);
НаборЗаписей = Объект.Движения.НужноеДвижение;
Таблица = НаборЗаписей.Выгрузить();
Таблица.ЗаполнитьЗначения(НоваяСсылка, "Регистратор");
НаборЗаписей.Записать();

Мне кажется и двойная запись особо не мешает и более читабельна.
7. alest 09.09.19 18:16 Сейчас в теме
Ну да, можно вообще не записывать документ принудительно.

1 в вашем коде запись идет без режима ОбменДанными.Загрузка, если он нужен, то надо его прописать
2 дальше обработка обмена сама записывает документ, но т.к. РежимЗаписи при генерации правил не устанавливается, то идет просто запись, уже в режиме загрузки (я думал, что там режим проведения и не сработает)
3 от лишней записи объекта лучше избавиться, установив после принудительной записи
ОбъектМодифицирован = Ложь;
НужноБылоЗаписатьОбъект = Ложь;
Оставьте свое сообщение