Конвертация реквизитов Проведен и ПометкаУдаления из 8 в 7.7

03.03.14

Интеграция - Перенос данных 1C

Все кто сталкивался с переносом данных из 8 в 77 через конвертацию данных, знают что перенести значение реквизитов Проведен и ПометкаУдаления без танцев с бубнами, ни как не получится, При загрузке обработка ругается, что реквизит Проведен или ПометкаУдаления у документа нет. И это правда, вместо этих реквизитов у документов есть аналогичные методы, которые только возвращают значение. Точно такие танцы пришлось выполнить и мне, хотя все оказалось проще...

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Полный текст обработчиков
.txt 188,54Kb
7
7 Скачать (1 SM) Купить за 1 850 руб.

Предистория

Сначало была семерка, производство, файловый вариант, вся переписанная, куча новых объектов. База росла и у нее стали возникать частые транзакции, из-за которых приходилось перегружать сервер несколько раз на дню. Затем решили перейти на восьмерку, серверный вариант, конфигурация УНФ.  Причина выбора: относительно небольшая конфигурация для добавления новых объектов. Но из-за огромного количество документов и справочников и куча отчетов, решили переходить на восьмерку отделами, т.е. организовать выборочный перенос документов и и справочников туда и обратно.  Создали документ в 7, перенесли в 8, на основании создали в 8 другой документ и его перенесли в 7. И в семерке по этим докуметам пока строить отчеты.


Выполнение 

Использовав конфигурацию Конвертация данных,  версия 2.1.7.1, я стал создавать план обмена для переноса. С конвертацией начал ть впервые, возникали разные трудности, решение которых я с легкостью находил на просторах интернета. и Вот я столкнулся с переносом признака Проведен и ПометкаУдаления из 8 в 7. В конвертации при загрузки структуры семерочной базы, создает эти признаки как реквизиты объекта. И соответсвено из 7 в 8 позволяет переносить эти значения, а обратно нет. Но для начала обратно мне не надо было переносить. Но со временем потребность появилась. Начал все с признака Проведение, перерыл весь интернет и ничего, кроме как создать дополнительный реквизит (например "_Проведен") в семерке и передавать туда значение и при загрузки в семерке проверять, если истина (в семерке это 1), проводить документ. Создал реквизит у документа, написал код проверки после загрузки, все  хорошо ет, документы проводятся.

Потом потребовалось перенести ПометкуУдаления. Создал реквизит, написал код проверки. Переношу помеченные документы, а в семерке они не помечаются. Залезаю в отладчик, код отрабатывает верно, после записи документа, пометка стоит, а потом смотрю в списке документов, он не помечен. Непонятно почему!?. Лезу в отладчик, смотрю какой код выполняется после записи объекта, и вижу что 1с механизм установки этого признака сделала, а доть до рабочего варианта так и не смогла.

И вот, я решил поделиться рабочим вариантом кода со всеми.

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


Доработка обработки загрузки

Код который нужно доть находится в Процедуре ЗагрузитьДокументV8(Объект, Вид, ИмяПравила)

Отрывок кода (Полный код процедуры находится в конце статьи, а полный код обработчиков выгрузки находится в приложенном файле):

Код 1 

//--------- Заполняем реквизиты --------------------------------------------
	
	Реквизиты	=	Объект.ВыбратьУзлы("Свойство");
	Для Сч = 0 По Реквизиты.КоличествоУзлов() - 1 Цикл
		
		Реквизит					=	Реквизиты.ПолучитьУзел(Сч);
		ИдРеквизита					=	Реквизит.ПолучитьАтрибут("Имя");
		НеЗамещатьРеквизит			=	Реквизит.ПолучитьАтрибут("НеЗамещать");
		//РеквизитОперации			=	0;

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

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

	ВремяДокумента = "";
	ДатаДокумента  = ДатаИзXML(Реквизит.ВыбратьУзел("Значение").Значение, ВремяДокумента);
		
 
И видим проверку если ИдРеквизита равно ПометкаУдаления, то обработка присваивает реквизиту ПометкаУдаление значение полученое из восьмерки. Но так ка у нас выдавало ошибку, дальнейший код не отрабатывался. Теперь он у нас будет отрабатываться, после того как мы изменили условие в коде 1.
Идем дальше. Смотрим где же у нас встречается реквизит ПометкаУдаления.
Код 4
	ЗаписатьОбъект(ОбъектБД);
	
	Если ПустоеЗначение(ПометкаУдаления) = 1 Тогда
		Если ОбъектБД.ПометкаУдаления() = 1 Тогда	ОбъектБД.СнятьПометкуУдаления();	КонецЕсли;
	Иначе
		Если ОбъектБД.ПометкаУдаления() = 0 Тогда	ОбъектБД.Удалить(0);				КонецЕсли;
	КонецЕсли;	                                  
	
КонецПроцедуры		//	ЗагрузитьДокументV8()
А он встречается в конце процедуры после записи объекта. Помните почему у меня в списке документ оказывался без пометки, потому-что отрабатывался данный код, т.к. реквизит ПометкаУдаления был пустым, то выполнялся код снятии пометки удаления
Если ПустоеЗначение(ПометкаУдаления) = 1 Тогда
		Если ОбъектБД.ПометкаУдаления() = 1 Тогда	ОбъектБД.СнятьПометкуУдаления();	КонецЕсли;
Чтобы исправить это меняем код 4 на 
 
Если ПустоеЗначение(ПометкаУдаления) = 0 Тогда 
	Если ПометкаУдаления = 0 Тогда
		Если ОбъектБД.ПометкаУдаления() = 1 Тогда	ОбъектБД.СнятьПометкуУдаления();	КонецЕсли;
	ИначеЕсли ПометкаУдаления = 1 Тогда
		Если ОбъектБД.ПометкаУдаления() = 0 Тогда	ОбъектБД.Удалить(0);		КонецЕсли;  
	КонецЕсли
КонецЕсли;
 
Теперь у нас пометка удаления ет как надо.
Но чтоже делать с проведение?
Добавим в код 3 условие
 
ИначеЕсли ИдРеквизита = "Проведен " Тогда //bdv
			
	Проведен = Значение;
 Реквизиту Проведен присвоим значение из восьмерки. Теперь код 3 выглядит так:
Если ИдРеквизита = "ПометкаУдаления" Тогда
			
	ПометкаУдаления = Значение;
// Добавленый код
ИначеЕсли ИдРеквизита = "Проведен" Тогда 			
	Проведен = Значение;
// Добавленый код
ИначеЕсли	ИдРеквизита = "ДатаДок" Тогда

	ВремяДокумента = "";
	ДатаДокумента  = ДатаИзXML(Реквизит.ВыбратьУзел("Значение").Значение, ВремяДокумента);
 А в код 4 добавим условие проведение документа или же его распроведения
Если ПустоеЗначение(Проведен) = 0 Тогда
		Если Проведен = 1 Тогда 
			ОбъектБД.Провести();
		ИначеЕсли Проведен = 0 Тогда  
			Если ОбъектБД.Проведен() = 1 Тогда	ОбъектБД.СделатьНеПроведенным();	КонецЕсли;  
		КонецЕсли;
КонецЕсли;
	
  Теперь код 4 выглядит так:
        ЗаписатьОбъект(ОбъектБД);
	// Добавленый код
        Если ПустоеЗначение(Проведен) = 0 Тогда
		Если Проведен = 1 Тогда 
			ОбъектБД.Провести();				
		ИначеЕсли Проведен = 0 Тогда  
			Если ОбъектБД.Проведен() = 1 Тогда	ОбъектБД.СделатьНеПроведенным();	КонецЕсли;  
		КонецЕсли;
	КонецЕсли;
	
	Если ПустоеЗначение(ПометкаУдаления) = 0 Тогда 
		Если ПометкаУдаления = 0 Тогда
			Если ОбъектБД.ПометкаУдаления() = 1 Тогда	ОбъектБД.СнятьПометкуУдаления();	КонецЕсли;
		ИначеЕсли ПометкаУдаления = 1 Тогда
			Если ОбъектБД.ПометкаУдаления() = 0 Тогда	ОбъектБД.Удалить(0);				КонецЕсли;  
		КонецЕсли
	КонецЕсли;
 
	
КонецПроцедуры		//	ЗагрузитьДокументV8()
 
Этот код находится в в Обработке ВыгрузкаКонвертации, макет ПроцедурыИФункцииМодуляЗагрузки
Меняем его там, обновляем конфигурацию и теперь не паримся с проведение и пометкой удаления.
Более простого способа переноса этих признаков я не нашел. Кому нравится пользуйтесь на здоровье, кому не нравится предлагайте свои варианты решения. 
 
 Полный код процедуры ЗагрузитьДокументV8 с доработкой:
Процедура ЗагрузитьДокументV8(Объект, Вид, ИмяПравила)
	          
	Перем	ОбъектМД;
 	
	СозданНовыйОбъект	=	0;
	НовыеНеСоздавать	=	0;
	НеЗамещатьНайденные =	0;

	УзелСсылки = Объект.ВыбратьУзел("Ссылка");


	Если ПустоеЗначение(УзелСсылки) = 0 Тогда
		ТекущийОбъект = УстановитьДокументПоСсылкеV8(УзелСсылки, Вид, СозданНовыйОбъект, НовыеНеСоздавать, ОбъектМД, Объект);
		
		
		Если ТекущийОбъект = "Ошибка" Тогда Возврат КонецЕсли;
		                                           
		ОбъектБД	=	СоздатьОбъект("Документ." + Вид);    
		
		Если ПустоеЗначение(ТекущийОбъект) = 0 Тогда

			НеЗамещатьНайденные = Объект.ПолучитьАтрибут("НеЗамещать");
			
			Если СозданНовыйОбъект = 0 Тогда
				Если ПустоеЗначение(НеЗамещатьНайденные) = 0 Тогда
					Если ТекущийОбъект.ПометкаУдаления() = 0 Тогда	//	этот объект не создан по ссылке из реквизитов других объектов
						Возврат;	//	найденные не замещаем
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
			СтатусПроведения	=	гТабКэшПараметровЗагрузки.СтатусПроведения;
			ОтменитьПроведение	=	Число(Объект.ПолучитьАтрибут("ОтменитьПроведение"));
			
			ОбъектБД.НайтиДокумент(ТекущийОбъект);

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

		ЗначениеНомераДокумента = "";
		УзелНомераДокумента		= Объект.ВыбратьУзел("Свойство[@Имя=""НомерДок""]");
		Если ПустоеЗначение(УзелНомераДокумента) = 0 Тогда
			//ЗначениеНомераДокумента		=	УзелНомераДокумента.ПолучитьАтрибут("Значение");
			ЗначениеНомераДокумента = УстановитьРеквизитV8(УзелНомераДокумента, "Документ", Вид, "НомерДок");
		КонецЕсли;
		Если ПустоеЗначение(ЗначениеНомераДокумента) = 0 Тогда
			ОбъектБД.НомерДок			=	ЗначениеНомераДокумента;
		Иначе
			ЗначениеДатыДокумента		=	"";
			УзелДатыДокумента			=	Объект.ВыбратьУзел("Свойство[@Имя=""ДатаДок""]");
			Если ПустоеЗначение(УзелДатыДокумента) = 0 Тогда
				//ЗначениеДатыДокумента	=	Дата(УзелДатыДокумента.ПолучитьАтрибут("Значение"));
				ЗначениеДатыДокумента	=	УстановитьРеквизитV8(УзелДатыДокумента, "Документ", Вид, "ДатаДок");
			КонецЕсли;
			Если ПустоеЗначение(ЗначениеДатыДокумента) = 1 Тогда ЗначениеДатыДокумента = ФормДатаКон КонецЕсли;
			ОбъектБД.ДатаДок			=	ЗначениеДатыДокумента;
			ОбъектБД.УстановитьНовыйНомер();
		КонецЕсли;
		
	КонецЕсли;
	
	// Локальный обработчик "ПриЗагрузке"
	НомерСтроки = 0;
	Если ТаблицаПравилКонвертации.НайтиЗначение(ИмяПравила, НомерСтроки, "Код") = 1 Тогда
		ТаблицаПравилКонвертации.ПолучитьСтрокуПоНомеру(НомерСтроки);
		Если ТаблицаПравилКонвертации.ЕстьОбработчикПриЗагрузке = 1 Тогда
			Отказ = Шаблон("[ПКО_ПриЗагрузке_" + ИмяПравила + "(ОбъектБД, ИмяПравила, Объект)]");
			Если (ТипЗначенияСтр(Отказ) = "Строка") И (Отказ <> "0") Тогда
				Сообщить("Функция не обнаружена (" + Отказ + ")");
				Протокол.ДобавитьСтроку("     Функция не обнаружена (" + Отказ + ")");
			КонецЕсли;
			Если Число(Отказ) = 1 Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;                          
	
	ЕстьКонтроль				=	ОбъектМД.КонтрольУникальности;
	Уникальность				=	ОбъектМД.ПериодичностьНомера;
	АвтоНумерация				=	ОбъектМД.АвтоНумерация - 1;
	                    

	СпособЗагрузкиПоУмолчанию	=	"ЗамещатьНеПустыми";
	НеУдалятьСтроки				=	0;
	СтатусУдаления				=	"Авто";
	ПометкаУдаления				=	0;
	
	
                                             
	//--------- Заполняем реквизиты --------------------------------------------
	
	Реквизиты	=	Объект.ВыбратьУзлы("Свойство");
	Для Сч = 0 По Реквизиты.КоличествоУзлов() - 1 Цикл
		
		Реквизит					=	Реквизиты.ПолучитьУзел(Сч);
		ИдРеквизита					=	Реквизит.ПолучитьАтрибут("Имя");
		НеЗамещатьРеквизит			=	Реквизит.ПолучитьАтрибут("НеЗамещать");
		//РеквизитОперации			=	0;

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

		
		Если (ПустоеЗначение(ТипРеквизита) = 1) И (ИдРеквизита <> "ПометкаУдаления") И (ИдРеквизита <> "Проведен") Тогда
			
			ПредставлениеРеквизита		=	ТипОбъектаРеквизита + "." + ВидОбъектаРеквизита + "." + ИдРеквизита;
			ЗаписатьОшибку("Неверное имя реквизита:" + ПредставлениеРеквизита);
			Продолжить;
			
		ИначеЕсли	ТипРеквизита = "Неопределенный" Тогда
			
			//ТипЗнач			=	Реквизит.ПолучитьАтрибут("ТипЗначения");
			//ВидЗнач			=	Реквизит.ПолучитьАтрибут("ВидЗначения");
			//Точность		=	0;
			//Если ТипЗнач = "Число" Тогда
			//	СтрТочность	=	Значение;
			//	Точность	=	СтрДлина(	ОтделитьРазделителем(СтрТочность, ".")	);
			//КонецЕсли;
			//Если	ПустоеЗначение(РеквизитОперации) = 1	Тогда
			//	ОбъектБД.НазначитьТип(ИдРеквизита, ТипЗнач + ?(ПустоеЗначение(ВидЗнач)=1, "", "." + ВидЗнач), СтрДлина(Значение) + 10, Точность);
			//Иначе
			//	ОбъектБД.Операция.НазначитьТип(ИдРеквизита, ТипЗнач + ?(ПустоеЗначение(ВидЗнач)=1, "", "." + ВидЗнач), СтрДлина(Значение) + 10, Точность);
			//КонецЕсли;
			
			ТипЗнач  = ОпределитьСтроковыйТип(Реквизит.ПолучитьАтрибут("Тип"));
			Точность = 0;
			Если ТипЗнач = "Число" Тогда
				СтрТочность	=	Значение;
				Точность	=	СтрДлина(	ОтделитьРазделителем(СтрТочность, ".")	);
			КонецЕсли;
			ОбъектБД.НазначитьТип(ИдРеквизита, ТипЗнач, СтрДлина(Значение) + 10, Точность);
			
		КонецЕсли;


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

		
		Если ИдРеквизита = "ПометкаУдаления" Тогда
			
			ПометкаУдаления = Значение;
			
		ИначеЕсли ИдРеквизита = "Проведен" Тогда
			
			Проведен = Значение;
			
		ИначеЕсли		ИдРеквизита = "ДатаДок" Тогда

			ВремяДокумента = "";
			ДатаДокумента  = ДатаИзXML(Реквизит.ВыбратьУзел("Значение").Значение, ВремяДокумента);
			

			Если ОбъектБД.Проведен() = 1 Тогда
				Если (ДатаДокумента <> ОбъектБД.ДатаДок) Или (ОбъектБД.ПолучитьВремя() <> ВремяДокумента) Тогда
					ЗаписатьОшибку("Изменены дата или время проведенного документа - " + ОбъектБД + "!
									|Проведение документа отменено.", "!");
					ОбъектБД.СделатьНеПроведенным();
				Иначе
					Продолжить;
				КонецЕсли; 
			КонецЕсли;
			
			
			//Если СозданНовыйОбъект = 0 Тогда	//	Найден
			//	Если ОбъектБД.ПолучитьВремя() = Значение Тогда Продолжить КонецЕсли;	//	значение не изменилось
			//	Если ОбъектБД.Проведен() = 1 Тогда
			//		ЗаписатьОшибку("Изменено время проведенного документа - " + ОбъектБД + "!
			//						|Проведение документа отменено.", "!");
			//		ОбъектБД.СделатьНеПроведенным();
			//	КонецЕсли;
			//КонецЕсли;

			ОбъектБД.ДатаДок = ДатаДокумента;
			ОбъектБД.АвтоВремяОтключить();
		    ОбъектБД.УстановитьВремя(Число(Сред(ВремяДокумента, 1, 2)), Число(Сред(ВремяДокумента, 4, 2)), Число(Сред(ВремяДокумента, 7, 2)));
		
		//ИначеЕсли	ПустоеЗначение(РеквизитОперации) = 1	Тогда
		Иначе
			
			ОбъектБД.УстановитьАтрибут(ИдРеквизита, Значение);
			
		//Иначе
		//			  
		//	Если СозданНовыйОбъект = 0 Тогда	//	Найден
		//		Если ОбъектБД.Операция.ПолучитьАтрибут(ИдРеквизита) = Значение Тогда Продолжить КонецЕсли;	//	значение не изменилось
		//	КонецЕсли;
		//	
		//	ОбъектБД.Операция.УстановитьАтрибут(ИдРеквизита, Значение);
			
		КонецЕсли;
		
	КонецЦикла;


	
	//--------- ТабличнаяЧасть ----------------------------------------------------------

	
	ТЧ = Объект.ВыбратьУзел("ТабличнаяЧасть");

	Если ПустоеЗначение(ТЧ) = 0 Тогда
	
		НеЗамещатьТЧ    = ТЧ.ПолучитьАтрибут("НеЗамещать");

		Строки			=	ТЧ.ВыбратьУзлы("Запись");
		КоличествоСтрок	=	Строки.КоличествоУзлов();
		
		Если ПустоеЗначение(НеЗамещатьТЧ) = 1 Тогда
			Если ПустоеЗначение(КоличествоСтрок) = 0 Тогда ОбъектБД.УдалитьСтроки() КонецЕсли;
		КонецЕсли;
		
		Для СчСтрок = 0 По КоличествоСтрок - 1 Цикл
			СтрокаДокумента	=	Строки.ПолучитьУзел(СчСтрок);

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

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

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

	КонецЕсли; // загрузка табл. части
	
	//--------------------------------------------------------------------------
	
	Если ПроверкаУникальностиДокумента(ОбъектБД, ЕстьКонтроль, Уникальность, АвтоНумерация) = 0 Тогда Возврат КонецЕсли;
	                         
	// Глобальный обработчик "ПослеЗагрузкиОбъекта"
	Если мКонвертацияПослеЗагрузкиОбъекта = 1 Тогда
		Отказ = Шаблон("[Конвертация_ПослеЗагрузкиОбъекта(ОбъектБД, ИмяПравила)]");
		Если Число(Отказ) = 1 Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
                                
	// Локальный обработчик "ПослеЗагрузки"
	НомерСтроки = 0;
	Если ТаблицаПравилКонвертации.НайтиЗначение(ИмяПравила, НомерСтроки, "Код") = 1 Тогда
		ТаблицаПравилКонвертации.ПолучитьСтрокуПоНомеру(НомерСтроки);
		Если ТаблицаПравилКонвертации.ЕстьОбработчикПослеЗагрузки = 1 Тогда
			Отказ = Шаблон("[ПКО_ПослеЗагрузки_" + ИмяПравила + "(ОбъектБД, ИмяПравила, Объект)]"); 
			Если (ТипЗначенияСтр(Отказ) = "Строка") И (Отказ <> "0") Тогда
				Сообщить("Функция не обнаружена (" + Отказ + ")");
				Протокол.ДобавитьСтроку("     Функция не обнаружена (" + Отказ + ")");
			КонецЕсли;
			Если Число(Отказ) = 1 Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;                          

	ЗаписатьОбъект(ОбъектБД);
        Если ПустоеЗначение(Проведен) = 0 Тогда
		Если Проведен = 1 Тогда 
			ОбъектБД.Провести();
		ИначеЕсли Проведен = 0 Тогда  
			Если ОбъектБД.Проведен() = 1 Тогда	ОбъектБД.СделатьНеПроведенным();	КонецЕсли;  
		КонецЕсли;
	КонецЕсли;
	
	Если ПустоеЗначение(ПометкаУдаления) = 0 Тогда 
		Если ПометкаУдаления = 0 Тогда
			Если ОбъектБД.ПометкаУдаления() = 1 Тогда	ОбъектБД.СнятьПометкуУдаления();	КонецЕсли;
		ИначеЕсли ПометкаУдаления = 1 Тогда
			Если ОбъектБД.ПометкаУдаления() = 0 Тогда	ОбъектБД.Удалить(0);				КонецЕсли;  
		КонецЕсли
	КонецЕсли;
 	                                  
	
КонецПроцедуры		//	ЗагрузитьДокументV8()
 

Конвертация проведен пометкаудаление перенос реквизит данные

См. также

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Оперативный учет 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

Переносится из типовой конфигурации «Торговля и Склад», реакции 9.2 платформы «1С:Предприятие 7.7» в типовую конфигурацию «Бухгалтерия предприятия», редакции 3.0 платформы «1С: Предприятие 8.3» следующие документы и их операции (с соблюдением всех соответствующих проводок): Поступления товаров и услуг (в т.ч. комиссия), Реализации товаров и услуг (в т.ч. комиссия), ПКО и РКО, выписки банка, счета фактуры (выданные и полученный), Возвраты от покупателей и поставщику, Заявка Покупателя, Инвентаризация и другие (всего 28 видов документов, смотрите описание, приложенное к обработке)

11988 руб.

30.06.2014    65337    105    94    

112

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет выгружать данные из ТиС 7.7 в конфигурации 8.3 для сдачи отчетности, для переноса данных при переходе на 8.3, для организации обмена внутри компании при использовании разных версий 1С в структурных подразделениях или формирования отгрузочных накладных для клиентов.

6000 руб.

18.05.2020    23547    63    39    

37

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Оперативный учет 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 Бухгалтерский учет Управленческий учет Абонемент ($m)

Обработка и правила обмена данными для выгрузки документов и всех связанных с ними справочников из 1С7.7 ТиС 9.2 в 1С8.3 БП 3.0 через файл XML. В типовых конфигурациях уже есть такое решение. Это немного доработанные правила и сама обработка выгрузки, добавлена возможность устанавливать отбор по выгружаемым документам по Фирме, Контрагенту, Складу, Проекту, Автору, ЮрЛицу. А также это внешняя обработка, что даёт возможность адаптировать её под нетиповую ТиС. Обработка и правила тестировались на платформах: 1С: Предприятие 7.7 и 1С: Предприятие 8.3.18.1334. На типовых конфигурациях: «Торговля + склад», редакция 9.2 (7.70 1004) и «Бухгалтерия предприятия» редакция 3.0 (3.0.96.30).

1 стартмани

13.08.2021    9133    55    Kuzya_brаtsk    8    

11

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 1С:Управление торговлей 10 1С:Комплексная 7.7 Россия Управленческий учет Платные (руб)

Начните вести учет в УТ 10.3! Перенесите все свои данные в УТ 10.3 в любом месяце года и продолжите вести учет! Программа перенесёт любое количество баз с документами и остатками в больших количествах. Обработка выгрузки выполнит проверку исходных данных и сформирует отчет о найденных ошибках в справочниках и документах. Партии переносятся с себестоимостью. Штрихкоды номенклатуры загружаются. Цена переносится. Автор консультирует.

8400 руб.

17.03.2021    15978    5    13    

6

Зарплата Перенос данных 1C Программист Бухгалтер Бухгалтерский учет 7.7 Сложные периодические расчеты 1С:Бухгалтерия 7.7 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Как известно, Бухгалтерия 7.7 не имеет штатной возможности для обмена с ЗУП 3.1. Данная разработка пригодится тем, кто перешел с ЗиК 2.3 на ЗУП 3.1, но вынужден по каким-то своим причинам оставаться на Бухгалтерии 7.7.

18000 руб.

29.09.2020    13806    2    0    

5

SALE! 10%

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Бухгалтерия 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0 | Продукт является развитием и исправлением ошибок стандартной обработки для выгрузки данных из 1С Бухгалтерии 7.7 в Бухгалтерию 3.0 | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

50722 45650 руб.

26.05.2020    35017    10    72    

16

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Конвертация данных Бесплатно (free)

При переходе на новую версию 1С в период параллельной эксплуатации может возникнуть необходимость обратной конвертации данных (по правилам КД версии 2.1) из 1С:Предприятие 8.3 в 1С:Предприятие 7.7 для переноса данных из 1С:Предприятие 8.3 в 7.7. Сделать это поможет следующая инструкция по КД2 о том, как создать новую конвертацию из 8.3 в 7.7, сохранить модуль и правила загрузки данных, сделать загрузку данных. КД2.

17.10.2019    15125    ksnik    0    

16

Загрузка и выгрузка в Excel Перенос данных 1C Программист Пользователь Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 1С:ERP Управление предприятием 2 Абонемент ($m)

Описание технологии загрузки любых адресов из 1С 7.7 с разложением по ФИАС в современные конфигурации 1C 8.3 на примере ERP. Предлагаемый способ просто чудо, он гарантирует результат, он очень простой и качественный! Моя обработка является синтаксическим анализатором, который подставляет в строку грязного адреса выражение "Дом №" и "Корпус", благодаря чему грязные адреса 7.7 сами очень хорошо раскладываются по значимым полям ФИАС - заполняется область, город, улица, дом, корпус.. все раскладывается само с помощью встроенного механизма современных конфигураций 1С 8.3, который написали сами сотрудники фирмы 1С!

1 стартмани

16.08.2019    19621    18    ksnik    12    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bashinsky 134 12.12.13 17:55 Сейчас в теме
Эта статья рассчитана на тех, кто уже немного знаком с конфигурацией Конвертация данных. Если у кого-нибудь есть другое решение расскажите.
4. aves 228 18.12.13 10:52 Сейчас в теме
(1) - Общий реквизит = -1=Удален\0=норм\1=проведен
После загрузки документа - добавляем его в массив для обработки.
После обработки конвертации - обработка всех документов массива
2 года on-line - полет нормальный
5. bashinsky 134 18.12.13 12:47 Сейчас в теме
(4) aves, Общий реквизит - это в документе? Если да, то его нужно добавлять в каждый документ.
6. aves 228 18.12.13 14:46 Сейчас в теме
(5) в 77 есть общие реквизиты документов :-)
7. Xershi 1551 28.11.14 12:46 Сейчас в теме
10. M_Volkov 5 09.02.19 02:19 Сейчас в теме
2. nick_krsk 18 13.12.13 05:03 Сейчас в теме
А что если производить установку пометки удаления в обработчике "После загрузки"?
3. bashinsky 134 13.12.13 09:24 Сейчас в теме
обработка будет ругается, Неверное имя реквизита: ПометкаУдаления. Потому-что сначала идет проверка на ТипРеквизита, а так как это не реквизит, обработка возвращает пустое значение и пропускает код ниже. После проверки выполнятся обработчик "После загрузки".
8. gep 23 13.02.15 20:37 Сейчас в теме
Здравствуйте!
Во-первых, спасибо за ценную информацию - очень помогло.
Во-вторых, хочу добавить небольшую поправку:
Если документ проведен в базе-приемнике, а в базе-источнике снято проведение, то при обмене не произойдет отмена проведения в приемнике (во всяком случае при обмене м/у 7.7->7.7), т.к. в строках:
    Если ПустоеЗначение(Проведен) = 0 Тогда
        Если Проведен = 1 Тогда 
            ОбъектБД.Провести();
        ИначеЕсли Проведен = 0 Тогда  
            Если ОбъектБД.Проведен() = 1 Тогда    ОбъектБД.СделатьНеПроведенным();    КонецЕсли;  
        КонецЕсли;
    КонецЕсли;

Пустое значение и 0 в 7.7 - одно и тоже (а булево из 8-ки конвертируется в 0/1)
Следовательно если документ не проведен в источнике, и проведен в приемнике - ничего не произойдет, т.к. выражение ПустоеЗначение(Проведен) вернет 1, хотя Проведен не пуст, а равен 0. (7.7 такая 7.7)
Доработка проста. В строках:
ИначеЕсли ИдРеквизита = "Проведен" Тогда             
    Проведен = Значение;

меняем на
ИначеЕсли ИдРеквизита = "Проведен" Тогда             
    Проведен = Значение + 1;

И соответственно:
    Если ПустоеЗначение(Проведен) = 0 Тогда
        Если Проведен = 2 Тогда 
            ОбъектБД.Провести();
        ИначеЕсли Проведен = 1 Тогда  
            Если ОбъектБД.Проведен() = 1 Тогда    ОбъектБД.СделатьНеПроведенным();    КонецЕсли;  
        КонецЕсли;
    КонецЕсли;
9. bashinsky 134 16.02.15 11:56 Сейчас в теме
(8) gep, Спасибо, что нашли ошибку. У себя я ее давно исправил, но сюда внести изменения не было времени.
11. compaud 27.02.19 16:02 Сейчас в теме
На строчке
ОбъектБД.УстановитьВремя(Число(Сред(ВремяДокумента, 1, 2)), Число(Сред(ВремяДокумента, 4, 2)), Число(Сред(ВремяДокумента, 7, 2)));

Возникает ошибка

{путьдообработки(2879)}: Не выбран документ!
Оставьте свое сообщение