В практике разработки на платформе 1С:Предприятие 8.3 часто встречается ситуация, когда внедренный функционал (например, поиск по QR-коду, включая чтение QR из PDF и картинок, или специфическому строковому реквизиту) идеально работает у разработчика с правами администратора, но вызывает ошибки или выдает пустые результаты у обычных пользователей. Рассмотрим ситуацию, когда в справочнике Номенклатура был создан дополнительный реквизит guid (тип строка, 36 символов), по которому планируется осуществлять поиск с помощью сканера QR-кодов, а для подготовки самих кодов применялась простая генерация QR и штрихкодов без библиотек.
Выясним, почему стандартное поле поиска в форме списка ведет себя непредсказуемо, и разберем по шагам механизмы платформы, отвечающие за этот процесс.
Проанализируем работу встроенного поиска 1С. В управляемом интерфейсе существует два принципиально разных режима поиска, которые переключаются в меню "Еще" — "Настройка поиска". Именно здесь скрывается корень большинства проблем с «неработающим» поиском у рядовых сотрудников.
Разберем ситуацию: если у программиста в настройках стоит «Стандартный поиск», он находит товар мгновенно. Если же у пользователя включен «Расширенный поиск» и курсор стоит на колонке Наименование, то ввод GUID в поле поиска не даст результатов, так как система будет искать эту строку исключительно внутри наименований товаров.
Проанализируем еще один важный аспект — состав колонок формы. Для того чтобы любой из механизмов поиска «увидел» ваш реквизит guid, он обязательно должен быть выведен в динамический список на форме. Рассмотрим условия:
Полнотекстовый поиск — Использовать, но стандартный поиск в списках чаще опирается на данные текущей выборки.Строковый GUID содержит дефисы, которые в механизме полнотекстового поиска 1С (ППД) являются спецсимволами. Рассмотрим, как это влияет на работу:
Если поиск настроен через ППД, строка вида 123e4567-e89b-12d3 может быть воспринята системой как команда: «найти 123e4567 и исключить из результата всё, что содержит e89b». Чтобы избежать такой интерпретации, поисковую строку желательно заключать в кавычки. Однако, если ваша задача — массовый поиск объектов 1С по УИН из внешних списков, лучше использовать специализированные инструменты обработки табличных документов.
Посмотрим на пример того, как индексация влияет на производительность. Для строкового реквизита в 36 символов недостаточно просто включить «Индексировать». Если поиск идет по подстроке (вхождение в середину), обычный индекс базы данных не сработает. В таких случаях система выполняет полное сканирование таблицы (Full Scan), что на больших базах номенклатуры (от 100 000 позиций) приводит к существенным задержкам.
Чтобы не зависеть от того, какие настройки поиска выставил пользователь ("Стандартный" или "Расширенный"), рекомендуется реализовать обработку поиска программно через событие внешнего события сканера. Если работа ведется в полях, эффективным решением станет мобильный ТСД для инвентаризации и маркировки, интегрированный с основной базой.
В модуле формы списка необходимо перехватить данные от сканера и выполнить поиск непосредственно по ссылке или реквизиту, позиционируя форму на найденном элементе. Разберем пример кода для обработки считанного GUID:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие пришло от сканера штрихкодов
Если ПоддерживаетсяСобытие(Событие) Тогда
СчитанныйКод = СокрЛП(Данные);
// Выполняем поиск на сервере
НайденнаяСсылка = НайтиТоварПоGuidНаСервере(СчитанныйКод);
Если Не НайденнаяСсылка.Пустая() Тогда
// Позиционируем список на найденном элементе
Элементы.Список.ТекущаяСтрока = НайденнаяСсылка;
Иначе
ПоказатьПредупреждение(, "Товар с таким кодом не найден!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
На стороне сервера поиск будет выглядеть максимально эффективно, при этом можно использовать стандартный код 1С для получения ссылки по GUID, чтобы корректно обработать входящие данные:
&НаСервереБезКонтекста
Функция НайтиТоварПоGuidНаСервере(ЗначениеПоиска)
// Если мы ищем по нашему строковому реквизиту "guid"
Результат = Справочники.Номенклатура.НайтиПоРеквизиту("guid", ЗначениеПоиска);
// Если реквизит не заполнен, но это валидный UUID, можно поискать по ссылке
Если Результат.Пустая() Тогда
Попытка
СсылкаПоУникальномуИдентификатору = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ЗначениеПоиска));
// Проверяем существование объекта в базе
Если СсылкаПоУникальномуИдентификатору.ПолучитьОбъект() <> Неопределено Тогда
Результат = СсылкаПоУникальномуИдентификатору;
КонецЕсли;
Исключение
// Не валидный GUID - игнорируем
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
Для обеспечения стабильной работы поиска без написания кода, выполните следующие шаги:
Индексировать (или Индексировать с доп. упорядочиванием).Резюмируя: разница в поведении поиска у администратора и пользователя в 90% случаев обусловлена разным положением курсора в режиме «Расширенного поиска» или скрытыми колонками в пользовательских настройках формы. Использование программной обработки внешнего события сканера является наиболее надежным способом, так как оно полностью исключает влияние человеческого фактора и настроек интерфейса.