В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничением стандартного объекта Таблица (Moxel), размещенного на форме. В отличие от современных версий 1С (8.x), где существуют встроенные события ПриАктивизацииЯчейки, «семерка» не предоставляет штатных средств для динамического отслеживания перемещения курсора по ячейкам табличного документа. Это создает сложности, например, когда нужно вывести содержимое длинного текста из текущей ячейки в отдельное поле на форме или обновить связанные данные при навигации пользователя.
В данной статье мы подробно разберем, как обойти это ограничение, используя популярные внешние компоненты и технические приемы, накопленные сообществом за годы эксплуатации платформы.
Разберем типичную ситуацию: программист пытается назначить формулу на ячейку таблицы или повесить функцию на текстовый элемент формы. Однако стандартный механизм 1С 7.7 пересчитывает формулы на форме только при возникновении определенных событий, таких как нажатие кнопок, выбор из списка или полное обновление контекста формы. Простое перемещение курсора клавишами со стрелками или клик мышью по соседней ячейке таблицы не вызывает пересчет формул. Таким образом, отследить «движение по ТД» (табличному документу) стандартными средствами практически невозможно.
Библиотека FormEx является де-факто стандартом для расширения возможностей интерфейса 1С 7.7. Рассмотрим, как с ее помощью реализовать нашу задачу. Основная идея заключается в перехвате событий клавиатуры и мыши через объект РасширениеФормы.
Проанализируем алгоритм действий:
ТекущаяОбласть().Пример логики на языке 1С 7.7 (с использованием FormEx):
// В процедуре ПриОткрытии()
Сервис = СоздатьОбъект("Сервис");
Расширение = СоздатьОбъект("РасширениеФормы");
// Примерная схема обработки события нажатия клавиши
Процедура ПослеНажатияКлавиши(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
Если (КодКлавиши >= 37) И (КодКлавиши <= 40) Тогда // Стрелки
Обл = Таб.ТекущаяОбласть();
ТекСтр = Обл.Верх;
ТекКол = Обл.Лево;
// Теперь мы знаем координаты и можем вывести значение
ЗначениеВПоле = Таб.Область(ТекСтр, ТекКол).Текст;
КонецЕсли;
КонецПроцедуры
Также FormEx позволяет запустить «таймер», который будет с определенной периодичностью проверять координаты текущей области таблицы. Хотя это создает небольшую нагрузку на систему, для пользователя это выглядит как мгновенная реакция интерфейса.
Специализированная библиотека TableDoc.dll была разработана именно для того, чтобы превратить обычную таблицу 1С в полноценный элемент управления, близкий по возможностям к MS Excel. Она добавляет объекту «Таблица» свойства и методы, позволяющие напрямую получать индекс активной ячейки и реагировать на её изменение.
Рассмотрим преимущества этого метода:
Если проект позволяет внести более серьезные изменения, мы рекомендуем рассмотреть Йоксель. Это мощный аналог табличного документа для 1С 7.7. Он полностью заменяет штатный moxel и предоставляет разработчику богатый набор событий.
Выясним, как решается задача в Йокселе:
В этом компоненте существует встроенное событие ПослеСменыАктивнойЯчейки. Вам достаточно прописать обработчик, который будет срабатывать автоматически при любом перемещении пользователя по таблице.
Процедура ТаблицаПослеСменыАктивнойЯчейки(Контекст, Стр, Кол)
// Стр и Кол - это уже готовые координаты новой ячейки
Сообщить("Вы перешли на строку: " + Стр + ", колонку: " + Кол);
ЗначениеДляВывода = Таблица.Клетка(Стр, Кол).Текст;
КонецПроцедуры
Этот способ является самым надежным и современным (в рамках 7.7), так как он не полагается на низкоуровневый перехват сообщений Windows, а работает на уровне событий самого элемента управления.
Если задача заключается только в том, чтобы дать пользователю возможность увидеть содержимое ячейки, которое не помещается по ширине, можно использовать штатный механизм Расшифровки. Рассмотрим этот вариант подробнее:
ОбработкаЯчейкиТаблицы(Значение, Флаг, Таблица, Адрес) можно перехватить этот клик и вывести значение в специальное информационное окно или поле на форме.Хотя этот метод не является «автоматическим при навигации», он не требует подключения внешних DLL, что критично для закрытых корпоративных сред.
Для наиболее продвинутых задач можно использовать класс Окна из библиотеки 1С++. Проанализируем этот подход:
Каждое действие пользователя (клик, нажатие клавиши) генерирует системное сообщение (например, WM_LBUTTONDOWN или WM_KEYDOWN). С помощью 1С++ можно «подписаться» на эти сообщения, приходящие в окно таблицы. В момент получения такого сообщения программно вызывается ТекущаяОбласть(), и данные на форме обновляются.
Мы рассмотрели несколько способов отслеживания активной ячейки в 1С 7.7. Подведем итоги:
Выбор конкретного метода зависит от архитектуры вашей конфигурации и готовности использовать сторонние библиотеки.