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

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

Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

 

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

 

95

См. также

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

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

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

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

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

у меня выгрузка идет не через план обмена, а с помощью правил обмена созданные через Конвертацию данных. ТиС 7.7 ->Бух 8.1
7. artbear 1143 27.04.10 17:01 Сейчас в теме
(6) Часть скриншотов вылетела, их не видно
8. artbear 1143 28.04.10 10:54 Сейчас в теме
Не описан вариант проведения загруженных документов при переносе в базу 77 :(
Хотя код на язык 77 переделать несложно, но в 77 есть свои нюансы, к сожалению, которые не дают юзать простую переделку.
Если кому нужно, могу выложить код для 77.
cleaner_it; fvr2000; tandy82; Abadonna; +4 Ответить
10. Abadonna 3825 30.04.10 15:17 Сейчас в теме
(8) Не нужен...пока... но тебе все равно плюсик ;)
15. tandy82 59 26.09.10 18:13 Сейчас в теме
(8) artbear дай пожалуйста код проведения документов для 7.7.

Какие нам нюансы?
temp1982; fvr2000; +2 Ответить
21. A2004333 7 09.08.13 15:38 Сейчас в теме
(15) tandy82, если грузим в 1С 7.7, то достаточно написать в "После загрузки объекта":

Если ТипЗначенияСтр(Объект) = "Документ" Тогда
Объект.Записать();
Объект.Провести();
КонецЕсли;
28. Xershi 674 27.11.14 10:25 Сейчас в теме
(21) A2004333, конвертации 8.2 -> 7.7 не подходит...
9. Istur 1416 30.04.10 15:05 Сейчас в теме
(0) часть скриншотов слетала, не видно их(( Добавь их пожалуйста снова.
11. Re:аниматор 429 01.05.10 15:44 Сейчас в теме
(9) вроде все на месте, четыре скрина. в каком пункте нет?
12. artbear 1143 04.06.10 14:45 Сейчас в теме
(11) Кстати, в п.4 небольшой недочет:
если загружаемый док специально помечен на удаление, то загрузчик все равно пытается его провести, что неверно.
Например, в типовых конвертациях на удаление помечаются специальные служебные документы типа партий и т.п. Их не нужно проводить.
Для решения просто добавить проверку на НЕ ПометкаУдаления
13. Re:аниматор 429 04.06.10 18:31 Сейчас в теме
(12) в том то и дело, что я перегружаю только проведенные, а зачем переносить не проведенные и помеченные на удаление?

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

Мелочь, поэтому я и написал "небольшой" недочет :)
17. SoftLeon 21 04.09.11 18:39 Сейчас в теме
Re:аниматор пишет:

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



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

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

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

только вот не распроводится документ
16. Поручик 4291 30.01.11 01:34 Сейчас в теме
>>>>3. В обработчике «После загрузки объекта» пишем код:
Вариант, сдёрнутый из типовой

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

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

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

Собственно и таблица значений тут не нужна, достаточно массива.
malikov_pro; +1 Ответить
18. Tota 09.11.11 17:21 Сейчас в теме
Полезная статья. Благодарю.
19. Alex_Japanese_Student 437 28.12.11 10:11 Сейчас в теме
Полезная статья. Было бы правильным тогда описать еще правило, чтобы непроведенные документы и помеченные на удаление объекты не выгружались
20. zarazax 29 26.04.12 17:47 Сейчас в теме
У меня обработчик ПослеЗагрузки выглядит так:

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


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

Плюсик поставил :)
jif; serpan75; zvERP1c; Kesak; NoRazum; +5 Ответить
33. cheiser1982 80 16.11.17 11:40 Сейчас в теме
(20) Однозначно плюс, спасибо!
22. industrial 29.08.13 20:57 Сейчас в теме
Использую следующий код

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

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


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

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

Исключение

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

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




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

Попытка

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

Исключение

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

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

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

Попытка

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

Исключение

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

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


КонецЕсли;


КонецЦикла;
23. 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. Xershi 674 27.11.14 09:22 Сейчас в теме
Как решить вопрос в обратную сторону 8.2 -> 7.7? Так же можете отписать тут : http://forum.infostart.ru/forum85/topic120931/
30. zvERP1c 24.02.15 21:24 Сейчас в теме
Обработчик ПослеЗагрузкиДанных
Если ИмяТипаОбъекта = "Документ" Тогда 
	Объект.Записать();
	МетаданныеОбъекта = Объект.Метаданные();
	Если МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить  Тогда
		Если НЕ Объект.ПометкаУдаления 
			И Объект.Проведен Тогда
			НоваяСтрокаТаблицыДляПроведения = Параметры.ТаблицаДокументовДляПроведения.Добавить();
			НоваяСтрокаТаблицыДляПроведения.Ссылка = Объект.Ссылка;
			НоваяСтрокаТаблицыДляПроведения.Дата = Объект.Дата;
		КонецЕсли;
	КонецЕсли;
КонецЕсли;
Показать
31. flintic 22.07.15 02:51 Сейчас в теме
Очень хорошее решение! Реально помогло при конвертации из УПП 1.3 в Бухгалтерию 3.0.
32. Kvitka_ru 31.07.17 09:12 Сейчас в теме
Спасибо, Большое! Все получилось! Супер статья.
34. dima_gsv 9 03.10.18 09:59 Сейчас в теме
Небольшое уточнение к началу статьи.
ПКО документа, перед загрузкой:
РежимЗаписи = "Проведение";
В данном решение есть минус, при ошибке проведения документа при загрузке объект не будет загружен вообще.

В последних версиях обработки УниверсальныйОбменДаннымиXML при ошибке проведения документ всё равно будет записан в режиме Запись со снятием признака Проведен. С одной стороны хорошо, что документ записывается. С другой - плохо, если документ уже был проведён, то он становится непроведённым, но остаются все движения в регистрах.
Жаль, что программисты, делавшие УниверсальныйОбменДаннымиXML в этом месте немного не доработали.
В общем, если нужно провести документ правильно, проведи его сам!
35. dima_gsv 9 03.10.18 12:16 Сейчас в теме
Мой вариант проведения документов в конвертации без дополнительной таблицы, когда последовательность проведения не важна. В Конвертации в "После загрузки объекта":
Если ИмяТипаОбъекта = "Документ" Тогда
	
	// установка Режима записи документа
	// - Проведение, для документов у которых Объект.Проведен = Истина
	// - Отмена проведения, для ранее проведённых документов, у которых Объект.Проведен = Ложь
	Если Объект.Проведен Тогда
		
		// предварительная отмена проведения у проведённого ранее документа,
		// чтобы в случае невозможности проведения не осталось движений с непроведённым документом
		Если Объект.Ссылка.Проведен Тогда
			Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
		КонецЕсли;
		
		РежимЗаписи = "Проведение";
	ИначеЕсли Объект.Ссылка.Проведен Тогда
		РежимЗаписи = "ОтменаПроведения";
	КонецЕсли;
	
КонецЕсли;
ОбъектМодифицирован = Ложь;
Показать
Оставьте свое сообщение