Рассмотрим частую задачу, с которой сталкиваются разработчики при работе с управляемыми формами в конфигурациях вроде 1С:Комплексная автоматизация (КА) или 1С:Управление торговлей (УТ). Представим ситуацию: пользователь открывает обработку «Обеспечение потребностей», формирует список, а затем через сочетание клавиш Ctrl+F (или Alt+F) задает поиск по определенному элементу. После этого пользователь нажимает кнопку обновления списка заказов, но отбор по введенному тексту поиска остается активным. Возникает вопрос: как при обновлении списка программно очистить этот пользовательский поиск? Разберем эту проблему по шагам и проанализируем возможные варианты решения.
Проанализируем архитектуру управляемых форм 1С:Предприятие 8.3. К сожалению, официально в платформе не существует встроенных методов, свойств или функций для программного управления системной пользовательской строкой поиска, которая вызывается по Ctrl+F для табличных частей и таблиц значений на форме.
Разработчики не могут ни программно вписать туда нужный текст, ни очистить его платформенными средствами. Системный поиск живет «своей жизнью» в интерфейсе клиента, и прямого доступа из серверного или клиентского кода к нему нет.
Поскольку штатных средств нет, рассмотрим популярный обходной путь (костыль) — эмуляцию нажатия пользователем сочетания клавиш Ctrl+Q, которое отвечает за отмену поиска в таблице 1С. Для этого используется COM-объект системы Windows.
Посмотрим на пример кода, который реализует этот подход. Важно сделать нужную таблицу активной, чтобы нажатие клавиш ушло именно в нее:
&НаКлиенте
Процедура ОтключитьПользовательскийОтбор(Команда)
// Делаем таблицу активным элементом формы
ТекущийЭлемент = Элементы.ТабличнаяЧасть1;
// Создаем COM-объект для эмуляции клавиатуры
ОбъектShell = Новый COMОбъект("Wscript.Shell");
// Отправляем сочетание клавиш Ctrl+Q (символ ^ означает Ctrl)
ОбъектShell.SendKeys("^q");
КонецПроцедуры
Этот код программно имитирует действие пользователя по отмене поиска. Однако у этого метода есть существенные недостатки, которые мы разберем далее.
При использовании метода SendKeys("^q") выясним неприятную причину сбоев: этот метод крайне зависим от текущей активной раскладки клавиатуры в операционной системе пользователя.
Если у пользователя в момент выполнения кода активна английская раскладка (EN), команда отрабатывает корректно, и поиск сбрасывается. Но если активна русская раскладка (RU), символ q интерпретируется как нажатие клавиши Й. Сочетание Ctrl+Й в 1С вызывает открытие встроенного калькулятора, а не отмену поиска.
Для решения этой проблемы применяют следующие усовершенствования:
Wscript.Shell раскладка принудительно переключается на английскую с помощью вызовов WinAPI (часто через внешние компоненты, например, DynamicWrapperX), выполняется SendKeys, а затем раскладка возвращается обратно. Это сложный и зависимый от ОС путь.Проанализируем еще одну ситуацию: даже если раскладка английская, команда Ctrl+Q может не сработать. Это происходит, если в момент выполнения кода фокус (активность) находится на кнопке «Обновить», а не на самой табличной части. Форма просто не успевает перерисоваться и перевести фокус.
Чтобы избежать этого, рекомендуется переводить фокус на таблицу, а саму эмуляцию нажатия вызывать через ПодключитьОбработчикОжидания с минимальной задержкой. Разберем пример реализации:
&НаКлиенте
Процедура ОбновитьСписокКоманда(Команда)
// 1. Обновляем данные таблицы...
ОбновитьДанныеТаблицы();
// 2. Устанавливаем фокус на таблицу
ТекущийЭлемент = Элементы.ТабличнаяЧасть1;
// 3. Подключаем обработчик с задержкой 0.1 сек для отмены поиска
ПодключитьОбработчикОжидания("СброситьПоискКлавишами", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура СброситьПоискКлавишами()
Попытка
ОбъектShell = Новый COMОбъект("Wscript.Shell");
ОбъектShell.SendKeys("^q");
Исключение
// Обработка ошибки, если COM-объект недоступен (например, веб-клиент или Linux)
КонецПопытки;
КонецПроцедуры
Если задача состоит именно в программном управлении отображаемыми (видимыми) строками табличной части, мы настоятельно рекомендуем отказаться от ненадежной эмуляции кнопок (Ctrl+F) и использовать штатное свойство элементов формы — ОтборСтрок.
Этот подход работает исключительно надежно, так как является полностью задокументированным механизмом платформы. Чтобы пользователям было удобно, над табличной частью можно вывести отдельное поле ввода (строку), при изменении которой будет программно устанавливаться или сбрасываться отбор.
Посмотрим на пример использования ОтборСтрок:
&НаКлиенте
Процедура ПриИзмененииПользовательскогоПоляПоиска(Элемент)
ЗначениеПоиска = Элементы.ПолеПоискаПоНоменклатуре.Значение;
Если ЗначениеЗаполнено(ЗначениеПоиска) Тогда
// Установка отбора
Элементы.ТабличнаяЧасть1.ОтборСтрок = Новый ФиксированнаяСтруктура("Номенклатура", ЗначениеПоиска);
Иначе
// Сброс отбора
Элементы.ТабличнаяЧасть1.ОтборСтрок = Неопределено;
КонецЕсли;
КонецПроцедуры
Таким образом, при нажатии кнопки «Обновить» вам достаточно будет просто выполнить Элементы.ТабличнаяЧасть1.ОтборСтрок = Неопределено;, и все строки снова станут видимыми. Никаких проблем с раскладками клавиатуры или фокусом в этом случае не возникнет.
В завершение разберем нюанс, касающийся типа данных. В конфигурациях КА 2.4 и УТ 11 списки (например, списки заказов на формах рабочих мест) часто реализуются не как классические табличные части или таблицы значений, а как Динамические списки. Если эти списки используются для ведения торговли на маркетплейсах, то автоматизировать их регулярное наполнение можно, настроив интеграцию 1С с маркетплейсами Ozon, Wildberries, Яндекс.Маркет для получения информации о заказах напрямую в учетную систему.
Если вы работаете с динамическим списком, управлять отборами можно штатно через КомпоновщикНастроек.ПользовательскиеНастройки, просто очищая элементы отбора. Вы можете использовать метод ПолучитьИсполняемуюСхемуКомпоновкиДанных() для глубокой работы с настройками. Однако важно помнить: даже если вы программно очистите все отборы динамического списка, текст, который пользователь ввел в стандартное поле поиска (с иконкой лупы), визуально там останется. Для полной очистки интерфейса потребуется либо перезакрытие формы, либо использование нестандартных решений, аналогичных тем, что мы рассматривали выше для табличных частей. Для детального изучения программного управления компоновщиком данных пригодится руководство по тонкой настройке динамических списков.