Помогите переделать обработку по замене номенклатуры по регистрам ОФ

1. ShuSU 63 09.05.19 12:08 Сейчас в теме +0.5 $m
Всем привет. Встала задача перейти на учет товара по характеристике. нашел обработку https://infostart.ru/public/58109/. но у меня Далион. в ней нету серийноменклатуры, по этому функцию с ней связана я закомментировал. добавил в форме колонку Характеристики. связал её с строкой НаЧтоЗаменять.
и все в тупике. как заставить обработку перенаправить учет по всем регистрам на номенклатуру с характеристикой. что бы потом старую можно было без жерт удалить. и остаток и все документы были на нужном товаре с характеристикой.
код обработки:
////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ

Перем мМенеджеры;        // Соответствие типов объектов их свойствам


////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Возвращает объект ОписаниеТипов, содержащий указанный тип.
//
// Параметры:
//  ЗначениеТипа - строка с именем типа или значение типа Тип.
//  
// Возвращаемое значение:
//  ОписаниеТипов
//
Функция вОписаниеТипа(ЗначениеТипа)

	МассивТипов = Новый Массив;
	Если ТипЗнч(ЗначениеТипа) = Тип("Строка") Тогда
		МассивТипов.Добавить(Тип(ЗначениеТипа));
	Иначе
		МассивТипов.Добавить(ЗначениеТипа);
	КонецЕсли; 
	ОписаниеТипов	= Новый ОписаниеТипов(МассивТипов);

	Возврат ОписаниеТипов;

КонецФункции // вОписаниеТипа()

// Инициализирует переменную мМенеджеры, содержащую соответствия типов объектов их свойствам
//
// Параметры:
//  Нет.
// 
Процедура вИнициализацияМенеджеров()

	мМенеджеры = Новый Соответствие;

	ИмяТипа = "Справочник";
	Для каждого ОбъектМД Из Метаданные.Справочники Цикл
		Имя              = ОбъектМД.Имя;
		Менеджер         = Справочники[Имя];
		ТипСсылкиСтрокой = "СправочникСсылка." + Имя;
		ТипСсылки        = Тип(ТипСсылкиСтрокой);
		Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД);
		мМенеджеры.Вставить(ОбъектМД, Структура);
	КонецЦикла;

	ИмяТипа = "Документ";
	Для каждого ОбъектМД Из Метаданные.Документы Цикл
		Имя              = ОбъектМД.Имя;
		Менеджер         = Документы[Имя];
		ТипСсылкиСтрокой = "ДокументСсылка." + Имя;
		ТипСсылки        = Тип(ТипСсылкиСтрокой);
		Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД);
		мМенеджеры.Вставить(ОбъектМД, Структура);
	КонецЦикла;

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

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

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


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

	Возврат Не БылиИсключения;
	
КонецФункции

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ



// Процедура вызывается при нажатии кнопки "ВыполнитьЗамену" командной панели
// табличного поля "НайденныеСсылки". 
// Выполняет замену ссылок в найденных объектах.
//
Процедура КнопкаВыполнитьНажатие(Элемент)
	
	Заменяемые = Новый Соответствие;
	Для каждого Стр Из ЗаменяемыеЗначения Цикл
		Если Стр.Пометка Тогда
			Заменяемые.Вставить(Стр.ЧтоЗаменять, Стр.НаЧтоЗаменять);
		КонецЕсли;
	КонецЦикла;
	
	вВыполнитьЗаменуЭлементов(Заменяемые, НайденныеСсылки);
	Сигнал();
	Сигнал();
	Сигнал();
	

	Предупреждение("Обработка завершена!");
КонецПроцедуры // КнопкаВыполнитьНажатие()

// Процедура вызывается при нажатии кнопки "НайтиСсылки" командной панели
// табличного поля "ЗаменяемыеЗначения". 
// Выполняет поиск объектов, содержащих указанные ссылки.
//
Процедура КоманднаяПанельЗаменяемыеЗначенияНайтиСсылки(Кнопка)

	МассивЗаменяемых = Новый Массив;
	Для каждого Стр Из ЗаменяемыеЗначения Цикл
		Если Стр.Пометка Тогда
			МассивЗаменяемых.Добавить(Стр.ЧтоЗаменять);
		КонецЕсли;
	КонецЦикла;

	Если МассивЗаменяемых.Количество() = 0 Тогда
		Предупреждение("Не выбрано ни одного значения для поиска!");
		Возврат;
	КонецЕсли;
	
	НайденныеСсылки = НайтиПоСсылкам(МассивЗаменяемых);
	
	НайденныеСсылки.Колонки[0].Имя = "Ссылка";
	НайденныеСсылки.Колонки[1].Имя = "Данные";
	НайденныеСсылки.Колонки[2].Имя = "Метаданные";
	
	НайденныеСсылки.Колонки.Добавить("Включено", вОписаниеТипа("Булево"));
	НайденныеСсылки.Колонки.Добавить("Доступно", вОписаниеТипа("Булево"));

	КоманднаяПанельНайденныеСсылкиВключитьВсе("");
    //Выключаем ссылки, которые не нужно заменять
	
	Для каждого стр из НайденныеСсылки цикл
		Отключено=ложь;
		МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗНЧ(Стр.Данные));
		Если Метаданные.РегистрыСведений.Содержит(МетаданныеТипа) Тогда
			Отключено=истина;
		конецесли;
		стр.Включено=не Отключено;
		Стр.Доступно=не Отключено;
	конеццикла;
	
	Сигнал();
	Сигнал();
	Сигнал();

КонецПроцедуры

// Процедура вызывается при нажатии кнопки "ВключитьВсе" командной панели
// табличного поля "НайденныеСсылки". 
// Включает пометки у всех строк.
//
Процедура КоманднаяПанельНайденныеСсылкиВключитьВсе(Кнопка)

    НайденныеСсылки.ЗаполнитьЗначения(Истина, "Включено");
	ЭтаФорма.Обновить();
	
КонецПроцедуры

// Процедура вызывается при нажатии кнопки "ВыключитьВсе" командной панели
// табличного поля "НайденныеСсылки". 
// Выключает пометки у всех строк.
//
Процедура КоманднаяПанельНайденныеСсылкиВыключитьВсе(Кнопка)

	НайденныеСсылки.ЗаполнитьЗначения(Ложь, "Включено");
	ЭтаФорма.Обновить();
	
КонецПроцедуры


////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ ТАБЛИЧНОГО ПОЛЯ ЗаменяемыеЗначения

// Процедура - обработчик события "ПриНачалеРедактирования"
//
Процедура ЗаменяемыеЗначенияПриНачалеРедактирования(Элемент, НоваяСтрока)

	Если НоваяСтрока Тогда
		Элемент.ТекущаяСтрока.Пометка = Истина;
		Элемент.ТекущаяСтрока.ЧтоЗаменять=Справочники.Номенклатура.ПустаяСсылка();
		Элемент.ТекущаяСтрока.НаЧтоЗаменять=Справочники.Номенклатура.ПустаяСсылка();
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ ТАБЛИЧНОГО ПОЛЯ НайденныеСсылки

// Процедура - обработчик события "ПриВыводеСтроки"
//
Процедура НайденныеСсылкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

	ОформлениеСтроки.Ячейки.Тип.УстановитьТекст(ТипЗнч(ДанныеСтроки.Данные));
	ОформлениеСтроки.Ячейки.Включено.ТолькоПросмотр=не ДанныеСтроки.Доступно;
	Если не ДанныеСтроки.Доступно тогда
		ОформлениеСтроки.ЦветТекста=WebЦвета.Серый;
	конецесли;
	
КонецПроцедуры

// Процедура - обработчик события "Выбор"
//
Процедура НайденныеСсылкиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	ОткрытьЗначение(ВыбраннаяСтрока.Данные);
	СтандартнаяОбработка = Ложь;
КонецПроцедуры


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



			КонецЕсли;
		конецесли;
	
	КонецЦикла;
 
КонецПроцедуры


Процедура ЗаменяемыеЗначенияНаЧтоЗаменятьНачалоВыбора(Элемент, СтандартнаяОбработка)
КонецПроцедуры
Показать



еще обнаружил баг далиона. он присваивает ЕИзмерения восьмизначный номер (00000001) и обработка отказывается менять пока не убираешь пару символов
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SaschaL 09.05.19 13:57 Сейчас в теме
Обработку можно прицепить к посту, которую начали делать.
Просто недавно тут поднимал подобную тему, но в итоге под ЕРП написал сам обработку, по замене номенклатуры с характеристиками и номенклатуры на номенклатуру с характеристиками
3. SaschaL 09.05.19 13:58 Сейчас в теме
Может чем и смогу помочь. Диалона к сожалению нет у меня, а было бы не плохо проверить как работает, я писал обработку на Управляемом приложении. Судя по картинке обработка , которая у вас есть она на обычных формах
4. ShuSU 63 09.05.19 18:33 Сейчас в теме
(3)Было бы не плохо с вами списаться. да, далион на обычной Форме крутится, как с вами связаться, напишите в личку. могу поднять терменал с RDP что бы пощупали.
5. ShuSU 63 11.05.19 05:12 Сейчас в теме
Вопрос закрыт, коль ни кто не откликнулся.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот