Странная передача ИНН для группы. УНФ3
При синхронизации УНФ 3.0 с БП региональной словил странную ошибку:
Направление: Получение.
ПОД: Справочник_Контрагенты_Получение.
ПКО: Справочник_Контрагенты_Получение.
Объект: Справочник.Контрагенты.
Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(5895)}:ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные, ПоляКопируемые, ПоляИсключаемые);
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(1874)}:ЗаполнитьДанныеИБПоПолученнымДанным(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации);
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(6432)}:ДанныеДляЗаписиВИБ = СтруктураОбъектаXDTOВДанныеИБ(
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(2058)}:ПрочитатьСообщениеОбмена(КомпонентыОбмена, Результаты, ТаблицыДляЗагрузки);
{Обработка.КонвертацияОбъектовXDTO.МодульОбъекта(399)}:ОбменДаннымиXDTOСервер.ПроизвестиЧтениеДанных(КомпонентыОбмена);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(5207)}:ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(ПараметрыЗагрузки);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(9126)}:ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена, , ТолькоПараметры);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(391)}:ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена, ТолькоПараметры);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(9468)}:ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы,
{Обработка.ВыполнениеОбменаДанными.МодульМенеджера(41)}:ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
{(1)}:Обработки.ВыполнениеОбменаДанными.ВыполнитьЗапускОбменаДанными(Параметры[0],Параметры[1])
{ОбщийМодуль.ОбщегоНазначения.Модуль(5943)}:Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{ОбщийМодуль.ДлительныеОперации.Модуль(1623)}:ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
{ОбщийМодуль.ДлительныеОперации.Модуль(667)}:ВызватьПроцедуру(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры);
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(1422)}:Результат = ДлительныеОперации.ВыполнитьВФоне(
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка установки значения свойства 'ИНН'
по причине:
Реквизит недоступен для группы
[ОшибкаИспользованияВстроенногоЯзыка]
В какой именно группе ошибка, не понял, решил обойти проблему.
Расширил модуль ОбменДаннымиXDTOСервер:
&Вместо("ЗаполнитьДанныеИБПоПолученнымДанным") Процедура дор_ЗаполнитьДанныеИБПоПолученнымДанным(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации) //Осипов 2023-11-23 ошибка приходит контрагент-группа //ДанныеИБ - СправочникОбъект.Контрагенты //ПолученныеДанные - СправочникОбъект.Контрагенты СвойстваОтсутствующиеВПолученныхДанных = Неопределено; Если Метаданные.НайтиПоТипу(ТипЗнч(ДанныеИБ)) = Метаданные.Справочники.Контрагенты И ТипЗнч(ПолученныеДанные) = Тип("СправочникОбъект.Контрагенты") И ДанныеИБ.ЭтоГруппа Тогда //Свойство должно быть Если НЕ ПолученныеДанные.ДополнительныеСвойства.Свойство("СвойстваОтсутствующиеВПолученныхДанных") Тогда ПолученныеДанные.ДополнительныеСвойства.Вставить("СвойстваОтсутствующиеВПолученныхДанных", ""); КонецЕсли; СвойстваОтсутствующиеВПолученныхДанных = ПолученныеДанные.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных; ПолученныеДанные.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных = СвойстваОтсутствующиеВПолученныхДанных + ?(СвойстваОтсутствующиеВПолученныхДанных = "","",",") + "ИНН, КПП"; //Если ПолученныеДанные.Свойство("ИНН") Тогда // ПолученныеДанные.Удалить("ИНН"); // Сообщить("Удален реквизит ИНН у: " + ДанныеИБ); //КонецЕсли; //Если ПолученныеДанные.Свойство("КПП") Тогда // ПолученныеДанные.Удалить("КПП"); // Сообщить("Удален реквизит КПП у: " + ДанныеИБ); //КонецЕсли; КонецЕсли; ПродолжитьВызов(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации); Если СвойстваОтсутствующиеВПолученныхДанных <> Неопределено Тогда //Восстанавливаем прошлое значение ПолученныеДанные.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных = СвойстваОтсутствующиеВПолученныхДанных; КонецЕсли; КонецПроцедуры
Да, чтобы это диагностировать дополнительно пришлось поменять обмен через интернет на обмен через FTP, потому что в обмене через интернет была только информация что ошибка произошла в базе-корреспонденте.
Но в итоге я подумал, что если контрагент загрузится как группа, то он и в документы попадет как группа и решил просто заменить этого контрагента на другого в документах в базе-отправителе через поиск и замену дублей. Код в итоге не пригодился.
Полезно взглянуть на типовой код, чтобы понять, как такая обманка работает:
Процедура ЗаполнитьДанныеИБПоПолученнымДанным(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации) СвойстваОтсутствующиеВПолученныхДанных = Новый Массив; Если ПолученныеДанные.ДополнительныеСвойства.Свойство("СвойстваОтсутствующиеВПолученныхДанных") Тогда СвойстваОтсутствующиеВПолученныхДанных = СтрРазделить(ПолученныеДанные.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных, ",", Ложь); КонецЕсли; ПоляКопии = ПравилоКонвертации.Свойства.ВыгрузитьКолонку("СвойствоКонфигурации"); Если ПоляКопии.Количество() > 0 Тогда Для НомерПоля = 0 По ПоляКопии.ВГраница() Цикл ПоляКопии[НомерПоля] = СокрЛП(ПоляКопии[НомерПоля]); КонецЦикла; Для НомерОтсутствующегоПоля = 0 По СвойстваОтсутствующиеВПолученныхДанных.ВГраница() Цикл СвойстваОтсутствующиеВПолученныхДанных[НомерОтсутствующегоПоля] = СокрЛП(СвойстваОтсутствующиеВПолученныхДанных[НомерОтсутствующегоПоля]); ИндексОтсутствующегоПоля = ПоляКопии.Найти(СвойстваОтсутствующиеВПолученныхДанных[НомерОтсутствующегоПоля]); Если ИндексОтсутствующегоПоля <> Неопределено Тогда ПоляКопии.Удалить(ИндексОтсутствующегоПоля); КонецЕсли; КонецЦикла; ПоляКопируемые = СтрСоединить(ПоляКопии, ","); ПоляИсключаемые = СтрСоединить(СвойстваОтсутствующиеВПолученныхДанных, ","); ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные, ПоляКопируемые, ПоляИсключаемые); КонецЕсли; ... КонецПроцедуры
Среда: УНФ 3.0.4.88 Объем: 0.5 час
Речь, я так понял, о попытке загрузить значение в собственный реквизит группы справочника по аналогии с реквизитом элемента.
Реквизиты группы нерасширяемы для групп. Автор обошел данную проблему использованием допреквизитов (фактически записывает значение в ТЧ «ДополнительныеРеквизиты» для того справочника, у которого есть такая табличная часть (и соотв. работает механизм допреквизитов).
Для самописных баз всё проще — добавляемый реквизит справочника имеет в свойствах ограничивающую настройку «Использование» со значениями:
(только) для элемента
(только) для группы
(для обоих) для группы и элемента