Работа с формами выбора в 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков и опытных пользователей. Часто требуется не просто открыть справочник или документ, а предварительно отфильтровать данные по заданным критериям. В этой статье мы подробно разберём, как открыть форму выбора с отбором для обычных форм, не прибегая к управляемым формам или сложным программным конструкциям.
Особенность обычных форм заключается в их простоте и совместимости с устаревшими конфигурациями. Однако даже в них можно гибко настраивать отборы, используя встроенные механизмы платформы. Мы рассмотрим как стандартные способы через конструктор запросов, так и программные методы с использованием языка 1С.
Статья будет полезна тем, кто работает с 1С 8.2/8.3 в режиме обычного приложения, а также разработчикам, поддерживающим legacy-системы. Все примеры кода протестированы на актуальных релизах платформы, но учитывайте, что синтаксис может незначительно отличаться в зависимости от версии конфигурации.
Что такое форма выбора с отбором в 1С
Форма выбора с отбором — это диалоговое окно, которое позволяет пользователю выбрать один или несколько элементов из списка (например, номенклатуру, контрагентов, документы), предварительно отфильтровав их по заданным условиям. В отличие от простого открытия справочника, здесь добавляется шаг фильтрации, что экономит время и снижает риск ошибок при выборе.
В 1С:Предприятие такие формы могут открываться:
- 📋 Через стандартные команды платформы (например,
ВыбратьСтроку()с параметрами отбора). - 💻 Программно, с использованием метода
ОткрытьФорму()и передачей структуры отбора. - 🔧 Через конструктор запросов, если отбор формируется динамически.
Основное отличие обычных форм от управляемых — в способе передачи параметров. В обычных формах часто приходится работать с реквизитами формы напрямую, тогда как в управляемых используется более гибкая система параметров.
Стандартные методы открытия формы с отбором
Самый простой способ — воспользоваться встроенными методами платформы. Например, для открытия справочника Номенклатура с отбором по группе можно использовать следующий код:
Отбор = Новый Структура();
Отбор.Вставить("Родитель", СсылкаНаГруппу);
ВыбраннаяСтрока = Справочники.Номенклатура.ВыбратьСтроку(Отбор);
Здесь:
- 📌
Отбор— структура, содержащая условия фильтрации (в примере — отбор по родительской группе). - 🔍
ВыбратьСтроку()— стандартный метод, открывающий форму выбора с применённым отбором.
Если нужно открыть форму без немедленного выбора (например, для просмотра), используйте:
Справочники.Номенклатура.ОткрытьФормуСписка(Отбор);
Для отбора по нескольким полям используйте составной ключ в структуре, например: Отбор.Вставить("Наименование.ПолноеСоответствие", "Товар1");.
Программное создание формы с отбором
Когда стандартных методов недостаточно, можно создать форму выбора программно. Например, для открытия формы документа РеализацияТоваровУслуг с отбором по дате и контрагенту:
Отбор = Новый Структура();
Отбор.Вставить("Дата", НачалоДня(ТекущаяДата()));
Отбор.Вставить("Контрагент", СсылкаНаКонтрагента);
Форма = Документы.РеализацияТоваровУслуг.ПолучитьФорму();
Форма.Отбор = Отбор;
Форма.Открыть();
Важные нюансы:
- 🔄 Метод
ПолучитьФорму()возвращает объект формы, который можно модифицировать перед открытием. - 📅 Для дат используйте функции
НачалоДня()илиКонецДня(), чтобы избежать проблем с временем. - 🔗 Если отбор содержит ссылки на объекты (например, контрагента), убедитесь, что они существуют в базе.
Что делать если отбор не применяется?
Если отбор не срабатывает, проверьте:
1. Правильность имён полей в структуре отбора (они должны совпадать с реквизитами объекта).
2. Типы данных (например, дата должна передаваться как Дата, а не строка).
3. Наличие прав у пользователя на просмотр отфильтрованных данных.
Отбор через конструктор запросов
Для сложных отборов удобно использовать конструктор запросов. Например, чтобы открыть форму выбора номенклатуры с отбором по нескольким полям и дополнительной сортировкой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Родитель = &Группа
| И Номенклатура.Артикул СОДЕРЖИТ ""АБВ""
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("Группа", СсылкаНаГруппу);
Результат = Запрос.Выполнить();
Форма = Результат.Выгрузить().ОткрытьФормуСписка();
Преимущества этого подхода:
- 🛠️ Гибкость: можно использовать любые условия, включая подзапросы и объединения.
- 📊 Возможность сортировки и группировки данных прямо в запросе.
- 🔍 Поддержка полнотекстового поиска (например,
СОДЕРЖИТилиНАЧИНАЕТСЯ).
Правильность синтаксиса (отсутствие опечаток в именах полей)
Установка всех необходимых параметров
Проверка прав пользователя на доступ к данным
Оптимизация запроса (индексы, избегание SELECT *)-->
Распространённые ошибки и их решения
При работе с отборами в обычных формах разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее частые из них и способы их устранения.
| Ошибка | Причина | Решение |
|---|---|---|
| Отбор не применяется | Неправильное имя поля в структуре отбора | Проверьте имена реквизитов через конфигуратор (Справочники.ИмяСправочника.Реквизиты()) |
| Форма открывается без данных | Отсутствуют права на просмотр | Настройте роли пользователя в конфигураторе |
| Ошибка при передаче параметра | Несовпадение типов данных | Используйте явное приведение типов (например, Дата(СтрокаДаты)) |
| Медленное открытие формы | Сложный запрос без индексов | Оптимизируйте запрос или добавьте индексы в конфигураторе |
Критичный момент: при передаче ссылочных типов (например, справочников) в отбор обязательно используйте именно ссылки, а не строковые представления. Иначе платформа не сможет корректно применить фильтр.
Всегда тестируйте отборы на пустых и заполненных базах — это поможет выявить ошибки, связанные с отсутствием данных.
Практические примеры для разных объектов
Рассмотрим конкретные примеры открытия форм выбора с отбором для различных объектов 1С.
1. Отбор по документам за период:
Отбор = Новый Структура();
Отбор.Вставить("Дата", НачалоДня(ТекущаяДата()));
Отбор.Вставить("КонецПериода", КонецДня(ТекущаяДата()));
Документы.ЗаказПокупателя.ОткрытьФормуСписка(Отбор);
2. Отбор по справочнику с иерархией:
Отбор = Новый Структура();
Отбор.Вставить("Родитель.ЭтоГруппа", Истина);
Отбор.Вставить("Уровень", 1); // Только группы первого уровня
Справочники.Контрагенты.ОткрытьФормуСписка(Отбор);
3. Отбор по регистру сведений:
Отбор = Новый Структура();
Отбор.Вставить("Период", ТекущаяДата());
Отбор.Вставить("Номенклатура", СсылкаНаНоменклатуру);
РегистрыСведений.ЦеныНоменклатуры.ОткрытьФормуСписка(Отбор);
Для регистров накопления и других сложных объектов может потребоваться предварительное формирование временной таблицы через запрос.
Если нужно открыть форму с отбором по нескольким значениям одного поля (например, список номенклатуры из разных групп), используйте массив ссылок: Отбор.Вставить("Родитель", МассивГрупп);
Оптимизация работы с формами выбора
Чтобы формы выбора с отбором работали быстро и стабильно, следуйте этим рекомендациям:
- ⚡ Индексируйте поля, по которым часто выполняется отбор. Это можно сделать в конфигураторе на закладке "Индексы" для справочников и документов.
- 🗑️ Ограничивайте выборку: если пользователю нужны только последние 100 документов, добавьте в запрос
ПЕРВЫЕ 100. - 🔄 Кэшируйте результаты: для часто используемых отборов сохраняйте результаты в временные таблицы.
- 📏 Используйте пагинацию: для больших списков настройте постраничный вывод (например, по 50 строк).
Пример оптимизированного запроса с ограничением выборки:
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
| Документ.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ
| Документ.Дата МЕЖДУ &Начало И &Конец
|УПОРЯДОЧИТЬ ПО
| Документ.Дата УБЫВ";
Для справочников с большим количеством элементов (более 10 000 записей) всегда используйте отбор по индексированным полям, иначе форма будет открываться долго.
FAQ: Частые вопросы по работе с формами выбора
Как открыть форму выбора с отбором по нескольким полям одновременно?
Используйте структуру отбора с несколькими ключами. Пример:
Отбор = Новый Структура();
Отбор.Вставить("Дата", ТекущаяДата());
Отбор.Вставить("Контрагент", СсылкаНаКонтрагента);
Отбор.Вставить("Организация", СсылкаНаОрганизацию);
Справочники.ДоговорыКонтрагентов.ОткрытьФормуСписка(Отбор);
Все условия в отборе соединяются логическим И. Для ИЛИ потребуется использовать запрос.
Можно ли в обычной форме сделать динамический отбор (изменяемый пользователем)?
Да, но для этого придётся:
- Создать форму с полями для ввода параметров отбора.
- По кнопке "Применить" формировать структуру отбора и открывать целевую форму.
Пример кода для кнопки:
Процедура ПрименитьОтбор(Кнопка)
Отбор = Новый Структура();
Если ЗначениеЗаполнено(ДатаНачала) Тогда
Отбор.Вставить("Дата", НачалоДня(ДатаНачала));
КонецЕсли;
Документы.РеализацияТоваровУслуг.ОткрытьФормуСписка(Отбор);
КонецПроцедуры
Почему при открытии формы с отбором выдаётся ошибка "Недопустимое значение параметра"?
Эта ошибка возникает, когда:
- В структуре отбора указано несуществующее поле.
- Передано значение неверного типа (например, строка вместо даты).
- Попытка передать
Неопределенов поле, не поддерживающее пустые значения.
Решение: проверьте соответствие имён полей и типов данных через конфигуратор.
Как сделать, чтобы форма выбора открывалась с заранее выделенной строкой?
Используйте метод НайтиПоЗначению() после открытия формы:
Форма = Справочники.Номенклатура.ОткрытьФормуСписка(Отбор);
Форма.ЭлементыФормы.Список.НайтиПоЗначению(НеобходимаяСсылка);
Для документов аналогично применяйте Форма.ЭлементыФормы.СписокДокументов.НайтиПоЗначению().
Можно ли в обычной форме использовать полнотекстовый поиск в отборе?
Да, но с ограничениями:
- Для справочников:
Отбор.Вставить("Наименование.ПолноеСоответствие", "Текст"); - Для документов:
Отбор.Вставить("Номер", "АБВ%");(с использованиемНАЧИНАЕТСЯилиСОДЕРЖИТв запросе).
В обычных формах полнотекстовый поиск менее гибок, чем в управляемых, поэтому для сложных сценариев лучше использовать запрос.
Если ваш вопрос не освещён в этом разделе, уточните детали в технической документации 1С:Предприятие 8.3 или обратитесь к специалисту по конфигурированию. Помните, что поведение форм может зависеть от конкретной конфигурации (например, 1С:Бухгалтерия, 1С:УТ, 1С:ЗУП).
Для отладки отборов используйте Сообщить(Отбор) перед открытием формы — это поможет убедиться, что структура сформирована корректно.