При интерактивной работе со списками документов в 1С стандартное поведение платформы при двойном щелчке мыши по строке — открытие карточки документа (формы документа) или выбор значения, если форма открыта для выбора. Однако часто возникает задача переопределить это поведение: например, по двойному клику на определенный столбец переключать признак-флажок, открывать связанный отчет, открывать структуру подчиненности или запускать обработку текущей строки без открытия самого документа.
Разберем подробно, как реализовать такой перехват в обычных и управляемых формах, а также рассмотрим особенности изменения данных документа непосредственно из списка.
Для обычной формы списка документов перехват двойного клика реализуется через событие таблицы Выбор. Посмотрим на алгоритм работы обработчика:
ЭтаФорма.РежимВыбора). Если форма вызвана для подбора или выбора значения в другое поле, стандартное поведение обычно прерывать не требуется.Колонка.Имя.СтандартнаяОбработка = Ложь. Это ключевой момент, сообщающий платформе, что стандартное действие (открытие карточки документа) выполнять не нужно.Посмотрим на пример кода обработчика события в модуле обычной формы:
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
Если ЭтаФорма.РежимВыбора Тогда
Возврат;
КонецЕсли;
Если Колонка.Имя = "Картинка" Тогда
// Выполняем требуемое действие вместо открытия формы документа
ДействияФормыСтруктураПодчиненностиДокумента(Неопределено);
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
В управляемом интерфейсе логика строится аналогичным образом, но состав параметров обработчика события Выбор таблицы формы отличается: вместо параметра Колонка используется Поле.
Разберем сигнатуру события управляемой таблицы: (Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка). Имя поля проверяется через свойство Поле.Имя.
Рассмотрим пример клиентского обработчика события:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = "ФлагПроверен" Тогда
СтандартнаяОбработка = Ложь;
ИзменитьФлагНаСервере(ВыбраннаяСтрока);
ОповеститьОбИзменении(ВыбраннаяСтрока);
КонецЕсли;
КонецПроцедуры
Проанализируем частый сценарий, когда в списке требуется переключать флажок (булево значение). В управляемых формах таблица списка обычно связана с объектом ДинамическийСписок, данные которого предназначены исключительно для чтения. Напрямую отредактировать ячейку в строке списка невозможно — требуется перезапись объекта в базе данных.
Разберем по шагам, как правильно выполнить изменение реквизита на сервере:
ВыбраннаяСтрока с помощью метода ВыбраннаяСтрока.ПолучитьОбъект().Записать(). Важно: операцию записи обязательно помещаем в конструкцию Попытка ... Исключение, так как документ может быть заблокирован другим пользователем или недоступен для изменения из-за даты запрета редактирования.ОповеститьОбИзменении(ВыбраннаяСтрока) или метода Элементы.Список.Обновить().Посмотрим на пример серверной процедуры:
&НаСервере
Процедура ИзменитьФлагНаСервере(СсылкаНаДокумент)
Попытка
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокументОбъект <> Неопределено Тогда
ДокументОбъект.ФлагПроверен = Не ДокументОбъект.ФлагПроверен;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Исключение
ВызватьИсключение "Не удалось изменить признак: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Если флажок в форме списка носит чисто служебный характер (например, «Проверено», «Распечатано», «В работе»), перезапись самого документа является не лучшим решением. Простая запись проведенного документа может вызывать повторное проведение, очистку движений, создание лишних версий в истории и ошибки контроля прав доступа.
В таких случаях рекомендуется использовать альтернативные подходы:
Пробел). Это существенно ускоряет работу пользователя при пакетной обработке строк.