К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как определить, откуда открыта форма 1С

Разбираем способы определить, откуда открыта форма 1С: параметры формы, УникальныйИдентификатор, стек вызовов, отладчик и собственные маркеры в коде.

Задача определить, откуда открыта форма в 1С, возникает при доработке типовых конфигураций и отладке собственных механизмов. Одна и та же форма документа или справочника может открываться из списка, из другого документа, из обработки, по команде интерфейса или программно — и в каждом случае может требоваться разное поведение: другая видимость элементов, запрет редактирования, автоматическое заполнение реквизитов.

Платформа 1С:Предприятие не хранит готового свойства «источник открытия», поэтому источник определяют косвенно: через параметры формы, уникальный идентификатор владельца, ключ уникальности, анализ кода отладчиком или через собственные маркеры, которые разработчик передаёт при открытии. Ниже разобраны все рабочие методы — от простых к более сложным.

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

Как устроено открытие форм в 1С и что можно отследить

Управляемая форма в 1С открывается несколькими способами: интерактивно пользователем (команда списка, навигационная ссылка, подбор), программно через метод ОткрытьФорму() или ОткрытьЗначение(), а также глобальными командами интерфейса. В каждом случае на сервере вызывается обработчик ПриСозданииНаСервере, и именно там доступна вся информация, которую платформа передала форме.

Ключевой объект для анализа — коллекция Параметры в модуле формы. В неё попадают стандартные параметры (Ключ, Отбор, ЗначениеКопирования, РежимОткрытияОкна и другие) и произвольные параметры, переданные при программном открытии. Дополнительно у формы есть свойства КлючУникальности и УникальныйИдентификатор владельца, если форма открыта как подчинённая.

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

Метод 1. Анализ параметров формы в ПриСозданииНаСервере

Первое место, куда стоит смотреть, — обработчик ПриСозданииНаСервере. По составу параметров часто можно понять сценарий открытия: если заполнен Параметры.Ключ — открыт существующий объект, если есть Параметры.ЗначениеКопирования — форма открыта копированием, если заполнен Параметры.Отбор — форма списка открыта с отбором, например по владельцу или из другого документа.

Типичный фрагмент диагностики выглядит так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Ключ") И Не Параметры.Ключ.Пустая() Тогда

// Открыт существующий объект

ИначеЕсли Параметры.Свойство("ЗначениеКопирования")

И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда

// Форма открыта копированием

ИначеЕсли Параметры.Свойство("ЗначенияЗаполнения") Тогда

// Создание нового объекта, возможно на основании

КонецЕсли;

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

Параметр ЗначенияЗаполнения особенно полезен: при вводе на основании типовые конфигурации передают в него структуру с основанием, и по наличию реквизита-основания можно понять, из какого документа создан объект. Аналогично параметр Отбор у формы списка показывает, какой контекст задал вызывающий код — например, отбор по контрагенту означает открытие из карточки контрагента.

Метод 2. Собственный параметр-маркер при программном открытии

Самый надёжный способ — явно передавать источник открытия в собственном параметре, когда вы контролируете вызывающий код. При вызове ОткрытьФорму() вторым параметром передаётся структура, и любые её ключи попадают в Параметры формы.

// В месте открытия

ПараметрыОткрытия = Новый Структура;

ПараметрыОткрытия.Вставить("ИсточникОткрытия", "ОбработкаЗагрузкиПрайса");

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыОткрытия);

// В модуле формы

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Источник = "";

Если Параметры.Свойство("ИсточникОткрытия", Источник) Тогда

Если Источник = "ОбработкаЗагрузкиПрайса" Тогда

Элементы.ГруппаЦены.Видимость = Ложь;

КонецЕсли;

КонецЕсли;

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

При таком подходе важно объявить параметр в редакторе формы (закладка «Параметры»), если он должен быть обязательным или влиять на ключевые параметры. Необъявленные произвольные параметры тоже доступны через Параметры.Свойство(), но объявление делает поведение предсказуемым и защищает от случайного переопределения стандартных параметров.

Метод 3. Ключ уникальности и владелец формы

Третий параметр метода ОткрытьФорму() — владелец формы, четвёртый — уникальность. Если при открытии передать владельцем другую форму, в открытой форме можно проверить владельца и понять контекст. Кроме того, КлючУникальности часто используют как маркер: передавая туда строку-идентификатор сценария, вы одновременно предотвращаете повторное открытие той же формы и получаете способ опознать источник.

ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",

ПараметрыОткрытия, ЭтаФорма, "ИзРабочегоМестаКассира");

В открытой форме значение доступно как свойство КлючУникальности. Метод подходит, когда структуру параметров менять нежелательно — например, она уже перегружена данными. Ограничение очевидно: ключ уникальности один, и если он уже используется по назначению (для блокировки повторного открытия), совмещать его с маркером нужно аккуратно.

Метод 4. Поиск места открытия отладчиком

Когда форму открывает типовой или чужой код и изменять его нельзя, единственный способ точно узнать источник — отладка. Порядок действий стандартный: включить отладку в конфигураторе, поставить точку останова в обработчике ПриСозданииНаСервере нужной формы, воспроизвести действие пользователя и, когда выполнение остановится, открыть стек вызовов.

Стек вызовов покажет всю цепочку: какая команда интерфейса, общий модуль или обработка инициировали открытие. Для управляемых форм часть вызовов происходит на клиенте, поэтому в настройках отладки должны быть разрешены и клиентские, и серверные предметы отладки.

Порядок действий в отладчике
  1. 1
    Включите отладку: Сервис → Параметры → отладка разрешена
  2. 2
    Поставьте точку останова в ПриСозданииНаСервере нужной формы
  3. 3
    Воспроизведите в пользовательском сеансе действие, открывающее форму
  4. 4
    При остановке откройте стек вызовов (Отладка → Стек вызовов)
  5. 5
    Пройдите по стеку вверх до клиентского вызова ОткрытьФорму или команды
  6. 6
    Зафиксируйте модуль, процедуру и параметры вызова

Метод 5. Журнал регистрации и замеры производительности

Если отладка недоступна (рабочая база, нет возможности остановить сеанс), косвенную информацию дают технологический журнал и замеры производительности. Замер через «Администрирование → Обслуживание → Журнал регистрации и замеры» покажет, какие модули и строки кода выполнялись в момент открытия формы, что позволяет локализовать вызывающий код.

Этот способ менее точен, чем отладчик, но безопасен для рабочей базы: он не прерывает работу пользователей. Его разумно применять, когда нужно понять, какой из нескольких механизмов открывает форму, а останавливать сеанс нельзя.

Сравнение методов

Параметры формы

Подходит, когда открытие уже передаёт стандартные параметры; не работает, если вызывающий код ничего не передаёт

Собственный маркер

Самый надёжный для своего кода; требует изменения всех мест открытия

КлючУникальности

Удобен как дополнительный маркер; ограничен одним значением

Отладчик и стек вызовов

Даёт точный ответ для чужого кода; требует возможности остановить сеанс

Замеры производительности

Безопасен на рабочей базе; даёт лишь косвенную локализацию

Типичные ошибки и ограничения

Частая ошибка — попытка определить источник в обработчике ПриОткрытии на клиенте по признакам, доступным только на сервере. Вся диагностика параметров должна выполняться в ПриСозданииНаСервере, а на клиент передаваться уже готовое решение (например, через реквизиты формы или условное оформление).

Вторая ошибка — рассчитывать, что Параметры.Свойство() отличит «параметр не передан» от «параметр передан пустым». Метод вернёт Истина, если ключ есть, даже со значением Неопределено, поэтому после проверки свойства нужно проверять и само значение.

Третья ловушка — динамическое открытие через ОткрытьЗначение() и навигационные ссылки: в этих случаях платформа сама формирует параметры, и вмешаться в них нельзя. Для таких сценариев остаются только косвенные признаки и отладчик.

Типичные ошибки
01
Анализ параметров в ПриОткрытии вместо ПриСозданииНаСервере — часть данных ещё недоступна или требует серверного вызова
02
Проверка только Параметры.Свойство() без проверки значения — пустой параметр даёт ложное срабатывание
03
Использование имён стандартных параметров для своих маркеров — конфликт с логикой платформы
04
Попытка определить источник при открытии через ОткрытьЗначение() без отладчика — параметры формирует платформа

Проверка результата

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

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

Итог

Что важно запомнить

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

Частые вопросы

Можно ли узнать, что форму открыли из конкретной обработки, не меняя её код?

Напрямую — нет. Если обработка не передаёт опознавательных параметров, остаются косвенные признаки (состав отборов, значения заполнения) или отладчик со стеком вызовов, который покажет точное место открытия.

Чем отличается ОткрытьФорму() от ОткрытьЗначение() с точки зрения определения источника?

ОткрытьФорму() позволяет передать произвольную структуру параметров, владельца и ключ уникальности — это даёт полный контроль. ОткрытьЗначение() открывает объект по ссылке, и параметры формирует платформа, поэтому передать маркер нельзя.

Работает ли анализ параметров в обычных формах (не управляемых)?

Да, принцип тот же: параметры передаются при ОткрытьФорму() и доступны в обработчике ПередОткрытием через свойство формы. Отличается только синтаксис обращения к параметрам.

Как понять, что форма списка открыта для выбора, а не для просмотра?

Проверьте параметр РежимВыбора в ПриСозданииНаСервере: платформа передаёт его при открытии формы из поля ввода. Дополнительно может быть заполнен параметр ЗакрыватьПриВыборе.

Можно ли определить источник открытия в расширении конфигурации?

Да, в расширении можно добавить свой обработчик ПриСозданииНаСервере с аннотацией После и проанализировать параметры формы. Изменить параметры, передаваемые типовым кодом, расширение не позволит, но проанализировать их и скорректировать поведение формы — вполне.