Найти виды характеристик и выбрать элементы внутри своей группы

Учебные задачи

На группе G и трёх собственных видах характеристик сравним поиск, порядок дерева, отбор по родителю и существующим ссылкам, затем получим штатные данные выбора.

Где и как запускать

Полный обычный клиентский общий модуль УчебныеМенеджеры85, только толстый клиент. Пульт отдельным полным модулем ниже. Не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение, толстый клиент. Не рабочая БП/КА2/УТ и не её копия. Нет разделителей, общих реквизитов, расширений, подписок, РИБ и фоновых прикладных заданий. Здесь база и код не запускались: runtimeVerifiedScenarios=0.

  2. Планы счетов → УчебныеСчета85: длина кода 10, маска пустая, длина наименования 100, контроль уникальности включён. Без видов субконто, признаков учёта и предопределённых счетов. Реквизит УчебныйКлюч85: Строка(10), переменная длина, индексирование Индексировать. Формы и макет подготовьте далее, модули пустые. Второй ПустыеСчета85 — без реквизитов, форм, предопределённых счетов и записей, только для политики.

  3. Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов включена, длина кода 10, тип кода Строка, длина наименования 100, тип характеристик только Строка(30). Реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать, использование для групп и элементов. Без предопределённых элементов и дополнительных значений. Второй ПустыеСвойства85 — без предопределённых элементов и записей, только для политики.

  4. Для ОБОИХ основных планов заранее вручную создайте только четыре обычные записи: G — код 01, наименование Учебный родитель, ключ G, родитель пустой; A — код 10, наименование Учебный верхний A, ключ A, родитель пустой; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, родитель пустой. У плана характеристик G именно группа, A/B/C элементы типа Строка(30). У плана счетов G обычный родительский счёт, не группа справочника. Записи пометкой удаления не отмечены. Эти собственные записи готовит человек; код уроков их не создаёт и не записывает.

  5. У УчебныеСчета85 создайте обычные формы Счет85 (форма счёта), Список85 (форма списка), Выбор85 (форма выбора), назначьте основными для соответствующих назначений. Используйте стандартный мастер своих форм, модули оставьте пустыми. У УчебныеСвойства85 обычные Элемент85, Группа85, Список85, Выбор85, ВыборГруппы85 — назначьте основными для элемента, группы, списка, выбора элемента и выбора группы. Это НЕ управляемые формы.

  6. У каждого основного плана создайте макет Шаблон85 типа Табличный документ. В R1C1 у плана счетов текст План счетов, у плана характеристик текст План характеристик. Без параметров и кода. У пустых планов макеты и формы не нужны.

  7. Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставляйте полный основной модуль выбранного урока на верхнем уровне. Создайте обработку УчебныеМенеджеры85, обычную основную форму Пульт, кнопку Выполнить с действием ВыполнитьНажатие; полный модуль формы приведён отдельно.

  8. Для политики войдите собственным учебным администратором. ПустыеСчета85 и ПустыеСвойства85 должны иметь НОЛЬ любых записей, ноль предопределённых определений и никогда ранее не перенастраиваться. Режим обновления в конфигурации и информационной базе исходно Авто. Нельзя подменить это подготовкой существующей базы: вычисленный getter не доказывает исходное значение сохранённого override.

  9. F7 и обновление только собственного стенда, затем Пульт толстого клиента. Уроки поиска только читают четыре записи. Уроки форм открывают 4/6 отдельных своих окон и макет; не нажимайте Записать, завершайте окна без сохранения новых объектов, макет не печатайте и не сохраняйте.

  10. Урок политики в будущем меняет служебный признак и режим обновления только двух пустых своих планов, затем возвращает исходный признак и заранее известное Авто. Это запись системной настройки собственного стенда, не создание предопределённых объектов, не удаление следов изменения и не беззаписный опыт. Здесь никакая запись или 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.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Получаем конкретный менеджер своего плана после проверки имени стенда и платформы. Четыре записи с известными ключами уже подготовлены человеком, код не вызывает Создать или Записать.

  2. НайтиПоРеквизиту работает с собственным ограниченным строковым реквизитом УчебныйКлюч85. Получаем G, затем B в пределах G; отсутствие нужных записей даёт отказ вместо произвольной подстановки ссылки.

  3. НайтиПоНаименованию использует Истина для точного совпадения и конкретного родителя. Для пустого искомого наименования этот getter может вернуть Неопределено, а для отсутствующей непустой строки — пустую ссылку; здесь имя явно непустое.

  4. Выбрать без родителя даёт общий плоский порядок Код Возр: G,A,C,B. Отсутствующий параметр не заменяется пустой ссылкой, поскольку для иерархии пустая ссылка может означать только верхний уровень.

  5. ВыбратьИерархически с тем же порядком даёт G,B,A,C: ребёнок G проходит раньше следующих корневых A/C, несмотря на больший код 30. Родитель G имеет наименьший код 01, поэтому опыт не зависит от возможного приоритета групп. Это не обычная сортировка всех записей.

  6. Выбрать с родителем G возвращает только B. Отдельный отбор имеет ровно один ключ УчебныйКлюч85=B и требует его индексирования в подготовке; два поля в структуру отбора не добавляются.

  7. ВыбратьПоСсылкам доступен с 8.3.26, на 8.5.1.1343 он есть. Источник содержит настоящие A/B, заведомо не-ссылочный текст и пустую ссылку. Чужие по типу и несуществующие элементы игнорируются по справке; результат проверяем как множество A/B, не по порядку массива.

  8. ПолучитьДанныеВыбора получает обязательную Структуру с Отбор и СтрокаПоиска. Неопределено в строке поиска означает быстрый выбор, а не произвольную пустую структуру параметров.

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

  10. ПрочитатьСвоиКлючи обходит настоящую выборку через Следующий, отклоняет неизвестные ключи и повторы. Любое расхождение состава или иерархии завершает опыт ошибкой.

Как проверить результат

  1. Будущий тест: F7, свой Пульт, одна выбранная версия общего модуля. Вывод подтверждает G,A,C,B против G,B,A,C; runtimeVerifiedScenarios=0 до реального опыта.

  2. Дети G и отбор по ключу содержат только B. Данные быстрого выбора — один элемент со значением той же собственной ссылки B.

  3. Выборка по ссылкам содержит ровно A/B и не выдаёт текст или пустую ссылку как запись. Порядок результата источником не обещается.

  4. В своём стенде перенесите B в корень: контроль иерархии/детей должен отказать. Верните подготовку, не маскируйте расхождение новым ожидаемым списком.

  5. Добавьте лишнюю собственную запись с неизвестным ключом или дублируйте ключ: валидатор должен отказать. Урок не является универсальным просмотрщиком произвольных планов.

Ожидаемый результат

Будущий опыт работает только с подготовленными собственными планами. Код, формы и служебные настройки здесь не выполнялись: runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Один ключ структуры отбора — ограничение Выбрать/ВыбратьИерархически; нельзя путать его с произвольной структурой условий ПолучитьДанныеВыбора.

  2. У плана счетов G — родительский счёт, у плана характеристик G — группа. Код не использует ЭтоГруппа у счёта и не смешивает ссылочные типы разных планов.

  3. НайтиПоНаименованию и НайтиПоРеквизиту при дублях могут вернуть только один объект; выбор по уникальному ключу — правило нашей подготовки, не гарантия уникальности произвольных данных.

  4. Доступность метода в своей платформе и успешная статическая сверка не доказывают записи или правильность обработчиков чужой базы. Код в 1С не выполнялся.

  5. Статья иерархического отбора видов характеристик упоминает поле Имя, в отличие от обычной статьи Код/Наименование. Здесь иерархический отбор не передаётся; обычный отбор использует собственный индексируемый реквизит, поэтому не угадываем этот спорный вариант.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.