При разработке конфигураций в системе 1С:Предприятие 7.7 мы часто сталкиваемся с необходимостью использовать одну и ту же форму списка справочника для выполнения различных задач. Например, форма списка может быть открыта просто для просмотра и редактирования элементов справочника, а может быть вызвана из другого документа или обработки для выбора одного или нескольких элементов. В таких случаях перед нами встает вопрос: как в модуле формы списка программно определить, в каком режиме она была открыта – обычно или для выбора?
Необходимость такого определения обусловлена тем, что поведение формы в зависимости от режима может значительно отличаться. В режиме выбора нам, как правило, требуется:
Без четкого понимания текущего режима работы формы, нам пришлось бы прибегать к неочевидным или ненадежным методам, таким как анализ заголовка формы или передача дополнительных флагов через параметры, что усложняет код и снижает его надежность. Однако, в 1С 7.7 существует штатный, элегантный способ решения этой задачи, который мы с вами подробно разберем.
Форма.РежимВыбора()Для определения режима открытия формы списка в 1С:Предприятие 7.7 разработчики платформы предусмотрели специальный метод объекта Форма – РежимВыбора(). Этот метод является наиболее надежным и рекомендуемым способом получения информации о текущем режиме работы формы. Он возвращает булево значение:
Истина, если форма была открыта в режиме выбора.Ложь, если форма была открыта в обычном режиме (для просмотра или редактирования).Использование этого метода позволяет нам создать гибкую и адаптивную форму списка, которая автоматически подстраивает свое поведение под текущую задачу. Например, мы можем применить этот метод в процедуре ПриОткрытии() формы, чтобы выполнить первоначальную настройку, или в процедуре обработки выбора строки для модификации реакции на действия пользователя.
Рассмотрим пример простейшего использования метода РежимВыбора():
// В модуле формы списка справочника
Процедура ПриОткрытии()
Если Форма.РежимВыбора() = 1 Тогда
Сообщить("Форма открыта в режиме выбора.");
// Здесь можно изменить видимость кнопок, установить отборы и т.д.
Иначе
Сообщить("Форма открыта в обычном режиме.");
// Здесь можно выполнить настройки для обычного режима
КонецЕсли;
КонецПроцедуры
Обратите внимание, что в 1С 7.7 булево значение Истина часто соответствует числовому значению 1, а Ложь – 0. Поэтому проверка Форма.РежимВыбора() = 1 является корректной.
Чтобы метод Форма.РежимВыбора() вернул Истина, форма должна быть открыта с соответствующим указанием режима. В 1С 7.7 существует несколько способов открытия форм, которые могут активировать режим выбора:
ОткрытьФорму() с параметрами: Это наиболее общий способ. Мы можем открыть форму списка справочника, явно указав режим просмотра или редактирования. Для режима выбора часто используются дополнительные параметры, которые сигнализируют системе о том, что форма открывается для выбора. Однако, сам метод ОткрытьФорму() напрямую не устанавливает "режим выбора" в том смысле, в котором его понимает Форма.РежимВыбора(). Режим выбора активируется, когда форма вызывается из поля ввода, для которого необходимо выбрать значение, или когда используется специализированный метод, как описано ниже.ОткрытьПодбор(): Этот специализированный метод предназначен именно для открытия формы в режиме подбора элементов. Когда вы используете ОткрытьПодбор(), платформа 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, независимо от того, в каком режиме они открыты.