Как в журнале документов 1С 7.7 перехватить открытие документа и открыть связанный объект

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 7.7 (так называемых «клюшках») часто возникает задача кастомизации поведения стандартных интерфейсов. Типичный пример: в журнале документов при двойном клике на строку или нажатии клавиши Enter необходимо открывать не текущий документ, а связанный с ним объект (например, из «Заявки» сразу переходить к «Заказу»).

Рассмотрим подробно, как реализовать этот механизм правильно, какие стандартные процедуры платформы для этого предназначены и на что стоит обратить внимание, чтобы не нарушить общую логику работы программы.

Способ 1. Использование процедуры ПриВыбореСтроки (Рекомендуемый)

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

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

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


Процедура ПриОткрытии()   
    // Включаем режим программной обработки выбора строки
    Форма.ОбработкаВыбораСтроки(1);
КонецПроцедуры    

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

Важный нюанс: если вы установили ОбработкаВыбораСтроки(1), то стандартное действие (открытие формы) отключается. Если вы не пропишете ОткрытьФорму(ТекущийДокумент) в блоке Иначе, то при двойном клике на документ, не попадающий под условия подмены, вообще ничего не произойдет.

Способ 2. Перехват в форме самого документа

Существует альтернативный вариант: позволить системе открыть основной документ, но мгновенно закрыть его и открыть связанный. Этот метод менее предпочтителен, так как пользователь может увидеть «мерцание» открывающегося и закрывающегося окна, однако в некоторых архитектурных ситуациях он может быть полезен.

Рассмотрим код для модуля формы документа Заявка:


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

Использование СтатусВозврата(0) внутри ПриОткрытии() — это стандартный способ 1С 7.7 прервать создание или открытие окна.

Тонкости и проверка данных

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

  1. Проверка «битых» ссылок: Перед вызовом ОткрытьФорму() всегда проверяйте объект методом Выбран(). Если в базе данных осталась ссылка на удаленный документ, попытка открытия вызовет системную ошибку.
  2. Права доступа: В 1С 7.7 попытка программно открыть форму документа, на который у пользователя нет прав (в наборе прав не стоит галочка «Просмотр»), приведет к ошибке. Рекомендуется использовать встроенные средства проверки прав, если конфигурация это позволяет.
  3. Клавиша Enter: Метод с ПриВыбореСтроки() хорош тем, что он перехватывает и мышь, и клавиатуру. Это сохраняет единообразие интерфейса для опытных пользователей, работающих без мыши.
  4. Контекст выбора: Обратите внимание на функцию Форма.РежимВыбора(). Если пользователь открыл журнал, чтобы выбрать документ в поле другого документа (например, подбор), ваша подмена может помешать нормальной работе. Поэтому всегда проверяйте, не находится ли журнал в режиме выбора.

Использование внешних компонент (FormEx)

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

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

Заключение

Мы проанализировали два основных способа перехвата открытия документа. Метод через форму журнала является более чистым и профессиональным, так как он предотвращает лишние действия системы по инициализации формы «ненужного» в данный момент документа. Метод через форму документа проще в реализации, если доступ к журналу ограничен или логика подмены должна работать из любого места системы, где открывается этот документ.

← На главную