Почему поиск по реквизиту в списке 1С работает не у всех пользователей и как это исправить

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

В практике разработки на платформе 1С:Предприятие 8.3 часто встречается ситуация, когда внедренный функционал (например, поиск по QR-коду, включая чтение QR из PDF и картинок, или специфическому строковому реквизиту) идеально работает у разработчика с правами администратора, но вызывает ошибки или выдает пустые результаты у обычных пользователей. Рассмотрим ситуацию, когда в справочнике Номенклатура был создан дополнительный реквизит guid (тип строка, 36 символов), по которому планируется осуществлять поиск с помощью сканера QR-кодов, а для подготовки самих кодов применялась простая генерация QR и штрихкодов без библиотек.

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

Анализ механизмов поиска в управляемых формах

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

  1. Стандартный поиск (определение платформы: "Поиск производится по значениям всех колонок"). В этом режиме система анализирует данные во всех видимых на экране колонках списка. Если вы вводите часть GUID или считываете QR-код, платформа просматривает все поля и находит совпадение, независимо от того, какая колонка сейчас активна.
  2. Расширенный поиск (определение платформы: "Поиск сразу по значениям нескольких реквизитов"). Несмотря на название, этот режим накладывает жесткое ограничение на контекст. Поиск осуществляется только по той колонке, на которой в данный момент установлен фокус (курсор).

Разберем ситуацию: если у программиста в настройках стоит «Стандартный поиск», он находит товар мгновенно. Если же у пользователя включен «Расширенный поиск» и курсор стоит на колонке Наименование, то ввод GUID в поле поиска не даст результатов, так как система будет искать эту строку исключительно внутри наименований товаров.

Влияние видимости реквизитов на результат

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

Проблемы при работе с GUID и спецсимволами

Строковый GUID содержит дефисы, которые в механизме полнотекстового поиска 1С (ППД) являются спецсимволами. Рассмотрим, как это влияет на работу:

Если поиск настроен через ППД, строка вида 123e4567-e89b-12d3 может быть воспринята системой как команда: «найти 123e4567 и исключить из результата всё, что содержит e89b». Чтобы избежать такой интерпретации, поисковую строку желательно заключать в кавычки. Однако, если ваша задача — массовый поиск объектов 1С по УИН из внешних списков, лучше использовать специализированные инструменты обработки табличных документов.

Посмотрим на пример того, как индексация влияет на производительность. Для строкового реквизита в 36 символов недостаточно просто включить «Индексировать». Если поиск идет по подстроке (вхождение в середину), обычный индекс базы данных не сработает. В таких случаях система выполняет полное сканирование таблицы (Full Scan), что на больших базах номенклатуры (от 100 000 позиций) приводит к существенным задержкам.

Программное решение: обход ограничений интерфейса

Чтобы не зависеть от того, какие настройки поиска выставил пользователь ("Стандартный" или "Расширенный"), рекомендуется реализовать обработку поиска программно через событие внешнего события сканера. Если работа ведется в полях, эффективным решением станет мобильный ТСД для инвентаризации и маркировки, интегрированный с основной базой.

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


&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Проверяем, что событие пришло от сканера штрихкодов
    Если ПоддерживаетсяСобытие(Событие) Тогда
        СчитанныйКод = СокрЛП(Данные);
        
        // Выполняем поиск на сервере
        НайденнаяСсылка = НайтиТоварПоGuidНаСервере(СчитанныйКод);
        
        Если Не НайденнаяСсылка.Пустая() Тогда
            // Позиционируем список на найденном элементе
            Элементы.Список.ТекущаяСтрока = НайденнаяСсылка;
        Иначе
            ПоказатьПредупреждение(, "Товар с таким кодом не найден!");
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

На стороне сервера поиск будет выглядеть максимально эффективно, при этом можно использовать стандартный код 1С для получения ссылки по GUID, чтобы корректно обработать входящие данные:


&НаСервереБезКонтекста
Функция НайтиТоварПоGuidНаСервере(ЗначениеПоиска)
    
    // Если мы ищем по нашему строковому реквизиту "guid"
    Результат = Справочники.Номенклатура.НайтиПоРеквизиту("guid", ЗначениеПоиска);
    
    // Если реквизит не заполнен, но это валидный UUID, можно поискать по ссылке
    Если Результат.Пустая() Тогда
        Попытка
            СсылкаПоУникальномуИдентификатору = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ЗначениеПоиска));
            // Проверяем существование объекта в базе
            Если СсылкаПоУникальномуИдентификатору.ПолучитьОбъект() <> Неопределено Тогда
                Результат = СсылкаПоУникальномуИдентификатору;
            КонецЕсли;
        Исключение
            // Не валидный GUID - игнорируем
        КонецПопытки;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Рекомендации по настройке

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

  1. Убедитесь, что у всех пользователей в форме списка выведена колонка с искомым реквизитом.
  2. Проверьте, что в свойствах реквизита в конфигураторе установлено свойство Индексировать (или Индексировать с доп. упорядочиванием).
  3. Проинструктируйте пользователей переключить режим поиска в положение "Стандартный", если им требуется искать данные сразу по нескольким полям (артикул, GUID, наименование) без переключения фокуса колонок.
  4. Если используется полнотекстовый поиск, не забудьте обновить индекс ППД через консоль администрирования или регламентным заданием.

Резюмируя: разница в поведении поиска у администратора и пользователя в 90% случаев обусловлена разным положением курсора в режиме «Расширенного поиска» или скрытыми колонками в пользовательских настройках формы. Использование программной обработки внешнего события сканера является наиболее надежным способом, так как оно полностью исключает влияние человеческого фактора и настроек интерфейса.

← На главную