Работа с формами в 1С:Предприятие 8.3 — одна из ключевых задач как для разработчиков, так и для опытных пользователей. Режим выбора формы позволяет гибко управлять взаимодействием с объектами конфигурации, но часто вызывает вопросы у новичков. В этой статье мы разберём все способы открытия форм в режиме выбора, включая программные методы, настройки конфигуратора и нюансы работы с разными типами объектов.
Особое внимание уделим практическим примерам — от простого открытия справочника до сложных сценариев с передачей параметров и обработкой результатов. Вы узнаете, как избежать типичных ошибок, почему форма может не открываться, и как адаптировать код под разные версии платформы. Материал будет полезен как начинающим 1С-программистам, так и специалистам, которые хотят систематизировать свои знания.
Что такое режим выбора в 1С и зачем он нужен
Режим выбора в 1С:Предприятие — это специальный режим открытия формы, при котором пользователь может выбрать один или несколько элементов из списка (например, номенклатуру, контрагента или документ) и передать их в основную форму. Этот механизм широко используется для:
- 📌 Заполнения реквизитов — когда нужно выбрать значение из справочника (например, "Контрагент" в документе "Реализация").
- 🔄 Межформенного взаимодействия — передача данных между формами без прямого редактирования.
- 📊 Фильтрации данных — выбор элементов для отчётов или обработок.
- 🔧 Автоматизации процессов — когда выбор пользователя запускает дальнейшие действия (например, печать документа).
Основное отличие режима выбора от обычного открытия формы — наличие кнопки Выбрать и возможность возвращать выбранные данные в вызывающую форму. Например, при выборе номенклатуры в документе "Поступление товаров" пользователь видит список товаров, выбирает нужный и возвращается к заполнению документа с автоматически подставленным значением.
Если форма открывается в режиме выбора, но кнопка "Выбрать" неактивна, проверьте настройки прав доступа — возможно, у пользователя нет прав на чтение данных из этого справочника.
Способы открытия формы в режиме выбора
В 1С:Предприятие 8.3 есть несколько способов открыть форму в режиме выбора. Выбор метода зависит от задачи, уровня доступа и версий платформы. Рассмотрим основные подходы:
1. Через конфигуратор (для разработчиков)
Самый гибкий способ — программное открытие формы с использованием встроенного языка. Основные методы:
- 📝
ОткрытьФорму()— универсальный метод для открытия любой формы. - 🔹
ОткрытьФормуМодально()— блокирует работу с другими окнами до закрытия текущей формы. - 🔄
ПолучитьФорму()— создаёт форму без её отображения (для дальнейшей настройки).
Пример кода для открытия справочника "Номенклатура" в режиме выбора:
Процедура ОткрытьСправочникНаВыбор()
Результат = ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ЭтотОбъект, Истина);
Если НЕ Результат.ВыбранноеЗначение = Неопределено Тогда
Сообщить("Вы выбрали: " + Результат.ВыбранноеЗначение.Наименование);
КонецЕсли;
КонецПроцедуры
2. Через пользовательский интерфейс (без программирования)
Пользователи без доступа к конфигуратору могут открывать формы в режиме выбора через:
- 🖱️ Контекстное меню — правый клик на реквизите → "Выбрать из списка".
- 🔍 Кнопку лупы рядом с полем ввода (если она активна).
- 📋 Горячие клавиши —
F4илиCtrl+Shift+F4(зависит от настройки).
3. Через внешние обработки
Если стандартные механизмы не подходят, можно создать внешнюю обработку с кастомной логикой выбора. Это актуально для:
- 🔧 Нестандартных фильтров (например, выбор только активных контрагентов).
- 📊 Многокритериального поиска (по нескольким реквизитам одновременно).
- 🔄 Интеграции с другими системами (выбор данных из внешних источников).
Пример: обработка для выбора номенклатуры с фильтром по остаткам на складе.
Пример кода для внешней обработки
Процедура КомандыФормы_ВыполнитьВыбор(Команда)
Фильтр = Новый Структура("ТолькоСОстатками", Истина);
Результат = ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ЭтотОбъект, Истина,, Фильтр);
Если Результат.ВыбранноеЗначение <> Неопределено Тогда
Возврат Результат.ВыбранноеЗначение;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецПроцедуры
Параметры метода ОткрытьФорму() для режима выбора
Метод ОткрытьФорму() — самый универсальный инструмент для работы с формами. Для открытия в режиме выбора используются следующие параметры:
| Параметр | Описание | Пример значения |
|---|---|---|
ИмяФормы |
Имя открываемой формы (например, форма выбора справочника). | "Справочник.Контрагенты.ФормаВыбора" |
ВладелецФормы |
Объект, который будет владельцем формы (обычно ЭтотОбъект). |
ЭтотОбъект |
РежимВыбора |
Флаг, указывающий, что форма открывается для выбора (Истина). |
Истина |
ПараметрыФормы |
Дополнительные параметры (например, фильтры или начальные значения). | Новый Структура("ФильтрПоГруппе", Истина) |
Модальность |
Определяет, будет ли форма модальной (Истина — блокирует другие окна). |
Ложь |
Пример с фильтром по группе справочника:
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ФильтрПоГруппе", Новый Структура("Родитель", Справочники.Номенклатура.НайтиПоНаименованию("Товары")));
Результат = ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ЭтотОбъект, Истина, , ПараметрыФормы);
Если не указать параметр РежимВыбора = Истина, форма откроется в обычном режиме без возможности передачи выбранного значения.
Типичные ошибки и их решения
При работе с формами в режиме выбора разработчики и пользователи часто сталкиваются с типичными проблемами. Рассмотрим самые распространённые из них и способы их устранения:
1. Форма не открывается или открывается в обычном режиме
Причины и решения:
- 🚫 Не указан параметр
РежимВыбора = Истина→ Добавьте его в вызовОткрытьФорму(). - 🔒 Недостаточно прав → Проверьте права пользователя на чтение данных справочника.
- 🔧 Ошибка в имени формы → Убедитесь, что форма существует в конфигурации.
2. Кнопка "Выбрать" неактивна
Это происходит, если:
- 📛 Не задан владелец формы → Передайте
ЭтотОбъектво втором параметре. - 🔄 Форма открыта не в режиме выбора → Проверьте параметр
РежимВыбора. - 🚫 Отсутствуют права на выбор → Настройте роли в конфигураторе.
3. Не передаётся выбранное значение
Частая ошибка — игнорирование возвращаемого значения метода ОткрытьФорму(). Пример правильной обработки:
РезультатВыбора = ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ЭтотОбъект, Истина);
Если РезультатВыбора.ВыбранноеЗначение <> Неопределено Тогда
Сообщить("Выбран: " + РезультатВыбора.ВыбранноеЗначение.Наименование);
Иначе
Сообщить("Выбор отменён пользователем");
КонецЕсли;
Указан ли параметр РежимВыбора = Истина?|Проверены ли права пользователя на чтение данных?|Корректно ли указано имя формы?|Передан ли владелец формы (ЭтотОбъект)?|Обработан ли результат выбора (РезультатВыбора.ВыбранноеЗначение)?-->
Работа с фильтрами и параметрами в режиме выбора
Одной из ключевых возможностей режима выбора является фильтрация данных. Это позволяет сузить список доступных для выбора элементов по заданным критериям. Фильтры передаются через параметр ПараметрыФормы в виде структуры.
Пример фильтрации справочника "Контрагенты" по типу (только "Покупатель"):
Параметры = Новый Структура();
Параметры.Вставить("Фильтр",
Новый Структура("ТипКонтрагента",
Новый Массив(Перечисление.ТипыКонтрагентов.Покупатель)
)
);
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ЭтотОбъект, Истина, , Параметры);
Также можно передавать начальные значения для полей формы. Например, чтобы форма выбора открывалась с предварительно выбранной группой:
Параметры.Вставить("Группа", Справочники.Контрагенты.ПоискПоРеквизиту("ЭтоГруппа", Истина));
Для сложных фильтров используйте объект Запрос — это позволит гибко настраивать условия отбора, включая связь с другими справочниками.
Особенности работы с разными типами объектов
Режим выбора поддерживается для большинства объектов 1С:Предприятие, но есть нюансы в зависимости от типа:
1. Справочники
Самый распространённый случай. Особенности:
- 📚 Поддерживаются иерархические справочники (можно фильтровать по группам).
- 🔍 Доступен поиск по наименованию (клавиша
F3). - 🔄 Можно выбирать несколько элементов (если разрешено в настройках формы).
2. Документы
При выборе документов учитывайте:
- 📅 Можно фильтровать по дате или виду документа.
- 🔒 Часто требуются дополнительные права на просмотр документов.
- 📊 Полезно использовать отбор по статусу (например, только проведённые).
3. Перечисления
Для перечислений режим выбора упрощён:
- 📋 Открывается список всех значений перечисления.
- 🔹 Выбор всегда одиночный (нельзя выбрать несколько значений).
- 🔧 Часто используется для заполнения реквизитов с типом "Перечисление".
Пример открытия формы выбора для перечисления "ВидыНоменклатуры":
Результат = ОткрытьФорму("Перечисление.ВидыНоменклатуры.ФормаВыбора", ЭтотОбъект, Истина);
Как открыть форму выбора для плана видов характеристик (ПВХ)?
Для ПВХ используется тот же подход, что и для справочников, но с указанием имени плана. Пример:
ОткрытьФорму("ПланВидовХарактеристик.Цвета.ФормаВыбора", ЭтотОбъект, Истина);
Практические примеры для разных задач
Рассмотрим несколько реальных сценариев использования режима выбора, которые часто встречаются в работе с 1С:Предприятие.
1. Выбор номенклатуры с учётом остатков
Задача: открыть форму выбора номенклатуры, но показать только те товары, которые есть в наличии на складе.
Процедура ВыбратьНоменклатуруСОстатками()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Ссылка КАК Ссылка
|ИЗ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров
|ГДЕ ОстаткиТоваров.Количество > 0";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СписокДоступнойНоменклатуры = Новый Массив;
Пока Выборка.Следующий() Цикл
СписокДоступнойНоменклатуры.Добавить(Выборка.Ссылка);
КонецЦикла;
Параметры = Новый Структура();
Параметры.Вставить("Фильтр", Новый Структура("Ссылка", СписокДоступнойНоменклатуры));
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ЭтотОбъект, Истина, , Параметры);
КонецПроцедуры
2. Выбор контрагента с проверкой долга
Задача: при выборе контрагента в документе "Реализация" показывать только тех, у кого нет просроченной задолженности.
Процедура ВыбратьКонтрагентаБезДолга()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ Контрагенты.Ссылка КАК Ссылка
|ИЗ Справочник.Контрагенты КАК Контрагенты
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Долги
|ПО Контрагенты.Ссылка = Долги.Контрагент
|ГДЕ Долги.СуммаОстаток <= 0 ИЛИ Долги.Контрагент ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
// Далее аналогично примеру выше: формируем фильтр и открываем форму
КонецПроцедуры
3. Множественный выбор для отчёта
Задача: позволить пользователю выбрать несколько организаций для формирования сводного отчёта.
Процедура ВыбратьНесколькоОрганизаций()
Параметры = Новый Структура();
Параметры.Вставить("РежимВыбораЭлементов", Перечисление.РежимыВыбораЭлементов.Множественный);
Результат = ОткрытьФорму("Справочник.Организации.ФормаВыбора", ЭтотОбъект, Истина, , Параметры);
Если Результат.ВыбранныеЗначения <> Неопределено Тогда
Для Каждого Организация Из Результат.ВыбранныеЗначения Цикл
Сообщить(Организация.Наименование);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Для множественного выбора обязательно укажите параметр РежимВыбораЭлементов = Перечисление.РежимыВыбораЭлементов.Множественный.
FAQ: Частые вопросы по работе с режимом выбора
Как открыть форму выбора для документа с фильтром по дате?
Используйте параметр Фильтр с указанием диапазона дат. Пример:
Параметры = Новый Структура();
Параметры.Вставить("Фильтр",
Новый Структура("Дата",
Новый Структура("С", НачалоДня(ТекущаяДата()), "По", КонецДня(ТекущаяДата()))
)
);
ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаВыбора", ЭтотОбъект, Истина, , Параметры);
Можно ли открыть форму выбора для регистра сведений?
Да, но только если для регистра сведений определена форма выбора в конфигураторе. Пример:
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаВыбора", ЭтотОбъект, Истина);
Если форма не открывается, проверьте наличие формы выбора в свойствах регистра сведений.
Как передать выбранное значение в другую форму?
Используйте механизм владельца формы. Пример:
// В вызывающей форме:
Процедура ОткрытьВыборКонтрагента()
Результат = ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ЭтотОбъект, Истина);
Если Результат.ВыбранноеЗначение <> Неопределено Тогда
ЭлементыФормы.Контрагент.Значение = Результат.ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Выбранное значение автоматически передаётся в форму-владельца через объект Результат.
Почему при выборе не обновляется поле в документе?
Возможные причины:
- Не обработан результат выбора (проверьте код после
ОткрытьФорму()). - Поле не связано с реквизитом формы (проверьте свойства элемента управления).
- Отсутствуют права на изменение документа (проверьте роли пользователя).
Как сделать, чтобы форма выбора открывалась в отдельном окне?
Используйте параметр ОткрыватьВНовомОкне = Истина:
ПараметрыОкна = Новый Структура("ОткрыватьВНовомОкне", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ЭтотОбъект, Истина, , , ПараметрыОкна);
Если форма выбора открывается слишком долго, проверьте фильтры — возможно, запрос выполняется по большой базе данных. Оптимизируйте отбор или используйте индексы.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 3.0) имена форм выбора могут отличаться от стандартных. Всегда проверяйте актуальные имена в конфигураторе через меню Все функции → Формы.