ПланСчетовОбъект.<Имя плана счетов>.ПолучитьФорму

Методы · GetForm

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

Синтаксис

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

ПланСчетовОбъект.<Имя плана счетов>.ПолучитьФорму (ChartOfAccountsObject.<Chart of accounts name>.GetForm)

ПланСчетовОбъект.<Имя плана счетов> (ChartOfAccountsObject.<Chart of accounts name>)

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

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

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

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

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

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

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

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

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

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

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

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

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

Счёт B: принадлежность, перечитывание, макет и блокировка своего экземпляра

Работаем с настоящим сохранённым B своего плана: отличаем локальную правку от базы и собственную блокировку от общей занятости записи.

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

Полный обычный клиентский общий модуль УчебныеМенеджерыПланов85 → Общие модули → УчебныеМенеджеры85. Пульт отдельным модулем ниже; не выполнялся.

Подготовка

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

  2. Планы счетов → УчебныеСчета85: многоуровневый план, код Строка(10), маска пустая, наименование 100, уникальность кода включена, без предопределённых счетов, видов субконто и признаков учёта. Собственный реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать. Модули пустые.

  3. Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов, код Строка(10), наименование 100, тип характеристик только Строка(30), без предопределённых элементов. Реквизит УчебныйКлюч85: Строка(10), Индексировать, применяется к группам и элементам. Модули пустые.

  4. В обоих планах вручную подготовьте ровно четыре записи: G — код 01, наименование Учебный родитель, ключ G, пустой родитель; A — код 10, наименование Учебный верхний A, ключ A, пустой родитель; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, пустой родитель. Все записи обычные, не предопределённые, без пометки удаления. У характеристик G — группа, остальные элементы. У счетов G — родительский счёт, а не группа.

  5. В собственных счетах заранее вручную задайте Вид: G и A — Активный, B — Пассивный, C — АктивноПассивный. Забалансовый=Ложь, строк видов субконто нет. Сначала сохраните эту собственную подготовку. Код урока счёт не записывает и не проводит бухгалтерских операций.

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

  7. Дополнительно у УчебныеСвойства85 создайте обычную форму Элемент85, у УчебныеСчета85 — Счет85. Мастер формы объекта, назначить основной, модуль пустой. Для счетов собственный макет Шаблон85 типа Табличный документ с текстом План счетов в R1C1; не файл и не макет рабочей конфигурации.

  8. Вставьте один полный вариант общего модуля УчебныеМенеджеры85, модуль Пульта отдельно ниже. F7 и обновление только собственной новой базы. Приготовленные G/A/B/C и их модули остаются прежними, других сеансов нет. Не совмещайте одноимённые процедуры разных уроков.

  9. Будущий код читает свои записи, правит имя только в памяти, перечитывает его и кратковременно блокирует только собственный B. Это приобретение/снятие блокировки, не безэффектное чтение; предметные данные не записываются. Форма получается закрытой, не открывается. Здесь 1С и блокировки не запускались.

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

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

Процедура ПроверитьСвоюПодготовку()
    ПроверитьСвойКонтекст();
    Менеджер = ПланыСчетов.УчебныеСчета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,A,B,C", ВидСчета.Активный, ВидСчета.Активный, ВидСчета.Пассивный, ВидСчета.АктивноПассивный);
        Если Выборка.Вид <> Виды[Ключ] Или Выборка.Забалансовый Тогда
            ВызватьИсключение "Не совпали подготовленные вид счёта или балансовый признак";
        КонецЕсли;
        Если Выборка.ВидыСубконто.Количество() <> 0 Тогда
            ВызватьИсключение "Этот план подготовлен без строк видов субконто";
        КонецЕсли;
        Если ТипЗнч(Выборка.Порядок) <> Тип("Строка") Тогда
            ВызватьИсключение "Порядок — служебная строка, не числовой индекс выборки";
        КонецЕсли;
        Если НачальныйУровень <> 0 Тогда
            ВызватьИсключение "В полной иерархической выборке счетов верхний уровень начинается с нуля";
        КонецЕсли;
        Сообщить("Вид: " + Строка(Выборка.Вид) + "; порядок: " + Выборка.Порядок + "; субконто: 0; забалансовый: нет");
        Объект = Выборка.ПолучитьОбъект();
        Если Объект = Неопределено Тогда
            ВызватьИсключение "ПолучитьОбъект может вернуть Неопределено для исчезнувшей записи";
        КонецЕсли;
        Если Объект.Наименование <> ОжидаемоеИмя Тогда
            ВызватьИсключение "Имя прочитанного объекта не совпало с подготовкой";
        КонецЕсли;
        Объект.Наименование = "Локальный черновик " + Ключ;
        Если Объект.Наименование = Выборка.Наименование Тогда
            ВызватьИсключение "Локальное изменение объекта не должно менять поле читаемой выборки";
        КонецЕсли;
        Повторная = Менеджер.Выбрать(,Новый Структура("УчебныйКлюч85", Ключ));
        Если Не Повторная.Следующий() Тогда
            ВызватьИсключение "Собственная запись исчезла при повторном чтении";
        КонецЕсли;
        Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
            ВызватьИсключение "Новое чтение не подтвердило отсутствие изменения собственной записи";
        КонецЕсли;
        Объект.Наименование = ОжидаемоеИмя;
        Сообщить(Ключ + ": " + Выборка.Код + " — " + Выборка.Наименование
            + "; уровень " + Строка(Уровень) + "; версия " + ВерсияДо + "; локальная правка не записана");
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "G,B,A,C" Тогда
        ВызватьИсключение "Нужен полный иерархический обход G,B,A,C";
    КонецЕсли;
    Дети = Менеджер.ВыбратьИерархически(Родитель,,"Код Возр");
    ЧислоДетей = 0;
    Пока Дети.Следующий() Цикл
        Если Дети.УчебныйКлюч85 <> "B" Или Дети.УровеньВВыборке() <> 0 Тогда
            ВызватьИсключение "В выборке внутри G единственный B находится на относительном уровне ноль";
        КонецЕсли;
        ЧислоДетей = ЧислоДетей + 1;
    КонецЦикла;
    Если ЧислоДетей <> 1 Тогда
        ВызватьИсключение "Внутри G должен быть ровно один собственный B";
    КонецЕсли;
    Сообщить("Все четыре паспорта проверены. Записать не вызывался; изменение объекта осталось в памяти.");
КонецПроцедуры
УчебныеМенеджеры85.Пульт

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

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

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

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

  1. Общий проверяющий код повторно использует подготовку четырёх паспортов из урока выборки. Сверяются реальные ссылки/имена/родители/версии и точный состав G/A/B/C; новый объект или неизвестный ИсходныйОбъект не передаётся.

  2. B получен поиском собственного индексированного ключа и ПолучитьОбъект. Nullable результат, точный прикладной тип, сохранённость, Ссылка и Родитель проверены перед дальнейшими действиями.

  3. ПринадлежитЭлементу(G)=Истина, ПринадлежитЭлементу(B)=Ложь. Это подчинение по всей иерархии, а не сравнение ссылки B с G. У плана счетов G обычный родительский счёт, не группа справочника.

  4. Имя меняется в памяти экземпляра. Прочитать применяется только к сохранённому объекту и возвращает данные из базы: исходное имя и чистое состояние. Это не Записать и не сохранение черновика.

  5. Получаем два экземпляра одной своей ссылки и проверяем независимость локальной правкой второго: первый сохраняет имя, второй перечитывается. Если независимость не подтверждена, блокировку не берём. Заблокирован проверяет конкретный объект встроенного языка, не общую занятость записи в базе.

  6. Заблокировать вызывается только после своей подготовки. Успешное приобретение отмечается флагом; на ошибочном пути снимается только наша приобретённая блокировка, затем ошибка передаётся дальше. На успешном пути Разблокировать вызывается отдельно, состояние перепроверяется.

  7. ПолучитьФорму получает имя собственной обычной формы, пустого владельца и новый уникальный ключ. Проверяем Неопределено/тип/закрытость/ключ. Получение формы экземпляра объекта не равно получению формы по ссылке; Открыть не вызывается.

  8. После снятия своей блокировки повторная проверка четырёх записей подтверждает неизменный состав и сохранённые имена. Если блокировку снять не удалось, опыт не считается успешным; отсутствие чужих блокировок таким кодом не доказано.

  9. Макет получается именно методом объекта своего счёта. Его тип и R1C1 проверяются; он не показывается, не печатается, не сохраняется и не создаёт бухгалтерские проводки.

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

  1. Будущий ручной тест: F7, свой Пульт, одна сессия. В начале и конце должны пройти четыре паспорта собственных записей, состав неизменен.

  2. Проверить принадлежность B реальному G и непринадлежность самому B. Для характеристики отдельно уровень G=0/B=1 и полный путь через /. Для счёта — только собственный текст макета.

  3. После локального имени проверить Модифицированность, затем после Прочитать — исходное имя и чистое состояние. В стандартном списке сохранённое B всегда имеет исходное имя.

  4. Внутри опыта блокировка первого экземпляра True, второго False; после снятия первого False. Это будущие проверки API, не полученные здесь результаты и не диагностика блокировок рабочей базы.

  5. Полученная форма должна остаться закрытой. Не нажимать Записать, Открыть, печать или файловое сохранение. Закрыть только Пульт после завершения.

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

Будущий опыт показывает настоящую иерархию собственного B, отбрасывает несохранённую правку перечитыванием и приобретает/снимает только свою блокировку. Форма остаётся закрытой, записи не меняются; runtimeVerifiedScenarios=0.

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

  1. Заблокирован=False второго экземпляра не доказывает отсутствие блокировки у другого объекта/пользователя. Вторую конкурентную блокировку здесь не пытаемся брать.

  2. Прочитать недопустим для нового объекта и отбрасывает текущие несохранённые изменения. Не используйте его как способ сохранить правку.

  3. ПолучитьФорму и макет здесь доступны в толстом обычном клиенте. Не переносите основной модуль в тонкий клиент или управляемую форму с директивами.

  4. Только новая собственная база с пустыми обработчиками и единственной сессией. Это не блокировка/разблокировка чужих объектов; никакая операция 1С здесь не выполнялась.

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

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

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

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

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