Почему в 1С:ERP не работает поиск по коду в поле ввода объекта эксплуатации и как это исправить?

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

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

Причина 1. Жесткие отборы по статусу объекта в документах

Выясним, как ведет себя система на уровне бизнес-логики ERP. В типовых конфигурациях для многих документов (например, «Регистрация дефекта», «Заказ на ремонт») на поле ввода объекта эксплуатации накладываются строгие ограничения. Платформа отсекает неподходящие элементы еще до того, как сработает стандартный поиск по строке.

Проанализируем этот механизм:

  1. В метаданных или программно в модуле формы документа накладываются Связи параметров выбора или Параметры выбора.
  2. Для реквизита «Объект эксплуатации» устанавливается жесткий отбор, разрешающий выбор только тех элементов, у которых статус равен значению В эксплуатации.
  3. Если объект только что создан, находится на складе, списан или просто не введен в эксплуатацию, платформа полностью исключает его из результатов запроса автоподбора. Даже если вы введете абсолютно точный код элемента, выпадающий список останется пустым.

Для решения этой проблемы проверим статус целевого объекта в системе. Если бизнес-логика требует возможности выбора объектов в любых статусах, нам потребуется модифицировать форму документа с помощью расширения конфигурации, ослабив или удалив параметры выбора в событии ПриСозданииНаСервере.

Причина 2. Путаница между реквизитами «Код» и «Инвентарный номер»

Рассмотрим структуру справочника основных средств в ERP. В отличие от простых конфигураций, в 1С:ERP основные средства представлены справочником ОбъектыЭксплуатации. У этого справочника есть стандартный системный реквизит Код и дополнительный текстовый реквизит ИнвентарныйНомер.

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

Разберем, как включить инвентарный номер в автоподбор:

  1. Создадим расширение конфигурации (чтобы не снимать типовую ERP с поддержки).
  2. Зайдем в свойства справочника ОбъектыЭксплуатации в расширении.
  3. Для реквизита ИнвентарныйНомер установим свойство «Индексировать» в значение Индексировать или Индексировать с доп. упорядочиванием. Это критически важно, так как платформа позволяет настраивать ввод по строке только по проиндексированным полям.
  4. Добавим реквизит ИнвентарныйНомер в список свойства «Ввод по строке» справочника.

Причина 3. Способ поиска и лидирующие нули

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

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

Вариант А. Интерактивная настройка свойства поля ввода. В свойствах конкретного поля ввода на форме документа можно изменить значение свойства СпособПоискаПриВводеПоСтроке со значения Начало на Любая часть. Но этот способ требует изменения каждой формы, где выбирается объект.

Вариант Б. Программное переопределение через расширение. Мы можем перехватить событие инициализации формы и принудительно задать режим поиска для нужного элемента. Напишем следующий код в модуле формы документа:


&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Устанавливаем способ поиска по любой части строки для элемента формы
    Элементы.ОбъектЭксплуатации.СпособПоискаСтрокиПриВводеПоСтроке = СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть;
КонецПроцедуры

Причина 4. Влияние индекса полнотекстового поиска (ППД)

В крупных базах 1С:ERP для быстрого подбора данных при вводе по строке задействуются механизмы полнотекстового поиска. Если в вашей системе регламентное задание по обновлению индекса полнотекстового поиска работает со сбоями, отключено или индекс поврежден, автоподбор по коду будет работать некорректно или не работать вовсе.

Выясним, как администратор может решить эту проблему:

  1. Перейдем в раздел НСИ и администрирование — Администрирование — Общие настройки.
  2. Развернем подраздел Поиск данных и перейдем по ссылке Полнотекстовый поиск данных.
  3. В открывшемся окне нажмем кнопку «Настроить».
  4. Проверим состояние индекса. Если он не актуален, нажмем сначала кнопку «Очистить индекс», а затем дождемся завершения операции и запустим «Обновить индекс».

Причина 5. Программное переопределение в модуле менеджера справочника

В ERP разработчики часто переопределяют стандартный поиск платформы, прописывая собственную логику в процедуре ОбработкаПолученияДанныхВыбора в модуле менеджера справочника ОбъектыЭксплуатации. Если в этой процедуре стоит флаг СтандартнаяОбработка = Ложь, то любые интерактивные настройки «Ввода по строке» в конфигураторе будут полностью проигнорированы.

Рассмотрим, как с помощью расширения перехватить эту процедуру и реализовать гибкий и безотказный поиск по коду, инвентарному номеру и наименованию, включая автоматическое дополнение строки лидирующими нулями.

Создадим в расширении метод-аналог в модуле менеджера справочника:


&Вместо("ОбработкаПолученияДанныхВыбора")
Процедура Расш_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если нам нужно полностью переписать алгоритм поиска, отключаем стандартную логику
    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = Новый СписокЗначений;
    
    // Получаем строку поиска, введенную пользователем
    СтрокаПоиска = СокрЛП(Параметры.СтрокаПоиска);
    Если ПустаяСтрока(СтрокаПоиска) Тогда
        Возврат;
    КонецЕсли;
    
    // Готовим строку поиска с лидирующими нулями на случай, если введен чистый номер
    // Предположим, длина кода в справочнике составляет 9 символов
    СтрокаСНулями = СтрокаПоиска;
    Если СтрДлина(СтрокаПоиска) < 9 И ТолькоЦифрыВСтроке(СтрокаПоиска) Тогда
        СтрокаСНулями = ОбщегоНазначенияКлиентСервер.ДополнитьСтроку(СтрокаПоиска, 9, "0", "Слева");
    КонецЕсли;
    
    // Строим запрос для поиска по трем реквизитам: Наименование, Код, ИнвентарныйНомер
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ТОП 30
        |	Объекты.Ссылка КАК Ссылка,
        |	Объекты.Наименование + "" (Код: "" + Объекты.Код + "", Инв. №: "" + Объекты.ИнвентарныйНомер + "")"" КАК Представление
        |ИЗ
        |	Справочник.ОбъектыЭксплуатации КАК Объекты
        |ГДЕ
        |	НЕ Объекты.ПометкаУдаления
        |	И (Объекты.Наименование ПОДОБНО &СтрокаПоиска
        |		ИЛИ Объекты.Код ПОДОБНО &СтрокаПоиска
        |		ИЛИ Объекты.Код ПОДОБНО &СтрокаСНулями
        |		ИЛИ Объекты.ИнвентарныйНомер ПОДОБНО &СтрокаПоиска)";
        
    Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");
    Запрос.УстановитьПараметр("СтрокаСНулями", "%" + СтрокаСНулями + "%");
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
    КонецЦикла;
    
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ТолькоЦифрыВСтроке(Знач Строка) Экспорт
    Для Позиция = 1 По СтрДлина(Строка) Цикл
        Символ = Сред(Строка, Позиция, 1);
        Если Найти("0123456789", Символ) = 0 Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
КонецФункции

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

← На главную