Почему при вводе по строке возникает ошибка «Номенклатура с похожим наименованием не найдена» после изменения длины реквизита?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Анализируем причину сбоя: почему ломается стандартный поиск?

Давайте разберем по шагам, что происходит в системе, когда мы увеличиваем длину реквизита (например, КраткийКод) с 6 до 7 символов и пытаемся ввести в поле выбора значение 1234567:

  1. Пользователь вводит в поле ввода 7-значное текстовое значение.
  2. Платформа инициирует событие получения данных выбора. На этом этапе управление может передаваться в общие модули конфигурации или подсистемы БСП (Библиотеки Стандартных Подсистем).
  3. В коде конфигурации (в нашем случае — в общем модуле) срабатывает проверка, которая исторически была «захардкожена» под старый формат данных. Программа проверяет условие: ДлинаСтроки(ВведенныйТекст) = 6.
  4. Поскольку длина нового кода равна 7, проверка возвращает ложь (Ложь). Программа решает, что введенный текст не является кратким кодом.
  5. Алгоритм поиска по краткому коду полностью отсекается. Вместо этого система переходит к альтернативному сценарию — стандартному поиску по умолчанию, то есть по наименованию номенклатуры.
  6. Платформа пытается найти элемент, наименование которого начинается с 1234567. Естественно, товара с таким названием в базе нет, из-за чего на экран выводится стандартное сообщение об ошибке.

Переменная или фиксированная длина строки: как избежать скрытых проблем в СУБД

При работе со строковыми реквизитами, по которым настроен ввод по строке, крайне важно правильно выбрать свойство Допустимая длина в конфигураторе.

Рассмотрим разницу между фиксированной и переменной длиной строки:

Где искать скрытые ограничения: роль БСП и обработчиков событий

Часто разработчики проверяют только модуль менеджера конкретного справочника. Если он оказывается пустым, это создает иллюзию того, что поиск управляется исключительно платформой. На самом деле в современных конфигурациях (УТ 11, ERP, КА, УНФ) процесс интерактивного выбора контролируется механизмами БСП.

Проанализируем основные места, где может быть прописана логика валидации длины ввода:

Чтобы быстро локализовать проблему, используйте глобальный поиск по конфигурации (сочетание клавиш Ctrl + Shift + F) по ключевой фразе ошибки или ее части (например, "с похожим наименованием не найдена"). Это позволит мгновенно обнаружить общий модуль, блокирующий обработку строк новой длины.

Пошаговый алгоритм исправления проблемы (Best Practices)

Рассмотрим, как правильно решить проблему и предотвратить ее появление при последующих изменениях метаданных.

Шаг 1. Переходим на динамическое определение длины в коде

Избавьтесь от жесткого кодирования (хардкода) длины в общих модулях. Вместо фиксированных проверок с числом 6 или 7 используйте обращение к метаданным системы. Проанализируем пример правильного написания кода:


// Плохой тон программирования:
// Если ДлинаСтроки(ВведенныйТекст) = 6 Тогда ...

// Рекомендуемый динамический подход:
ОписаниеРеквизита = Метаданные.Справочники.Номенклатура.Реквизиты.КраткийКод;
МаксимальнаяДлина = ОписаниеРеквизита.Тип.КвалификаторыСтроки.Длина;

Если ДлинаСтроки(ВведенныйТекст) <= МаксимальнаяДлина Тогда
    // Выполняем поиск по краткому коду
КонецЕсли;

Такой подход гарантирует, что при последующем изменении длины реквизита в конфигураторе (например, до 8 или 10 символов) программный код продолжит работать корректно без дополнительного вмешательства программиста.

Шаг 2. Настраиваем индексирование реквизита

Для того чтобы поиск по реквизиту КраткийКод в рамках ввода по строке работал быстро и без сбоев на больших базах данных, проверьте его свойства в конфигураторе. Свойство Индексировать должно быть установлено в значение Индексировать или Индексировать с дополнительным упорядочиванием.

Шаг 3. Нормализуем существующие данные в базе данных

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.КраткийКод КАК КраткийКод
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.КраткийКод ПОДОБНО ""% """; // ищем строки с пробелом на конце

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ОбъектНоменклатуры = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
    ОбъектНоменклатуры.КраткийКод = СокрЛП(ВыборкаДетальныеЗаписи.КраткийКод);
    
    Попытка
        ОбъектНоменклатуры.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОчисткаПробелов", УровеньЖурналаРегистрации.Предупреждение,,, 
            "Не удалось записать объект: " + ВыборкаДетальныеЗаписи.Ссылка);
    КонецПопытки;
КонецЦикла;

Функция СокрЛП эффективно удалит все нежелательные пробелы слева и справа, приведя данные к корректному виду переменной строки.

Шаг 4. Обновляем полнотекстовый поиск (ПТС)

Если в формах выбора номенклатуры задействован механизм полнотекстового поиска, изменение длины реквизитов и обновление существующих записей может привести к рассинхронизации поискового индекса. Старые элементы могут перестать находиться по обновленным кодам.

Выполним переиндексацию ПТС:

  1. Перейдем в режим «1С:Предприятие» под правами администратора.
  2. Откроем меню Администрирование -> Общие настройки -> Поиск данных (название разделов может незначительно отличаться в зависимости от конфигурации).
  3. Нажмем кнопку Очистить индекс, чтобы удалить устаревшие данные автозаполнения.
  4. Нажмем кнопку Обновить индекс. Система запустит фоновое задание по созданию нового поискового индекса, учитывающего актуальную длину реквизитов.

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

← На главную