КД 2.х Передача произвольного параметра с объектом выгрузки при переносе 7.7-8.хПоследнее время часто стали появляться ветки с вопросами как передать какую-то произвольную информацию с объектом выгрузки. Вот и я на днях столкнулся как раз с этим вопросом.
<br><br><br><br><br><br> После небольшого мозгового штурма воплотил вот такую идею. | | Автор статьи: Рэйв | Редакторы: Михей, andrewks, Последняя редакция №9 от 05.10.10 | История URL: http://kb.mista.ru/article.php?id=811 | |
Ключевые слова: КД,Передача,Параметр,7.7
Метод довольно прост в реализации, хотя придется все таки немного поправить обработку обмена в 1С v.8
1. Для передачи параметра (или параметров, количество передаваемого может быть произвольным)
в обработчике Правила Конвертации Объекта(ПКО) ПриВыгрузке пишем следующее
//передача одного параметра с именем "Клиент" и значением - строковым представлением реквизита объекта Клиент
УзелПараметра = DOMDocument.createNode(1, "ЗначениеПараметра", "");
УзелПараметра.setAttribute("ИмяПараметрПКО", "Клиент");
УзелПараметра.setAttribute("ЗначениеПараметрПКО", Строка(Источник.Клиент));
Приемник.appendChild(УзелПараметра);
Количество таких блоков может быть произвольным, в зависимости от количества передаваемого.
""ИмяПараметрПКО" и "ЗначениеПараметрПКО" - имена обязательные, потому что по ним потом будет поиск в при загрузке.
"Клиент" и Строка(Источник.Клиент) - величины произвольные.
Первое вы сами назначаете и сами же потом будите использовать в обработчиках загрузки.
А второе- это и есть передаваемое значение. Оно может быть любым, но при записи в файл все равно приведется к типу Строка.
2. Для получения переданных параметров в базе-приемнике надо немного изменить обработку загрузки.
Открываем в конфигурации модуль объекта обработки
и ищем Функция ПрочитатьОбъект().
Идем от начала в низ, пропускаем обработчики ПередЗагрузкой и находим вот такой кусок кода
Пока ФайлОбмена.Прочитать() Цикл
ИмяУзла = ФайлОбмена.ЛокальноеИмя;
Если ИмяУзла = "Свойство"
ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда
ЭтоПараметрДляОбъекта = (ИмяУзла = "ЗначениеПараметра");
Для начала перед циклом
Пока ФайлОбмена.Прочитать() Цикл
поставим свою строчку :
ПараметрыПКО=Новый Соответствие;
Дальше в цикле нас интересует именно переменная ЭтоПараметрДляОбъекта .
Поэтому быстренько проверив ее заполняем наше свежерожденное соответствие:
Если ЭтоПараметрДляОбъекта Тогда
ИмяПараметраПКО = одАтрибут(ФайлОбмена, одТипСтрока, "ИмяПараметрПКО");
ЗначениеПараметраПКО= одАтрибут(ФайлОбмена, одТипСтрока, "ЗначениеПараметрПКО");
ПараметрыПКО.Вставить(ИмяПараметраПКО, ЗначениеПараметраПКО);
КонецЕсли;
Вот собственно и все.
Соответствие ПараметрыПКО доступно в обработчиках ПриЗагрузке и ПослеЗагрузки. А там - вспоминайте уже сами какими именами вы называли ваши параметры и доставайте их из него. Например :
МойПараметр1=ПараметрыПКО.Получить("МоеИмяПараметра1");
МойПараметр2=ПараметрыПКО.Получить("МоеИмяПараметра2");
МойПараметр3=ПараметрыПКО.Получить("МоеИмяПараметра3");
----------------------------------------------------------------------------
*есть мнение, что изменений в универсальной обработке обмена при загрузке можно избежать.
Если у кого-то есть конструктивное дополнение этого мнения кодом - прошу не полениться и дополнить статью.
Значится так:
Открываем КД (например у меня Конвертация данных, редакция 2.1 (2.1.2.1)), заходим в Настройку правил обмена, позиционируемся на любой ПКО, далее открываем любое ПКС и смотрим что там есть радиобатон "Пердавать данные в параметр" а далее все по мануалу. |