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