Как настроить автоматический переход на следующее поле ввода при заполнении символов в 1С:Предприятие 7.7

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

При проектировании интерфейсов в 1С:Предприятии 7.7 разработчики часто сталкиваются с аппаратными или эргономическими требованиями пользователей. Типичный пример: необходимо ввести последовательность данных (например, серийные номера, коды маркировки или ключи активации), разбитых по нескольким полям ввода. Пользователь хочет, чтобы при заполнении первого поля (например, ровно на 100 символов) фокус ввода автоматически, без нажатия клавиш Enter или Tab, перепрыгивал в следующее поле.

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

Почему штатная «Формула» элемента диалога не решает задачу «на лету»

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

Платформа 1С 7.7 спроектирована так, что обработчик, указанный в поле «Формула», срабатывает только при потере фокуса элементом ввода или при явном нажатии пользователем клавиши Enter. Пока пользователь набирает текст внутри поля, событие изменения значения не генерируется во встроенном языке. Символы накапливаются во внутреннем буфере операционной системы (так называемом Edit control), и сама платформа 1С «не знает» о промежуточном состоянии строки до завершения ввода. Таким образом, отследить сотый символ непосредственно в момент его нажатия штатными средствами встроенного языка невозможно.

Рассмотрим, какие альтернативные и обходные пути существуют для решения этой проблемы.

Решение 1. Использование единого текстового поля с последующей нарезкой (Рекомендуемый способ)

Проанализируем наиболее изящный и стабильный способ, который не требует привлечения сторонних библиотек и гарантирует отсутствие зависаний интерфейса. Вместо того чтобы заставлять пользователя переходить по 10 различным полям ввода, мы можем предложить ему одно текстовое поле неограниченной длины. Пользователь вводит или копирует туда сплошной текст, а система берет на себя задачу разбить его на равные части.

Разберем по шагам, как это реализовать:

  1. Разместите на форме текстовый реквизит (например, с идентификатором ПолныйТекст) и установите для него тип «Строка» неограниченной длины. На форме сделайте его многострочным для удобства отображения.
  2. При записи документа или при нажатии специальной кнопки обработки мы программно разделим эту строку на фрагменты по 100 символов и запишем в соответствующие реквизиты базы данных.
  3. При открытии формы выполним обратную операцию — соберем из отдельных реквизитов одну длинную строку для показа пользователю.

Посмотрим на пример кода, реализующего нарезку строки:


// Процедура разбивает длинную строку на части по 100 символов
Процедура ПриЗаписи()
    ВременныйТекст = СокрЛП(ПолныйТекст);
    ДлинаТекста = СтрДлина(ВременныйТекст);
    
    // Предположим, у нас есть реквизиты Поле1, Поле2 ... Поле10 в базе данных
    Поле1 = Лев(ВременныйТекст, 100);
    
    Если ДлинаТекста > 100 Тогда
        Поле2 = Сред(ВременныйТекст, 101, 100);
    КонецЕсли;
    
    Если ДлинаТекста > 200 Тогда
        Поле3 = Сред(ВременныйТекст, 201, 100);
    КонецЕсли;
    
    // И так далее для всех необходимых полей...
КонецПроцедуры

При открытии формы мы делаем обратное «склеивание»:


Процедура ПриОткрытии()
    // Собираем текст обратно для отображения пользователю
    ПолныйТекст = СокрЛП(Поле1) + СокрЛП(Поле2) + СокрЛП(Поле3);
КонецПроцедуры

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

Решение 2. Штатная настройка порядка обхода и маски ввода

Если разделение полей принципиально важно для интерфейса, мы можем максимально упростить жизнь пользователю штатными настройками формы. Ограничим длину каждого поля ввода ровно 100 символами.

Рассмотрим подробнее шаги настройки:

  1. Откройте свойства каждого поля ввода на форме и на вкладке «Тип» установите длину строки равной 100.
  2. Перейдите в режим настройки порядка обхода элементов диалога (меню «Диалог» — «Порядок обхода»). Убедитесь, что ваши поля расположены строго друг за другом: Поле1 -> Поле2 -> Поле3 и так далее.

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

Решение 3. Программная имитация нажатия Enter через WScript.Shell

Если вы хотите частично автоматизировать процесс перехода, можно использовать возможности системного скриптового движка Windows. Метод основан на вызове системного объекта WScript.Shell, который позволяет отправлять нажатия клавиш в активное окно.

В формулу первого поля ввода поместим вызов функции ПриИзмененииПоля1(). Код модуля формы будет выглядеть следующим образом:


Процедура ПриИзмененииПоля1()
    // Если длина текста достигла предела и фокус теряется
    Если СтрДлина(Поле1) >= 100 Тогда
        Попытка
            Шелл = СоздатьОбъект("WScript.Shell");
            // Имитируем нажатие клавиши Enter для перехода на следующее поле по порядку обхода
            Шелл.SendKeys("{ENTER}");
        Исключение
            Предупреждение("Не удалось выполнить автоматический переход: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Важное ограничение: Этот метод все равно сработает только тогда, когда платформа 1С зафиксирует изменение поля (то есть при выходе из него или при первом ручном нажатии Enter). Полностью автоматического прыжка «на лету» в момент ввода сотого символа без сторонних компонент этим способом добиться не получится.

Решение 4. Использование внешней компоненты FormEx (продвинутый уровень)

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

С помощью FormEx мы можем включить глобальный перехват нажатий клавиш на форме. Давайте разберем схему работы этого механизма:

  1. Загружаем внешнюю компоненту FormEx.dll при запуске системы или непосредственно в модуле формы.
  2. Активируем перехват клавиатуры с помощью метода ПерехватКлавиатуры(1).
  3. В модуле формы пишем предопределенную процедуру перехвата нажатий клавиатуры.

Примерный шаблон реализации выглядит так:


Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
    // Метод вызывается при каждом нажатии клавиши пользователем в активном поле формы
    // Здесь мы анализируем текущую длину текста в активном элементе управления.
    // Обратите внимание: для получения текста «на лету» может потребоваться
    // отправить Windows-сообщение WM_GETTEXT к HWND активного поля ввода,
    // так как реквизит 1С обновится только после потери фокуса.
КонецПроцедуры

Использование этого метода требует от программиста хорошего понимания работы WinAPI и механизмов Windows Messages. Это мощный, но технически сложный инструмент, который может снизить стабильность работы программы при некорректной реализации.

Решение 5. Поле HTML-документа (ActiveX) как альтернативный интерфейс

Еще один продвинутый и очень гибкий способ обойти ограничения интерфейса 1С 7.7 — использовать элемент управления ActiveX "Microsoft Web Browser" (Поле HTML-документа).

Мы можем встроить HTML-страницу прямо на форму 1С. На этой странице с помощью стандартной верстки создаются нужные текстовые поля. В коде страницы на языке JavaScript прописывается логика автоматического перехода:


// Пример JavaScript внутри HTML-документа для автоперехода
document.getElementById('input1').addEventListener('input', function() {
    if (this.value.length >= 100) {
        document.getElementById('input2').focus();
    }
});

Преимущества: Веб-технологии позволяют реализовать абсолютно любой дизайн и логику поведения элементов ввода. После заполнения всех полей в HTML-форме итоговые данные передаются обратно в переменные 1С.

Подведем итоги

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

← На главную