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

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Метод 1: Использование предопределенной процедуры ПриНачалеРедактированияСтроки()

Рассмотрим самый простой, штатный способ. Если документ открыт в режиме редактирования, платформа предоставляет нам стандартное событие, которое срабатывает при попытке изменить строку (в том числе по двойному клику). Разберем, как его использовать:

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


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

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

Метод 2: Перехват событий через FormEx (режим чтения)

Проанализируем ситуацию, когда нам крайне важно дать пользователю возможность кликнуть по ячейке "на лету", не переводя весь документ в режим редактирования. Это часто требуется для АРМ (автоматизированных рабочих мест), где из формы прихода нужно быстро поправить реквизиты номенклатуры (например, штрихкод или модель). Здесь нам на помощь приходит внешняя компонента FormEx.

Выясним, как работает этот механизм. FormEx позволяет перехватывать системные сообщения Windows (события мыши) до того, как их обработает ядро 1С. Разберем реализацию по шагам:

  1. Убедимся, что компонента FormEx.dll загружена в систему (обычно в ПриНачалеРаботыСистемы).
  2. В модуле формы документа создадим объект расширения формы.
  3. Опишем процедуру ПриДвойномНажатииЛевойКнопки.

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


Процедура ПриДвойномНажатииЛевойКнопки(Состояние, Х, У, ФСО)
    // Создаем объект расширения формы для доступа к координатам
    ФормаРасш = СоздатьОбъект("РасширениеФормы");
    
    // Получаем атрибут формы, по которому кликнули
    Атрибут = ФормаРасш.ПолучитьАтрибутПоКоординатам(Х, У);
    
    // Проверяем, что клик пришелся на табличную часть
    // В 1С 7.7 идентификатор многострочной части обычно пустой или "МногострочнаяЧасть"
    Если (Атрибут.Идентификатор = "") ИЛИ (Атрибут.Идентификатор = "МногострочнаяЧасть") Тогда
        // Просим FormEx установить фокус на ячейку по координатам пикселей
        ФормаРасш.УстановитьТекущуюЯчейку("МногострочнаяЧасть", Х, У);
        
        Колонка = Форма.ТекущаяКолонка();
        НомерСтрокиДок = НомерСтроки; // Получаем номер строки документа
        
        Если Колонка = "Штрихкод" Тогда
            // Выполняем логику редактирования реквизита товара
            ОбработатьВводШтрихкода(Товар);
            // Предотвращаем стандартную реакцию 1С (если она была)
            ФСО = 0;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: использование метода ПолучитьАтрибутПоКоординатам позволяет игнорировать статус ТолькоПросмотр. Это дает колоссальное преимущество в производительности труда: менеджер не тратит время на открытие справочников, поиск позиций и лишние нажатия кнопок "ОК".

Метод 3: Открытие формы в режиме редактирования с программными ограничениями

Рассмотрим альтернативный "архитектурный" подход, который предложили опытные участники обсуждения. Если вы не хотите использовать внешние ВК, можно пойти на хитрость. Мы даем пользователю права на запись документа, но программно запрещаем ему менять критические данные.

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

  1. В процедуре ПриОткрытии() принудительно устанавливаем Форма.ТолькоПросмотр(0).
  2. Для всех колонок табличной части, кроме целевых (например, "Модель"), устанавливаем свойство "Только просмотр" в конфигураторе.
  3. В модуле документа в процедуре ПриЗаписи() проверяем, не изменились ли важные реквизиты (сумма, количество, склад).

Этот метод позволяет использовать штатную формулу в свойствах колонки. Выясним, как это настроить: в свойствах колонки табличной части на закладке "Дополнительно" в поле "Формула" вписываем название функции, например РедактироватьПоле(). Теперь при клике по ячейке будет вызываться ваша логика.

Метод 4: Использование объекта "ТабличноеПоле" из 1С++

Проанализируем самый продвинутый вариант. Если ваш интерфейс требует сложной раскраски, иерархии или специфических реакций на мышь, стандартная многострочная часть 1С 7.7 (МСЧ) может оказаться слишком "убогой". В этом случае рекомендуется использовать объект ТабличноеПоле из состава внешней компоненты 1С++.

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

Пример инициализации перехвата событий в 1С++:


// В процедуре ПриОткрытии
ТП = СоздатьОбъект("ТабличноеПоле");
ТП.УстановитьСобытие("OnDblClick", "ПриДвойномКликеПоТП");

Выводы и рекомендации

Выясним причину споров в сообществе: многие программисты считают, что документ — это регистратор хозяйственной операции, и он не должен использоваться как АРМ для редактирования справочников. Однако практика показывает, что для бизнеса скорость ввода данных является приоритетом.

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

Помните, что любая автоматизация должна быть обоснована. Если менеджер тратит 10 минут на поиск товара в справочнике вместо одного клика в документе — это повод применить один из разобранных нами методов.

← На главную