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