На группе G и трёх собственных видах характеристик сравним поиск, порядок дерева, отбор по родителю и существующим ссылкам, затем получим штатные данные выбора.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеМенеджеры85, только толстый клиент. Пульт отдельным полным модулем ниже. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение, толстый клиент. Не рабочая БП/КА2/УТ и не её копия. Нет разделителей, общих реквизитов, расширений, подписок, РИБ и фоновых прикладных заданий. Здесь база и код не запускались: runtimeVerifiedScenarios=0.
Планы счетов → УчебныеСчета85: длина кода 10, маска пустая, длина наименования 100, контроль уникальности включён. Без видов субконто, признаков учёта и предопределённых счетов. Реквизит УчебныйКлюч85: Строка(10), переменная длина, индексирование Индексировать. Формы и макет подготовьте далее, модули пустые. Второй ПустыеСчета85 — без реквизитов, форм, предопределённых счетов и записей, только для политики.
Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов включена, длина кода 10, тип кода Строка, длина наименования 100, тип характеристик только Строка(30). Реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать, использование для групп и элементов. Без предопределённых элементов и дополнительных значений. Второй ПустыеСвойства85 — без предопределённых элементов и записей, только для политики.
Для ОБОИХ основных планов заранее вручную создайте только четыре обычные записи: G — код 01, наименование Учебный родитель, ключ G, родитель пустой; A — код 10, наименование Учебный верхний A, ключ A, родитель пустой; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, родитель пустой. У плана характеристик G именно группа, A/B/C элементы типа Строка(30). У плана счетов G обычный родительский счёт, не группа справочника. Записи пометкой удаления не отмечены. Эти собственные записи готовит человек; код уроков их не создаёт и не записывает.
У УчебныеСчета85 создайте обычные формы Счет85 (форма счёта), Список85 (форма списка), Выбор85 (форма выбора), назначьте основными для соответствующих назначений. Используйте стандартный мастер своих форм, модули оставьте пустыми. У УчебныеСвойства85 обычные Элемент85, Группа85, Список85, Выбор85, ВыборГруппы85 — назначьте основными для элемента, группы, списка, выбора элемента и выбора группы. Это НЕ управляемые формы.
У каждого основного плана создайте макет Шаблон85 типа Табличный документ. В R1C1 у плана счетов текст План счетов, у плана характеристик текст План характеристик. Без параметров и кода. У пустых планов макеты и формы не нужны.
Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставляйте полный основной модуль выбранного урока на верхнем уровне. Создайте обработку УчебныеМенеджеры85, обычную основную форму Пульт, кнопку Выполнить с действием ВыполнитьНажатие; полный модуль формы приведён отдельно.
Для политики войдите собственным учебным администратором. ПустыеСчета85 и ПустыеСвойства85 должны иметь НОЛЬ любых записей, ноль предопределённых определений и никогда ранее не перенастраиваться. Режим обновления в конфигурации и информационной базе исходно Авто. Нельзя подменить это подготовкой существующей базы: вычисленный getter не доказывает исходное значение сохранённого override.
F7 и обновление только собственного стенда, затем Пульт толстого клиента. Уроки поиска только читают четыре записи. Уроки форм открывают 4/6 отдельных своих окон и макет; не нажимайте Записать, завершайте окна без сохранения новых объектов, макет не печатайте и не сохраняйте.
Урок политики в будущем меняет служебный признак и режим обновления только двух пустых своих планов, затем возвращает исходный признак и заранее известное Авто. Это запись системной настройки собственного стенда, не создание предопределённых объектов, не удаление следов изменения и не беззаписный опыт. Здесь никакая запись или UI-операция не выполнялась.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
Ребенок = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "B", Родитель);
Если Родитель.Пустая() Или Ребенок.Пустая() Тогда
ВызватьИсключение "Создайте собственные записи G и B с заданной связью";
КонецЕсли;
Найденный = Менеджер.НайтиПоНаименованию("Учебный дочерний B", Истина, Родитель);
Если Найденный <> Ребенок Тогда
ВызватьИсключение "Точный поиск в своём родителе должен вернуть тот же B";
КонецЕсли;
Все = ПрочитатьСвоиКлючи(Менеджер.Выбрать(,,"Код Возр"));
ПроверитьПорядок(Все, "G,A,C,B");
Дерево = ПрочитатьСвоиКлючи(Менеджер.ВыбратьИерархически(,,"Код Возр"));
ПроверитьПорядок(Дерево, "G,B,A,C");
Дети = ПрочитатьСвоиКлючи(Менеджер.Выбрать(Родитель,,"Код Возр"));
ПроверитьПорядок(Дети, "B");
Отбор = Новый Структура("УчебныйКлюч85", "B");
ПоКлючу = ПрочитатьСвоиКлючи(Менеджер.Выбрать(,Отбор,"Код Возр"));
ПроверитьПорядок(ПоКлючу, "B");
Ссылки = Новый Массив;
Ссылки.Добавить(Ребенок);
Ссылки.Добавить(Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "A"));
Ссылки.Добавить("это не ссылка");
Ссылки.Добавить(Менеджер.ПустаяСсылка());
ПоСсылкам = ПрочитатьСвоиКлючи(Менеджер.ВыбратьПоСсылкам(Ссылки));
Если ПоСсылкам.Количество() <> 2 Или ПоСсылкам.Найти("A") = Неопределено Или ПоСсылкам.Найти("B") = Неопределено Тогда
ВызватьИсключение "Нужны только существующие собственные ссылки A и B, без обещания порядка источника";
КонецЕсли;
Параметры = Новый Структура;
Параметры.Вставить("Отбор", Отбор);
Параметры.Вставить("СтрокаПоиска", Неопределено);
ДанныеВыбора = Менеджер.ПолучитьДанныеВыбора(Параметры);
Если ТипЗнч(ДанныеВыбора) <> Тип("СписокЗначений") Или ДанныеВыбора.Количество() <> 1
Или ДанныеВыбора.Получить(0).Значение <> Ребенок Тогда
ВызватьИсключение "Быстрый выбор по одному ключу должен вернуть собственный B";
КонецЕсли;
Сообщить("Плоско G,A,C,B; иерархически G,B,A,C; дети и отбор только B; по ссылкам A и B. Записи не менялись.");
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьСвоиКлючи(Выборка)
Ключи = Новый Массив;
Пока Выборка.Следующий() Цикл
Ключ = Выборка.УчебныйКлюч85;
Если Ключ <> "A" И Ключ <> "G" И Ключ <> "B" И Ключ <> "C" Тогда
ВызватьИсключение "Выборка содержит неподготовленную запись своего стенда";
КонецЕсли;
Если Ключи.Найти(Ключ) <> Неопределено Тогда
ВызватьИсключение "В подготовке ключи должны быть уникальны";
КонецЕсли;
Ключи.Добавить(Ключ);
КонецЦикла;
Возврат Ключи;
КонецФункции
Процедура ПроверитьПорядок(Ключи, Ожидаемый)
Если СтрСоединить(Ключи, ",") <> Ожидаемый Тогда
ВызватьИсключение "Не совпали состав или порядок собственных записей: " + СтрСоединить(Ключи, ",");
КонецЕсли;
КонецПроцедурыУчебныеМенеджеры85.Пульт
УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Формы → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Получаем конкретный менеджер своего плана после проверки имени стенда и платформы. Четыре записи с известными ключами уже подготовлены человеком, код не вызывает Создать или Записать.
НайтиПоРеквизиту работает с собственным ограниченным строковым реквизитом УчебныйКлюч85. Получаем G, затем B в пределах G; отсутствие нужных записей даёт отказ вместо произвольной подстановки ссылки.
НайтиПоНаименованию использует Истина для точного совпадения и конкретного родителя. Для пустого искомого наименования этот getter может вернуть Неопределено, а для отсутствующей непустой строки — пустую ссылку; здесь имя явно непустое.
Выбрать без родителя даёт общий плоский порядок Код Возр: G,A,C,B. Отсутствующий параметр не заменяется пустой ссылкой, поскольку для иерархии пустая ссылка может означать только верхний уровень.
ВыбратьИерархически с тем же порядком даёт G,B,A,C: ребёнок G проходит раньше следующих корневых A/C, несмотря на больший код 30. Родитель G имеет наименьший код 01, поэтому опыт не зависит от возможного приоритета групп. Это не обычная сортировка всех записей.
Выбрать с родителем G возвращает только B. Отдельный отбор имеет ровно один ключ УчебныйКлюч85=B и требует его индексирования в подготовке; два поля в структуру отбора не добавляются.
ВыбратьПоСсылкам доступен с 8.3.26, на 8.5.1.1343 он есть. Источник содержит настоящие A/B, заведомо не-ссылочный текст и пустую ссылку. Чужие по типу и несуществующие элементы игнорируются по справке; результат проверяем как множество A/B, не по порядку массива.
ПолучитьДанныеВыбора получает обязательную Структуру с Отбор и СтрокаПоиска. Неопределено в строке поиска означает быстрый выбор, а не произвольную пустую структуру параметров.
Этот метод вызывает ОбработкаПолученияДанныхВыбора. В собственных менеджерских модулях обработчиков нет, поэтому ожидается штатный список с одним B; это не доказательство поведения чужой конфигурации.
ПрочитатьСвоиКлючи обходит настоящую выборку через Следующий, отклоняет неизвестные ключи и повторы. Любое расхождение состава или иерархии завершает опыт ошибкой.
Как проверить результат
Будущий тест: F7, свой Пульт, одна выбранная версия общего модуля. Вывод подтверждает G,A,C,B против G,B,A,C; runtimeVerifiedScenarios=0 до реального опыта.
Дети G и отбор по ключу содержат только B. Данные быстрого выбора — один элемент со значением той же собственной ссылки B.
Выборка по ссылкам содержит ровно A/B и не выдаёт текст или пустую ссылку как запись. Порядок результата источником не обещается.
В своём стенде перенесите B в корень: контроль иерархии/детей должен отказать. Верните подготовку, не маскируйте расхождение новым ожидаемым списком.
Добавьте лишнюю собственную запись с неизвестным ключом или дублируйте ключ: валидатор должен отказать. Урок не является универсальным просмотрщиком произвольных планов.
Ожидаемый результат
Будущий опыт работает только с подготовленными собственными планами. Код, формы и служебные настройки здесь не выполнялись: runtimeVerifiedScenarios=0.
На что обратить внимание
Один ключ структуры отбора — ограничение Выбрать/ВыбратьИерархически; нельзя путать его с произвольной структурой условий ПолучитьДанныеВыбора.
У плана счетов G — родительский счёт, у плана характеристик G — группа. Код не использует ЭтоГруппа у счёта и не смешивает ссылочные типы разных планов.
НайтиПоНаименованию и НайтиПоРеквизиту при дублях могут вернуть только один объект; выбор по уникальному ключу — правило нашей подготовки, не гарантия уникальности произвольных данных.
Доступность метода в своей платформе и успешная статическая сверка не доказывают записи или правильность обработчиков чужой базы. Код в 1С не выполнялся.
Статья иерархического отбора видов характеристик упоминает поле Имя, в отличие от обычной статьи Код/Наименование. Здесь иерархический отбор не передаётся; обычный отбор использует собственный индексируемый реквизит, поэтому не угадываем этот спорный вариант.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.