Получает форму регистра расчета.
Синтаксис
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)Полное описание, параметры и ограничения
РегистрРасчетаМенеджер.<Имя регистра расчета>.ПолучитьФорму (CalculationRegisterManager.<Calculation register name>.GetForm)
РегистрРасчетаМенеджер.<Имя регистра расчета> (CalculationRegisterManager.<Calculation register name>)
ПолучитьФорму (GetForm)
Доступен, начиная с версии 8.0.
Синтаксис:
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Параметры:
<Форма> (обязательный)
Тип: Строка, ОбъектМетаданных: Форма.
Имя формы, как оно задано в конфигураторе, или объект описания метаданного требуемой формы.
<Владелец> (необязательный)
Тип: Форма; Элемент управления.
Объект, который будет являться владельцем открываемой формы.
<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.
Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров).
Возвращаемое значение:
Тип: Форма, Неопределено.
Неопределено - если в обработчике ПриСозданииНаСервере установлен признак отказа от создания формы.
Описание:
Получает форму регистра расчета.
Доступность:
Толстый клиент.
Примечание:
Перед выполнением метода производится анализ параметров вызова и, при необходимости, происходит переадресация вызова глобальному контексту.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Ключ сохранённого движения B, собственные формы и макет регистра расчёта
После полного паспорта своего стенда получаем ключ реальной строки 2 документа 001; отдельно создаём закрытые собственные формы и читаем свой макет по имени и метаданным.
Где и как запускать
Полный обычный клиентский общий модуль УчебнаяВыборкаРасчета85 → УчебныеПаспортаРасчета85. Свои реальные движения читаются, окна не открываются, макет не печатается; не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебнаяВыборкаРасчета85, совместимость НеИспользовать, обычное приложение/толстый клиент. Не рабочая ЗУП/КА2/УТ/БП и не их копия. Нет расширений, общих реквизитов, разделителей, подписок, обмена, истории и фоновых прикладных заданий. Одна сессия. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.
План видов расчёта Уч85ВидыПаспорта: строковый код 10, наименование 100, ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуРегистрации. Единственный предопределённый вид УчебноеНачисление с кодом DEMO и именем Учебное начисление. Базовые/ведущие/вытесняющие виды пусты. Модули плана пустые. Этот вид не содержит формулу зарплаты.
Регистр расчёта Уч85Паспорта: периодичность Месяц, план Уч85ВидыПаспорта, Период действия=Да, Базовый период=Да. Единственное измерение Участник: Строка(10), Индексировать, базовое; ресурс Сумма: Число(15,2). Без графика, перерасчётов и других полей; модуль набора пустой. В этом варианте обязательные флаги периодов включены, не переиспользуйте стенд предыдущего урока с выключенными периодами.
Документ Уч85Паспорт: номер Строка(3), длина 3, без реквизитов и табличных частей, Проведение=Разрешить; в Движения включите только Уч85Паспорта. В модуль ОБЪЕКТА вставьте полный отдельный ОбработкаПроведения ниже. Остальные обработчики пустые. Сначала F7 и обновление только своего стенда.
Вручную создайте ровно один документ: номер 001, дата 15.10.2026 12:00:00. Проведите его только в своей новой учебной базе. Это БУДУЩАЯ реальная запись подготовки: платформа запишет две строки движений и рассчитает фактические периоды. Здесь никакая запись или проведение не выполнялись. Основной урок ниже только читает уже сохранённые строки.
Общий модуль УчебныеПаспортаРасчета85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет; остальные клиентские флаги=Нет. Вставьте полный основной модуль. Обработка УчебныеПаспортаРасчета85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие; её полный отдельный модуль ниже. Не смешивайте три модуля в одном.
После собственного проведения откройте Пульт. Не создавайте второй документ, не меняйте движения вручную и не добавляйте Записать в основной модуль. Две строки имеют реальную ссылку 001, номера 1/2, участников A/B, суммы 100/200, общую регистрацию октябрь и базу сентябрь; действие A — 1–15 октября, B — 16–31 октября.
Дополнительно в собственном регистре Уч85Паспорта создайте обычную форму списка Список85 стандартным мастером, назначьте основной формой списка; модуль пустой. Это НЕ управляемая форма. Собственный макет Паспорт85: Табличный документ, R1C1 содержит ровно Учебный паспорт расчета, без параметров. Сначала F7 своего стенда.
Основной общий модуль замените целиком этим уроком; отдельные ОбработкаПроведения и Пульт те же полные модули ниже. Уже проведённый собственный 001 и две его строки остаются подготовкой: этот основной модуль не перепроводит документ, не открывает формы, не печатает и не сохраняет макет.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвоюПодготовку();
ДокументыПодготовки = Документы.Уч85Паспорт.Выбрать();
Если Не ДокументыПодготовки.Следующий() Тогда
ВызватьИсключение "Собственный сохранённый 001 исчез";
КонецЕсли;
СвойРегистратор = ДокументыПодготовки.Ссылка;
Менеджер = РегистрыРасчета.Уч85Паспорта;
Выборка = Менеджер.ВыбратьПоРегистратору(СвойРегистратор);
СвойКлюч = Неопределено;
Пока Выборка.Следующий() Цикл
Если Выборка.Участник = "B" Тогда
СвойКлюч = Менеджер.СоздатьКлючЗаписи(Новый Структура("Регистратор,НомерСтроки", Выборка.Регистратор, Выборка.НомерСтроки));
КонецЕсли;
КонецЦикла;
Если СвойКлюч = Неопределено Тогда
ВызватьИсключение "Нужна настоящая сохранённая строка B собственного регистратора";
КонецЕсли;
Если ТипЗнч(СвойКлюч) <> Тип("РегистрРасчетаКлючЗаписи.Уч85Паспорта")
Или СвойКлюч.Регистратор <> СвойРегистратор Или СвойКлюч.НомерСтроки <> 2 Тогда
ВызватьИсключение "Ключ должен идентифицировать реальную строку 2 собственного 001";
КонецЕсли;
Сообщить("Ключ собственного движения B: регистратор " + Строка(СвойКлюч.Регистратор) + "; строка " + Строка(СвойКлюч.НомерСтроки));
МетаданныеРегистра = Метаданные.РегистрыРасчета.Уч85Паспорта;
ФормаСписка = МетаданныеРегистра.Формы.Найти("Список85");
МакетПаспорта = МетаданныеРегистра.Макеты.Найти("Паспорт85");
Если ФормаСписка = Неопределено Или МакетПаспорта = Неопределено Тогда
ВызватьИсключение "Подготовьте собственные обычную форму Список85 и макет Паспорт85";
КонецЕсли;
УникальностьПервой = Новый УникальныйИдентификатор;
УникальностьВторой = Новый УникальныйИдентификатор;
ПерваяФорма = Менеджер.ПолучитьФорму(ФормаСписка, , УникальностьПервой);
ВтораяФорма = Менеджер.ПолучитьФормуСписка("Список85", , УникальностьВторой);
ПроверитьСвоеЗакрытоеОкно(ПерваяФорма, УникальностьПервой);
ПроверитьСвоеЗакрытоеОкно(ВтораяФорма, УникальностьВторой);
МакетПоИмени = Менеджер.ПолучитьМакет("Паспорт85");
МакетПоМетаданным = Менеджер.ПолучитьМакет(МакетПаспорта);
Если ТипЗнч(МакетПоИмени) <> Тип("ТабличныйДокумент") Или ТипЗнч(МакетПоМетаданным) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Подготовлен собственный макет типа Табличный документ";
КонецЕсли;
Если МакетПоИмени.Область(1, 1).Текст <> "Учебный паспорт расчета"
Или МакетПоМетаданным.Область(1, 1).Текст <> "Учебный паспорт расчета" Тогда
ВызватьИсключение "Оба способа получения должны прочитать свой точный R1C1";
КонецЕсли;
Сообщить("Две собственные формы получены, но не открыты; макет прочитан двумя способами, не напечатан и не сохранён.");
КонецПроцедуры
Процедура ПроверитьСвоеЗакрытоеОкно(Окно, Уникальность)
Если Окно = Неопределено Тогда
ВызватьИсключение "Получение формы может вернуть Неопределено";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Тогда
ВызватьИсключение "Нужна собственная обычная форма толстого клиента";
КонецЕсли;
Если Окно.Открыта() Или Окно.КлючУникальности <> Уникальность Тогда
ВызватьИсключение "Не используем уже открытое чужое окно";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоюПодготовку()
ПроверитьСвойКонтекст();
Регистр = Метаданные.РегистрыРасчета.Уч85Паспорта;
План = Метаданные.ПланыВидовРасчета.Уч85ВидыПаспорта;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.РегистрыРасчета.Количество() <> 1
Или Метаданные.ПланыВидовРасчета.Количество() <> 1
Или Регистр.ПланВидовРасчета <> План Или Регистр.Периодичность <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраРасчета.Месяц
Или Не Регистр.ПериодДействия Или Не Регистр.БазовыйПериод
Или Не План.ИспользованиеПериодаДействия
Или План.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.ПоПериодуРегистрации
Или Регистр.Измерения.Количество() <> 1 Или Регистр.Измерения.Найти("Участник") = Неопределено
Или Регистр.Ресурсы.Количество() <> 1 Или Регистр.Ресурсы.Найти("Сумма") = Неопределено
Или Регистр.Перерасчеты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен собственный регистр с включёнными действием и базой, а не другой стенд без этих свойств";
КонецЕсли;
ДокументыПодготовки = Документы.Уч85Паспорт.Выбрать();
Если Не ДокументыПодготовки.Следующий() Тогда
ВызватьИсключение "Сначала вручную сохраните и проведите собственный 001";
КонецЕсли;
СвойРегистратор = ДокументыПодготовки.Ссылка;
Если ДокументыПодготовки.Номер <> "001" Или ДокументыПодготовки.Дата <> Дата(2026, 10, 15, 12, 0, 0)
Или Не ДокументыПодготовки.Проведен Или ДокументыПодготовки.ПометкаУдаления
Или СвойРегистратор.Пустая() Тогда
ВызватьИсключение "Нужен настоящий проведённый собственный документ 001 без пометки";
КонецЕсли;
Если ДокументыПодготовки.Следующий() Тогда
ВызватьИсключение "Не должно быть других документов собственного стенда";
КонецЕсли;
СвойВид = ПланыВидовРасчета.Уч85ВидыПаспорта.УчебноеНачисление;
ОбъектВида = СвойВид.ПолучитьОбъект();
Если ОбъектВида = Неопределено Тогда
ВызватьИсключение "Нужен реально созданный собственный предопределённый вид";
КонецЕсли;
Если ОбъектВида.БазовыеВидыРасчета.Количество() <> 0
Или ОбъектВида.ВедущиеВидыРасчета.Количество() <> 0
Или ОбъектВида.ВытесняющиеВидыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "Этот опыт не допускает базовых, ведущих или вытесняющих зависимостей";
КонецЕсли;
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.Выбрать(), СвойРегистратор, СвойВид, "A,B");
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.ВыбратьПоРегистратору(СвойРегистратор), СвойРегистратор, СвойВид, "A,B");
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.Выбрать(Дата(2026, 10, 1), Дата(2026, 10, 31, 23, 59, 59),
Новый Структура("Участник", "B"), "Возр"), СвойРегистратор, СвойВид, "B");
Пустая = РегистрыРасчета.Уч85Паспорта.Выбрать(Дата(2026, 11, 1), Дата(2026, 11, 30, 23, 59, 59));
Если Пустая.Следующий() Тогда
ВызватьИсключение "В ноябре собственных движений нет";
КонецЕсли;
Сообщить("Прочитаны реальные движения 001, вариант по регистратору и один индексированный отбор. Записать в этом общем модуле нет.");
КонецПроцедуры
Процедура ПрочитатьПаспорта(Выборка, СвойРегистратор, СвойВид, ОжидаемыеКлючи)
Если ТипЗнч(Выборка) <> Тип("РегистрРасчетаВыборка.Уч85Паспорта") Тогда
ВызватьИсключение "Нужна настоящая специализированная выборка своего регистра";
КонецЕсли;
НайденныеКлючи = Новый Массив;
Пока Выборка.Следующий() Цикл
Ключ = Выборка.Участник;
Если Ключ = "A" Тогда
Номер = 1;
Начало = Дата(2026, 10, 1);
Конец = Дата(2026, 10, 15, 23, 59, 59);
Сумма = 100;
ИначеЕсли Ключ = "B" Тогда
Номер = 2;
Начало = Дата(2026, 10, 16);
Конец = Дата(2026, 10, 31, 23, 59, 59);
Сумма = 200;
Иначе
ВызватьИсключение "Неизвестное движение своего стенда";
КонецЕсли;
Если НайденныеКлючи.Найти(Ключ) <> Неопределено Или Выборка.Регистратор <> СвойРегистратор
Или Выборка.НомерСтроки <> Номер Или Выборка.ВидРасчета <> СвойВид
Или Не Выборка.Активность Или Выборка.Сторно Или Выборка.Сумма <> Сумма
Или Выборка.ПериодРегистрации <> Дата(2026, 10, 1)
Или Выборка.ПериодДействия <> Дата(2026, 10, 1)
Или Выборка.ПериодДействияНачало <> Начало Или Выборка.ПериодДействияКонец <> Конец
Или Выборка.БазовыйПериодНачало <> Дата(2026, 9, 1)
Или Выборка.БазовыйПериодКонец <> Дата(2026, 9, 30, 23, 59, 59) Тогда
ВызватьИсключение "Не совпал паспорт собственной сохранённой строки расчёта";
КонецЕсли;
ФактическиеИнтервалы = Выборка.ФактическийПериодДействия;
Если ТипЗнч(ФактическиеИнтервалы) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Фактический период — фиксированный массив, не одна пара дат";
КонецЕсли;
Если ФактическиеИнтервалы.Количество() <> 1 Тогда
ВызватьИсключение "В собственном опыте без вытеснения ожидается один фактический интервал";
КонецЕсли;
Для Каждого Интервал Из ФактическиеИнтервалы Цикл
Если ТипЗнч(Интервал) <> Тип("ЭлементФактическогоПериодаДействия")
Или Интервал.ДатаНачала <> Начало Или Интервал.ДатаОкончания <> Конец Тогда
ВызватьИсключение "Фактический интервал без вытеснения должен совпасть с заданным действием";
КонецЕсли;
Сообщить(Ключ + ": фактический интервал " + Строка(Интервал.ДатаНачала) + " — " + Строка(Интервал.ДатаОкончания));
КонецЦикла;
НайденныеКлючи.Добавить(Ключ);
Сообщить("Строка " + Строка(Выборка.НомерСтроки) + ": регистрация " + Строка(Выборка.ПериодРегистрации)
+ "; месяц действия " + Строка(Выборка.ПериодДействия) + "; база " + Строка(Выборка.БазовыйПериодНачало)
+ " — " + Строка(Выборка.БазовыйПериодКонец));
КонецЦикла;
Если СтрСоединить(НайденныеКлючи, ",") <> ОжидаемыеКлючи Тогда
ВызватьИсключение "Количество и порядок собственных строк отличаются от подготовленных";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебнаяВыборкаРасчета85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУч85Паспорт.МодульОбъекта
УчебнаяВыборкаРасчета85 → Документы → Уч85Паспорт → Модуль объекта
Полный модуль своего документа для будущего ручного проведения; не выполнялся.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или ЭтотОбъект.Номер <> "001" Или ЭтотОбъект.Дата <> Дата(2026, 10, 15, 12, 0, 0) Тогда
Отказ = Истина;
ВызватьИсключение "Проводить можно только собственный учебный 001 в подготовленном стенде";
КонецЕсли;
Набор = ЭтотОбъект.Движения.Уч85Паспорта;
Набор.Записывать = Истина;
Набор.Очистить();
Для Номер = 1 По 2 Цикл
Запись = Набор.Добавить();
Запись.Активность = Истина;
Запись.Сторно = Ложь;
Запись.ПериодРегистрации = ЭтотОбъект.Дата;
Запись.ВидРасчета = ПланыВидовРасчета.Уч85ВидыПаспорта.УчебноеНачисление;
Запись.БазовыйПериодНачало = Дата(2026, 9, 1);
Запись.БазовыйПериодКонец = Дата(2026, 9, 30, 23, 59, 59);
Если Номер = 1 Тогда
Запись.Участник = "A";
Запись.Сумма = 100;
Запись.ПериодДействияНачало = Дата(2026, 10, 1);
Запись.ПериодДействияКонец = Дата(2026, 10, 15, 23, 59, 59);
Иначе
Запись.Участник = "B";
Запись.Сумма = 200;
Запись.ПериодДействияНачало = Дата(2026, 10, 16);
Запись.ПериодДействияКонец = Дата(2026, 10, 31, 23, 59, 59);
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебныеПаспортаРасчета85.Пульт
УчебнаяВыборкаРасчета85 → Обработки → УчебныеПаспортаРасчета85 → Формы → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеПаспортаРасчета85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Полная ПроверитьСвоюПодготовку повторяет проверенный паспорт 001 и всех его движений A/B, включая базу, действие и фактические интервалы. Ссылка регистратора реально прочитана, ключ не строится для отсутствующего документа.
СоздатьКлючЗаписи получает структуру ровно из двух полей Регистратор и НомерСтроки, прочитанных у фактической строки B. Возвращается прикладной РегистрРасчетаКлючЗаписи, не строка, не UUID и не Запись. Свойства ключа только читаются и сверяются с сохранённым 001/2.
Ключ — адрес движения; создание ключа само не сохраняет и не доказывает существование записи. В этом уроке наличие доказывает предшествующее чтение и паспорт. Не используйте непустой ключ как универсальную проверку наличия данных.
ПолучитьФорму использует собственный объект метаданных формы, ПолучитьФормуСписка — её собственное имя. Для каждой задан отдельный UUID уникальности, чтобы не получить уже открытое окно. UUID здесь относится только к форме, не заменяет реального регистратора.
Оба результата проверяются на nullable, тип обычной формы, закрытое состояние и точный ключ уникальности. Получение формы не равно её открытию: Открыть не вызывается и видимый список/выделение строки не обещаются.
ПолучитьМакет вызывается по собственному имени и по объекту метаданных. Заранее задан тип Табличный документ; R1C1 сравнивается с точной учебной надписью. Макет — отдельный документ представления, не данные движений и не печать.
Общий модуль не выполняет Записать/Удалить/проведение, не перенастраивает открытые окна и не вызывает сеть. Будущая сохраняющая подготовка 001 вынесена в самостоятельный модуль документа и честно отмечена в уроке.
Как проверить результат
Будущий тест F7 и собственный Пульт обычного толстого клиента: паспорт A/B проходит, ключ имеет конкретный прикладной тип, реальный 001 и номер строки 2.
Обе формы существуют, обычные, не открыты и имеют разные переданные UUID. Никакие видимые окна списка или автоматическое выделение B не заявляются.
Оба полученных макета — ТабличныйДокумент и имеют точный текст R1C1. Не печатать и не записывать файлы для проверки.
Если своей формы/макета нет, тип неверен, запись исчезла или паспорт не совпал, опыт должен остановиться; здесь результат в 1С ещё не получен.
Ожидаемый результат
Будущий результат: проверенный адрес реального движения 001/2, два закрытых собственных окна и свой макет; никаких записей основного модуля или вывода на печать. Не выполнялся.
На что обратить внимание
Не конструируйте Новый РегистрРасчетаКлючЗаписи: ключ возвращает менеджер. Два поля идентификации readonly и не заменяются ссылкой документа без номера строки.
В native примере СоздатьКлючЗаписи встречается структура измерений; контракт параметра для регистра расчёта явно требует регистратор и номер строки. Урок следует этому контракту и использует реально прочитанные значения.
Получение формы допускает переадресацию глобальному контексту и nullable результат. Подготовка обычной формы и толстый клиент обязательны; не переносите опыт на управляемый/веб-клиент.
UUID ключа уникальности окна не является идентификатором записи регистра. Макет не является формой и не содержит автоматического результата расчёта.
Основной модуль только читает, но отдельное будущее проведение подготовки сохраняет свои движения. Рабочие базы запрещены; runtimeVerifiedScenarios=0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.