Конвертация Данных 2.0. Проведение перенесенного документа

Опубликовал Дмитрий Бухалов (Re:аниматор) в раздел Программирование - Практика программирования

Конвертация Данных 2.0. Проведение перенесенного документа

Часто вижу вопросы на форумах как организовать автоматическое проведение документов загруженных с помощью правил обмена конфигурации «Конвертация данных 2.0».

в частности для варианта обмена 7.7 -> 8.1

ПКО документа, перед загрузкой:
РежимЗаписи = "Проведение";

В данном решение есть минус, при ошибке проведения документа при загрузке объект не будет загружен вообще.

Делюсь решением:

1. В свойствах конвертации создаем параметр "ТаблицаДокументов" устанавливаем галочку "При загрузке"

2. В обработчике «Перед загрузкой данных» пишем код:

ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Документ");
ТаблицаДокументов.Колонки.Добавить("ДатаВремя");

Параметры.ТаблицаДокументов = ТаблицаДокументов;

3. В обработчике «После загрузки объекта» пишем код:

Если ИмяТипаОбъекта = "Документ" Тогда

    Объект.Записать();

    НоваяСтрока = Параметры.ТаблицаДокументов.Добавить();
    НоваяСтрока.Документ = Объект.Ссылка;
    НоваяСтрока.ДатаВремя = Объект.Дата;

КонецЕсли;

4. В обработчике «После загрузки данных» пишем код:

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

 

Собственно и всё.

 

См. также

Комментарии
1. Герман (German) 930 10.07.09 23:34 Сейчас в теме
В данном случае лучше отделить фактический перенос данных и проведение:
-скорость обмена;
-доопределение данных пользователем;
-стабильность;

Лучше использовать фоновое проведение:
-просто добавлять еще запись в РС, Фоновое проведение(ну или как он там называется)
2. Дмитрий Бухалов (Re:аниматор) 388 11.07.09 03:38 Сейчас в теме
(1) можно добавить параметр перед выгрузкой правил обмена "ПроводитьПослеЗагрузки" можно просто переносить или переносить и проводить.

про фоновое я так понимаю через правила обмена, не понял, можно подробнее?

3. Дмитрий Бухалов (Re:аниматор) 388 11.07.09 03:41 Сейчас в теме
(1) ... данное решение оч актуально для правил обмена 7.7 -> 8.1
4. Дмитрий Бухалов (Re:аниматор) 388 11.07.09 09:56 Сейчас в теме
(1) про фоновое. имелось ввиду запуск регламентных заданий? вот через неё точно не надо) так что проведение после загрузки в полне нормальное решение. + можно сделать флажок, проводить или нет. есть выбор решения. а то что проводятся после загрузке оч удобно.
5. Ulcer (KapasMordorov) 11.07.09 12:53 Сейчас в теме
В типовых есть регистр сведений ОтложенныеДвиженияДокументов.
Используется как раз для обмена.
6. Дмитрий Бухалов (Re:аниматор) 388 11.07.09 14:16 Сейчас в теме
(5)
- В типовых, речь идет о механизмет как сделать через конвертацию данных. а если не типовая?
- Регистр сведений "ОтложенныеДвиженияДокументов" используется при обмене через план обмена.

у меня выгрузка идет не через план обмена, а с помощью правил обмена созданные через Конвертацию данных. ТиС 7.7 ->Бух 8.1
7. Артур Аюханов (artbear) 859 27.04.10 17:01 Сейчас в теме
(6) Часть скриншотов вылетела, их не видно
8. Артур Аюханов (artbear) 859 28.04.10 10:54 Сейчас в теме
Не описан вариант проведения загруженных документов при переносе в базу 77 :(
Хотя код на язык 77 переделать несложно, но в 77 есть свои нюансы, к сожалению, которые не дают юзать простую переделку.
Если кому нужно, могу выложить код для 77.
cleaner_it; fvr2000; tandy82; Abadonna; +4 Ответить 2
9. Станислав Турчинский (Istur) 1346 30.04.10 15:05 Сейчас в теме
(0) часть скриншотов слетала, не видно их(( Добавь их пожалуйста снова.
10. Аркадий Кучер (Abadonna) 3667 30.04.10 15:17 Сейчас в теме
(8) Не нужен...пока... но тебе все равно плюсик ;)
11. Дмитрий Бухалов (Re:аниматор) 388 01.05.10 15:44 Сейчас в теме
(9) вроде все на месте, четыре скрина. в каком пункте нет?
12. Артур Аюханов (artbear) 859 04.06.10 14:45 Сейчас в теме
(11) Кстати, в п.4 небольшой недочет:
если загружаемый док специально помечен на удаление, то загрузчик все равно пытается его провести, что неверно.
Например, в типовых конвертациях на удаление помечаются специальные служебные документы типа партий и т.п. Их не нужно проводить.
Для решения просто добавить проверку на НЕ ПометкаУдаления
13. Дмитрий Бухалов (Re:аниматор) 388 04.06.10 18:31 Сейчас в теме
(12) в том то и дело, что я перегружаю только проведенные, а зачем переносить не проведенные и помеченные на удаление?

з.ы. условие сделать не сложно, лично не считаю это недочетом
14. Артур Аюханов (artbear) 859 05.06.10 09:03 Сейчас в теме
(13) Пример типовой выгрузки - при типовом переносе из Бух 77 в Бух 8 остатков по спецодежде создаются 2 документа: "ввод остатков материалов в эксплуатации" и "передача материалов в эксплутацию" (последний - это документ для партионного учета)
Первый проводится, а вот второй (партия) не проводится и создается помеченным на удаление.
В этом случае твой код будет пытаться проводить оба документа и 1С будет выдавать ошибку, что удаленный документ нельзя проводить :(

Мелочь, поэтому я и написал "небольшой" недочет :)
15. tAndy (tandy82) 58 26.09.10 18:13 Сейчас в теме
(8) artbear дай пожалуйста код проведения документов для 7.7.

Какие нам нюансы?
temp1982; fvr2000; +2 Ответить 1
16. Сергей Ожерельев (Поручик) 3536 30.01.11 01:34 Сейчас в теме
>>>>3. В обработчике «После загрузки объекта» пишем код:
Вариант, сдёрнутый из типовой

Если ИмяТипаОбъекта = "Документ" Тогда

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

КонецЕсли;
...Показать Скрыть

Собственно и таблица значений тут не нужна, достаточно массива.
malikov_pro; +1 Ответить
17. German Derkachenko (SoftLeon) 20 04.09.11 18:39 Сейчас в теме
Re:аниматор пишет:

(12) в том то и дело, что я перегружаю только проведенные, а зачем переносить не проведенные и помеченные на удаление?



з.ы. условие сделать не сложно, лично не считаю это недочетом

Если в исходной базе сняли после переноса отметку проведения, нужно также снять отметку проведения и в конечной базе.
Видимо, нужно в таком случае слегка добавить код:

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

только вот не распроводится документ
18. Антоха (Tota) 09.11.11 17:21 Сейчас в теме
Полезная статья. Благодарю.
19. alex_japanese_student (Alex_Japanese_Student) 327 28.12.11 10:11 Сейчас в теме
Полезная статья. Было бы правильным тогда описать еще правило, чтобы непроведенные документы и помеченные на удаление объекты не выгружались
20. zarazax (zarazax) 29 26.04.12 17:47 Сейчас в теме
У меня обработчик ПослеЗагрузки выглядит так:

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


Если уж говорить об универсальности, то, действительно, надо добавить проверку пометки удаления и проверку на возможность проведения документа.

Плюсик поставил :)
serpan75; 3BEPb777; Kesak; NoRazum; +4 Ответить
21. Артур Рахманов (A2004333) 7 09.08.13 15:38 Сейчас в теме
(15) tandy82, если грузим в 1С 7.7, то достаточно написать в "После загрузки объекта":

Если ТипЗначенияСтр(Объект) = "Документ" Тогда
Объект.Записать();
Объект.Провести();
КонецЕсли;
22. Дмитрий Диаковский (industrial) 29.08.13 20:57 Сейчас в теме
Использую следующий код

Для Каждого Стр1 Из Параметры.ТаблицаСтатусыДокументов Цикл

Ссылка=Стр1.Ссылка;
Об=Ссылка.ПолучитьОбъект();


Если Стр1.ПараметрПроведен=Истина Тогда

Попытка
Об.ПометкаУдаления=ЛОЖЬ; //если вдруг был помечен на удаление
Об.Записать(РежимЗаписиДокумента.Проведение);

Исключение

Сообщить("Не смогли провести "+Стр1.Ссылка+" "+ОписаниеОшибки());

КонецПопытки;




ИначеЕсли Ссылка.Проведен Тогда

Попытка

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

Исключение

Сообщить("Не смогли отменить проведение "+Стр1.Ссылка+" "+ОписаниеОшибки());

КонецПопытки;

ИначеЕсли Ссылка.ПометкаУдаления<>Стр1.ПараметрПометкаУдаления Тогда

Попытка

Об.ПометкаУдаления=Стр1.ПараметрПометкаУдаления;
Об.Записать();

Исключение

Сообщить("Не смогли записать "+Стр1.Ссылка+" "+ОписаниеОшибки());

КонецПопытки;


КонецЕсли;


КонецЦикла;
23. Tarley (Tarley) 29.01.14 13:34 Сейчас в теме
спасибо,очень помогло решение
24. timothy 24.02.14 17:28 Сейчас в теме
Спасибо, тоже воспользовался.
25. Евгений Фалин (Gotcha) 5 25.02.14 18:12 Сейчас в теме
Респект, спасибо!
Идеи хорошие.
26. Алексей Шарапов (Isperator) 26.03.14 16:48 Сейчас в теме
Спасибо, статья помогла.
27. Xer shi (Xershi) 240 27.11.14 09:22 Сейчас в теме
Как решить вопрос в обратную сторону 8.2 -> 7.7? Так же можете отписать тут : http://forum.infostart.ru/forum85/topic120931/
28. Xer shi (Xershi) 240 27.11.14 10:25 Сейчас в теме
(21) A2004333, конвертации 8.2 -> 7.7 не подходит...
29. Xer shi (Xershi) 240 28.11.14 12:41 Сейчас в теме
30. 3BEPb777 Семь (3BEPb777) 24.02.15 21:24 Сейчас в теме
Обработчик ПослеЗагрузкиДанных
Если ИмяТипаОбъекта = "Документ" Тогда 
	Объект.Записать();
	МетаданныеОбъекта = Объект.Метаданные();
	Если МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить  Тогда
		Если НЕ Объект.ПометкаУдаления 
			И Объект.Проведен Тогда
			НоваяСтрокаТаблицыДляПроведения = Параметры.ТаблицаДокументовДляПроведения.Добавить();
			НоваяСтрокаТаблицыДляПроведения.Ссылка = Объект.Ссылка;
			НоваяСтрокаТаблицыДляПроведения.Дата = Объект.Дата;
		КонецЕсли;
	КонецЕсли;
КонецЕсли;
...Показать Скрыть
31. Сергей Григорьев (flintic) 22.07.15 02:51 Сейчас в теме
Очень хорошее решение! Реально помогло при конвертации из УПП 1.3 в Бухгалтерию 3.0.
Оставьте свое сообщение