Как в 1С 7.7 получить данные строки таблицы значений одиночным кликом мыши?

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

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

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

Проанализируем самый простой способ, который не требует установки дополнительных библиотек. Он основан на особенности перерисовки формы в 1С 7.7. Когда пользователь перемещает курсор по строкам таблицы значений, форма инициирует обновление своих элементов.

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

  1. Откроем форму обработки или документа в конфигураторе.
  2. Разместим на форме элемент типа Текст.
  3. Вынесем этот элемент за видимые границы формы или сделаем его очень маленьким, чтобы он не мешал пользователю.
  4. В поле Формула этого текстового реквизита пропишем вызов функции, например: ОбновитьДанныеПоСтроке().

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


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

Важное ограничение: этот метод отлично работает при смене строки (переход вверх/вниз). Однако, если пользователь кликнет по той же самой строке, которая уже была активна, перерисовка формы может не произойти, и функция не вызовется.

Метод 2. Использование штатной обработки ожидания

Если нам нужно отслеживать положение курсора в реальном времени, вне зависимости от того, была ли перерисовка формы, мы можем запустить таймер. Рассмотрим, как это сделать с помощью метода Форма.ОбработкаОжидания().

В процедуре ПриОткрытии() мы инициализируем цикл проверки:


Процедура ПриОткрытии()
    // Запускаем проверку с интервалом в 1 секунду
    Форма.ОбработкаОжидания("ПроверитьПоложениеКурсора", 1);
КонецПроцедуры

Процедура ПроверитьПоложениеКурсора() Экспорт
    Если ТЗ.ТекущаяСтрока() > 0 Тогда
        // Сравниваем с предыдущим положением, чтобы не спамить кодом
        Если (ТЗ.ТекущаяСтрока() <> СтарыйНомерСтроки) Или (ТЗ.ТекущаяКолонка() <> СтарыйНомерКолонки) Тогда
            СтарыйНомерСтроки = ТЗ.ТекущаяСтрока();
            СтарыйНомерКолонки = ТЗ.ТекущаяКолонка();
            
            // Выполняем действия
            Сообщить("Вы находитесь в ячейке: (" + СтарыйНомерСтроки + ", " + СтарыйНомерКолонки + ")");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Использование внешней компоненты FormEx (профессиональный подход)

Для тех, кто хочет добиться идеального поведения интерфейса, лучшим решением будет использование компоненты FormEx. Она позволяет перехватывать события мыши и клавиатуры напрямую. Разберем пример, как отловить событие ПриОтжатииЛевойКнопки.

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


// Это событие вызывается компонентой FormEx автоматически
Процедура ПриОтжатииЛевойКнопки(СостояниеМыши, ГорКоордината, Вер Координата, ФСО)
    // Метод ТекущаяКолонка() для ТЗ возвращает ИДЕНТИФИКАТОР колонки
    ИдКолонки = ТЗ.ТекущаяКолонка();
    НомСтроки = ТЗ.ТекущаяСтрока();
    
    Если НомСтроки > 0 Тогда
        // Вызываем процедуру обработки данных
        ОбработатьКлик(НомСтроки, ИдКолонки);
    КонецЕсли;
КонецПроцедуры

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

Метод 4. Трюк с использованием функции Шаблон()

Проанализируем интересный программный прием, упомянутый опытными разработчиками. Функция Шаблон() (или ValueToStringInternal в некоторых контекстах) позволяет выполнять код динамически. В сочетании с FormEx это дает мощный инструмент для создания универсальных обработчиков.

Например, если у вас много колонок и для каждой нужно свое действие, вместо длинных конструкций Если...ИначеЕсли можно использовать такой подход:


Процедура ОбработатьКлик(пСтрока, пКолонка)
    // Предположим, у нас есть функции ВыполнитьДействие_Цена(), ВыполнитьДействие_Количество()
    Попытка
        Результат = Шаблон("[ВыполнитьДействие_" + пКолонка + "(" + пСтрока + ")]");
    Исключение
        // Если функции для колонки нет, ничего не делаем
    КонецПопытки;
КонецПроцедуры

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

Особенности работы с текущей колонкой в ТЗ

Выясним важную техническую деталь, на которой часто спотыкаются новички. Метод ТекущаяКолонка() в 1С 7.7 ведет себя по-разному в зависимости от контекста:

Использование 1С++ и класса ТабличноеПоле

Если стандартная Таблица Значений категорически не подходит под ваши задачи, рассмотрим вариант замены её на объект ТабличноеПоле из библиотеки 1С++. Это превращает таблицу в полноценный ActiveX-объект, который обладает всеми необходимыми событиями:

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

Подведем итог: для быстрого решения «малой кровью» используйте текстовый реквизит с формулой. Если же вам нужен полный контроль над действиями пользователя и мгновенная реакция на мышь — ставьте FormEx и перехватывайте события нажатия кнопок. Это позволит вашей программе выглядеть и работать гораздо современнее.

← На главную