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

Методы · GetForm

Получает форму объекта вид расчета.

Синтаксис

ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Полное описание, параметры и ограничения

ПланВидовРасчетаСсылка.<Имя плана видов расчета>.ПолучитьФорму (ChartOfCalculationTypesRef.<Chart of calculation types name>.GetForm)

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

ПолучитьФорму (GetForm)

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

Синтаксис:
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Параметры:

<Форма> (необязательный)
Тип: Строка, ОбъектМетаданных: Форма.
Имя формы, как оно задано в конфигураторе, или объект описания метаданного требуемой формы. Если параметр не указан, то используется основная форма, заданная в конфигураторе.

<Владелец> (необязательный)
Тип: Форма; Элемент управления.
Объект, который будет являться владельцем открываемой формы.

<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.
Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров).
Возвращаемое значение:
Тип: Форма, Неопределено.
Неопределено - если в обработчике ПриСозданииНаСервере установлен признак отказа от создания формы.
Описание:

Получает форму объекта вид расчета.

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

Толстый клиент.

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

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

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

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

Получить закрытую обычную форму именно сохранённой премии B

По ссылке B получим собственную форму просмотра с новым ключом; проверим загруженный объект, не открывая и не сохраняя его.

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

Полный обычный клиентский общий модуль УчебныеВиды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. Для основных опытов используется одна сессия, никаких фоновых обменов, расширений, сторонних обработчиков или других пользователей, меняющих записи. Код читает собственные виды и изменяет полученный объект только в памяти. Записать, удаление, проведение, расчёт регистров, файлы и сеть не вызываются.

  8. Уч85Начисления → Формы: создайте обычную форму Уч85Просмотр. Основной реквизит ВидРасчета типа ПланВидовРасчетаОбъект.Уч85Начисления. Добавьте связанные поля Код/Наименование/Уч85Ключ, только просмотр, без кнопок записи/удаления. Модуль формы пустой; в других обычных формах основное имя может отличаться.

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

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

  2. Получаем действительную B из общей подготовки A/B/C. Перед получением формы запоминаем строковую версию её данных.

  3. Передаём имя Уч85Просмотр, пропускаем второй параметр владельца и задаём третий параметр — новый УникальныйИдентификатор. Это исключает намеренный поиск ранее открытого окна по общему ключу.

  4. Сначала проверяем Неопределено, затем тип Форма. Метод справки относится к толстому клиенту; управляемую форму в тонком клиенте этим кодом не подменяем.

  5. ПолучитьФорму возвращает форму, но не равен Открыть. Проверяем, что она закрыта, и сопоставляем её КлючУникальности.

  6. Из основного реквизита ВидРасчета читаем ссылку и имя. Они принадлежат сохранённой B, а не новому объекту копии или случайной записи.

  7. Заново проверяем набор и версию. Модуль формы пустой, никаких обработчиков записи/создания нет; форму не открываем и её реквизит не меняем.

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

  1. Будущий тест: создать обычную Уч85Просмотр точно по подготовке, F7 и Выполнить в Пульте.

  2. Форма имеет тип Форма и не открыта. ПолучитьФорму использует все три позиции параметров.

  3. КлючУникальности равен переданному UUID; ВидРасчета.Ссылка равна своей B.

  4. Загруженное имя Учебная премия. В клиенте не должно появиться открытого окна просмотра.

  5. Повторное чтение A/B/C и версии B проходит. Учебный код не вызывается в рабочей базе.

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

Получена закрытая собственная форма существующей B. Вид не записывался, новое окно не открывалось.

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

  1. Имя формы — имя в Конфигураторе, не заголовок окна. Реквизит ВидРасчета нужно создать и назначить основным.

  2. Владелец занимает вторую позицию, ключ третью. Передача UUID во вторую позицию неверна.

  3. Справка допускает Неопределено при отказе создания; проверка обязательна даже при пустом собственном модуле.

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

  5. Это обычная форма и толстый клиент. runtimeVerifiedScenarios=0.

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

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

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

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

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