При разработке в среде 1С:Предприятие 8.3 часто возникает задача расширения типового функционала без снятия конфигурации с поддержки. Один из распространенных сценариев — добавление нового реквизита к справочнику через расширение и вывод его в динамический список. Однако программисты часто сталкиваются с тем, что новое поле, хотя и отображается в списке, отсутствует в стандартном диалоге поиска (Alt+F) в колонке «Где искать». Разберем подробно, почему это происходит и как решить данную проблему.
Рассмотрим ситуацию, когда динамический список использует произвольный запрос. Часто в таких запросах для исключения дублирования строк (например, при соединении с табличными частями или регистрами сведений) используется ключевое слово РАЗЛИЧНЫЕ (DISTINCT). Выясним, как это влияет на механизмы платформы.
Когда в запросе присутствует РАЗЛИЧНЫЕ, платформа 1С воспринимает результат как некую временную выборку, а не прямую проекцию полей таблицы базы данных. В этом режиме автоматическое сопоставление полей списка и реквизитов метаданных для целей фильтрации и поиска может работать некорректно. Платформа просто «не понимает», что поле МоеПоле в результатах запроса — это тот самый индексируемый реквизит справочника, по которому нужно разрешить поиск.
Для того чтобы явно указать платформе связь между выбираемым полем и механизмами поиска, необходимо использовать специальные инструкции компоновки данных в тексте запроса. Эти инструкции заключаются в фигурные скобки {}. Проанализируем типичную ошибку и правильный вариант написания запроса.
Неправильный вариант:
В данном случае поле описано в блоке выбора, но в секции ГДЕ оно указано без псевдонима, что при использовании РАЗЛИЧНЫЕ не позволяет поисковому механизму сопоставить данные.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
СправочникСотрудники.Ссылка КАК Ссылка,
СправочникСотрудники.МойРеквизитИзРасширения КАК МоеПоле
ИЗ
Справочник.Сотрудники КАК СправочникСотрудники
{ГДЕ
СправочникСотрудники.МойРеквизитИзРасширения
}
Правильный вариант:
Необходимо явно прописать псевдоним поля внутри фигурных скобок секции ГДЕ. Это создает жесткую связь между колонкой динамического списка и источником данных для системы компоновки (СКД), на которой базируются динамические списки.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
СправочникСотрудники.Ссылка КАК Ссылка,
СправочникСотрудники.МойРеквизитИзРасширения КАК МоеПоле
ИЗ
Справочник.Сотрудники КАК СправочникСотрудники
{ГДЕ
СправочникСотрудники.МойРеквизитИзРасширения КАК МоеПоле
}
После внесения таких изменений платформа получит четкую инструкцию: «Поле МоеПоле доступно для фильтрации и поиска, и оно соответствует реквизиту МойРеквизитИзРасширения».
Помимо редактирования текста запроса, важно проверить настройки самого объекта «Динамический список» в редакторе формы. Пройдем по шагам настройки, которые гарантируют корректную работу поиска:
Основная таблица. Для нашего примера там должен быть выбран Справочник.Сотрудники. Если это свойство не заполнено, поиск по многим полям (особенно добавленным через расширение) может быть недоступен.Автозаполнение и ручное указание пути к данным для каждого поля. Однако при правильном использовании фигурных скобок {} автозаполнение обычно работает корректно.Если после манипуляций с запросом поле появилось в окне «Где искать», но поиск не выдает результатов или работает крайне медленно, проверим свойства самого реквизита в расширении:
Индексировать или Индексировать с доп. упорядочиванием.Полнотекстовый поиск установлено Использовать.Важный нюанс: После добавления реквизита в расширение и обновления базы данных индекс полнотекстового поиска не обновляется мгновенно. Рассмотрим шаги для принудительного обновления:
В конфигурациях типа «Зарплата и управление персоналом» формы списков часто строятся с использованием механизмов Библиотеки стандартных подсистем (БСП). Разберем ситуацию, когда поиск ограничен программно.
В некоторых типовых формах (например, список сотрудников) состав доступных полей для поиска может переопределяться в коде при создании формы. Проанализируем процедуру ПриСозданииНаСервере. Если в ней вызываются методы БСП для настройки списков, проверьте, не передается ли там жесткий массив доступных полей поиска. В этом случае добавление поля в запрос будет недостаточно — потребуется также через расширение модуля формы («После») добавить ваш реквизит в коллекцию доступных полей компоновщика настроек динамического списка.
Для того чтобы реквизит из расширения появился в окне поиска динамического списка, выполните следующие действия:
{ГДЕ ... КАК Псевдоним} внутри произвольного запроса.Эти шаги позволяют обойти ограничения платформы, связанные с обработкой расширений и сложных SQL-запросов, обеспечивая пользователю полноценный и удобный интерфейс для поиска информации.