Как реализовать функционал автоподбора в 1С:Предприятии 7.7 по аналогии с 1С 8?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Рассмотрим подробнее, какими способами можно реализовать быстрый поиск и автоподбор, разберем их плюсы, минусы и особенности реализации.

Метод 1: Использование штатного инкрементального поиска

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

Разберем, как это работает:

  1. Откройте нужный справочник (например, Контрагенты или Сотрудники).
  2. Убедитесь, что список отсортирован по той колонке, по которой вы хотите искать (наименование или код). Для этого нажмите на заголовок колонки.
  3. Просто начните набирать символы на клавиатуре. Курсор будет автоматически перемещаться на ближайшее подходящее значение.

Важный момент: если вызвать справочник в режиме выбора (например, из документа), этот механизм также работает. Это не совсем «автоподбор» в самом поле ввода, но значительно ускоряет работу, избавляя от необходимости вызывать окно поиска через Ctrl + F3 или иконку бинокля.

Метод 2: Внешняя компонента FormEx и перехват нажатий

Для реализации полноценного «живого» поиска при вводе в текстовое поле нам потребуется расширить возможности встроенного языка. Наиболее популярным решением здесь является внешняя компонента FormEx. Она позволяет перехватывать события клавиатуры, чего штатная 1С 7.7 делать не умеет (событие ПриИзменении в 7.7 срабатывает только после нажатия Enter или потери фокуса).

Рассмотрим алгоритм реализации:

  1. Подключаем компоненту FormEx.dll в глобальном модуле.
  2. В форме документа или справочника создаем текстовое поле ввода.
  3. Используем событие ПослеНажатияКнопкиКлавиатуры, которое предоставляет компонента.

Пример логики обработки нажатий может выглядеть следующим образом:


Процедура ПослеНажатияКнопкиКлавиатуры(Контекст, КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
    // Проверяем, что фокус находится на нужном поле ввода
    Если НазваниеТекущегоЭлемента() = "ПолеПоиска" Тогда
        // Программным путем считываем введенный текст
        ТекущийТекст = СокрЛП(ПолеПоиска);
        
        // Выполняем поиск по справочнику
        Спр = СоздатьОбъект("Справочник.Контрагенты");
        Если Спр.НайтиПоНаименованию(ТекущийТекст, 0, 0) = 1 Тогда
            // Если нашли, можем подсветить или вывести в список подбора
            Сообщить("Найдено: " + Спр.Наименование, "i");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

С помощью этой компоненты можно также программно «вываливать» список (Drop-down), создавая полную иллюзию работы в 1С 8.

Метод 3: Прямые SQL-запросы через 1С++ для высокой скорости

Если ваша база данных работает на MS SQL Server (как в случае автора вопроса), мы можем добиться мгновенного поиска даже по огромным справочникам (сотни тысяч записей). Штатный метод НайтиПоНаименованию при частичном поиске может работать медленно. Выясним, как ускорить этот процесс с помощью компоненты 1С++.

Проанализируем преимущества прямого запроса:

Пример структуры запроса через объект ODBCRecordset:


ТекстЗапроса = "
|SELECT
|    sc.ID as [Ссылка $Справочник.Контрагенты],
|    sc.DESCR as Наименование
|FROM
|    $Справочник.Контрагенты as sc
|WHERE
|    sc.DESCR LIKE :ТекстПоиска
|";
Запрос.УстановитьТекстовыйПараметр("ТекстПоиска", "%" + ВведенныеСимволы + "%");
Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

Метод 4: Использование функции в формуле текстового элемента

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

Разберем этот механизм по шагам:

  1. Разместите на форме текстовый элемент (не поле ввода, а просто текст).
  2. В поле «Формула» этого элемента пропишите вызов функции, например: глОбновитьПоиск().
  3. В самой функции глОбновитьПоиск() пропишите логику сравнения текущего значения поля ввода с предыдущим сохраненным значением.
  4. Если значения различаются, значит пользователь что-то ввел — в этот момент программно перефильтруйте таблицу или список, отображаемый на форме.

Этот метод считается менее стабильным и более нагрузочным для системы, но он позволяет обойтись без регистрации DLL-библиотек на рабочих станциях пользователей.

Метод 5: Специализированные обработки подбора

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

Посмотрим на алгоритм эффективной работы в таких случаях:

Это гораздо надежнее, чем пытаться реализовать поведение 1С 8 в каждой отдельной строке многострочной части документа 7.7.

Рекомендации и выводы

Выбор конкретного метода зависит от ваших навыков программирования и технических условий. Если вы пользователь, то наиболее эффективным для вас будет освоение инкрементального поиска в справочниках и использование горячих клавиш. Если вы разработчик, мы рекомендуем использовать связку FormEx + 1С++ для SQL-баз, так как это обеспечит максимальный комфорт для бухгалтера и высокую скорость работы программы.

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

← На главную