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

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

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

Переопределение кнопки выбора в поле диалога формы

Для управления стандартным процессопом выбора значения в платформе 1С 7.7 предусмотрена предопределенная процедура ПриНачалеВыбораЗначения(), которая размещается в модуле формы. Проанализируем ее синтаксис:

ПриНачалеВыбораЗначения(<ИдентЭлемДиалога>, <ФлагСтандОбр>)

  1. <ИдентЭлемДиалога> — строковый идентификатор элемента диалога формы, в котором была нажата кнопка выбора.
  2. <ФлагСтандОбр> — признак выполнения стандартного действия платформы. По умолчанию параметр равен 1. Если в теле процедуры присвоить ему значение 0, то штатный диалог выбора (например, журнал документов или список справочника) открываться не будет.

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


Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
    Если ИдентЭлемДиалога = "ТвойРеквизит" Тогда
        Если ПустоеЗначение(ТвойРеквизит) = 0 Тогда
            ФлагСтандОбр = 0;
            ОткрытьФорму(ТвойРеквизит);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Рассмотрим подробнее важную коллизию данного подхода. Если мы безусловно сбрасываем флаг стандартной обработки (ФлагСтандОбр = 0) всякий раз, когда поле заполнено, пользователь теряет возможность интерактивно заменить значение другим документом через стандартную «педальку». Чтобы решить эту проблему, можно применить один из следующих приемов:

  1. Очистка реквизита перед выбором: пользователь предварительно очищает значение клавишами Delete или Backspace. При пустом реквизите условие ПустоеЗначение(ТвойРеквизит) = 0 не сработает, флаг останется равен 1, и откроется стандартный выбор.
  2. Интерактивный диалог: при клике вывести пользователю вопрос функцией Вопрос("Открыть документ или выбрать другой?", "Открыть+Выбрать+Отмена"). В зависимости от ответа мы либо сбрасываем флаг и вызываем ОткрытьФорму(), либо оставляем стандартное поведение.
  3. Разделение элементов управления: оставить штатную кнопку выбора без вмешательства в код, а рядом с полем ввода добавить небольшую кнопку (например, со стрелкой «>>»), в формуле которой прописать открытие формы документа.

Открытие документа из определенной колонки в форме списка

Теперь разберем вторую ситуацию: на форме списка справочника (например, «АрхивТТН») есть табличная часть списка, содержащая реквизит «Документ». Задача заключается в том, чтобы при выборе строки в этой колонке открывался документ, а при выборе в любой другой колонке — открывался сам элемент справочника.

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

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


Процедура ПриОткрытии()
    Форма.ОбработкаВыбораСтроки(1);
КонецПроцедуры

Далее напишем обработчик выбора строки. В нем мы проверим активную колонку с помощью Форма.ТекущаяКолонка() и учтем все ключевые проверки:


Процедура ПриВыбореСтроки()
    // Проверяем, выбрана ли реальная строка (защита от кликов по пустому списку)
    Если Выбран() = 0 Тогда
        Возврат;
    КонецЕсли;

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

Важные замечания и ограничения платформы 1С 7.7

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