Почему метод НайтиПоРеквизиту не ищет значения в группах справочника в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Особенности работы метода НайтиПоРеквизиту с группами

В платформе 1С 7.7 метод НайтиПоРеквизиту() выполняет поиск как среди элементов, так и среди групп справочника. Однако для успешного поиска по группе должны строго соблюдаться системные условия в метаданных:

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

Синтаксис вызова метода выглядит следующим образом:


Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоРеквизиту("Артикул", СокрЛП(ИскомыйАртикул), 1) = 1 Тогда
    Если Спр.ЭтоГруппа() = 1 Тогда
        Предупреждение("Найдена группа: " + Спр.ТекущийЭлемент());
    Иначе
        Предупреждение("Найден элемент: " + Спр.ТекущийЭлемент());
    КонецЕсли;
КонецЕсли;

Третий параметр метода (1) задает флаг точного соответствия. Метод позиционируется на первой записи в порядке индекса. Если одинаковое значение реквизита присутствует и у группы, и у элемента, тип найденного объекта необходимо определять методом ЭтоГруппа().

Основные причины, почему поиск не находит значение

Если свойства реквизита в конфигураторе настроены правильно, но метод все равно возвращает 0, проанализируем возможные источники проблемы в самих данных:

  1. Несоответствие длины и формата строк: Для текстовых реквизитов фиксированной длины обрезка пробелов функцией СокрЛП() может приводить к несовпадению значения с индексом БД. Если точный поиск не срабатывает, проверьте передачу значения с точным совпадением длины или без обрезки пробелов.
  2. Невидимые и спецсимволы: В строке могут присутствовать неразрывные пробелы (код 160), символы табуляции или переводы строк, которые не удаляются стандартной функцией СокрЛП().
  3. Несовпадение типов: Если реквизит числовой, а параметром передается строка (или наоборот), неявное преобразование типов в методе не выполняется, и поиск возвращает 0.
  4. Повреждение индексов информационной базы: Поиск по реквизиту опирается на индексные файлы таблиц справочников. При сбоях индексов метод может не находить существующие строки. В таких ситуациях помогает запуск процедуры реиндексации или полное тестирование и исправление информационной базы.

Ограничения использования объекта Запрос для групп

Попытка заменить метод НайтиПоРеквизиту() стандартным объектом Запрос имеет важное ограничение платформы 1С 7.7. При обработке справочника объект Запрос не выбирает группы в качестве первичных записей. Группы попадают в выборку запроса только в том случае, если в отчет вошли подчиненные им элементы. Если группа пустая или ни один из ее элементов не попал под условия отбора, объект Запрос такую группу не вернет.

Альтернативные способы поиска по группам

Если требуется гарантированно обойти группы и элементы с программным контролем значений, рассмотрим альтернативные варианты реализации:

  1. Иерархический перебор выборкой: Метод ВыбратьЭлементы(1) включает режим иерархической выборки, в который входят как элементы, так и группы.
  2. Использование Таблицы Значений: Для многократного быстрого поиска по сложным условиям структуру справочника предварительно выгружают в объект ТаблицаЗначений, где поиск выполняется методом НайтиЗначение().

Посмотрим на пример ручного иерархического обхода справочника:


Спр = СоздатьОбъект("Справочник.Номенклатура");
// Параметр 1 включает выборку с учетом иерархии (включая группы)
Спр.ВыбратьЭлементы(1);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.ЭтоГруппа() = 1 Тогда
        Если СокрЛП(Спр.Арт) = СокрЛП(ИскомоеЗначение) Тогда
            Сообщить("Найдена группа: " + Спр.Наименование);
            Прервать;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Таким образом, метод НайтиПоРеквизиту() полноценно работает с группами справочника в 1С 7.7 при условии включения признаков «Сортировка» и «Использовать для групп», а также при строгой валидации формата и типов передаваемых данных.

← На главную