Разработчики и пользователи, давно работающие с платформой 1С:Предприятие 7.7, прекрасно знают об одной из главных её интерфейсных проблем — крайне ограниченном штатном механизме поиска в списках. В "семерке" стандартный быстрый поиск при вводе символов с клавиатуры работает исключительно по той колонке, по которой в данный момент установлена сортировка (как правило, это «Код» или «Наименование»). Если возникает необходимость быстро найти элемент по подстроке, по несортированной колонке или по сложному реквизиту в журнале документов, стандартных средств платформы становится явно недостаточно.
В рамках данной статьи мы подробно проанализируем ситуацию, разберем программные инструменты, упомянутые практикующими специалистами, и рассмотрим альтернативные профессиональные решения, которые позволяют обойти интерфейсные ограничения 1С 7.7.
Выясним причину такого поведения платформы. Архитектура 1С 7.7 проектировалась в конце 1990-х годов. Табличные части и списки справочников в ней базируются на кастомизированных элементах управления Windows (WinAPI). Платформа осуществляет позиционирование в базе данных по индексу активной колонки. Полноценный динамический поиск по мере ввода (интерактивная фильтрация) «из коробки» не предусмотрен. Делать под каждый список отдельную поисковую процедуру силами встроенного языка — задача трудоемкая и неэффективная с точки зрения производительности.
Давайте разберем по шагам, с помощью каких инструментов и библиотек можно решить эту задачу — как на уровне операционной системы, так и на уровне программирования конфигурации.
---
Одним из наиболее простых и изящных пользовательских решений является использование сторонней утилиты Listary. Рассмотрим подробнее, как она работает и чем может помочь пользователю 1С.
Listary — это поисковая утилита для Windows, которая встраивается в системные диалоги и стандартные списки элементов управления.
Принцип работы в контексте 1С 7.7:
Главный плюс данного подхода — полная универсальность и отсутствие необходимости вносить изменения в код конфигурации 1С. Однако стоит учитывать нюанс: в некоторых сильно кастомизированных табличных частях самой 1С (которые отрисовываются внутренними механизмами платформы, а не стандартным WinAPI ListView) Listary может не сработать. Тем не менее, для работы с файловой системой и внешними каталогами обмена это незаменимый инструмент.
---
Если нам необходимо пойти дальше и разобраться, как устроены окна 1С 7.7 изнутри для написания собственных скриптов автоматизации, на помощь приходит утилита InqSoft Window Scanner.
Это специализированный инструмент для разработчиков, системных администраторов и реверс-инженеров. Он позволяет буквально «сканировать» запущенные в операционной системе приложения:
HWND) и их дочерних элементов (кнопок, полей ввода, таблиц).Проанализировав структуру окон с помощью Window Scanner, программист может точно определить, какому именно элементу интерфейса нужно послать Windows-сообщение (например, через WinAPI функцию SendMessage) для эмуляции ввода или перехвата фокуса.
---
Для разработчиков, желающих внедрить удобный поиск непосредственно в код конфигурации, сообщество 1С в свое время создало мощные инструменты расширения возможностей встроенного языка.
Это легендарный ActiveX/COM-компонент, разработанный ведущими специалистами сообщества OpenConf. Он предоставляет огромный набор системных функций, недоступных в стандартном встроенном языке 1С 7.7.
С точки зрения нашей задачи, в библиотеке крайне полезен метод FilterValue(). Он позволяет вызывать кастомные, быстрые Windows-диалоги выбора значений из списков (включая древовидные структуры и списки с флажками множественного выбора). Этот метод поддерживает моментальный интерактивный поиск по подстроке при вводе символов с клавиатуры, что позволяет программисту организовать удобный подбор элементов без перегрузки интерфейса самой платформы.
Библиотека dynwrap.dll (и её современный аналог DynamicWrapperX) позволяет вызывать любые функции Windows API напрямую из встроенного языка 1С 7.7 без необходимости писать полноценные внешние компоненты на C++.
Посмотрим на пример логики работы с API. Программист может перехватить дескриптор окна списка 1С, отследить ввод пользователя и программно спозиционировать курсор на нужной строке, используя стандартные функции WinAPI, такие как FindWindowEx и SendMessage.
---
Если вы хотите сделать поиск в списках по-настоящему быстрым и бесшовным для пользователя, рекомендуется использовать две библиотеки, ставшие стандартом де-факто для разработки на 1С 7.7: FormEx и 1С++ (1cpp.dll).
Внешняя компонента FormEx (автор — Алексей Фёдоров) позволяет полностью управлять интерфейсом форм 1С 7.7. В ней реализовано предопределенное событие ПриНажатииКнопкиКлавиатуры.
Рассмотрим пример концептуального кода, который можно разместить в модуле формы для реализации поиска при нажатии клавиш:
// Пример обработки нажатия клавиш для организации быстрого поиска
Процедура ПриНажатииКнопкиКлавиатуры(Контекст, КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
// Если нажата алфавитно-цифровая клавиша
Если (КодКлавиши >= 48) И (КодКлавиши <= 90) Тогда
// Накапливаем введенные символы в специальную переменную поиска
ПоисковаяСтрока = ПоисковаяСтрока + Символ;
// Производим позиционирование в списке по накопленной строке
// Например, ищем в ТаблицеЗначений или справочнике
СтрокаНомера = 0;
Если СписокЗначений.НайтиЗначение(ПоисковаяСтрока, СтрокаНомера, "Наименование") = 1 Тогда
СписокЗначений.ТекущаяСтрока(СтрокаНомера);
КонецЕсли;
// Отменяем стандартную обработку нажатия, чтобы символ не вставился в текущее поле
ФлагСтандартнойОбработки = 0;
КонецЕсли;
КонецПроцедуры
Благодаря этому событию мы можем полностью контролировать ввод пользователя, подсвечивать найденные строки цветом (что также умеет делать FormEx) и динамически фильтровать списки.
В базах данных большого объема стандартные поисковые механизмы 1С 7.7 неизбежно начинают тормозить. Компонента 1С++ позволяет выполнять прямые SQL-запросы к базе данных (MS SQL или локальной SQLite).
Вместо стандартного справочника на форму помещается объект «ТаблицаЗначений» или специальный «Поставщик Данных». Поиск в такой таблице по мере ввода текста происходит за миллисекунды даже по миллионной базе товаров за счет использования SQL-инструкции LIKE и полнотекстовых индексов:
// Примерный SQL-запрос для сверхбыстрого поиска по подстроке
Запрос = СоздатьОбъект("ODBCРекордсет");
ТекстЗапроса = "
|SELECT ID as [Элемент $Справочник.Номенклатура],
| DESCR as Наименование
|FROM $Справочник.Номенклатура
|WHERE DESCR LIKE :СтрокаПоиска
|";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СокрЛП(ВведенныйТекст) + "%");
ТЗ_Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Полученная таблица значений мгновенно выводится на форму, обеспечивая пользователю моментальный отклик интерфейса.
---
Мы проанализировали различные методы обхода ограничений платформы 1С 7.7. Выбор конкретного решения зависит от ваших задач и прав доступа к системе: