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