gifts2017

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

 

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

 

См. также

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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


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

Плюсик поставил :)
serpan75; 3BEPb777; Kesak; NoRazum; +4 Ответить
21. Артур Рахманов (A2004333) 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) 25.02.14 18:12
Респект, спасибо!
Идеи хорошие.
26. Алексей Шарапов (Isperator) 26.03.14 16:48
Спасибо, статья помогла.
27. Xer shi (Xershi) 27.11.14 09:22
Как решить вопрос в обратную сторону 8.2 -> 7.7? Так же можете отписать тут : http://forum.infostart.ru/forum85/topic120931/
28. Xer shi (Xershi) 27.11.14 10:25
(21) A2004333, конвертации 8.2 -> 7.7 не подходит...
30. 3BEPb777 Семь (3BEPb777) 24.02.15 21:24
Обработчик ПослеЗагрузкиДанных
Если ИмяТипаОбъекта = "Документ" Тогда 
	Объект.Записать();
	МетаданныеОбъекта = Объект.Метаданные();
	Если МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить  Тогда
		Если НЕ Объект.ПометкаУдаления 
			И Объект.Проведен Тогда
			НоваяСтрокаТаблицыДляПроведения = Параметры.ТаблицаДокументовДляПроведения.Добавить();
			НоваяСтрокаТаблицыДляПроведения.Ссылка = Объект.Ссылка;
			НоваяСтрокаТаблицыДляПроведения.Дата = Объект.Дата;
		КонецЕсли;
	КонецЕсли;
КонецЕсли;
...Показать Скрыть
31. Сергей Григорьев (flintic) 22.07.15 02:51
Очень хорошее решение! Реально помогло при конвертации из УПП 1.3 в Бухгалтерию 3.0.