При переходе на новые версии платформы «1С:Предприятие 8» (начиная с 8.3.15, 8.3.16 и далее, включая 8.3.17) многие разработчики и пользователи сталкиваются с неожиданным поведением интерфейса поиска. Особенно часто вопросы возникают при работе с табличными частями документов и справочников: пропадает строка поиска, в меню управления поиском отсутствуют привычные кнопки (например, «Отменить поиск»), или поиск вообще перестает выводиться на форму, поэтому для автоматизации процесса обновления и тестирования баз в таких условиях удобно использовать инструмент для автоматического обслуживания 1С.
В этой статье мы подробно разберем, почему так происходит, проанализируем архитектурные отличия механизмов поиска, выясним причины «исчезновения» элементов управления и рассмотрим практические способы решения этой проблемы как интерактивно в конфигураторе, так и программно в коде.
Для начала давайте разберемся, почему меню управления поиском для динамического списка и для обычной табличной части выглядит по-разному. Начиная с версии платформы 8.3.16.1030, фирма «1С» провела масштабную унификацию интерфейса. Внешне элементы поиска стали похожи, однако их внутреннее устройство кардинально отличается:
ДанныеФормыКоллекция). Полнотекстовый поиск для локальных данных невозможен по определению. Поиск по табличной части — это, по сути, быстрый локальный отбор (фильтрация) строк по набранным символам. Он выполняется мгновенно силами самого клиента.Именно из-за этого логика платформы для табличных частей отличается. Отдельная кнопка «Отменить поиск» в подменю управления локальной таблицей была признана разработчиками 1С избыточной (поведение by design). Так как поиск в табличной части — это простая фильтрация, отмена поиска выполняется стандартным стиранием текста в поле ввода (нажатием на «крестик» очистки) или с помощью стандартных горячих клавиш:
Ctrl + Q — стандартное сочетание клавиш для отмены поиска в управляемых формах;Esc — закрытие и сброс текущего поиска (при фокусе на строке поиска).Таким образом, «урезанное» меню управления поиском в табличной части — это не ошибка, а штатное поведение платформы, обусловленное локальным характером обрабатываемых данных.
Рассмотрим ситуацию, когда в типовой управляемой форме (например, в конфигурациях «1С:Документооборот», «1С:ERP Управление предприятием» или «1С:Комплексная автоматизация») строка поиска по табличной части вообще не отображается, либо перестает работать после добавления формы в расширение. Выделим две основные причины этого поведения.
В типовых конфигурациях командные панели табличных частей часто настраиваются разработчиками вручную для более гибкого управления кнопками. Если у командной панели, связанной с таблицей, снят флажок «Автозаполнение», платформа автоматически не выводит туда системные элементы поиска (строку поиска и кнопку управления).
Для решения этой проблемы в конфигураторе предусмотрен специальный механизм — Дополнение элемента формы. Давайте разберем по шагам, как вернуть строку поиска интерактивно:
Товары).Отображение строки поиска для вывода поля ввода или Управление поиском для вывода кнопки вызова меню поиска.При заимствовании форм в расширения конфигурации свойства элементов управления (включая настройки отображения поиска) могут сбрасываться в значения по умолчанию или вести себя некорректно из-за несоответствия версий совместимости платформы. На платформе 8.3.17 и выше часто требуется явно инициализировать свойства таблицы формы в коде, чтобы гарантировать появление поиска. Для исследования структуры и изменения свойств элементов прямо в пользовательском режиме можно использовать редактор управляемых форм в режиме Предприятия.
Для исправления этой ситуации мы можем программно переопределить свойства положения строки поиска в обработчике формы ПриСозданииНаСервере.
Проанализируем ситуацию, когда табличная часть или элементы формы создаются динамически из кода, либо нам необходимо принудительно инициализировать поиск в расширении. Рассмотрим практический пример программной настройки свойств таблицы. Для ускорения и стандартизации таких доработок можно использовать готовый модуль для программного изменения управляемых форм.
Для того чтобы строка поиска и кнопка управления поиском гарантированно отобразились на командной панели таблицы, мы должны использовать свойства таблицы формы ПоложениеСтрокиПоиска и ПоложениеУправленияПоиском.
Разберем пример программного создания таблицы и настройки поиска:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Допустим, мы динамически создаем таблицу формы на странице
СтраницаФормы = Элементы.ГруппаСтраницыТовары;
ТаблицаФормы = Элементы.Добавить("Закупки_ЗаявкаНаПоставку", Тип("ТаблицаФормы"), СтраницаФормы);
ТаблицаФормы.ПутьКДанным = "Объект.Закупки_ЗаявкаНаПоставку";
// Принудительно задаем отображение строки поиска в командной панели таблицы
ТаблицаФормы.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.КоманднаяПанель;
// Принудительно задаем отображение меню управления поиском в командной панели
ТаблицаФормы.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.КоманднаяПанель;
КонецПроцедуры
В данном коде мы использовали системное перечисление ПоложениеСтрокиПоиска и ПоложениеУправленияПоиском. Возможные значения для этих свойств:
ПоложениеСтрокиПоиска.КоманднаяПанель — строка поиска отображается непосредственно в связанной командной панели.ПоложениеСтрокиПоиска.Шапка — строка поиска будет выводиться непосредственно над заголовками колонок таблицы.ПоложениеСтрокиПоиска.Нет — строка поиска полностью отключается для данной таблицы.ПоложениеСтрокиПоиска.Авто — платформа самостоятельно определяет наилучшее место для отображения (по умолчанию).Если вы работаете с расширением, достаточно написать аналогичный код для существующей на форме таблицы, чтобы жестко зафиксировать ее поведение и обойти возможные ошибки платформы при кэшировании метаданных:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Корректируем свойства стандартной таблицы формы "Товары"
Элементы.Товары.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.КоманднаяПанель;
Элементы.Товары.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.КоманднаяПанель;
КонецПроцедуры
Еще одна неочевидная проблема, из-за которой поиск по табличной части может заблокироваться или стать недоступным для пользователя, заключается в использовании программных отборов разработчиком.
Если в коде управляемой формы к таблице применяется фильтрация через свойство ОтборСтрок (например, для отображения только определенных строк коллекции на клиенте), то стандартный интерактивный поиск платформы блокируется:
// Пример программной установки отбора строк, который может заблокировать поиск
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Активный", Истина);
При установке свойства ОтборСтрок строка поиска может стать визуально неактивной, либо ввод символов в нее не будет давать никаких результатов. Пользователь при этом не видит явных причин блокировки и не может интерактивно сбросить этот отбор. Помните, что программный отбор имеет абсолютный приоритет над пользовательским поиском. Если вам необходимо реализовать совместную работу программных фильтров и пользовательского поиска, рекомендуется использовать отборы на уровне данных (если это динамический список) или управлять видимостью строк коллекции программно, избегая жесткой блокировки элемента формы.
Проанализировав поведение платформы 1С при работе с поиском по табличным частям, мы можем сформулировать следующие правила для успешной разработки:
Ctrl + Q и Esc.ПоложениеСтрокиПоиска и ПоложениеУправленияПоиском в обработчике ПриСозданииНаСервере, чтобы избежать их непредсказуемого сброса платформой.ОтборСтрок, если пользователям жизненно необходим стандартный полнотекстовый поиск по строкам табличной части.