Новый год по бухгалтерскому календарю опаздывает с натуральным на 3 месяца. Поэтому приходиться догружать данные. С базами 8 все просто. Есть поиск по внутреннему идентификатору. Но в 77 такого счастья нет. Сменили номер, дату и — привет лишним документам и старым хвостам. Как с этим бороться? Да очень просто. Можно воспользоваться дополнительными свойствами или регистром «Коллизии при обмене». Пример для передачи документа «Выписка банка» из Бух 77 в Бух 2.0 с использованием дополнительных свойств.
Что нам требуется
Передать, найти, переопределить, записать
Свойства избыточны, но зато бухгалтер сразу найдет в старой базе нужную информацию.
Передаем
Обработчик При выгрузке
УстановитьАтрибут(Приемник, "ВидДок", Источник.Вид());
УстановитьАтрибут(Приемник, "НомерДок", СокрЛП(Источник.НомерДок));
УстановитьАтрибут(Приемник, "ДатаДок", Формат(Источник.ДатаДок,"Д ГГГГммДД"));
УстановитьАтрибут(Приемник, "НомерСтроки", Строка(ВходящиеДанные.Получить("НомерСтроки")));
УстановитьАтрибут(Приемник, "ИНН", Константа.ИННОрганизации);
УстановитьАтрибут(Приемник, "ИД", ЗначениеВСтрокуВнутр(Источник));
Ищем
Обработчик Перед загрузкой
//Ищем объект по доп реквизитам
Параметры.Вставить("ДатаДок",Дата(ФайлОбмена.ПолучитьАтрибут("ДатаДок")));
Параметры.Вставить("НомерДок",ФайлОбмена.ПолучитьАтрибут("НомерДок"));
Параметры.Вставить("ВидДок",ФайлОбмена.ПолучитьАтрибут("ВидДок"));
Параметры.Вставить("ИНН",ФайлОбмена.ПолучитьАтрибут("ИНН"));
Параметры.Вставить("НомерСтроки",ФайлОбмена.ПолучитьАтрибут("НомерСтроки"));
Параметры.Вставить("ИД",ФайлОбмена.ПолучитьАтрибут("ИД"));
Параметры.Вставить("ОбъектНайден",Ложь);
Запрос=Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ ПЕРВЫЕ 1
| Реквизиты.Объект,
| &ИНН как инн,
| Реквизиты.Свойство,
| Реквизиты.Значение,
| Виды.Значение КАК ВидДок,
| Даты.Значение КАК ДатаДок,
| Номера.Значение КАК НомерДок,
| НомераСтрок.Значение КАК НомерСтроки,
| ВнутреннийИдентификатор.Значение КАК ИД
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК Реквизиты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НомераСтрок
| ПО Реквизиты.Объект = НомераСтрок.Объект
| И (НомераСтрок.Свойство.Наименование = ""НомерСтроки"")
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ИННОрг
| ПО Реквизиты.Объект = ИннОрг.Объект
| И (ИннОрг.Значение = &ИНН)
| И (ИннОрг.Свойство.Наименование = ""ИНН"")
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ВнутреннийИдентификатор
| ПО Реквизиты.Объект = ВнутреннийИдентификатор.Объект
| И (ВнутреннийИдентификатор.Значение = &ИД)
| И (Виды.Свойство.Наименование = ""ИД"")
|ГДЕ
| ВЫБОР
| КОГДА &НомерСтроки = 0
| ТОГДА ИСТИНА
| КОГДА НомераСтрок.Значение = &НомерСтроки
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ";
Запрос.УстановитьПараметр("ВидДок",Параметры.ВидДок);
Запрос.УстановитьПараметр("ДатаДок",Параметры.ДатаДок);
Запрос.УстановитьПараметр("НомерДок",Параметры.НомерДок);
Запрос.УстановитьПараметр("ИНН",Параметры.ИНН);
Запрос.УстановитьПараметр("НомерСтроки",Параметры.НомерСтроки);
Запрос.УстановитьПараметр("ИД",Параметры.ИД);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда //Нашли объект
Ссылка=Результат.Объект;
Параметры.Вставить("ОбъектНайден",Истина);
Параметры.Вставить("Объект",Ссылка.ПолучитьОбъект());
Иначе
Параметры.Вставить("ОбъектНайден",Ложь);
КонецЕсли;
Переопределяем если нашли
Обработчик При загрузке
Если Параметры.ОбъектНайден=Истина Тогда
//Стоит заметить, что при переопределении поля поиска не изменяются. Поэтому требуется прописать
СтОбъект=Объект;
ОбъектНайден=Истина;
Объект=Параметры.Объект;
Объект.Номер=СтОбъект.Номер;
Объект.Дата=СтОбъект.Дата;
КонецЕсли;
И последнее — записываем
Обработчик После загрузки
Объект.Записать();
Свойства=ПланыВидовХарактеристик.СвойстваОбъектов;
СсылкаИНН =Свойства.НайтиПоНаименованию("ИНН");
СсылкаНомерДок =Свойства.НайтиПоНаименованию("НомерДок");
СсылкаДатаДок =Свойства.НайтиПоНаименованию("ДатаДок");
СсылкаВидДок =Свойства.НайтиПоНаименованию("ВидДок");
СвойстваДоков=ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документы;
СсылкаНомерСтроки =Свойства.НайтиПоНаименованию("НомерСтроки");
СсылкаИД =Свойства.НайтиПоНаименованию("ИД");
Набор=РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Объект.Ссылка);
Набор.Прочитать();
Набор.Очистить();
//ИНН
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаИНН;
Запись.Значение=Параметры.ИНН;
//НомерДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаНомерДок;
Запись.Значение=Параметры.НомерДок;
//ДатаДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаДатаДок;
Запись.Значение=Параметры.ДатаДок;
//ВидДок
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаВидДок;
Запись.Значение=Параметры.ВидДок;
//НомерСтроки
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаНомерСтроки;
Запись.Значение=Параметры.НомерСтроки;
//ИД
Запись=Набор.Добавить();
Запись.Объект=Объект.Ссылка;
Запись.Свойство=СсылкаИД;
Запись.Значение=Параметры.ИД;
Набор.Записать();
Здравствуйте! У меня проблема по конвертации данных. При конвертации данных в приемнике есть справочник, у которого заведен дополнительный реквизит, в источнике нет информации для передачи. Нужно кроме поиска по наименованию организовать поиск по конкретному дополнительному реквизиту. Добавила ПКС поиск объекта при загрузке по свойству,, источник пусто, переключатель передавать данные в параметр. Как организовать поиск этого дополнительного реквизита? может подскажете?
(1) ilsijar,
Используем обработчик «Поля поиска» и Его параметры СвойствоПоиска, ПараметрыОбъекта и СсылкаНаОбъект
Показать
Как передать в параметр конкретное значение дополнительного реквизита из приемника?
В ПКС в обработчике после загрузки
ВидВзаиморасчетов = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Вид взаиморасчетов»);
Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(«62.03 Расчеты за пользование услугами эл.связи»,,,ВидВзаиморасчетов);
Ошибка Переменная не определена (ВидВР). ВидВР это параметр.
(4) ilsijar,
Совершенно верно. ВидВр это не параметр, но ПараметрыОбъекта[«ВидВР»] это вполне материальный объект
Ошибка:
Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(1207)}: Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1258)}: Ошибка в обработчике события ПоследовательностьПолейПоиска
ИмяПКО =
ТипОбъекта = Договор с контрагентом
Обработчик = Последовательность полей поиска
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = (1)
КодСообщения = 73
В ПКО ДоговорыКонтрагентов в обработчике:
Показать
В ПКС в обработчике после загрузки
В значение параметра не попадает, и параметр = неопределено. В значение параметра можно только перед загрузкой. Перед загрузкой в значение присвоила строковое значение наименования, и в запросе условие
Но это не очень правильно. Нельзя ли из приемника в параметр как-то записать?
Спасибо, хороший вариант.