В процессе разработки и кастомизации типовых решений на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуациями, когда стандартные механизмы ведут себя не вполне очевидно. Одной из таких задач является управление элементами поиска на форме списка и решение проблемы «узких» полей наименования. Рассмотрим подробно, как вернуть строку поиска в интерфейс и что делать, если данные из внешних источников (например, Excel) не помещаются в стандартный реквизит Наименование.
Бывают случаи, когда на управляемой форме списка или выбора справочника отсутствует привычное поле поиска, хотя свойство Автозаполнение у командной панели установлено в значение Истина. Это может происходить из-за специфических настроек самой формы или режима совместимости конфигурации. Проанализируем, как принудительно вывести этот элемент, не прибегая к сложному программированию.
Если стандартная кнопка «Найти» присутствует, но пользователю требуется именно встроенное текстовое поле над списком (как в современных типовых конфигурациях), нам необходимо воспользоваться специальным объектом — Дополнением элемента формы.
Выполним следующие шаги для настройки интерфейса:
Список), а в расширении выберем путь Список.СтрокаПоиска.Теперь платформа будет автоматически связывать вводимый текст с механизмом фильтрации динамического списка. Рассмотрим также программный способ управления видимостью этого элемента, если нам нужно скрывать или показывать его в зависимости от условий:
// Пример программного управления видимостью поиска в процедуре ПриСозданииНаСервере
Элементы.СписокСтрокаПоиска.Видимость = Истина;
// Можно задать режим отображения через свойство динамического списка
Элементы.Список.РежимОтображенияСтрокиПоиска = РежимОтображенияСтрокиПоиска.Всегда;
Перейдем ко второй части задачи. Стандартный реквизит Наименование у справочников в 1С имеет жесткое ограничение в 150 символов (в некоторых старых версиях или при определенных настройках оно может быть еще меньше). Это ограничение связано с оптимизацией индексов в базе данных SQL. Если нам требуется загружать номенклатуру из Excel, где названия достигают 200 и более знаков, простым увеличением длины в конфигураторе задачу решить не удастся.
Проанализируем доступные варианты решения этой проблемы:
В большинстве современных конфигураций (УТ 11, ERP 2.5) уже предусмотрен реквизит НаименованиеПолное с типом Строка неограниченной длины. Если в вашей базе его нет, создайте новый реквизит НаименованиеДлинное.
Важный нюанс: Метод НайтиПоРеквизиту не работает со строками неограниченной длины. Для поиска по такому полю нам придется использовать другие инструменты.
Если мы пишем обработку загрузки из Excel, нам нужно сопоставлять товары. Рассмотрим, как реализовать поиск по длинному наименованию с помощью запроса. Это самый надежный способ:
Функция НайтиТоварПоДлинномуНаименованию(ИскомоеИмя)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.НаименованиеПолное = &Наименование";
Запрос.УстановитьПараметр("Наименование", ИскомоеИмя);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецФункции
Если же мы хотим использовать оператор ПОДОБНО для поиска по частичному совпадению, код будет выглядеть так:
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Номенклатура
|ГДЕ НаименованиеПолное ПОДОБНО &НаименованиеПоиск";
// Добавляем спецсимволы % для поиска вхождения строки
Запрос.УстановитьПараметр("НаименованиеПоиск", "%" + ТекстИзExcel + "%");
Если база данных очень большая и поиск по строке неограниченной длины через ПОДОБНО работает медленно, применим метод хеширования. Разберем его суть:
ХешНаименования (Строка, 32 символа) и индексируем его.ПередЗаписью) вычисляем MD5-хеш от длинного наименования и записываем его в этот реквизит.Справочники.Номенклатура.НайтиПоРеквизиту("ХешНаименования", ВычисленныйХеш).Этот метод позволяет обходить любые ограничения длины и обеспечивает максимально возможную скорость поиска.
Выясним причину, по которой не стоит пытаться «взломать» длину стандартного поля Наименование. Если ваша база участвует в обмене данными (например, через КД 2.0 или КД 3.0) с другими конфигурациями, изменение длины поля приведет к рассинхронизации структур. Данные будут обрезаться при переносе в базу-приемник, что создаст дубли и ошибки сопоставления объектов. Использование дополнительного реквизита (как НаименованиеПолное) является более безопасным и гибким подходом для распределенных систем.
Таким образом, мы рассмотрели два эффективных пути: настройку удобного пользовательского интерфейса через дополнения формы и архитектурно правильное решение проблемы хранения длинных строковых данных.