Как вывести строку поиска на форму и обойти ограничение длины наименования в 150 символов?

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

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

Разберем причину отсутствия поля поиска на форме

Бывают случаи, когда на управляемой форме списка или выбора справочника отсутствует привычное поле поиска, хотя свойство Автозаполнение у командной панели установлено в значение Истина. Это может происходить из-за специфических настроек самой формы или режима совместимости конфигурации. Проанализируем, как принудительно вывести этот элемент, не прибегая к сложному программированию.

Если стандартная кнопка «Найти» присутствует, но пользователю требуется именно встроенное текстовое поле над списком (как в современных типовых конфигурациях), нам необходимо воспользоваться специальным объектом — Дополнением элемента формы.

Инструкция по добавлению строки поиска

Выполним следующие шаги для настройки интерфейса:

  1. Откроем нужную форму в конфигураторе и перейдем в дерево элементов формы.
  2. Нажмем правую кнопку мыши на группе, где должна располагаться строка поиска (обычно это командная панель или верхняя группа формы), и выберем Добавить.
  3. В открывшемся списке типов элементов прокрутим вниз до раздела Дополнение элемента формы.
  4. Выберем вид дополнения — Отображение строки поиска.
  5. После добавления элемента перейдем в его свойства. Нам нужно установить связь с данными. В поле Источник выберем наш динамический список (например, Список), а в расширении выберем путь Список.СтрокаПоиска.

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


// Пример программного управления видимостью поиска в процедуре ПриСозданииНаСервере
Элементы.СписокСтрокаПоиска.Видимость = Истина;
// Можно задать режим отображения через свойство динамического списка
Элементы.Список.РежимОтображенияСтрокиПоиска = РежимОтображенияСтрокиПоиска.Всегда;

Проблема ограничения длины наименования в 150 символов

Перейдем ко второй части задачи. Стандартный реквизит Наименование у справочников в 1С имеет жесткое ограничение в 150 символов (в некоторых старых версиях или при определенных настройках оно может быть еще меньше). Это ограничение связано с оптимизацией индексов в базе данных SQL. Если нам требуется загружать номенклатуру из Excel, где названия достигают 200 и более знаков, простым увеличением длины в конфигураторе задачу решить не удастся.

Проанализируем доступные варианты решения этой проблемы:

Использование реквизита НаименованиеПолное

В большинстве современных конфигураций (УТ 11, ERP 2.5) уже предусмотрен реквизит НаименованиеПолное с типом Строка неограниченной длины. Если в вашей базе его нет, создайте новый реквизит НаименованиеДлинное.

Важный нюанс: Метод НайтиПоРеквизиту не работает со строками неограниченной длины. Для поиска по такому полю нам придется использовать другие инструменты.

Организация поиска при загрузке данных

Если мы пишем обработку загрузки из Excel, нам нужно сопоставлять товары. Рассмотрим, как реализовать поиск по длинному наименованию с помощью запроса. Это самый надежный способ:


Функция НайтиТоварПоДлинномуНаименованию(ИскомоеИмя)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Номенклатура.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	Номенклатура.НаименованиеПолное = &Наименование";
    
    Запрос.УстановитьПараметр("Наименование", ИскомоеИмя);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецФункции

Если же мы хотим использовать оператор ПОДОБНО для поиска по частичному совпадению, код будет выглядеть так:


Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Номенклатура 
    |ГДЕ НаименованиеПолное ПОДОБНО &НаименованиеПоиск";
// Добавляем спецсимволы % для поиска вхождения строки
Запрос.УстановитьПараметр("НаименованиеПоиск", "%" + ТекстИзExcel + "%");

Альтернативный метод: Хеширование наименований

Если база данных очень большая и поиск по строке неограниченной длины через ПОДОБНО работает медленно, применим метод хеширования. Разберем его суть:

  1. Создаем в справочнике дополнительный реквизит ХешНаименования (Строка, 32 символа) и индексируем его.
  2. При записи элемента (в событии ПередЗаписью) вычисляем MD5-хеш от длинного наименования и записываем его в этот реквизит.
  3. При загрузке из Excel вычисляем хеш от входящей строки и выполняем мгновенный поиск через Справочники.Номенклатура.НайтиПоРеквизиту("ХешНаименования", ВычисленныйХеш).

Этот метод позволяет обходить любые ограничения длины и обеспечивает максимально возможную скорость поиска.

Влияние на синхронизацию данных

Выясним причину, по которой не стоит пытаться «взломать» длину стандартного поля Наименование. Если ваша база участвует в обмене данными (например, через КД 2.0 или КД 3.0) с другими конфигурациями, изменение длины поля приведет к рассинхронизации структур. Данные будут обрезаться при переносе в базу-приемник, что создаст дубли и ошибки сопоставления объектов. Использование дополнительного реквизита (как НаименованиеПолное) является более безопасным и гибким подходом для распределенных систем.

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

← На главную