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