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

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

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

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

ПланВидовРасчетаВыборка.<Имя плана видов расчета> (ChartOfCalculationTypesSelection.<Chart of calculation types name>)

ПланВидовРасчетаВыборка.<Имя плана видов расчета> (ChartOfCalculationTypesSelection.<Chart of calculation types name>)

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

Свойства:
<Имя общего реквизита> (<Common attribute name>)
<Имя реквизита> (<Attribute name>)
<Имя табличной части> (<Tabular section name>)
БазовыеВидыРасчета (BaseCalculationTypes)
ВедущиеВидыРасчета (LeadingCalculationTypes)
ВерсияДанных (DataVersion)
ВытесняющиеВидыРасчета (DisplacingCalculationTypes)
ИмяПредопределенныхДанных (PredefinedDataName)
Код (Code)
Наименование (Description)
ПериодДействияБазовый (ActionPeriodIsBasic)
ПометкаУдаления (DeletionMark)
Предопределенный (Predefined)
Ссылка (Ref)

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

Описание:

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

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

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

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

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

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

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

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

Прочитать виды расчёта с настоящими связями и восстановить локальный объект

На трёх своих сохранённых видах разберём код/версию/признаки, реальные зависимости и поиск; Прочитать вернёт локально изменённому объекту данные базы без записи.

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

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

Подготовка

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

  2. План видов расчёта Уч85Начисления: Код Строка(10), переменная длина, наименование 100, уникальность кода включена. ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуДействия, в базовых планах только сам Уч85Начисления. Собственный реквизит Уч85Ключ Строка(8), Индексировать. Нет предопределённых элементов, общих реквизитов, разделителей, регистров расчёта или расчётных алгоритмов. Модули пустые.

  3. В стандартном списке своего плана вручную создайте ровно три обычных вида: A — код 10, имя Учебный оклад, ключ A, ПериодДействияБазовый=Истина; B — код 20, имя Учебная премия, ключ B, ПериодДействияБазовый=Ложь; C — код 30, имя Учебное отсутствие, ключ C, ПериодДействияБазовый=Ложь. Все без пометки удаления и не предопределённые.

  4. У B вручную заполните три стандартные таблицы: БазовыеВидыРасчета содержит только ссылку A; ВедущиеВидыРасчета только A; ВытесняющиеВидыРасчета только C. У A/C все три таблицы пустые. Сохраните только эту собственную подготовку. Это технический граф связей, не утверждённая методика начисления зарплаты.

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

  6. Создайте собственную обработку УчебныеВиды85 с обычной основной формой Пульт. Кнопка Выполнить, действие ВыполнитьНажатие; отдельный полный модуль формы приведён ниже. F7 и обновление только своего стенда, запуск Пульта в толстом клиенте.

  7. Для основных опытов используется одна сессия, никаких фоновых обменов, расширений, сторонних обработчиков или других пользователей, меняющих записи. Код читает собственные виды и изменяет полученный объект только в памяти. Записать, удаление, проведение, расчёт регистров, файлы и сеть не вызываются.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Свои = ПолучитьСвоиВиды();
    Менеджер = Свои.Менеджер;
    ПоКоду = Менеджер.НайтиПоКоду("20");
    Если ПоКоду = Неопределено Тогда
        ВызватьИсключение "Для непустого собственного кода результат не должен быть Неопределено";
    КонецЕсли;
    Если ПоКоду.Пустая() Или ПоКоду <> Свои.B
        Или Менеджер.НайтиПоНаименованию("Учебная премия", Истина) <> Свои.B Тогда
        ВызватьИсключение "Поиск по коду и точному имени должен дать свой B";
    КонецЕсли;
    Если Менеджер.НайтиПоКоду("") <> Неопределено
        Или Менеджер.НайтиПоНаименованию("", Истина) <> Неопределено Тогда
        ВызватьИсключение "Пустой код и пустое точное имя имеют отдельный nullable-контракт";
    КонецЕсли;
    НеНайденный = Менеджер.НайтиПоКоду("missing");
    Если НеНайденный = Неопределено Тогда
        ВызватьИсключение "Отсутствующий непустой код должен вернуть пустую ссылку, не Неопределено";
    КонецЕсли;
    Если Не НеНайденный.Пустая() Тогда
        ВызватьИсключение "В новом стенде не должно быть узла с кодом missing";
    КонецЕсли;
    Выборка = Менеджер.Выбрать(, "Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.Уч85Ключ;
        ВерсияДо = Выборка.ВерсияДанных;
        Если ТипЗнч(ВерсияДо) <> Тип("Строка") Тогда
            ВызватьИсключение "Версия данных выборки — строка, не дата/двоичные данные";
        КонецЕсли;
        ПроверитьСвоиСвязи(Выборка, Ключ, Свои);
        Сообщить(СтрШаблон("%1: код %2, имя %3; предопределённый=%4, имя предопределения=%5, пометка=%6; базовый период=%7, версия=%8",
            Ключ, Выборка.Код, Выборка.Наименование, Выборка.Предопределенный, Выборка.ИмяПредопределенныхДанных,
            Выборка.ПометкаУдаления, Выборка.ПериодДействияБазовый, ВерсияДо));
        ОбъектВида = Выборка.ПолучитьОбъект();
        Если ОбъектВида = Неопределено Тогда
            ВызватьИсключение "Собственная запись исчезла: объект может быть Неопределено";
        КонецЕсли;
        ОбъектВида.Наименование = "Локальный черновик " + Ключ;
        ОбъектВида.Прочитать();
        Если ОбъектВида.Наименование <> Свои.Имена[Ключ] Тогда
            ВызватьИсключение "Прочитать должен вернуть сохранённое имя уже существующего вида";
        КонецЕсли;
        Повторная = Менеджер.Выбрать(Новый Структура("Уч85Ключ", Ключ));
        Если Не Повторная.Следующий() Тогда
            ВызватьИсключение "Собственная запись отсутствует при повторном отборе";
        КонецЕсли;
        Если Повторная.Ссылка <> Выборка.Ссылка Или Повторная.Наименование <> Свои.Имена[Ключ]
            Или Повторная.ВерсияДанных <> ВерсияДо Тогда
            ВызватьИсключение "Новое чтение не подтвердило прежние имя, ссылку и версию";
        КонецЕсли;
        Если Повторная.Следующий() Тогда
            ВызватьИсключение "Отбор по своему ключу должен дать одну запись";
        КонецЕсли;
    КонецЦикла;
    Источник = Новый Массив;
    Источник.Добавить(Свои.A);
    Источник.Добавить("не ссылка");
    Источник.Добавить(Менеджер.ПустаяСсылка());
    Источник.Добавить(Свои.B);
    Ссылки = Новый Массив;
    ПоСсылкам = Менеджер.ВыбратьПоСсылкам(Источник);
    Пока ПоСсылкам.Следующий() Цикл
        Если (ПоСсылкам.Ссылка <> Свои.A И ПоСсылкам.Ссылка <> Свои.B)
            Или Ссылки.Найти(ПоСсылкам.Ссылка) <> Неопределено Тогда
            ВызватьИсключение "По ссылкам допускаются только свои A/B без повторов";
        КонецЕсли;
        Ссылки.Добавить(ПоСсылкам.Ссылка);
    КонецЦикла;
    Если Ссылки.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны обе ссылки A/B, порядок исходным массивом не обещается";
    КонецЕсли;
    Параметры = Новый Структура("Отбор,СтрокаПоиска", Новый Структура("Уч85Ключ", "B"), Неопределено);
    Выбор = Менеджер.ПолучитьДанныеВыбора(Параметры);
    Если ТипЗнч(Выбор) <> Тип("СписокЗначений") Или Выбор.Количество() <> 1 Тогда
        ВызватьИсключение "Быстрый выбор должен содержать ровно свой B";
    КонецЕсли;
    Если Выбор.Получить(0).Значение <> Свои.B Тогда
        ВызватьИсключение "Проверяется значение ссылки, не строковое представление";
    КонецЕсли;
    Сообщить("Паспорт A/B/C, реальные зависимости и поиск проверены. Прочитать отменил локальные имена; вид не записывался и зарплата не рассчитывалась.");
КонецПроцедуры

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

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

КонецПроцедуры

Функция ПолучитьСвоиВиды()
    ПроверитьСвойОсновнойПлан();
    Менеджер = ПланыВидовРасчета.Уч85Начисления;
    A = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "A");
    B = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "B");
    C = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "C");
    Если A.Пустая() Или B.Пустая() Или C.Пустая() Или A = B Или A = C Или B = C Тогда
        ВызватьИсключение "Подготовьте три разные реальные ссылки своего основного плана";
    КонецЕсли;
    Коды = Новый Структура("A,B,C", "10", "20", "30");
    Имена = Новый Структура("A,B,C", "Учебный оклад", "Учебная премия", "Учебное отсутствие");
    Свои = Новый Структура("Менеджер,A,B,C,Коды,Имена", Менеджер, A, B, C, Коды, Имена);
    Ключи = Новый Массив;
    Выборка = Менеджер.Выбрать(, "Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.Уч85Ключ;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя) Тогда
            ВызватьИсключение "В основной выборке есть лишний учебный вид";
        КонецЕсли;
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя
            Или Выборка.ПометкаУдаления Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> ""
            Или Выборка.Ссылка <> Свои[Ключ] Тогда
            ВызватьИсключение "Поля собственного вида не совпали с подготовкой";
        КонецЕсли;
        ПроверитьСвоиСвязи(Выборка, Ключ, Свои);
        Ключи.Добавить(Ключ);
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "A,B,C" Тогда
        ВызватьИсключение "Основной план должен содержать ровно A,B,C в порядке кода";
    КонецЕсли;
    Возврат Свои;
КонецФункции

Процедура ПроверитьСвоиСвязи(Выборка, Ключ, Свои)
    Если ТипЗнч(Выборка.ПериодДействияБазовый) <> Тип("Булево") Или Выборка.ПериодДействияБазовый <> (Ключ = "A") Тогда
        ВызватьИсключение "Только собственный A имеет подготовленный признак базового периода";
    КонецЕсли;
    Если Ключ = "B" Тогда
        Если Выборка.БазовыеВидыРасчета.Количество() <> 1 Или Выборка.ВедущиеВидыРасчета.Количество() <> 1
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 1 Тогда
            ВызватьИсключение "У B нужны три реальные подготовленные строки зависимостей";
        КонецЕсли;
        Если Выборка.БазовыеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВедущиеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВытесняющиеВидыРасчета.Получить(0).ВидРасчета <> Свои.C Тогда
            ВызватьИсключение "У B базовый/ведущий A и вытесняющий C, не плановые случайные ссылки";
        КонецЕсли;
    Иначе
        Если Выборка.БазовыеВидыРасчета.Количество() <> 0 Или Выборка.ВедущиеВидыРасчета.Количество() <> 0
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 0 Тогда
            ВызватьИсключение "У A/C таблицы зависимостей должны быть пустыми";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
УчебныеВиды85.Пульт

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

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

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

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

  1. Подготовлены реальные A/B/C в собственной базе, не случайные плановые GUID. Метаданные основного плана проверяются: строковый код, период действия, зависимость ПоПериодуДействия и только свой базовый план.

  2. БазовыеВидыРасчета у метаданных — разрешённые планы; у выборки B — строки конкретных зависимостей. Через Количество и Получить(0).ВидРасчета проверяем реальные A/A/C; у A/C все три таблицы пустые.

  3. Основная выборка явно отсортирована Код Возр. Поля доступны после успешного Следующий. Код/имя/ссылка, Предопределенный=Ложь, пустое имя предопределения и отсутствие пометки сверяются с подготовкой.

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

  5. НайтиПоКоду("20") и точное имя возвращают B. Пустой код и пустое точное имя по контракту дают Неопределено, отсутствующий непустой код — пустую ссылку; перед Пустая проверяется nullable-результат.

  6. ВерсияДанных — строка. ПолучитьОбъект может вернуть Неопределено; после проверки меняем только локальное имя и вызываем Прочитать у СУЩЕСТВУЮЩЕГО объекта. Этот метод недопустим для нового вида.

  7. Повторная выборка с одним собственным индексированным ключом подтверждает исходные имя, ссылку и версию. Прочитать восстанавливает объект из базы, не сохраняет новое локальное имя и не выполняет расчёт.

  8. ВыбратьПоСсылкам доступен с 8.3.26. Наш массив содержит A/B, текст и пустую ссылку; неподходящие значения игнорируются. Проверяется множество A/B, порядок массива не объявляется порядком выборки.

  9. ПолучитьДанныеВыбора требует Отбор и СтрокаПоиска. Неопределено означает быстрый выбор; отбор по Уч85Ключ=B даёт один элемент СписокЗначений с собственной ссылкой B, не только похожим текстом.

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

  1. Будущий тест: F7, свой Пульт, Выполнить. Основной порядок A,B,C; у B три подготовленные реальные строки A/A/C, у A/C пусто.

  2. ПериодДействияБазовый Истина только у A. Обычные виды не предопределённые и не помеченные; версия каждого имеет тип Строка.

  3. Пустые строки поиска дают Неопределено, missing даёт пустую ссылку. Никакой Пустая у Неопределено не вызывается.

  4. После локального переименования Прочитать возвращает прежнее сохранённое имя; новое чтение подтверждает прежнюю версию. Вид не записывается.

  5. По ссылкам ровно A/B; быстрый выбор один B. Повторное нажатие не изменяет сами связи, имена или число записей.

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

Будущий результат: реальные связи A/A/C, корректно различённые результаты поиска и восстановленный из базы локальный объект без записи вида.

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

  1. БазовыеВидыРасчета у выборки существует только при зависимости от базы; ВытесняющиеВидыРасчета — только при использовании периода действия. Нельзя читать эти поля в неподготовленном плане.

  2. Значение периода действия как базового — признак типа расчёта, не сама дата и не рассчитанный базовый период. Этот урок не вычисляет зарплату или пересчёты.

  3. Для этих двух полей выборки справка разрешает запись. Мы показываем только чтение и не делаем вывод о сохранении присваиванием полей курсора.

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

  5. НайтиПоНаименованию/НайтиПоРеквизиту при дубликатах возвращают одно совпадение. Наши ключи уникальны; произвольная рабочая конфигурация этим опытом не проверяется.

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

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

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

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

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