При получении данных из регистра сведений программисты часто используют метод Выбрать() объекта РегистрСведенийМенеджер.<Имя регистра>. Однако при попытке передать в этот метод структуру отбора может возникнуть ошибка исключения платформы:
Ошибка при вызове метода контекста (Выбрать) по причине: Недопустимое значение параметра (параметр номер '1')
Рассмотрим подробно причины возникновения этой ошибки, разберем ограничения метода Выбрать() и проанализируем альтернативные варианты решения задачи.
Основная и наиболее частая причина данной ошибки заключается в настройках метаданных в Конфигураторе. В платформе 1С:Предприятие 8 задано жесткое правило: в качестве полей отбора для метода Выбрать() можно использовать только те измерения или реквизиты, для которых установлено обязательное индексирование.
Проанализируем пример кода, который вызывает ошибку:
Структура = Новый Структура("Подразделение");
Структура.Подразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Бухгалтерия");
Выборка = РегистрыСведений.ПодразделенияДляВыгрузки.Выбрать(Структура);
Если для измерения Подразделение в конфигураторе установлено значение свойства Индексировать = Не индексировать и не взведен флаг Ведущее, метод Выбрать() выбросит исключение.
Для исправления ошибки выполним следующие шаги в Конфигураторе:
Индексировать или Индексировать с доп. упорядочиванием (либо установим флаг Ведущее, если поле ссылается на главный объект).Если свойства индексации установлены корректно, но ошибка продолжается, разберем другие возможные причины:
Выбрать() для регистра сведений может содержать только один элемент. Если передать структуру с двумя и более ключами (например, по подразделению и организации), платформа выдаст ошибку недопустимого параметра.Выбрать() недопустим, даже если для ресурса включена индексация.НайтиПоНаименованию() при неудачном поиске возвращает пустую ссылку (.Пустая()), а не Неопределено.Метод Выбрать() имеет существенные ограничения: он не поддерживает фильтрацию по нескольким полям, сложные условия (например, отбор по списку или иерархии) и выборку только нужных колонок. Рассмотрим более эффективные подходы.
Запросы в 1С не требуют предварительной установки флага «Индексировать» в конфигураторе и позволяют строить отборы любой сложности без лишней нагрузки на систему.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Подразделение
|ИЗ
| РегистрСведений.ПодразделенияДляВыгрузки КАК Т
|ГДЕ
| Т.Подразделение = &Подразделение";
ПодразделениеСсылка = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Бухгалтерия");
Если Не ПодразделениеСсылка.Пустая() Тогда
Запрос.УстановитьПараметр("Подразделение", ПодразделениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка записей выборки
КонецЦикла;
КонецЕсли;
Если требуется прочитать срез данных по определенным измерениям, оптимально использовать НаборЗаписей. Набор записей использует составные индексы таблиц 1С и не требует индивидуального индексирования каждого измерения.
НаборЗаписей = РегистрыСведений.ПодразделенияДляВыгрузки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Подразделение.Установить(Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Бухгалтерия"));
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Обработка записей регистра
КонецЦикла;