При работе в конфигурации 1С:Управление торговлей 10.3 (и других решениях на обычных формах) пользователи часто сталкиваются с неудобством при подборе товара по коду. Стандартное поведение системы настроено таким образом, что поиск выполняется по любому вхождению подстроки. Если код товара имеет вид 00000000022, а оператор вводит в поле поиска «22», система выдаст не только нужную позицию, но и все товары, коды которых содержат эти цифры (например, 122, 220, 2215 и т. д.). Это значительно замедляет работу, вынуждая сотрудника выбирать нужную строку из огромного списка.
В этой статье мы подробно разберем, как изменить этот алгоритм, чтобы поиск работал по точному соответствию, и при этом оператору не приходилось вручную вводить длинный ряд лидирующих нулей. Мы проанализируем ситуацию, изучим техническую суть проблемы и внедрим решение, состоящее всего из нескольких строк кода.
Прежде чем переходить к кодингу, проанализируем причину такого поведения системы. В справочнике Номенклатура поле Код имеет тип Строка. Это стандарт для большинства конфигураций, так как строковый тип позволяет использовать префиксы (например, префиксы узлов распределенной информационной базы или организаций).
Когда мы используем стандартное поле поиска в форме списка или в обработке подбора, платформа применяет фильтр вида «Содержит». С точки зрения базы данных, запрос выглядит примерно так: поиск всех строк, где код подобен %22%. Наша задача — изменить это поведение на поиск по значению 00000000022.
Самый простой и эффективный способ, который упоминался в обсуждении на форуме, — это перехват введенного текста и автоматическое добавление нулей слева. Рассмотрим, как это работает. Допустим, длина кода в вашей базе составляет 11 символов. Если пользователь ввел «22», нам нужно превратить это в «00000000022».
Для реализации этого метода нам понадобится функция Прав(). Разберем логику по шагам:
Посмотрим на пример кода, который реализует эту логику:
ТекстПоиска = "22"; // То, что ввел пользователь
ДлинаКода = 11;
НужныйКод = Прав("00000000000" + ТекстПоиска, ДлинаКода);
// В итоге НужныйКод станет "00000000022"
Если вы хотите написать более универсальный и «чистый» код, рекомендуем использовать возможности типовых модулей. В конфигурациях 1С часто присутствует функция ДополнитьСтроку. Рассмотрим подробнее, как применить этот метод. Это позволит избежать «хардкода» (жесткого прописывания) нулей в тексте программы.
Проанализируем пример использования функции из общего модуля СтроковыеФункцииКлиентСервер:
ВведенноеЗначение = "55";
ДлинаКода = Метаданные.Справочники.Номенклатура.ДлинаКода;
НужныйКод = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(ВведенноеЗначение, ДлинаКода, "0", "Слева");
Важный момент: прежде чем дополнять строку нулями, желательно убедиться, что пользователь ввел именно число, а не название товара. Для этого можно использовать проверку через попытку приведения к типу Число или регулярные выражения.
Для того чтобы поиск заработал в подборе, нам нужно найти объект Обработка.ПодборНоменклатуры. В этой обработке нас интересует основная форма. Именно на ней расположено поле, куда оператор вводит текст для поиска.
Выясним причину, по которой поиск срабатывает: обычно это событие ОкончаниеВводаТекста или обработчик нажатия кнопки поиска (если поиск не автоматический). Нам нужно вставить нашу логику дополнения нулями перед тем, как система передаст значение в фильтр списка.
Примерная структура изменений в процедуре формы:
Процедура ПолеВводаТекстаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
// Если введено число, дополняем его нулями
Если ЭтоЧисло(Текст) Тогда
СтандартнаяОбработка = Ложь; // Отменяем стандартный поиск
Длина = Метаданные.Справочники.Номенклатура.ДлинаКода;
КодДляПоиска = Прав("00000000000" + СокрЛП(Текст), Длина);
// Устанавливаем отбор в списке номенклатуры
СправочникСписок.Отбор.Код.Использование = Истина;
СправочникСписок.Отбор.Код.ВидСравнения = ВидСравнения.Равно;
СправочникСписок.Отбор.Код.Значение = КодДляПоиска;
КонецЕсли;
КонецПроцедуры
В ходе обсуждения предлагалась идея просто удалить лидирующие нули из всех кодов справочника. Рассмотрим подробнее, почему это плохое решение. Код в 1С — это строка. Если мы преобразуем коды 1, 3, 11, 21 в строки без нулей, то при стандартной сортировке мы получим следующий порядок: 1, 11, 21, 3. Это происходит потому, что строковая сортировка идет посимвольно слева направо. Лидирующие нули как раз и служат для того, чтобы «числовая» сортировка внутри строк работала корректно (001, 003, 011, 021).
Если ваша задача — максимально облегчить работу оператора, обратите внимание на следующие советы:
Таким образом, решив задачу с помощью «трех строк кода», мы обеспечили оператору возможность мгновенно находить нужный товар по короткому номеру, сохранив при этом целостность структуры кодирования в 1С:Управление торговлей. Мы проанализировали механизм работы строковых фильтров и применили оптимальный способ трансформации данных «на лету».