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