Как реализовать быстрый поиск в списках и таблицах 1С:Предприятие 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разработчики и пользователи, давно работающие с платформой 1С:Предприятие 7.7, прекрасно знают об одной из главных её интерфейсных проблем — крайне ограниченном штатном механизме поиска в списках. В "семерке" стандартный быстрый поиск при вводе символов с клавиатуры работает исключительно по той колонке, по которой в данный момент установлена сортировка (как правило, это «Код» или «Наименование»). Если возникает необходимость быстро найти элемент по подстроке, по несортированной колонке или по сложному реквизиту в журнале документов, стандартных средств платформы становится явно недостаточно.

В рамках данной статьи мы подробно проанализируем ситуацию, разберем программные инструменты, упомянутые практикующими специалистами, и рассмотрим альтернативные профессиональные решения, которые позволяют обойти интерфейсные ограничения 1С 7.7.

Причина проблемы: почему штатный поиск в 1С 7.7 неудобен

Выясним причину такого поведения платформы. Архитектура 1С 7.7 проектировалась в конце 1990-х годов. Табличные части и списки справочников в ней базируются на кастомизированных элементах управления Windows (WinAPI). Платформа осуществляет позиционирование в базе данных по индексу активной колонки. Полноценный динамический поиск по мере ввода (интерактивная фильтрация) «из коробки» не предусмотрен. Делать под каждый список отдельную поисковую процедуру силами встроенного языка — задача трудоемкая и неэффективная с точки зрения производительности.

Давайте разберем по шагам, с помощью каких инструментов и библиотек можно решить эту задачу — как на уровне операционной системы, так и на уровне программирования конфигурации.

---

Решение 1: Системная утилита Listary

Одним из наиболее простых и изящных пользовательских решений является использование сторонней утилиты Listary. Рассмотрим подробнее, как она работает и чем может помочь пользователю 1С.

Listary — это поисковая утилита для Windows, которая встраивается в системные диалоги и стандартные списки элементов управления.

Принцип работы в контексте 1С 7.7:

  1. Утилита постоянно работает в фоновом режиме в системном трее.
  2. Когда пользователь открывает в 1С любой стандартный диалог выбора файлов (например, при импорте/экспорте XML-файлов или обработок) или системный список WinAPI, достаточно просто начать набирать текст на клавиатуре.
  3. Поверх активного окна мгновенно появляется компактная поисковая строка Listary, которая динамически фильтрует элементы списка «на лету», скрывая неподходящие строки.

Главный плюс данного подхода — полная универсальность и отсутствие необходимости вносить изменения в код конфигурации 1С. Однако стоит учитывать нюанс: в некоторых сильно кастомизированных табличных частях самой 1С (которые отрисовываются внутренними механизмами платформы, а не стандартным WinAPI ListView) Listary может не сработать. Тем не менее, для работы с файловой системой и внешними каталогами обмена это незаменимый инструмент.

---

Решение 2: Исследование интерфейса с помощью InqSoft Window Scanner

Если нам необходимо пойти дальше и разобраться, как устроены окна 1С 7.7 изнутри для написания собственных скриптов автоматизации, на помощь приходит утилита InqSoft Window Scanner.

Это специализированный инструмент для разработчиков, системных администраторов и реверс-инженеров. Он позволяет буквально «сканировать» запущенные в операционной системе приложения:

Проанализировав структуру окон с помощью Window Scanner, программист может точно определить, какому именно элементу интерфейса нужно послать Windows-сообщение (например, через WinAPI функцию SendMessage) для эмуляции ввода или перехвата фокуса.

---

Решение 3: Программное расширение через внешние библиотеки (svcsvc.dll и dynwrap.dll)

Для разработчиков, желающих внедрить удобный поиск непосредственно в код конфигурации, сообщество 1С в свое время создало мощные инструменты расширения возможностей встроенного языка.

Использование svcsvc.dll (Service Service)

Это легендарный ActiveX/COM-компонент, разработанный ведущими специалистами сообщества OpenConf. Он предоставляет огромный набор системных функций, недоступных в стандартном встроенном языке 1С 7.7.

С точки зрения нашей задачи, в библиотеке крайне полезен метод FilterValue(). Он позволяет вызывать кастомные, быстрые Windows-диалоги выбора значений из списков (включая древовидные структуры и списки с флажками множественного выбора). Этот метод поддерживает моментальный интерактивный поиск по подстроке при вводе символов с клавиатуры, что позволяет программисту организовать удобный подбор элементов без перегрузки интерфейса самой платформы.

Использование dynwrap.dll (Dynamic Wrapper)

Библиотека dynwrap.dll (и её современный аналог DynamicWrapperX) позволяет вызывать любые функции Windows API напрямую из встроенного языка 1С 7.7 без необходимости писать полноценные внешние компоненты на C++.

Посмотрим на пример логики работы с API. Программист может перехватить дескриптор окна списка 1С, отследить ввод пользователя и программно спозиционировать курсор на нужной строке, используя стандартные функции WinAPI, такие как FindWindowEx и SendMessage.

---

Решение 4: Профессиональный подход (Компоненты FormEx и 1С++)

Если вы хотите сделать поиск в списках по-настоящему быстрым и бесшовным для пользователя, рекомендуется использовать две библиотеки, ставшие стандартом де-факто для разработки на 1С 7.7: FormEx и 1С++ (1cpp.dll).

Перехват клавиатуры с помощью FormEx

Внешняя компонента FormEx (автор — Алексей Фёдоров) позволяет полностью управлять интерфейсом форм 1С 7.7. В ней реализовано предопределенное событие ПриНажатииКнопкиКлавиатуры.

Рассмотрим пример концептуального кода, который можно разместить в модуле формы для реализации поиска при нажатии клавиш:


// Пример обработки нажатия клавиш для организации быстрого поиска
Процедура ПриНажатииКнопкиКлавиатуры(Контекст, КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
    
    // Если нажата алфавитно-цифровая клавиша
    Если (КодКлавиши >= 48) И (КодКлавиши <= 90) Тогда
        
        // Накапливаем введенные символы в специальную переменную поиска
        ПоисковаяСтрока = ПоисковаяСтрока + Символ;
        
        // Производим позиционирование в списке по накопленной строке
        // Например, ищем в ТаблицеЗначений или справочнике
        СтрокаНомера = 0;
        Если СписокЗначений.НайтиЗначение(ПоисковаяСтрока, СтрокаНомера, "Наименование") = 1 Тогда
            СписокЗначений.ТекущаяСтрока(СтрокаНомера);
        КонецЕсли;
        
        // Отменяем стандартную обработку нажатия, чтобы символ не вставился в текущее поле
        ФлагСтандартнойОбработки = 0;
        
    КонецЕсли;
    
КонецПроцедуры

Благодаря этому событию мы можем полностью контролировать ввод пользователя, подсвечивать найденные строки цветом (что также умеет делать FormEx) и динамически фильтровать списки.

Прямые SQL-запросы через 1С++

В базах данных большого объема стандартные поисковые механизмы 1С 7.7 неизбежно начинают тормозить. Компонента 1С++ позволяет выполнять прямые SQL-запросы к базе данных (MS SQL или локальной SQLite).

Вместо стандартного справочника на форму помещается объект «ТаблицаЗначений» или специальный «Поставщик Данных». Поиск в такой таблице по мере ввода текста происходит за миллисекунды даже по миллионной базе товаров за счет использования SQL-инструкции LIKE и полнотекстовых индексов:


// Примерный SQL-запрос для сверхбыстрого поиска по подстроке
Запрос = СоздатьОбъект("ODBCРекордсет");
ТекстЗапроса = "
|SELECT ID as [Элемент $Справочник.Номенклатура],
|       DESCR as Наименование
|FROM $Справочник.Номенклатура
|WHERE DESCR LIKE :СтрокаПоиска
|";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СокрЛП(ВведенныйТекст) + "%");
ТЗ_Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

Полученная таблица значений мгновенно выводится на форму, обеспечивая пользователю моментальный отклик интерфейса.

---

Резюме и рекомендации

Мы проанализировали различные методы обхода ограничений платформы 1С 7.7. Выбор конкретного решения зависит от ваших задач и прав доступа к системе:

  1. Если вы — конечный пользователь и вам нужно быстро искать файлы или элементы в системных диалогах без изменения кода 1С, используйте утилиту Listary.
  2. Если вы — системный администратор или автоматизатор и хотите гибко управлять окнами запущенных приложений, воспользуйтесь InqSoft Window Scanner.
  3. Если вы — разработчик 1С 7.7, внедряйте профессиональные компоненты FormEx (для перехвата ввода на формах) и 1С++ (для быстрого поиска по базе данных через прямые запросы). Это сделает работу пользователей максимально комфортной и современной.
← На главную