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