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

Методы · SelectByRefs

Формирует выборку элементов плана видов расчета по заданному источнику ссылок на элементы плана видов расчета соответствующего типа. Если источник содержит значения, отличные от ссылок на элементы плана видов расчета соответствующего типа, или ссылки на несуществующие элементы, то такие значения игнорируются.

Синтаксис

ВыбратьПоСсылкам(<Источник>, <Колонка>)

Примеры платформы

Запрос = Новый Запрос();
Запрос.Текст = "
    |ВЫБРАТЬ
    |    Мобильные.Ссылка КАК Ссылка
    |ИЗ
    |    ПланОбмена.Мобильные КАК Мобильные
    |";
РезультатЗапроса = Запрос.Выполнить();
Выборка = ПланыОбмена.Мобильные.ВыбратьПоСсылкам(РезультатЗапроса);
Полное описание, параметры и ограничения

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

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

ВыбратьПоСсылкам (SelectByRefs)

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

Синтаксис:
ВыбратьПоСсылкам(<Источник>, <Колонка>)
Параметры:

<Источник> (обязательный)
Тип: ТаблицаЗначений, РезультатЗапроса, Массив, ФиксированныйМассив.
Источник ссылок на элементы плана видов расчета.

<Колонка> (необязательный)
Тип: Число, Строка, Неопределено.
Колонка источника ссылок. Число представляет индекс колонки источника. Строка представляет имя колонки. Если значением параметра является Неопределено, то используется первая колонка источника. Значение данного параметра игнорируется, если понятие "колонка" не имеет смысла для источника. Например, если в качестве источника используется Массив.
Значение по умолчанию: Неопределено.
Возвращаемое значение:
Тип: ПланВидовРасчетаВыборка.<Имя плана видов расчета>.

Описание:

Формирует выборку элементов плана видов расчета по заданному источнику ссылок на элементы плана видов расчета соответствующего типа. Если источник содержит значения, отличные от ссылок на элементы плана видов расчета соответствующего типа, или ссылки на несуществующие элементы, то такие значения игнорируются.

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

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

Пример:

Запрос = Новый Запрос();
Запрос.Текст = "
|ВЫБРАТЬ
| Мобильные.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.Мобильные КАК Мобильные
|";
РезультатЗапроса = Запрос.Выполнить();
Выборка = ПланыОбмена.Мобильные.ВыбратьПоСсылкам(РезультатЗапроса);

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

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

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

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

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

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

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

Полный обычный клиентский общий модуль УчебныеВиды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С» и не аффилирован с ней.