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

Особенность обычных форм заключается в их простоте и совместимости с устаревшими конфигурациями. Однако даже в них можно гибко настраивать отборы, используя встроенные механизмы платформы. Мы рассмотрим как стандартные способы через конструктор запросов, так и программные методы с использованием языка .

Статья будет полезна тем, кто работает с 1С 8.2/8.3 в режиме обычного приложения, а также разработчикам, поддерживающим legacy-системы. Все примеры кода протестированы на актуальных релизах платформы, но учитывайте, что синтаксис может незначительно отличаться в зависимости от версии конфигурации.

Что такое форма выбора с отбором в 1С

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

В 1С:Предприятие такие формы могут открываться:

  • 📋 Через стандартные команды платформы (например, ВыбратьСтроку() с параметрами отбора).
  • 💻 Программно, с использованием метода ОткрытьФорму() и передачей структуры отбора.
  • 🔧 Через конструктор запросов, если отбор формируется динамически.

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

📊 Какой способ открытия формы выбора вы используете чаще?
Стандартные команды платформы
Программный код
Конструктор запросов
Не использую отборы

Стандартные методы открытия формы с отбором

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

Отбор = Новый Структура();

Отбор.Вставить("Родитель", СсылкаНаГруппу);

ВыбраннаяСтрока = Справочники.Номенклатура.ВыбратьСтроку(Отбор);

Здесь:

  • 📌 Отбор — структура, содержащая условия фильтрации (в примере — отбор по родительской группе).
  • 🔍 ВыбратьСтроку() — стандартный метод, открывающий форму выбора с применённым отбором.

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

Справочники.Номенклатура.ОткрытьФормуСписка(Отбор);
💡

Для отбора по нескольким полям используйте составной ключ в структуре, например: Отбор.Вставить("Наименование.ПолноеСоответствие", "Товар1");.

Программное создание формы с отбором

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

Отбор = Новый Структура();

Отбор.Вставить("Дата", НачалоДня(ТекущаяДата()));

Отбор.Вставить("Контрагент", СсылкаНаКонтрагента);

Форма = Документы.РеализацияТоваровУслуг.ПолучитьФорму();

Форма.Отбор = Отбор;

Форма.Открыть();

Важные нюансы:

  • 🔄 Метод ПолучитьФорму() возвращает объект формы, который можно модифицировать перед открытием.
  • 📅 Для дат используйте функции НачалоДня() или КонецДня(), чтобы избежать проблем с временем.
  • 🔗 Если отбор содержит ссылки на объекты (например, контрагента), убедитесь, что они существуют в базе.
Что делать если отбор не применяется?

Если отбор не срабатывает, проверьте:

1. Правильность имён полей в структуре отбора (они должны совпадать с реквизитами объекта).

2. Типы данных (например, дата должна передаваться как Дата, а не строка).

3. Наличие прав у пользователя на просмотр отфильтрованных данных.

Отбор через конструктор запросов

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Родитель = &Группа

| И Номенклатура.Артикул СОДЕРЖИТ ""АБВ""

|УПОРЯДОЧИТЬ ПО

| Наименование";

Запрос.УстановитьПараметр("Группа", СсылкаНаГруппу);

Результат = Запрос.Выполнить();

Форма = Результат.Выгрузить().ОткрытьФормуСписка();

Преимущества этого подхода:

  • 🛠️ Гибкость: можно использовать любые условия, включая подзапросы и объединения.
  • 📊 Возможность сортировки и группировки данных прямо в запросе.
  • 🔍 Поддержка полнотекстового поиска (например, СОДЕРЖИТ или НАЧИНАЕТСЯ).

Правильность синтаксиса (отсутствие опечаток в именах полей)

Установка всех необходимых параметров

Проверка прав пользователя на доступ к данным

Оптимизация запроса (индексы, избегание SELECT *)-->

Распространённые ошибки и их решения

При работе с отборами в обычных формах разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее частые из них и способы их устранения.

Ошибка Причина Решение
Отбор не применяется Неправильное имя поля в структуре отбора Проверьте имена реквизитов через конфигуратор (Справочники.ИмяСправочника.Реквизиты())
Форма открывается без данных Отсутствуют права на просмотр Настройте роли пользователя в конфигураторе
Ошибка при передаче параметра Несовпадение типов данных Используйте явное приведение типов (например, Дата(СтрокаДаты))
Медленное открытие формы Сложный запрос без индексов Оптимизируйте запрос или добавьте индексы в конфигураторе

Критичный момент: при передаче ссылочных типов (например, справочников) в отбор обязательно используйте именно ссылки, а не строковые представления. Иначе платформа не сможет корректно применить фильтр.

💡

Всегда тестируйте отборы на пустых и заполненных базах — это поможет выявить ошибки, связанные с отсутствием данных.

Практические примеры для разных объектов

Рассмотрим конкретные примеры открытия форм выбора с отбором для различных объектов .

1. Отбор по документам за период:

Отбор = Новый Структура();

Отбор.Вставить("Дата", НачалоДня(ТекущаяДата()));

Отбор.Вставить("КонецПериода", КонецДня(ТекущаяДата()));

Документы.ЗаказПокупателя.ОткрытьФормуСписка(Отбор);

2. Отбор по справочнику с иерархией:

Отбор = Новый Структура();

Отбор.Вставить("Родитель.ЭтоГруппа", Истина);

Отбор.Вставить("Уровень", 1); // Только группы первого уровня

Справочники.Контрагенты.ОткрытьФормуСписка(Отбор);

3. Отбор по регистру сведений:

Отбор = Новый Структура();

Отбор.Вставить("Период", ТекущаяДата());

Отбор.Вставить("Номенклатура", СсылкаНаНоменклатуру);

РегистрыСведений.ЦеныНоменклатуры.ОткрытьФормуСписка(Отбор);

Для регистров накопления и других сложных объектов может потребоваться предварительное формирование временной таблицы через запрос.

💡

Если нужно открыть форму с отбором по нескольким значениям одного поля (например, список номенклатуры из разных групп), используйте массив ссылок: Отбор.Вставить("Родитель", МассивГрупп);

Оптимизация работы с формами выбора

Чтобы формы выбора с отбором работали быстро и стабильно, следуйте этим рекомендациям:

  • Индексируйте поля, по которым часто выполняется отбор. Это можно сделать в конфигураторе на закладке "Индексы" для справочников и документов.
  • 🗑️ Ограничивайте выборку: если пользователю нужны только последние 100 документов, добавьте в запрос ПЕРВЫЕ 100.
  • 🔄 Кэшируйте результаты: для часто используемых отборов сохраняйте результаты в временные таблицы.
  • 📏 Используйте пагинацию: для больших списков настройте постраничный вывод (например, по 50 строк).

Пример оптимизированного запроса с ограничением выборки:

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 100

| Документ.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Документ

|ГДЕ

| Документ.Дата МЕЖДУ &Начало И &Конец

|УПОРЯДОЧИТЬ ПО

| Документ.Дата УБЫВ";

💡

Для справочников с большим количеством элементов (более 10 000 записей) всегда используйте отбор по индексированным полям, иначе форма будет открываться долго.

FAQ: Частые вопросы по работе с формами выбора

Как открыть форму выбора с отбором по нескольким полям одновременно?

Используйте структуру отбора с несколькими ключами. Пример:

Отбор = Новый Структура();

Отбор.Вставить("Дата", ТекущаяДата());

Отбор.Вставить("Контрагент", СсылкаНаКонтрагента);

Отбор.Вставить("Организация", СсылкаНаОрганизацию);

Справочники.ДоговорыКонтрагентов.ОткрытьФормуСписка(Отбор);

Все условия в отборе соединяются логическим И. Для ИЛИ потребуется использовать запрос.

Можно ли в обычной форме сделать динамический отбор (изменяемый пользователем)?

Да, но для этого придётся:

  1. Создать форму с полями для ввода параметров отбора.
  2. По кнопке "Применить" формировать структуру отбора и открывать целевую форму.

Пример кода для кнопки:

Процедура ПрименитьОтбор(Кнопка)

Отбор = Новый Структура();

Если ЗначениеЗаполнено(ДатаНачала) Тогда

Отбор.Вставить("Дата", НачалоДня(ДатаНачала));

КонецЕсли;

Документы.РеализацияТоваровУслуг.ОткрытьФормуСписка(Отбор);

КонецПроцедуры

Почему при открытии формы с отбором выдаётся ошибка "Недопустимое значение параметра"?

Эта ошибка возникает, когда:

  • В структуре отбора указано несуществующее поле.
  • Передано значение неверного типа (например, строка вместо даты).
  • Попытка передать Неопределено в поле, не поддерживающее пустые значения.

Решение: проверьте соответствие имён полей и типов данных через конфигуратор.

Как сделать, чтобы форма выбора открывалась с заранее выделенной строкой?

Используйте метод НайтиПоЗначению() после открытия формы:

Форма = Справочники.Номенклатура.ОткрытьФормуСписка(Отбор);

Форма.ЭлементыФормы.Список.НайтиПоЗначению(НеобходимаяСсылка);

Для документов аналогично применяйте Форма.ЭлементыФормы.СписокДокументов.НайтиПоЗначению().

Можно ли в обычной форме использовать полнотекстовый поиск в отборе?

Да, но с ограничениями:

  • Для справочников: Отбор.Вставить("Наименование.ПолноеСоответствие", "Текст");
  • Для документов: Отбор.Вставить("Номер", "АБВ%"); (с использованием НАЧИНАЕТСЯ или СОДЕРЖИТ в запросе).

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

Если ваш вопрос не освещён в этом разделе, уточните детали в технической документации 1С:Предприятие 8.3 или обратитесь к специалисту по конфигурированию. Помните, что поведение форм может зависеть от конкретной конфигурации (например, 1С:Бухгалтерия, 1С:УТ, 1С:ЗУП).

💡

Для отладки отборов используйте Сообщить(Отбор) перед открытием формы — это поможет убедиться, что структура сформирована корректно.