Многие пользователи, переходящие с 1С 8 на 1С 7.7 или работающие в обеих системах параллельно, сталкиваются с отсутствием привычного функционала автоподбора. В восьмой версии платформы при вводе первых букв в поле выбора система автоматически предлагает подходящие варианты из справочника. В «семерке» же штатное поведение подразумевает нажатие кнопки выбора «...» и поиск в открывшемся списке. Однако, используя определенные технические решения, мы можем приблизить интерфейс старой доброй 7.7 к современным стандартам.
Рассмотрим подробнее, какими способами можно реализовать быстрый поиск и автоподбор, разберем их плюсы, минусы и особенности реализации.
Прежде чем приступать к сложному программированию, проанализируем штатные возможности платформы. В 1С 7.7 реализован так называемый инкрементальный поиск в формах списка справочников.
Разберем, как это работает:
Контрагенты или Сотрудники).Важный момент: если вызвать справочник в режиме выбора (например, из документа), этот механизм также работает. Это не совсем «автоподбор» в самом поле ввода, но значительно ускоряет работу, избавляя от необходимости вызывать окно поиска через Ctrl + F3 или иконку бинокля.
Для реализации полноценного «живого» поиска при вводе в текстовое поле нам потребуется расширить возможности встроенного языка. Наиболее популярным решением здесь является внешняя компонента FormEx. Она позволяет перехватывать события клавиатуры, чего штатная 1С 7.7 делать не умеет (событие ПриИзменении в 7.7 срабатывает только после нажатия Enter или потери фокуса).
Рассмотрим алгоритм реализации:
FormEx.dll в глобальном модуле.ПослеНажатияКнопкиКлавиатуры, которое предоставляет компонента.Пример логики обработки нажатий может выглядеть следующим образом:
Процедура ПослеНажатияКнопкиКлавиатуры(Контекст, КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
// Проверяем, что фокус находится на нужном поле ввода
Если НазваниеТекущегоЭлемента() = "ПолеПоиска" Тогда
// Программным путем считываем введенный текст
ТекущийТекст = СокрЛП(ПолеПоиска);
// Выполняем поиск по справочнику
Спр = СоздатьОбъект("Справочник.Контрагенты");
Если Спр.НайтиПоНаименованию(ТекущийТекст, 0, 0) = 1 Тогда
// Если нашли, можем подсветить или вывести в список подбора
Сообщить("Найдено: " + Спр.Наименование, "i");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
С помощью этой компоненты можно также программно «вываливать» список (Drop-down), создавая полную иллюзию работы в 1С 8.
Если ваша база данных работает на MS SQL Server (как в случае автора вопроса), мы можем добиться мгновенного поиска даже по огромным справочникам (сотни тысяч записей). Штатный метод НайтиПоНаименованию при частичном поиске может работать медленно. Выясним, как ускорить этот процесс с помощью компоненты 1С++.
Проанализируем преимущества прямого запроса:
LIKE %Текст%).Пример структуры запроса через объект ODBCRecordset:
ТекстЗапроса = "
|SELECT
| sc.ID as [Ссылка $Справочник.Контрагенты],
| sc.DESCR as Наименование
|FROM
| $Справочник.Контрагенты as sc
|WHERE
| sc.DESCR LIKE :ТекстПоиска
|";
Запрос.УстановитьТекстовыйПараметр("ТекстПоиска", "%" + ВведенныеСимволы + "%");
Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Существует «хитрый» способ реализовать динамическое обновление списка без использования внешних компонент. Он основан на том, что функции, прописанные в формулах текстовых элементов на форме, вычисляются при каждом обновлении экрана.
Разберем этот механизм по шагам:
глОбновитьПоиск().глОбновитьПоиск() пропишите логику сравнения текущего значения поля ввода с предыдущим сохраненным значением.Этот метод считается менее стабильным и более нагрузочным для системы, но он позволяет обойтись без регистрации DLL-библиотек на рабочих станциях пользователей.
Для массового ввода данных (например, когда нужно добавить 50–100 сотрудников в документ за один раз) лучше всего использовать не автоподбор в одной строке, а специализированную форму подбора.
Посмотрим на алгоритм эффективной работы в таких случаях:
ТаблицаЗначений), куда выводятся подходящие под критерии записи.ЗагрузитьТабличнуюЧасть или в цикле).Это гораздо надежнее, чем пытаться реализовать поведение 1С 8 в каждой отдельной строке многострочной части документа 7.7.
Выбор конкретного метода зависит от ваших навыков программирования и технических условий. Если вы пользователь, то наиболее эффективным для вас будет освоение инкрементального поиска в справочниках и использование горячих клавиш. Если вы разработчик, мы рекомендуем использовать связку FormEx + 1С++ для SQL-баз, так как это обеспечит максимальный комфорт для бухгалтера и высокую скорость работы программы.
Помните: любые доработки в 1С 7.7, связанные с перехватом событий или прямыми запросами к базе данных, требуют осторожности и предварительного тестирования на копии базы, чтобы избежать нестабильной работы интерфейса или ошибок доступа к данным.