ПланВидовХарактеристикВыборка.<Имя плана видов характеристик>

Типы · <Chart of characteristic types name>

Объект этого типа возвращается методами Выбрать и ВыбратьИерархически у объекта типа ПланВидовХарактеристикМенеджер.<Имя плана видов характеристик> и представляет собой специализированный способ перебора элементов плана видов характеристик. Обход элементов выполняется системой динамически. Это означает, что использование выборки не считывает все элементы сразу, а выбирает их порциями из базы данных. Такой подход позволяет достаточно быстро обходить с помощью выборки большие списки справочников и не загружает в память всех элементов выборки.

Полное описание, параметры и ограничения

ПланВидовХарактеристикВыборка.<Имя плана видов характеристик> (ChartOfCharacteristicTypesSelection.<Chart of characteristic types name>)

ПланВидовХарактеристикВыборка.<Имя плана видов характеристик> (ChartOfCharacteristicTypesSelection.<Chart of characteristic types name>)

Доступен, начиная с версии 8.0.

Свойства:
<Имя общего реквизита> (<Имя общего реквизита>)
<Имя реквизита> (<Attribute name>)
<Имя табличной части> (<Tabular section name>)
ВерсияДанных (DataVersion)
ИмяПредопределенныхДанных (PredefinedDataName)
Код (Code)
Наименование (Description)
ПометкаУдаления (DeletionMark)
Предопределенный (Predefined)
Родитель (Parent)
Ссылка (Ref)
ТипЗначения (ValueType)
ЭтоГруппа (IsFolder)

Методы:
ПолучитьОбъект (GetObject)
Следующий (Next)
УровеньВВыборке (LevelInSelection)

Описание:

Объект этого типа возвращается методами Выбрать и ВыбратьИерархически у объекта типа ПланВидовХарактеристикМенеджер.<Имя плана видов характеристик> и представляет собой специализированный способ перебора элементов плана видов характеристик. Обход элементов выполняется системой динамически. Это означает, что использование выборки не считывает все элементы сразу, а выбирает их порциями из базы данных. Такой подход позволяет достаточно быстро обходить с помощью выборки большие списки справочников и не загружает в память всех элементов выборки.

Доступность:

Сервер, толстый клиент, внешнее соединение.

См. также:
ПланВидовХарактеристикМенеджер.<Имя плана видов характеристик>, метод Выбрать
ПланВидовХарактеристикМенеджер.<Имя плана видов характеристик>, метод ВыбратьИерархически

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Отличить группу характеристик от элемента и прочитать объект без записи

Обойдём группу G и элементы B/A/C, проверим тип характеристик только у элементов, прочитаем паспорта и сравним локальную правку объекта с новым чтением базы.

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

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

Подготовка

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

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

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

  4. В обоих планах вручную подготовьте ровно четыре записи: G — код 01, наименование Учебный родитель, ключ G, пустой родитель; A — код 10, наименование Учебный верхний A, ключ A, пустой родитель; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, пустой родитель. Все записи обычные, не предопределённые, без пометки удаления. У характеристик G — группа, остальные элементы. У счетов G — родительский счёт, а не группа.

  5. В собственных счетах заранее вручную задайте Вид: G и A — Активный, B — Пассивный, C — АктивноПассивный. Забалансовый=Ложь, строк видов субконто нет. Сначала сохраните эту собственную подготовку. Код урока счёт не записывает и не проводит бухгалтерских операций.

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

  7. F7 и обновление только собственной учебной базы; откройте Пульт толстого клиента. Урок читает собственные записи и меняет наименование полученного объекта только в памяти. Не добавляйте Записать, транзакции или блокировки. Не оставляйте другие уроки с теми же именами процедур в одном общем модуле.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
    Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
    Если Родитель.Пустая() Тогда
        ВызватьИсключение "Не подготовлен собственный родитель G";
    КонецЕсли;
    Коды = Новый Структура("G,A,B,C", "01", "10", "30", "20");
    Имена = Новый Структура("G,A,B,C", "Учебный родитель", "Учебный верхний A", "Учебный дочерний B", "Учебный верхний C");
    Ключи = Новый Массив;
    НачальныйУровень = Неопределено;
    Выборка = Менеджер.ВыбратьИерархически(,,"Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.УчебныйКлюч85;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя)
            Или Ключи.Найти(Ключ) <> Неопределено Тогда
            ВызватьИсключение "Лишняя запись или повтор своего учебного ключа";
        КонецЕсли;
        Ключи.Добавить(Ключ);
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя Тогда
            ВызватьИсключение "Не совпали код или имя собственной подготовки";
        КонецЕсли;
        Если Выборка.Ссылка.Пустая() Или Выборка.Ссылка <> Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", Ключ) Тогда
            ВызватьИсключение "Выборка должна указывать на ту же собственную записанную ссылку";
        КонецЕсли;
        ОжидаемыйРодитель = Менеджер.ПустаяСсылка();
        Если Ключ = "B" Тогда
            ОжидаемыйРодитель = Родитель;
        КонецЕсли;
        Если Выборка.Родитель <> ОжидаемыйРодитель Или Выборка.ПометкаУдаления
            Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> "" Тогда
            ВызватьИсключение "Нужны собственные обычные записи с подготовленной иерархией";
        КонецЕсли;
        ВерсияДо = Выборка.ВерсияДанных;
        Если ТипЗнч(ВерсияДо) <> Тип("Строка") Тогда
            ВызватьИсключение "ВерсияДанных выборки должна быть строкой, а не датой или бинарными данными";
        КонецЕсли;
        Уровень = Выборка.УровеньВВыборке();
        Если НачальныйУровень = Неопределено Тогда
            НачальныйУровень = Уровень;
        КонецЕсли;
        ОжидаемаяРазница = 0;
        Если Ключ = "B" Тогда
            ОжидаемаяРазница = 1;
        КонецЕсли;
        Если Уровень - НачальныйУровень <> ОжидаемаяРазница Тогда
            ВызватьИсключение "B должен быть на один уровень глубже корневых G/A/C";
        КонецЕсли;
        Если Выборка.ЭтоГруппа <> (Ключ = "G") Тогда
            ВызватьИсключение "G должен быть группой, A/B/C — элементами";
        КонецЕсли;
        Если Выборка.ЭтоГруппа Тогда
            Сообщить("Группа G: ТипЗначения не используется как тип значения характеристики");
        Иначе
            ТипХарактеристики = Выборка.ТипЗначения;
            Если ТипЗнч(ТипХарактеристики) <> Тип("ОписаниеТипов")
                Или Не ТипХарактеристики.СодержитТип(Тип("Строка"))
                Или ТипХарактеристики.СодержитТип(Тип("Число")) Тогда
                ВызватьИсключение "Для собственного элемента нужен подготовленный строковый тип характеристики";
            КонецЕсли;
            Сообщить("Элемент " + Ключ + ": тип значения допускает строку, не число");
        КонецЕсли;
        Объект = Выборка.ПолучитьОбъект();
        Если Объект = Неопределено Тогда
            ВызватьИсключение "ПолучитьОбъект может вернуть Неопределено для исчезнувшей записи";
        КонецЕсли;
        Если Объект.Наименование <> ОжидаемоеИмя Тогда
            ВызватьИсключение "Имя прочитанного объекта не совпало с подготовкой";
        КонецЕсли;
        Объект.Наименование = "Локальный черновик " + Ключ;
        Если Объект.Наименование = Выборка.Наименование Тогда
            ВызватьИсключение "Локальное изменение объекта не должно менять поле читаемой выборки";
        КонецЕсли;
        Повторная = Менеджер.Выбрать(,Новый Структура("УчебныйКлюч85", Ключ));
        Если Не Повторная.Следующий() Тогда
            ВызватьИсключение "Собственная запись исчезла при повторном чтении";
        КонецЕсли;
        Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
            ВызватьИсключение "Новое чтение не подтвердило отсутствие изменения собственной записи";
        КонецЕсли;
        Объект.Наименование = ОжидаемоеИмя;
        Сообщить(Ключ + ": " + Выборка.Код + " — " + Выборка.Наименование
            + "; уровень " + Строка(Уровень) + "; версия " + ВерсияДо + "; локальная правка не записана");
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "G,B,A,C" Тогда
        ВызватьИсключение "Нужен полный иерархический обход G,B,A,C";
    КонецЕсли;

    Сообщить("Все четыре паспорта проверены. Записать не вызывался; изменение объекта осталось в памяти.");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры
УчебныеМенеджеры85.Пульт

УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Формы → Пульт → Модуль

Полный модуль собственной обычной формы; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедуры

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

  1. Используем конкретный менеджер собственного плана. ВыбратьИерархически возвращает специализированную выборку, не массив строк и не объект для записи. У неё нет выдуманного конструктора Новый План...Выборка.

  2. Следующий первый раз позиционирует выборку на первой записи; после каждого Истина читаем текущие свойства, после Ложь поля больше не используем. Выборка читает данные порциями и не обещает неизменный снимок при чужих параллельных изменениях.

  3. Код и Наименование сверяются с точными ключами подготовки; Ссылка сверяется с самостоятельным поиском того же ключа. Родитель B — G, остальные родители пустые. Лишние записи и повтор ключа вызывают отказ.

  4. ПометкаУдаления, Предопределенный и ИмяПредопределенныхДанных проверяют три разных факта. У своих четырёх обычных записей ожидаем Ложь, Ложь и пустую строку. Наличие родителя не делает запись предопределённой.

  5. УровеньВВыборке вызывается только для иерархической выборки. B на одну ступень глубже корневых G/A/C. У счетов полная выборка имеет уровни 0,1,0,0; отдельная выборка детей G показывает B на относительном уровне 0. В статье выборки характеристик нулевая база явно не оговорена: сравниваем глубину с первым корневым уровнем и выводим фактическое значение.

  6. ЭтоГруппа отделяет G от элементов A/B/C. ТипЗначения читаем только у элемента: это ОписаниеТипов, проверяем вхождение Строка и отсутствие Число. Это описание допустимого типа, не само значение пользовательского свойства. Для группы значение характеристики в этом опыте не используется.

  7. ВерсияДанных по установленной статье — Строка, не ДвоичныеДанные и не Дата. Храним её как непрозрачный маркер для сравнения двух чтений той же записи; не разбираем как дату и не считаем номером строки.

  8. ПолучитьОбъект вызывается только после успешного Следующий и проверяется на Неопределено. Это отдельный объект для возможной модификации, а не разрешение менять readonly-поля выборки.

  9. Меняем Наименование только полученного объекта в памяти. Поле выборки должно остаться прежним, а новая выборка по одному индексируемому ключу — вернуть исходное имя и версию. В конце возвращаем имя локального объекта; Записать не вызывается вообще.

  10. После обхода проверяем полный порядок G,B,A,C. Сообщения показывают проверенные собственные коды, имена, уровни и версии. Это будущий учебный опыт; здесь нет ни F7, ни выполнения в 1С.

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

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

  2. B имеет родителя G и уровень на единицу глубже корней. У счетов отдельная выборка внутри G содержит ровно B с относительным уровнем ноль.

  3. Код, имя, ссылка и родитель совпадают с собственной подготовкой; нет пометок удаления и предопределённых записей. Другая запись или повтор ключа должны остановить опыт.

  4. В момент локальной правки имя Объект отличается от исходного поля Выборка; новое чтение сохраняет исходное имя и строковый маркер версии. Сама правка в памяти не является записью.

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

  6. Только G — группа. Для трёх элементов ТипЗначения содержит Строка и не содержит Число; код не пытается присвоить тип через readonly-свойство выборки.

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

Будущий результат: четыре проверенных паспорта и подтверждение, что локальные изменения полученных объектов не записаны. Это статически подготовленный урок, не протокол реального запуска.

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

  1. Все документированные свойства выборки используются только для чтения. Правка допустима у Наименование полученного объекта, но сохранение потребовало бы отдельного Записать, которого здесь нет.

  2. Выборка динамическая. Две одинаковые версии в этом одиночном учебном опыте не дают блокировку, транзакционный снимок или защиту от будущего конкурентного изменения.

  3. Нулевой размер ВидыСубконто относится только к своему плану без субконто, а строковый тип — к подготовленным характеристикам. Не переносите эти ожидания на чужую конфигурацию.

  4. Текущую запись надо получить через Следующий. Не сохраняйте переменную выборки как копию текущей строки и не читайте её поля после завершения цикла.

  5. УровеньВВыборке не заменяет абсолютный уровень объекта: фильтр по родителю меняет начало выборки. Порядок не является индексом, ВерсияДанных не является датой.

  6. Код только для собственного обычного толстого клиента; 1С, рабочие базы и примеры здесь не запускались.

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

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

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

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

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