При разработке алгоритмов обмена данными (например, в «Конвертации данных») или прикладной логики разработчики часто используют метод менеджера объекта НайтиПоРеквизиту. Однако бывают ситуации, когда элемент точно присутствует в базе, значение визуально совпадает, но метод упорно возвращает пустую ссылку. Разберем по шагам, почему это происходит и как локализовать проблему.
Проанализируем распространенную ситуацию: в конфигурациях на базе БСП (Библиотеки Стандартных Подсистем) используются как стандартные реквизиты шапки, так и механизм дополнительных реквизитов и сведений. Если имя реквизита шапки совпадает с наименованием дополнительного реквизита (или они выводятся с одинаковыми заголовками на форме), возникает иллюзия, что значение заполнено в объекте.
Метод НайтиПоРеквизиту работает исключительно с реквизитами объекта базы данных. Дополнительные реквизиты хранятся в табличной части ДополнительныеРеквизиты, поэтому метод платформы их не видит.
Если требуется найти элемент по дополнительному реквизиту, используем запрос к табличной части:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты.ДополнительныеРеквизиты КАК ДопРеквизиты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО ДопРеквизиты.Ссылка = Контрагенты.Ссылка
|ГДЕ
| ДопРеквизиты.Свойство = &Свойство
| И ДопРеквизиты.Значение = &Значение";
Запрос.УстановитьПараметр("Свойство", ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код7"));
Запрос.УстановитьПараметр("Значение", ИскомоеЗначение);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
НайденнаяСсылка = Выборка.Ссылка;
КонецЕсли;
Разберем особенности работы метода НайтиПоРеквизиту на уровне платформы «1С:Предприятие»:
УстановитьПривилегированныйРежим(Истина).Родитель и Владелец. Передача непустого значения ограничивает поиск только указанной веткой.Выясним технические причины, по которым точное строковое совпадение дает отрицательный результат:
Символы.НПП), переносы строк (Символы.ВК, Символы.ПС) или табуляция. Визуально строки неотличимы, но для платформы они различны.Строка(10)), в базе строка дополняется пробелами справа. При поиске короткой строки без дополняющих пробелов совпадение не будет найдено.Если поиск не дает результатов, выполним проверку по следующим шагам:
ТипЗнч().СокрЛП() и функцию замены неразрывного пробела СтрЗаменить(Значение, Символы.НПП, " ").