gifts2017

Фокусы с Конвертацией данных 2.0

Опубликовал Владимир Нет (tusv) в раздел Обмен - Перенос данных из 1С7.7 в 1C8.X

Используем мощный инструмент Конвертации данных  себе во благо

Новый год по бухгалтерскому календарю опаздывает с натуральным на 3 месяца. Поэтому приходиться догружать данные. С базами 8 все просто. Есть поиск по внутреннему идентификатору. Но в 77 такого счастья нет. Сменили номер, дату и - привет лишним документам и старым хвостам. Как с этим бороться? Да очень просто. Можно воспользоваться дополнительными свойствами или регистром "Коллизии при обмене". Пример для передачи документа "Выписка банка" из Бух 77 в Бух 2.0 с использованием дополнительных свойств.

Что нам требуется

Передать, найти, переопределить, записать

Свойства избыточны, но зато бухгалтер сразу найдет в старой базе нужную информацию.

Передаем

Обработчик При выгрузке

УстановитьАтрибут(Приемник, "ВидДок", Источник.Вид());
УстановитьАтрибут(Приемник, "НомерДок", СокрЛП(Источник.НомерДок));
УстановитьАтрибут(Приемник, "ДатаДок", Формат(Источник.ДатаДок,"Д ГГГГммДД"));
УстановитьАтрибут(Приемник, "НомерСтроки", Строка(ВходящиеДанные.Получить("НомерСтроки")));
УстановитьАтрибут(Приемник, "ИНН", Константа.ИННОрганизации);

УстановитьАтрибут(Приемник, "ИД", ЗначениеВСтрокуВнутр(Источник));

Ищем

Обработчик Перед загрузкой

//Ищем объект по доп реквизитам

Параметры.Вставить("ДатаДок",Дата(ФайлОбмена.ПолучитьАтрибут("ДатаДок")));
Параметры.Вставить("НомерДок",ФайлОбмена.ПолучитьАтрибут("НомерДок"));
Параметры.Вставить("ВидДок",ФайлОбмена.ПолучитьАтрибут("ВидДок"));
Параметры.Вставить("ИНН",ФайлОбмена.ПолучитьАтрибут("ИНН"));
Параметры.Вставить("НомерСтроки",ФайлОбмена.ПолучитьАтрибут("НомерСтроки"));
Параметры.Вставить("ИД",ФайлОбмена.ПолучитьАтрибут("ИД"));
Параметры.Вставить("ОбъектНайден",Ложь);

Запрос=Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ ПЕРВЫЕ 1
| Реквизиты.Объект,
| &ИНН как инн,
| Реквизиты.Свойство,
| Реквизиты.Значение,
| Виды.Значение КАК ВидДок,
| Даты.Значение КАК ДатаДок,
| Номера.Значение КАК НомерДок,
| НомераСтрок.Значение КАК НомерСтроки,
| ВнутреннийИдентификатор.Значение КАК ИД
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК Реквизиты
|  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НомераСтрок
|  ПО Реквизиты.Объект = НомераСтрок.Объект
|   И (НомераСтрок.Свойство.Наименование = ""НомерСтроки"")
|  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ИННОрг
|  ПО Реквизиты.Объект = ИннОрг.Объект
|   И (ИннОрг.Значение = &ИНН)
|   И (ИннОрг.Свойство.Наименование = ""ИНН"")
|  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ВнутреннийИдентификатор
|  ПО Реквизиты.Объект = ВнутреннийИдентификатор.Объект
|   И (ВнутреннийИдентификатор.Значение = &ИД)
|   И (Виды.Свойство.Наименование = ""ИД"")
|ГДЕ
| ВЫБОР
|   КОГДА &НомерСтроки = 0
|    ТОГДА ИСТИНА
|   КОГДА НомераСтрок.Значение = &НомерСтроки
|    ТОГДА ИСТИНА
|   ИНАЧЕ ЛОЖЬ
|  КОНЕЦ";
Запрос.УстановитьПараметр("ВидДок",Параметры.ВидДок);
Запрос.УстановитьПараметр("ДатаДок",Параметры.ДатаДок);
Запрос.УстановитьПараметр("НомерДок",Параметры.НомерДок);
Запрос.УстановитьПараметр("ИНН",Параметры.ИНН);
Запрос.УстановитьПараметр("НомерСтроки",Параметры.НомерСтроки);
Запрос.УстановитьПараметр("ИД",Параметры.ИД);

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

Переопределяем если нашли

Обработчик  При загрузке

Если Параметры.ОбъектНайден=Истина Тогда
    //Стоит заметить, что при переопределении поля поиска не изменяются. Поэтому требуется прописать

    СтОбъект=Объект;

    ОбъектНайден=Истина;
    Объект=Параметры.Объект;

    Объект.Номер=СтОбъект.Номер;

    Объект.Дата=СтОбъект.Дата;
КонецЕсли;

И последнее - записываем

Обработчик После загрузки

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

Свойства=ПланыВидовХарактеристик.СвойстваОбъектов;
СсылкаИНН =Свойства.НайтиПоНаименованию("ИНН");
СсылкаНомерДок =Свойства.НайтиПоНаименованию("НомерДок");
СсылкаДатаДок =Свойства.НайтиПоНаименованию("ДатаДок");
СсылкаВидДок =Свойства.НайтиПоНаименованию("ВидДок");
СвойстваДоков=ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документы;
СсылкаНомерСтроки =Свойства.НайтиПоНаименованию("НомерСтроки"); 
СсылкаИД =Свойства.НайтиПоНаименованию("ИД");

Набор=РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Объект.Ссылка);
Набор.Прочитать();
Набор.Очистить();
//ИНН
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаИНН;
Запись.Значение=Параметры.ИНН;
//НомерДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаНомерДок;
Запись.Значение=Параметры.НомерДок;
//ДатаДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаДатаДок;
Запись.Значение=Параметры.ДатаДок;
//ВидДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаВидДок;
Запись.Значение=Параметры.ВидДок;
//НомерСтроки
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаНомерСтроки;
Запись.Значение=Параметры.НомерСтроки;
//ИД
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаИД;
Запись.Значение=Параметры.ИД;
Набор.Записать();

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ильсияр Левченко (ilsijar) 15.02.16 21:13
Здравствуйте! У меня проблема по конвертации данных. При конвертации данных в приемнике есть справочник, у которого заведен дополнительный реквизит, в источнике нет информации для передачи. Нужно кроме поиска по наименованию организовать поиск по конкретному дополнительному реквизиту. Добавила ПКС поиск объекта при загрузке по свойству,, источник пусто, переключатель передавать данные в параметр. Как организовать поиск этого дополнительного реквизита? может подскажете?
2. Владимир Нет (tusv) 16.02.16 09:51
(1) ilsijar,

Используем обработчик "Поля поиска" и Его параметры СвойствоПоиска, ПараметрыОбъекта и СсылкаНаОбъект

ДополнительныйРеквизит = ПараметрыОбъекта[<Твой параметр>];
Наименование = СвойствоПоиска["Наименование"];
Запрос= Новый Запрос;
Запрос.УстановитьПараметр("ДополнительныйРеквизит",ДополнительныйРеквизит);
Запрос.УстановитьПараметр("Наименование",Наименование);
//Текст запроса
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
   СсылкаНаОбъект=Выборка.Ссылка; //Ура мы все нашли,
КонецЕсли;
...Показать Скрыть
3. Ильсияр Левченко (ilsijar) 16.02.16 14:08
Как передать в параметр конкретное значение дополнительного реквизита из приемника?
4. Ильсияр Левченко (ilsijar) 16.02.16 16:57
В ПКС в обработчике после загрузки
ВидВзаиморасчетов = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вид взаиморасчетов");
Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("62.03 Расчеты за пользование услугами эл.связи",,,ВидВзаиморасчетов);

Ошибка Переменная не определена (ВидВР). ВидВР это параметр.

5. Владимир Нет (tusv) 16.02.16 17:59
(4) ilsijar,
Совершенно верно. ВидВр это не параметр, но ПараметрыОбъекта["ВидВР"] это вполне материальный объект
6. Ильсияр Левченко (ilsijar) 17.02.16 08:14
Ошибка:
Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(1207)}: Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1258)}: Ошибка в обработчике события ПоследовательностьПолейПоиска
ИмяПКО =
ТипОбъекта = Договор с контрагентом
Обработчик = Последовательность полей поиска
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = (1)
КодСообщения = 73
В ПКО ДоговорыКонтрагентов в обработчике:
ДополнительныйРеквизит = ПараметрыОбъекта["ВидВР"] ;
Наименование = СвойстваПоиска["Наименование"];
Организация = СвойстваПоиска["Организация"];
Контрагент = СвойстваПоиска["Контрагент"];
//ДополнительныйРеквизит = СвойстваПоиска["Значение"];
Запрос= Новый Запрос;
Запрос.УстановитьПараметр("Наименование",Наименование);
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Запрос.УстановитьПараметр("ДополнительныйРеквизит",ДополнительныйРеквизит);
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДоговорыКонтрагентов.Ссылка
		|ИЗ
		|	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
		|ГДЕ
		|	ДоговорыКонтрагентов.Наименование = &Наименование
		|	И ДоговорыКонтрагентов.Организация = &Организация
		|	И ДоговорыКонтрагентов.Контрагент = &Контрагент
		|	И ДоговорыКонтрагентов.ДополнительныеРеквизиты.Значение = &ДополнительныйРеквизит";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
   СсылкаНаОбъект=Выборка.Ссылка; //Ура мы все нашли,
КонецЕсли;
...Показать Скрыть
7. Ильсияр Левченко (ilsijar) 17.02.16 16:35
В ПКС в обработчике после загрузки
ВидВзаиморасчетов = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вид взаиморасчетов"); 
Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("62.03 Расчеты за пользование услугами эл.связи",,,ВидВзаиморасчетов); 

В значение параметра не попадает, и параметр = неопределено. В значение параметра можно только перед загрузкой. Перед загрузкой в значение присвоила строковое значение наименования, и в запросе условие
ДоговорыКонтрагентов.ДополнительныеРеквизиты.Значение.Наименование  = &ДополнительныйРеквизит

Но это не очень правильно. Нельзя ли из приемника в параметр как-то записать?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа