Почему метод НайтиПоНаименованию не находит контрагента в 1С:Управление торговлей?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки или автоматизации загрузки данных в «1С:Управление торговлей» программисты часто сталкиваются с парадоксальной ситуацией: при визуальном поиске в списке справочника контрагент легко находится, но программный код Справочники.Контрагенты.НайтиПоНаименованию(Наим) упорно возвращает пустую ссылку. Давайте вместе проанализируем, почему это происходит, и разберем по шагам все возможные причины — от банальных опечаток до архитектурных особенностей конфигурации.

Причина 1: Невидимые символы и лишние знаки препинания

Это самая распространенная причина, с которой столкнулся автор темы. Проблема заключается в том, что метод НайтиПоНаименованию требует практически идеального соответствия строки (в зависимости от параметров). В конце или начале строки могут находиться:

Решение: Перед выполнением поиска всегда следует очищать искомую строку от лишних пробелов с помощью функции СокрЛП(). Если подозрение падает на спецсимволы, проанализируем ситуацию в отладчике, используя замер длины строки функцией СтрДлина(). Если визуально строка кажется одинаковой, а длина разная — в ней есть скрытые знаки.

Рассмотрим пример правильной подготовки строки:


ИскомоеНаименование = СокрЛП(НаименованиеИзИсточника);
// Убираем неразрывные пробелы (Alt+0160)
ИскомоеНаименование = СтрЗаменить(ИскомоеНаименование, Символы.НПП, " ");
ИскомоеНаименование = СокрЛП(ИскомоеНаименование);

НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(ИскомоеНаименование, Истина);
Если НайденныйКонтрагент.Пустая() Тогда
    Сообщить("Контрагент не найден, проверьте спецсимволы!");
КонецЕсли;

Причина 2: Архитектура «Партнеры» и «Контрагенты» в УТ 11

Если вы работаете с современной версией «1С:Управление торговлей» (УТ 11.х), важно понимать различие между управленческой и юридической сущностями. В системе разделены два справочника:

  1. Партнеры — это управленческий объект (холдинг, группа компаний, бренд).
  2. Контрагенты — это юридические лица этих партнеров.

Часто в интерфейсе программы (в формах списков документов) поиск настроен именно по справочнику Партнеры. Если вы ищете по наименованию «Ромашка» в коде по справочнику Контрагенты, а в базе этот объект заведен как партнер с таким именем, но юридическое лицо называется «ООО Ромашка Плюс», программный метод закономерно ничего не найдет. Выясним причину, проверив настройки ведения учета: если опция «Независимо вести партнеров и контрагентов» включена, их названия могут не совпадать вовсе.

Причина 3: Параметр точного соответствия

Метод НайтиПоНаименованию имеет важный второй параметр — ИмяЛогическогоТипа (Ложь/Истина), который отвечает за точное совпадение. Рассмотрим подробнее:

Проанализируем пример использования:


// Поиск по началу строки (менее точный)
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("Альфа", Ложь); 

// Строгий поиск (рекомендуется при наличии полных данных)
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Альфа", Истина); 

Причина 4: Рабочее наименование против официального

В справочнике Контрагенты обычно есть два поля: «Наименование» (короткое, для списков) и «НаименованиеПолное» (официальное, для печати). Метод НайтиПоНаименованию работает только с реквизитом Наименование. Если вы пытаетесь найти объект по его полному официальному названию, которое хранится в другом поле, метод вернет пустую ссылку.

В таких случаях профессиональной рекомендацией будет использование запроса, так как он позволяет гибко искать по любому полю.

Причина 5: Иерархия и дубли

Если справочник имеет иерархическую структуру (группы и элементы), метод НайтиПоНаименованию ищет по всей базе. Однако, если в разных папках созданы контрагенты с одинаковыми именами, метод вернет первую попавшуюся ссылку. Это может создать иллюзию того, что «поиск не работает», если код ожидает найти элемент в конкретной группе, а получает из другой.

Универсальное решение: Использование запроса

Чтобы избежать проблем с параметрами метода НайтиПоНаименованию, чувствительностью к регистру (в некоторых случаях) и поиском по разным реквизитам, лучше всего использовать объект Запрос. Посмотрим на пример, который ищет контрагента по наименованию более надежно:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |   (Контрагенты.Наименование ПОДОБНО &Наим
    |   ИЛИ Контрагенты.НаименованиеПолное ПОДОБНО &Наим)
    |   И НЕ Контрагенты.ПометкаУдаления";

Запрос.УстановитьПараметр("Наим", СокрЛП(НаименованиеДляПоиска));

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    НайденнаяСсылка = Выборка.Ссылка;
Иначе
    НайденнаяСсылка = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;

Итоги и рекомендации

Подводя итог, если программный поиск не дает результатов, выполните следующие шаги:

  1. Проверьте искомую строку на наличие точек, лишних пробелов или кавычек в самом конце.
  2. Убедитесь, что вы ищете в правильном справочнике (в УТ 11 проверьте также справочник Партнеры).
  3. Используйте СокрЛП() для очистки входных данных.
  4. Если поиск по наименованию остается нестабильным, переходите на использование Запросов или поиск по уникальным идентификаторам (ИНН/КПП), что для контрагентов является стандартом надежности.

Помните, что визуальный поиск в списках часто задействует механизм полнотекстового поиска, который может «прощать» опечатки или находить вхождения слов в середине строки, в то время как НайтиПоНаименованию — это строгий инструмент индексации СУБД.

← На главную