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