При активной работе со справочником Номенклатура в решениях на платформе «1С:Предприятие» пользователи привыкают к быстрому поиску и подбору позиций в документах. Механизм «Ввод по строке» позволяет мгновенно находить нужный товар по коду, артикулу, краткому коду или наименованию. Однако при изменении структуры метаданных — например, при увеличении длины поискового реквизита — разработчики часто сталкиваются со странным поведением системы: при вводе нового длинного кода платформа выдает предупреждение: «Номенклатура с похожим наименованием не найдена».
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы платформы и программного кода, а также рассмотрим лучшие практики настройки реквизитов поиска.
Давайте разберем по шагам, что происходит в системе, когда мы увеличиваем длину реквизита (например, КраткийКод) с 6 до 7 символов и пытаемся ввести в поле выбора значение 1234567:
ДлинаСтроки(ВведенныйТекст) = 6.Ложь). Программа решает, что введенный текст не является кратким кодом.1234567. Естественно, товара с таким названием в базе нет, из-за чего на экран выводится стандартное сообщение об ошибке.При работе со строковыми реквизитами, по которым настроен ввод по строке, крайне важно правильно выбрать свойство Допустимая длина в конфигураторе.
Рассмотрим разницу между фиксированной и переменной длиной строки:
123456 запишется в базу как "123456 " (с пробелом на конце).ПОДОБНО (LIKE) перестанет находить элементы со старыми кодами, если пользователь введет значение без пробела.Допустимая длина = Переменная. При такой настройке пробелы в конец строки не добавляются, что гарантирует точное сопоставление данных при поиске.Часто разработчики проверяют только модуль менеджера конкретного справочника. Если он оказывается пустым, это создает иллюзию того, что поиск управляется исключительно платформой. На самом деле в современных конфигурациях (УТ 11, ERP, КА, УНФ) процесс интерактивного выбора контролируется механизмами БСП.
Проанализируем основные места, где может быть прописана логика валидации длины ввода:
ОбработкаПолученияДанныхВыбора в модуле менеджера справочника (даже если сам модуль чист, логика может вызываться через подписки на события).Номенклатура или за штрихкодирование.Чтобы быстро локализовать проблему, используйте глобальный поиск по конфигурации (сочетание клавиш Ctrl + Shift + F) по ключевой фразе ошибки или ее части (например, "с похожим наименованием не найдена"). Это позволит мгновенно обнаружить общий модуль, блокирующий обработку строк новой длины.
Рассмотрим, как правильно решить проблему и предотвратить ее появление при последующих изменениях метаданных.
Избавьтесь от жесткого кодирования (хардкода) длины в общих модулях. Вместо фиксированных проверок с числом 6 или 7 используйте обращение к метаданным системы. Проанализируем пример правильного написания кода:
// Плохой тон программирования:
// Если ДлинаСтроки(ВведенныйТекст) = 6 Тогда ...
// Рекомендуемый динамический подход:
ОписаниеРеквизита = Метаданные.Справочники.Номенклатура.Реквизиты.КраткийКод;
МаксимальнаяДлина = ОписаниеРеквизита.Тип.КвалификаторыСтроки.Длина;
Если ДлинаСтроки(ВведенныйТекст) <= МаксимальнаяДлина Тогда
// Выполняем поиск по краткому коду
КонецЕсли;
Такой подход гарантирует, что при последующем изменении длины реквизита в конфигураторе (например, до 8 или 10 символов) программный код продолжит работать корректно без дополнительного вмешательства программиста.
Для того чтобы поиск по реквизиту КраткийКод в рамках ввода по строке работал быстро и без сбоев на больших базах данных, проверьте его свойства в конфигураторе. Свойство Индексировать должно быть установлено в значение Индексировать или Индексировать с дополнительным упорядочиванием.
Если ранее для реквизита использовалась фиксированная длина строки, в базе гарантированно остались элементы с концевыми пробелами. Нам необходимо очистить их. Для этого запустим групповую обработку данных или напишем простую одноразовую обработку:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.КраткийКод КАК КраткийКод
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.КраткийКод ПОДОБНО ""% """; // ищем строки с пробелом на конце
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбъектНоменклатуры = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ОбъектНоменклатуры.КраткийКод = СокрЛП(ВыборкаДетальныеЗаписи.КраткийКод);
Попытка
ОбъектНоменклатуры.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаПробелов", УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось записать объект: " + ВыборкаДетальныеЗаписи.Ссылка);
КонецПопытки;
КонецЦикла;
Функция СокрЛП эффективно удалит все нежелательные пробелы слева и справа, приведя данные к корректному виду переменной строки.
Если в формах выбора номенклатуры задействован механизм полнотекстового поиска, изменение длины реквизитов и обновление существующих записей может привести к рассинхронизации поискового индекса. Старые элементы могут перестать находиться по обновленным кодам.
Выполним переиндексацию ПТС:
Выполнение этих четырех простых шагов позволит полностью устранить ошибку ввода по строке, сделает поиск гибким и устойчивым к будущим изменениям конфигурации.