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

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

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

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

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

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

Передаем

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

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

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

Ищем

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 Comments

  1. ilsijar

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

    Reply
  2. tusv

    (1) ilsijar,

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

    ДополнительныйРеквизит = ПараметрыОбъекта[<Твой параметр>];
    Наименование = СвойствоПоиска[«Наименование»];
    Запрос= Новый Запрос;
    Запрос.УстановитьПараметр(«ДополнительныйРеквизит»,ДополнительныйРеквизит);
    Запрос.УстановитьПараметр(«Наименование»,Наименование);
    //Текст запроса
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    СсылкаНаОбъект=Выборка.Ссылка; //Ура мы все нашли,
    КонецЕсли;
    

    Показать

    Reply
  3. ilsijar

    Как передать в параметр конкретное значение дополнительного реквизита из приемника?

    Reply
  4. ilsijar

    В ПКС в обработчике после загрузки

    ВидВзаиморасчетов = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Вид взаиморасчетов»);

    Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(«62.03 Расчеты за пользование услугами эл.связи»,,,ВидВзаиморасчетов);

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

    Reply
  5. tusv

    (4) ilsijar,

    Совершенно верно. ВидВр это не параметр, но ПараметрыОбъекта[«ВидВР»] это вполне материальный объект

    Reply
  6. ilsijar

    Ошибка:

    Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(1207)}: Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1258)}: Ошибка в обработчике события ПоследовательностьПолейПоиска

    ИмяПКО =

    ТипОбъекта = Договор с контрагентом

    Обработчик = Последовательность полей поиска

    ОписаниеОшибки = Получение элемента по индексу для значения не определено

    ПозицияМодуля = (1)

    КодСообщения = 73

    В ПКО ДоговорыКонтрагентов в обработчике:

    ДополнительныйРеквизит = ПараметрыОбъекта[«ВидВР»] ;
    Наименование = СвойстваПоиска[«Наименование»];
    Организация = СвойстваПоиска[«Организация»];
    Контрагент = СвойстваПоиска[«Контрагент»];
    //ДополнительныйРеквизит = СвойстваПоиска[«Значение»];
    Запрос= Новый Запрос;
    Запрос.УстановитьПараметр(«Наименование»,Наименование);
    Запрос.УстановитьПараметр(«Организация»,Организация);
    Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
    Запрос.УстановитьПараметр(«ДополнительныйРеквизит»,ДополнительныйРеквизит);
    Запрос.Текст =
    «ВЫБРАТЬ
    | ДоговорыКонтрагентов.Ссылка
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    | ДоговорыКонтрагентов.Наименование = &Наименование
    | И ДоговорыКонтрагентов.Организация = &Организация
    | И ДоговорыКонтрагентов.Контрагент = &Контрагент
    | И ДоговорыКонтрагентов.ДополнительныеРеквизиты.Значение = &ДополнительныйРеквизит»;
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    СсылкаНаОбъект=Выборка.Ссылка; //Ура мы все нашли,
    КонецЕсли;

    Показать

    Reply
  7. ilsijar

    В ПКС в обработчике после загрузки

    ВидВзаиморасчетов = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Вид взаиморасчетов»);
    Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(«62.03 Расчеты за пользование услугами эл.связи»,,,ВидВзаиморасчетов); 

    В значение параметра не попадает, и параметр = неопределено. В значение параметра можно только перед загрузкой. Перед загрузкой в значение присвоила строковое значение наименования, и в запросе условие

    ДоговорыКонтрагентов.ДополнительныеРеквизиты.Значение.Наименование  = &ДополнительныйРеквизит

    Но это не очень правильно. Нельзя ли из приемника в параметр как-то записать?

    Reply
  8. acanta

    Спасибо, хороший вариант.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *