При работе с консолью запросов в среде 1С:Предприятие 8.3 на управляемых формах программисты часто сталкиваются с досадной проблемой: при попытке выбрать папку (группу) справочника в качестве параметра запроса система либо выдает ошибку «Объект изменен», либо просто не позволяет выделить и выбрать нужный узел дерева. Это особенно критично, когда мы используем в запросе конструкцию В ИЕРАРХИИ, где в качестве значения параметра обязательно должна выступать группа.
В данной статье мы подробно разберем, почему это происходит, проанализируем поведение управляемого интерфейса и рассмотрим несколько эффективных способов решения этой задачи — от простых хитростей интерфейса до изменения логики самого запроса.
Давайте проанализируем ситуацию. В управляемом интерфейсе за выбор данных отвечает форма выбора справочника. Ошибка часто кроется в свойстве Выбор групп и элементов (в метаданных это соответствует свойству ChoiceFoldersAndItems). Если в коде самой консоли или в настройках формы выбора жестко установлено ограничение на выбор только элементов, платформа будет блокировать любую попытку передать ссылку на папку в поле параметра.
Еще одна неочевидная причина — баг платформы в некоторых версиях 8.3 при работе в режиме «Такси». В двухоконном режиме формы выбора (где слева отображается дерево групп, а справа — список элементов) фокус ввода может некорректно обрабатывать двойной клик по группе. Система «думает», что вы пытаетесь выбрать пустую область в списке элементов, а не саму группу в дереве.
Рассмотрим самый простой вариант, который не требует изменения кода или текста запроса. Если перед вами открылась стандартная форма выбора справочника Номенклатура или аналогичного, обратите внимание на структуру окна.
Часто ошибка возникает именно из-за попытки «провалиться» в папку в правой части списка вместо её выбора. Использование левой панели в сочетании с явным нажатием кнопки выбора (вместо двойного клика) позволяет обойти многие ограничения интерфейса.
Если интерфейс консоли категорически отказывается принимать ссылку на группу, мы можем проявить сообразительность и изменить сам подход к фильтрации. Рассмотрим ситуацию, когда нам нужно получить элементы в иерархии группы «Продукты».
Вместо использования параметра-ссылки &ВыбРодитель, мы можем обратиться к группе по её уникальным реквизитам — Наименованию или Коду. Разберем этот пример на коде.
Типичный запрос, вызывающий ошибку:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&ВыбРодитель)
Преобразуем его, чтобы не зависеть от интерактивного выбора ссылки в параметрах:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ (
ВЫБРАТЬ Ссылка
ИЗ Справочник.Номенклатура
ГДЕ Наименование = "ИмяГруппы" И ЭтоГруппа = ИСТИНА
)
Или через параметр-строку, который консоль точно позволит ввести:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ (
ВЫБРАТЬ Ссылка
ИЗ Справочник.Номенклатура
ГДЕ Код = &КодГруппы
)
В данном случае в параметрах консоли вы просто указываете строку (код или имя), и запрос отрабатывает корректно, самостоятельно находя нужную ссылку внутри базы данных.
Многие продвинутые консоли запросов (например, из состава «Инструментов разработчика» или консоль от ИТС) поддерживают вычисление выражений прямо в поле значения параметра. Если ваша консоль позволяет это делать, мы можем передать ссылку программно.
Попробуйте вставить в поле «Значение» параметра следующий код:
Справочники.Номенклатура.НайтиПоНаименованию("Ваша Папка")
или
Справочники.Номенклатура.НайтиПоКоду("00000001")
Этот метод позволяет полностью миновать форму выбора справочника, обращаясь к объекту напрямую через встроенный язык 1С. Это самый надежный способ для профессионального использования консоли.
Если вы используете собственную или открытую консоль и хотите исправить проблему «в корне», необходимо проанализировать код формы обработки. Найдите событие НачалоВыбора для таблицы, в которой вводятся параметры.
Проверьте, установлены ли параметры выбора. Для разрешения выбора папок необходимо добавить следующий фрагмент кода:
// В обработчике события НачалоВыбора или при установке типа параметра
НовыеПараметры = Новый ПараметрыВыбора("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.ГруппыИЭлементы);
Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(Новый Массив.Добавить(НовыеПараметры));
Это принудительно укажет платформе, что данное поле ввода предназначено для выбора как конечных элементов, так и узлов иерархии (групп).
Подводя итог, отметим, что стандартные учебные консоли часто имеют упрощенный интерфейс, не учитывающий все нюансы управляемых форм 8.3. Для постоянной работы рекомендуем использовать профессиональные решения, такие как «Консоль запросов для управляемых форм» (автор Сергей Старых). В таких инструментах механизмы типизации параметров проработаны более глубоко, и проблема выбора групп там встречается крайне редко.
Если же вы ограничены типовой консолью, используйте подзапрос с поиском по коду в тексте запроса — это сэкономит вам время и избавит от борьбы с интерфейсом выбора.