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

Программист 1С v7.7
← На главную

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

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

  1. Изменить реакцию на двойной клик по строке списка (вместо открытия элемента для редактирования – выполнить выбор).
  2. Скрыть или показать определенные элементы управления (например, кнопки "Изменить", "Добавить" в режиме выбора могут быть неактуальны, а кнопка "Выбрать" – наоборот, необходима).
  3. Установить дополнительные отборы или параметры, специфичные для процесса выбора.
  4. Вернуть выбранное значение в вызывающую форму.

Без четкого понимания текущего режима работы формы, нам пришлось бы прибегать к неочевидным или ненадежным методам, таким как анализ заголовка формы или передача дополнительных флагов через параметры, что усложняет код и снижает его надежность. Однако, в 1С 7.7 существует штатный, элегантный способ решения этой задачи, который мы с вами подробно разберем.

Штатный метод Форма.РежимВыбора()

Для определения режима открытия формы списка в 1С:Предприятие 7.7 разработчики платформы предусмотрели специальный метод объекта Форма – РежимВыбора(). Этот метод является наиболее надежным и рекомендуемым способом получения информации о текущем режиме работы формы. Он возвращает булево значение:

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

Рассмотрим пример простейшего использования метода РежимВыбора():


// В модуле формы списка справочника

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

Обратите внимание, что в 1С 7.7 булево значение Истина часто соответствует числовому значению 1, а Ложь – 0. Поэтому проверка Форма.РежимВыбора() = 1 является корректной.

Открытие формы в режиме выбора: механизм

Чтобы метод Форма.РежимВыбора() вернул Истина, форма должна быть открыта с соответствующим указанием режима. В 1С 7.7 существует несколько способов открытия форм, которые могут активировать режим выбора:

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

Рассмотрим пример открытия формы списка справочника "Товары" для выбора:


// В модуле вызывающей формы (например, формы документа)

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

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

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

Практическое применение РежимВыбора()

Теперь, когда мы знаем, как определить режим открытия формы, давайте рассмотрим, как это знание можно применить для создания по-настоящему удобных и функциональных форм списков.

Изменение поведения при двойном клике

Стандартное поведение формы списка справочника при двойном клике (или нажатии клавиши Enter) по строке – это открытие элемента для редактирования. В режиме выбора такое поведение не всегда желательно; чаще всего мы хотим, чтобы двойной клик приводил к выбору элемента и закрытию формы. Метод РежимВыбора() позволяет нам легко реализовать эту логику.

Мы будем использовать процедуру ПриВыбореСтроки(), которая вызывается при двойном клике на элементе списка или нажатии Enter.


// В модуле формы списка справочника "Товары"

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

В этом примере ТекущийЭлемент() возвращает ссылку на элемент справочника, на котором установлен курсор. Если форма находится в режиме выбора, мы вызываем Форма.ВыполнитьВыбор() для возврата значения. В противном случае, мы открываем форму элемента для редактирования.

Настройка элементов управления

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

Изменять видимость и доступность элементов формы удобнее всего в процедуре ПриОткрытии() формы, так как она выполняется один раз при загрузке формы.


// В модуле формы списка справочника

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

        // Показываем кнопку "Выбрать", если она была скрыта, или добавляем ее
        // Если кнопка "Выбрать" уже существует на форме и имеет имя "КнопкаВыбрать"
        КнопкаВыбрать.Видимость(1);
        КнопкаВыбрать.Текст("Выбрать"); // Можем изменить текст кнопки

        // Если кнопки "Выбрать" нет, мы можем добавить ее динамически (более сложный вариант)
        // или использовать существующую кнопку, изменив ее действие.
    Иначе
        // Обычный режим:
        КнопкаДобавить.Видимость(1);
        КнопкаИзменить.Видимость(1);
        КнопкаВыбрать.Видимость(0); // Скрываем кнопку "Выбрать"
    КонецЕсли;
КонецПроцедуры

// Также можем добавить обработчик для кнопки "Выбрать"
Процедура КнопкаВыбратьНажатие()
    Если Форма.РежимВыбора() = 1 Тогда
        Форма.ВыполнитьВыбор(ТекущийЭлемент());
    КонецЕсли;
КонецПроцедуры

В этом примере мы демонстрируем, как можно управлять видимостью элементов. Важно убедиться, что у вас на форме есть элементы управления с соответствующими именами, например, "КнопкаДобавить", "КнопкаИзменить" и "КнопкаВыбрать".

Установка отборов и начальных значений

При открытии формы для выбора часто требуется установить определенные отборы, чтобы пользователь видел только релевантные элементы. Например, при выборе товаров для документа "Поступление" нам могут быть интересны только товары, у которых есть остатки на складе, или товары определенной группы. Такие параметры обычно передаются в открываемую форму через объект Форма.Параметр.

Мы можем комбинировать проверку Форма.РежимВыбора() с анализом Форма.Параметр для более тонкой настройки отборов.

Сначала, в вызывающей форме, мы передаем необходимые параметры:


// В модуле вызывающей формы (например, формы документа)

Процедура КнопкаВыбратьТоварПоГруппеНажатие()
    Перем Параметры;
    Параметры = СоздатьОбъект("СписокЗначений");
    Параметры.Добавить("Мебель", "Группа"); // Передаем группу "Мебель"

    Перем ВыбранныйТовар;
    ВыбранныйТовар = ОткрытьФорму("Справочник.Товары", Параметры);

    Если ТипЗначения(ВыбранныйТовар) = 9 Тогда // Проверка, что выбран элемент справочника (Тип 9 для СправочникЭлемент в 7.7)
        Сообщить("Выбран товар: " + ВыбранныйТовар.Наименование);
    КонецЕсли;
КонецПроцедуры

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


// В модуле формы списка справочника "Товары"

Процедура ПриОткрытии()
    Если Форма.РежимВыбора() = 1 Тогда
        // Форма открыта для выбора, теперь смотрим параметры
        Если ТипЗначения(Форма.Параметр) = 11 Тогда // Проверка, что Параметр - СписокЗначений (Тип 11)
            Если Форма.Параметр.Найти("Группа") <> 0 Тогда
                Перем ЗначениеГруппы;
                ЗначениеГруппы = Форма.Параметр.Получить("Группа");
                // Устанавливаем отбор по группе
                УстановитьОтбор("Родитель", ЗначениеГруппы);
                // Отметьте, что "ЗначениеГруппы" должно быть ссылкой на элемент группы,
                // а не просто строкой "Мебель". В реальном коде мы бы передавали
                // объект справочника "ГруппыТоваров".
                // Например, если Параметры.Добавить(СпрГруппы.НайтиПоНаименованию("Мебель"), "Группа");
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    // ... дальнейшая логика, например, настройка видимости кнопок ...
КонецПроцедуры

Таким образом, мы видим, что Форма.РежимВыбора() является мощным инструментом для адаптации формы к различным сценариям использования, особенно в сочетании с механизмом передачи параметров.

Возврат выбранного значения: Форма.ВыполнитьВыбор()

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

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

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


// В модуле формы списка справочника "Товары"

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

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

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

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

Важность Синтакс-Помощника (СП)

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

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

Мы настоятельно рекомендуем вам регулярно обращаться к Синтакс-Помощнику. Это не только ускорит процесс разработки, но и поможет вам писать более корректный, эффективный и поддерживаемый код, используя стандартные и проверенные механизмы платформы.

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

Помните, что освоение Синтакс-Помощника – это один из ключевых навыков грамотного разработчика 1С 7.7.

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

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

← На главную