Как в форме списка документа по двойному клику на колонку выполнить свое действие вместо открытия?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Реализация перехвата в обычных формах

Для обычной формы списка документов перехват двойного клика реализуется через событие таблицы Выбор. Посмотрим на алгоритм работы обработчика:

  1. Проверяем, не открыта ли форма в режиме выбора (свойство ЭтаФорма.РежимВыбора). Если форма вызвана для подбора или выбора значения в другое поле, стандартное поведение обычно прерывать не требуется.
  2. Анализируем имя колонки, по которой кликнул пользователь, через параметр Колонка.Имя.
  3. Если клик произошел по требуемой колонке, выполняем необходимую логику.
  4. Устанавливаем параметр СтандартнаяОбработка = Ложь. Это ключевой момент, сообщающий платформе, что стандартное действие (открытие карточки документа) выполнять не нужно.

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


Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    Если ЭтаФорма.РежимВыбора Тогда
        Возврат;
    КонецЕсли;

    Если Колонка.Имя = "Картинка" Тогда
        // Выполняем требуемое действие вместо открытия формы документа
        ДействияФормыСтруктураПодчиненностиДокумента(Неопределено);
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Реализация перехвата в управляемых формах

В управляемом интерфейсе логика строится аналогичным образом, но состав параметров обработчика события Выбор таблицы формы отличается: вместо параметра Колонка используется Поле.

Разберем сигнатуру события управляемой таблицы: (Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка). Имя поля проверяется через свойство Поле.Имя.

Рассмотрим пример клиентского обработчика события:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    Если Поле.Имя = "ФлагПроверен" Тогда
        СтандартнаяОбработка = Ложь;
        ИзменитьФлагНаСервере(ВыбраннаяСтрока);
        ОповеститьОбИзменении(ВыбраннаяСтрока);
    КонецЕсли;
КонецПроцедуры

Особенности изменения данных документа из формы списка

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

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

  1. На сервере получаем объект документа по ссылке из переменной ВыбраннаяСтрока с помощью метода ВыбраннаяСтрока.ПолучитьОбъект().
  2. Меняем значение требуемого реквизита на противоположное (инвертируем булево значение).
  3. Вызываем метод Записать(). Важно: операцию записи обязательно помещаем в конструкцию Попытка ... Исключение, так как документ может быть заблокирован другим пользователем или недоступен для изменения из-за даты запрета редактирования.
  4. После возврата управления на клиент обновляем отображение строки с помощью вызова ОповеститьОбИзменении(ВыбраннаяСтрока) или метода Элементы.Список.Обновить().

Посмотрим на пример серверной процедуры:


&НаСервере
Процедура ИзменитьФлагНаСервере(СсылкаНаДокумент)
    Попытка
        ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
        Если ДокументОбъект <> Неопределено Тогда
            ДокументОбъект.ФлагПроверен = Не ДокументОбъект.ФлагПроверен;
            ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
    Исключение
        ВызватьИсключение "Не удалось изменить признак: " + ОписаниеОшибки();
    КонецПопытки;
КонецПроцедуры

Альтернативные архитектурные решения

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

В таких случаях рекомендуется использовать альтернативные подходы:

  1. Хранение статуса в регистре сведений: создаем независимый регистр сведений, где измерением выступает документ, а ресурсом — наш флаг. В динамическом списке выводим флаг через левое соединение запроса. При двойном клике меняем только запись в регистре, не затрагивая сам документ.
  2. Командная панель и горячие клавиши: вместо двойного клика по ячейке можно вынести действие на отдельную кнопку командной панели формы (или контекстного меню) и привязать к ней клавишу быстрого вызова (например, Пробел). Это существенно ускоряет работу пользователя при пакетной обработке строк.
← На главную