В продолжение темы: КД: Передача параметров из 7.7 в 8.x

1. Marik 76 19.04.20 20:23 Сейчас в теме
Собственно в продолжение темы: "КД: Передача параметров из 7.7 в 8.x" INFOSTART.RU


PPS. Спасибо Totoro за дополнение, есть еще один вариант передачи параметров. Иногда бывает необходимо передать параметр не для всей конвертации, а для отдельного объекта (или более того, нескольких объектов). Например, если у приемника нет реквизита для значения, а само значение нужно для выбора варианта заполнения объекта (см. счет учета в основных средствах в семерке и, скажем, в УПП). Тогда поможет такой трюк:

Если вставить в "При выгрузке" или в "После выгрузки" ПКО код:

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "СообщениеВсемуМиру");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Здравствуй, Мир!");
ДобавитьПодчиненный(Приемник, УзелПараметра);

то в обработчике "После загрузки" этого ПКО параметр можно прочитать через соответствие "ПараметрыОбъекта":

НашПривет = ПараметрыОбъекта["СообщениеВсемуМиру"];
Показать


Здесь нужно прояснить несколько моментов, объясню на примере переноса плана счетов из 1С 77 в 1С 8.Х

Для ПКО "Хозрасчетный" для обработчика события "При выгрузке" напишем следующий код, где мы передадим характеристики передаваемого счета:

Если Источник.Активный = 1 Тогда
	Вид = "Активный"
ИначеЕсли Источник.Активный = 2 Тогда
	Вид = "Пассивный"
Иначе
	Вид = "Активный/Пассивный"
КонецЕсли;

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "Вид");
УстановитьАтрибут(УзелПараметра, "Тип", "Строка");
ЗаписатьЭлемент(УзелПараметра, "Значение", Вид);
ДобавитьПодчиненный(Приемник, УзелПараметра);

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "Забалансовый");
УстановитьАтрибут(УзелПараметра, "Тип", "Число");
ЗаписатьЭлемент(УзелПараметра, "Значение", Источник.Забалансовый);
ДобавитьПодчиненный(Приемник, УзелПараметра);

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "Количественный");
УстановитьАтрибут(УзелПараметра, "Тип", "Число");
ЗаписатьЭлемент(УзелПараметра, "Значение", Источник.Количественный);
ДобавитьПодчиненный(Приемник, УзелПараметра);

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
_УзелСсылки = ВыгрузитьПоПравилу(Источник.Родитель(),,,,"Хозрасчетный",,,,1);
УстановитьАтрибут(УзелПараметра, "Имя", "Родитель");
УстановитьАтрибут(УзелПараметра, "Тип", "ПланСчетовСсылка.Хозрасчетный");
ДобавитьПодчиненный(УзелПараметра, _УзелСсылки.cloneNode(1));
ДобавитьПодчиненный(Приемник, УзелПараметра);

Для к = 1 По 3 Цикл
	Если Источник.КоличествоСубконто() < к Тогда
		Прервать;
	Иначе
		УзелПараметра = СоздатьУзел("ЗначениеПараметра");
		_УзелСсылки = ВыгрузитьПоПравилу(Источник.ВидСубконто(к-1),,,,"ВидыСубконтоХозрасчетные",,,,1);
		УстановитьАтрибут(УзелПараметра, "Имя", "ВидСубконто"+Строка(к));
		УстановитьАтрибут(УзелПараметра, "Тип", "ПланВидовХарактеристикСсылка.ВидыСубконтоХозрасчетные");
		ДобавитьПодчиненный(УзелПараметра, _УзелСсылки.cloneNode(1));
		ДобавитьПодчиненный(Приемник, УзелПараметра);
		
		УзелПараметра = СоздатьУзел("ЗначениеПараметра");
		УстановитьАтрибут(УзелПараметра, "Имя", "Количественный"+Строка(к));
		УстановитьАтрибут(УзелПараметра, "Тип", "Число");
		ЗаписатьЭлемент(УзелПараметра, "Значение", Источник.Количественный);
		ДобавитьПодчиненный(Приемник, УзелПараметра);
		
		УзелПараметра = СоздатьУзел("ЗначениеПараметра");
		УстановитьАтрибут(УзелПараметра, "Имя", "ТолькоОбороты"+Строка(к));
		УстановитьАтрибут(УзелПараметра, "Тип", "Число");
		ЗаписатьЭлемент(УзелПараметра, "Значение", Источник.ТолькоОбороты(к-1));
		ДобавитьПодчиненный(Приемник, УзелПараметра);
	КонецЕсли;
КонецЦикла;
Показать


Во-первых, для чего тут
УстановитьАтрибут(УзелПараметра, "Тип", "ПланСчетовСсылка.Хозрасчетный");

Это нужно для того, чтобы избежать ошибки при передаче пустой ссылки

Во-вторых, код
_УзелСсылки = ВыгрузитьПоПравилу(Источник.Родитель(),,,,"Хозрасчетный",,,,1);

Обратите внимание, что я передаю лишний параметр в функции "ВыгрузитьПоПравилу", чуть позже я объясню зачем

В третьих, код
ДобавитьПодчиненный(УзелПараметра, _УзелСсылки.cloneNode(1));

Здесь по сравнению с оригинальной статьей, я дописал "cloneNode(1)", иначе 1С 77 падала с ошибкой

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


Здесь я думаю все понятно, мы на основании переданных через параметры дополнительных характеристик счета создаем счет в базе Приемник.

Осталось только разобрать почему для функции "ВыгрузитьПоПравилу" я обозначил лишний параметр (см. выше)

Здесь в модуле обработки "V77Exp.ert" после того, как мы вставили код из файла "МодульВыгрузки.txt" мы произведем несколько изменений, а именно:

Во-первых, в самом начале переобъявим функцию "ВыгрузитьПоПравилу" следующим образом:
Функция ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО = "", УзелСсылки = "", ТолькоПолучитьУзелСсылки = 0, НомерПКО = 0, ФлагПропустить = 0) Далее

Обратите внимание на лишний параметр "ФлагПропустить", вот его мы как раз и задействуем выше.

Во-вторых, найдем саму функцию "ВыгрузитьПоПравилу" и заменим заголовок на следующий:
Функция ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО = "", УзелСсылки = "", ТолькоПолучитьУзелСсылки = 0, 
	НомерПКО = 0, ФлагПропустить = 0)

Здесь все логично и понятно

И последнее, найдем в функции "ВыгрузитьПоПравилу" код, который обрабатывает обработчик события "При выгрузке", ведь именно в ней мы прописали нестандартный код для передачи параметров. Если мы оставим этот код по умолчанию, то 1С 77 будет вываливаться с ошибкой, поэтому, используя параметры "ФлагПропустить", мы обойдем этот код, вот так:
Если (ПолучитьРеквизитПКО(НомерПКО, "ПриВыгрузке") = 1) И (ФлагПропустить = 0) Тогда

Таким образом, мы передали дополнительные характеристики счета из 1С 77 в 1С 8.Х
Спасибо и удачи всем!
По теме из базы знаний
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

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