Работа с документами и справочниками в платформе 1С:Предприятие часто требует точного выбора нужного элемента из огромного списка данных. Стандартная форма выбора, вызываемая при нажатии кнопки подбора или выбора в поле ввода, по умолчанию отображает все доступные записи. Однако в реальных бизнес-процессах пользователю критически важно видеть только релевантные данные, отфильтрованные по конкретному контексту текущей задачи.
Настройка отбора позволяет сузить область поиска, исключив лишнюю информацию и ускорив работу оператора. Это может быть фильтр по организации, складу, контрагенту или любому другому измерению, связанному с текущим документом. Реализовать такую логику можно как на уровне метаданных, так и динамически через программный код, что дает гибкость в управлении интерфейсом.
В данной статье мы детально разберем механизмы формирования отборов, рассмотрим работу со свойством Отбор и параметрами формы. Вы узнаете, как передавать условия фильтрации из основного окна в форму списка и как обрабатывать сложные сценарии выбора с использованием встроенного языка.
Базовые принципы работы формы выбора
Форма выбора в 1С — это специализированный интерфейс, который открывается поверх основного окна приложения. Её главная задача — предоставить пользователю удобный список для поиска и выделения нужного элемента справочника, документа или перечисления. По умолчанию система не накладывает никаких ограничений на отображаемые данные, если это явно не указано в свойствах объекта метаданных.
Ключевым элементом управления содержимым списка является свойство Отбор. Оно представляет собой коллекцию условий, аналогичную тем, что используются в обычных формах списков. Разница заключается лишь в способе передачи этих условий: в форму выбора они могут быть injected (внедрены) из вызывающего кода или заданы статически в конфигураторе.
Важно понимать, что форма выбора имеет свою собственную область видимости переменных. Прямой доступ к данным основного документа из формы выбора невозможен без использования параметров или глобальных контекстов. Поэтому правильная передача условий фильтрации является фундаментом корректной работы подбора.
⚠️ Внимание: Если вы используете управляемые формы, помните, что контекст выполнения кода формы выбора отделен от контекста основной формы. Передача данных возможна только через параметры формы или специальные механизмы вызова.
Для начала работы с отборами необходимо определить, какие именно критерии будут использоваться для фильтрации. Это может быть фиксированное значение, например, текущая организация пользователя, или динамическое значение, зависящее от заполненных полей в документе-источнике.
Использование предопределенных отборов в конфигураторе
Самый простой способ ограничить список выбираемых элементов — настроить отбор непосредственно в свойствах объекта метаданных. Этот метод подходит для случаев, когда условие фильтрации является постоянным и не зависит от контекста вызова. Например, если в справочнике "Номенклатура" есть группа "Услуги", и пользователю всегда нужно выбирать только услуги.
Для настройки перейдите в конфигуратор, откройте дерево метаданных и найдите нужный справочник или документ. В свойствах формы списка (или основной формы, если форма выбора не переопределена) найдите панель Отборы. Добавьте новое условие, выбрав нужное поле и задав вид сравнения.
- 🔹 Выберите поле для фильтрации, например, "ВидНоменклатуры".
- 🔹 Установите вид сравнения
Равнодля точного совпадения. - 🔹 В поле "Значение" укажите конкретный элемент или используйте предопределенное значение.
Такой подход гарантирует, что при любом вызове формы выбора пользователь увидит только отфильтрованный список. Однако у этого метода есть существенный недостаток: отсутствие гибкости. Если в другом документе потребуется выбрать товары из другой группы, вам придется создавать отдельную форму или менять логику работы.
Более продвинутым вариантом использования статических отборов является применение параметров формы. Вы можете создать параметр в форме списка, который будет использоваться в условии отбора. Значение этого параметра затем передается при открытии формы.
⚠️ Внимание: Интерфейс конфигуратора и доступные свойства могут различаться в зависимости от версии платформы 1С:Предприятие. Всегда сверяйтесь с официальной документацией для вашей конкретной версии ПО.
Используйте именованные отборы в метаданных для часто повторяющихся условий фильтрации. Это упрощает поддержку конфигурации и делает код более читаемым.
Динамическая настройка отбора через программный код
В большинстве реальных задач требуется динамическое формирование условий выбора. Например, при подборе товаров в документ "Реализация" необходимо показывать только те товары, которые числятся на остатках конкретного склада, указанного в шапке документа. Для этого используется программная установка отбора перед открытием формы.
Основной механизм реализации — использование объекта ФормаВыбора или метода ОткрытьФормуВыбора. В коде обработчика события (например, ПриНачалеВыбора или нажатие кнопки подбора) вы создаете структуру отбора и передаете её в форму.
Параметры = Новый Структура;
Параметры.Вставить("Отбор", Новый Структура("Склад", ТекущийСклад));
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", Параметры, ЭлементФормы);
В данном примере мы создаем структуру, в которую помещаем условие отбора по полю "Склад". Значение ТекущийСклад берется из текущего документа. При открытии формы система автоматически применит этот фильтр к списку.
Альтернативный способ — использование свойства СтруктураОтбора у поля ввода, если форма выбора вызывается стандартным механизмом выбора из поля. В этом случае отбор задается непосредственно в свойствах поля на форме основного документа.
- 🔹 Откройте форму документа в редакторе форм.
- 🔹 Выберите поле ввода, для которого нужно настроить подбор.
- 🔹 В свойствах найдите
СтруктураОтбораи задайте нужные условия.
Такой метод удобен тем, что не требует написания кода обработчиков событий для каждого поля. Однако он менее гибок, если условия отбора зависят от сложных вычислений или нескольких полей одновременно.
Передача параметров в форму выбора
Для сложной логики фильтрации часто недостаточно простого отбора по одному полю. Может потребоваться передача в форму выбора дополнительных данных, которые будут использоваться для вычисления условий или изменения поведения интерфейса. Механизм параметров формы позволяет решить эту задачу.
В форме списка справочника или документа необходимо создать параметры. Это делается в дереве элементов формы: кликните правой кнопкой мыши на корне формы, выберите "Добавить" -> "Параметр". Задайте имя параметра, тип данных и, при необходимости, значение по умолчанию.
Затем в модуле формы списка (клиентском или серверном, в зависимости от задачи) напишите обработчик события ПриСозданииНаСервере или ПриОткрытии. В этом обработчике считайте значение переданного параметра и сформируйте на его основе отбор.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Параметры.Склад <> Неопределено Тогда
Элементы.Список.Отбор.Добавить("Склад", ВидСравнения.Равно, Параметры.Склад);
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает полную изоляцию логики формы выбора. Форма становится универсальным инструментом, который может работать в разных контекстах в зависимости от переданных ей входных данных.
Особенности работы с параметрами
Параметры формы доступны только на чтение внутри формы. Изменение значения параметра не влияет на вызывающую форму, если не использованы специальные механизмы возврата значений.
Обработка события начала выбора и подбор
Событие ПриНачалеВыбора является ключевой точкой контроля для перехвата стандартного процесса выбора. Оно срабатывает в момент, когда пользователь нажимает кнопку выбора или клавишу F4 в поле ввода. Это идеальное место для динамической модификации отборов.
В обработчике этого события вы имеете доступ к объекту СтруктураВыбора, который позволяет управлять параметрами открываемой формы. Вы можете не только задать отбор, но и изменить заголовок формы, выбрать конкретную форму для отображения или даже отменить стандартный выбор.
- 🔹 Используйте параметр
СтруктураВыбора.Параметрыдля передачи данных. - 🔹 Свойство
СтруктураВыбора.Отборпозволяет напрямую задать коллекцию отборов. - 🔹 Свойство
СтруктураВыбора.Заголовокполезно для контекстной подсказки пользователю.
Частой ошибкой разработчиков является попытка изменить отбор после открытия формы. Это невозможно, так как форма уже инициализирована. Все настройки должны быть выполнены строго до момента открытия, внутри обработчика начала выбора.
| Событие | Момент вызова | Возможность изменения отбора | Доступ к данным формы |
|---|---|---|---|
| ПриНачалеВыбора | До открытия окна | Да (полный) | Нет (форма еще не создана) |
| ПриОткрытии (формы выбора) | В момент открытия | Да (через параметры) | Да (только чтение параметров) |
| ОбработкаВыбора | После выбора элемента | Нет | Да (получение выбранного значения) |
⚠️ Внимание: При использовании события
ПриНачалеВыбораубедитесь, что вы не блокируете интерфейс долгими серверными вызовами. Пользователь ожидает мгновенной реакции на нажатие кнопки выбора.
Событие ПриНачалеВыбора — это единственный момент, когда вы можете перехватить и модифицировать стандартный процесс открытия формы выбора перед её отображением пользователю.
Типичные ошибки и оптимизация производительности
Неправильная настройка отборов может привести к серьезным проблемам с производительностью системы, особенно в многопользовательских базах с большим объемом данных. Самая распространенная ошибка — использование полей, не индексированных в базе данных, в условиях отбора.
Если вы фильтруете список по полю, которое не является индексом (например, по комментарию или произвольному реквизиту без индекса), система будет вынуждена выполнять полный обход таблицы. Это приводит к значительным задержкам при открытии формы выбора.
Также стоит избегать передачи в отбор сложных объектов или коллекций, которые требуют сериализации при передаче между клиентом и сервером. Старайтесь использовать простые типы данных: ссылки, строки, числа, даты.
☑️ Проверка производительности отбора
Еще одной частой проблемой является "утечка" контекста. Если форма выбора открывается внутри цикла или часто вызываемой процедуры, убедитесь, что вы не создаете лишних объектов отбора каждый раз. Переиспользуйте структуры данных там, где это возможно.
Для отладки проблем с отборами используйте журнал регистрации или встроенный отладчик. Проверяйте, какие именно параметры передаются в форму, и соответствует ли полученный результат ожидаемому фильтру.
Как передать несколько условий в отбор формы выбора?
Для передачи нескольких условий создайте объект СтруктураОтбора или используйте коллекцию отборов формы. Добавьте в неё несколько элементов, каждый из которых будет представлять отдельное условие (ИЛИ, И). Пример: Отбор.Добавить("Вид", Равно, "Услуга"); Отбор.Добавить("Цена", Больше, 100);
Можно ли изменить отбор уже открытой формы выбора?
Нет, напрямую изменить отбор в уже отображаемой форме выбора из внешней формы нельзя. Необходимо закрыть форму и открыть её заново с новыми параметрами, либо использовать механизмы обновления списка внутри самой формы выбора через команды интерфейса.
Почему отбор не срабатывает при выборе из поля ввода?
Проверьте свойство СтруктураОтбора у поля ввода. Убедитесь, что типы данных в условии отбора совпадают с типом поля. Также проверьте, не переопределено ли событие ПриНачалеВыбора в коде, где логика отбора может быть нарушена.
Как использовать отбор по периоду в форме выбора документов?
Для документов часто требуется отбор по дате. Добавьте в параметры формы выбора параметр типа Дата или Период. В модуле формы списка используйте этот параметр для установки отбора по полю "Дата" с видом сравнения ВИнтервале или БольшеРавно.