Разработка и Конфигурация · 11 мин
Как определить, откуда открыта форма 1С
Разбираем способы определить, откуда открыта форма 1С: параметры формы, УникальныйИдентификатор, стек вызовов, отладчик и собственные маркеры в коде.
Задача определить, откуда открыта форма в 1С, возникает при доработке типовых конфигураций и отладке собственных механизмов. Одна и та же форма документа или справочника может открываться из списка, из другого документа, из обработки, по команде интерфейса или программно — и в каждом случае может требоваться разное поведение: другая видимость элементов, запрет редактирования, автоматическое заполнение реквизитов.
Платформа 1С:Предприятие не хранит готового свойства «источник открытия», поэтому источник определяют косвенно: через параметры формы, уникальный идентификатор владельца, ключ уникальности, анализ кода отладчиком или через собственные маркеры, которые разработчик передаёт при открытии. Ниже разобраны все рабочие методы — от простых к более сложным.
Выбор метода зависит от ситуации: если вы контролируете код, открывающий форму, правильнее передавать явный параметр; если форму открывает типовой механизм, придётся анализировать контекст через параметры и отладчик.
Как устроено открытие форм в 1С и что можно отследить
Управляемая форма в 1С открывается несколькими способами: интерактивно пользователем (команда списка, навигационная ссылка, подбор), программно через метод ОткрытьФорму() или ОткрытьЗначение(), а также глобальными командами интерфейса. В каждом случае на сервере вызывается обработчик ПриСозданииНаСервере, и именно там доступна вся информация, которую платформа передала форме.
Ключевой объект для анализа — коллекция Параметры в модуле формы. В неё попадают стандартные параметры (Ключ, Отбор, ЗначениеКопирования, РежимОткрытияОкна и другие) и произвольные параметры, переданные при программном открытии. Дополнительно у формы есть свойства КлючУникальности и УникальныйИдентификатор владельца, если форма открыта как подчинённая.
Важно понимать ограничение: если форму открыл типовой код без передачи специальных параметров, установить конкретное место вызова изнутри формы невозможно — можно только сузить круг по косвенным признакам или найти место открытия отладчиком.
Метод 1. Анализ параметров формы в ПриСозданииНаСервере
Первое место, куда стоит смотреть, — обработчик ПриСозданииНаСервере. По составу параметров часто можно понять сценарий открытия: если заполнен Параметры.Ключ — открыт существующий объект, если есть Параметры.ЗначениеКопирования — форма открыта копированием, если заполнен Параметры.Отбор — форма списка открыта с отбором, например по владельцу или из другого документа.
Типичный фрагмент диагностики выглядит так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Ключ") И Не Параметры.Ключ.Пустая() Тогда
// Открыт существующий объект
ИначеЕсли Параметры.Свойство("ЗначениеКопирования")
И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
// Форма открыта копированием
ИначеЕсли Параметры.Свойство("ЗначенияЗаполнения") Тогда
// Создание нового объекта, возможно на основании
КонецЕсли;
КонецПроцедуры
Параметр ЗначенияЗаполнения особенно полезен: при вводе на основании типовые конфигурации передают в него структуру с основанием, и по наличию реквизита-основания можно понять, из какого документа создан объект. Аналогично параметр Отбор у формы списка показывает, какой контекст задал вызывающий код — например, отбор по контрагенту означает открытие из карточки контрагента.
Метод 2. Собственный параметр-маркер при программном открытии
Самый надёжный способ — явно передавать источник открытия в собственном параметре, когда вы контролируете вызывающий код. При вызове ОткрытьФорму() вторым параметром передаётся структура, и любые её ключи попадают в Параметры формы.
// В месте открытия
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИсточникОткрытия", "ОбработкаЗагрузкиПрайса");
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыОткрытия);
// В модуле формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Источник = "";
Если Параметры.Свойство("ИсточникОткрытия", Источник) Тогда
Если Источник = "ОбработкаЗагрузкиПрайса" Тогда
Элементы.ГруппаЦены.Видимость = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При таком подходе важно объявить параметр в редакторе формы (закладка «Параметры»), если он должен быть обязательным или влиять на ключевые параметры. Необъявленные произвольные параметры тоже доступны через Параметры.Свойство(), но объявление делает поведение предсказуемым и защищает от случайного переопределения стандартных параметров.
Метод 3. Ключ уникальности и владелец формы
Третий параметр метода ОткрытьФорму() — владелец формы, четвёртый — уникальность. Если при открытии передать владельцем другую форму, в открытой форме можно проверить владельца и понять контекст. Кроме того, КлючУникальности часто используют как маркер: передавая туда строку-идентификатор сценария, вы одновременно предотвращаете повторное открытие той же формы и получаете способ опознать источник.
ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",
ПараметрыОткрытия, ЭтаФорма, "ИзРабочегоМестаКассира");
В открытой форме значение доступно как свойство КлючУникальности. Метод подходит, когда структуру параметров менять нежелательно — например, она уже перегружена данными. Ограничение очевидно: ключ уникальности один, и если он уже используется по назначению (для блокировки повторного открытия), совмещать его с маркером нужно аккуратно.
Метод 4. Поиск места открытия отладчиком
Когда форму открывает типовой или чужой код и изменять его нельзя, единственный способ точно узнать источник — отладка. Порядок действий стандартный: включить отладку в конфигураторе, поставить точку останова в обработчике ПриСозданииНаСервере нужной формы, воспроизвести действие пользователя и, когда выполнение остановится, открыть стек вызовов.
Стек вызовов покажет всю цепочку: какая команда интерфейса, общий модуль или обработка инициировали открытие. Для управляемых форм часть вызовов происходит на клиенте, поэтому в настройках отладки должны быть разрешены и клиентские, и серверные предметы отладки.
- 1Включите отладку: Сервис → Параметры → отладка разрешена
- 2Поставьте точку останова в ПриСозданииНаСервере нужной формы
- 3Воспроизведите в пользовательском сеансе действие, открывающее форму
- 4При остановке откройте стек вызовов (Отладка → Стек вызовов)
- 5Пройдите по стеку вверх до клиентского вызова ОткрытьФорму или команды
- 6Зафиксируйте модуль, процедуру и параметры вызова
Метод 5. Журнал регистрации и замеры производительности
Если отладка недоступна (рабочая база, нет возможности остановить сеанс), косвенную информацию дают технологический журнал и замеры производительности. Замер через «Администрирование → Обслуживание → Журнал регистрации и замеры» покажет, какие модули и строки кода выполнялись в момент открытия формы, что позволяет локализовать вызывающий код.
Этот способ менее точен, чем отладчик, но безопасен для рабочей базы: он не прерывает работу пользователей. Его разумно применять, когда нужно понять, какой из нескольких механизмов открывает форму, а останавливать сеанс нельзя.
Сравнение методов
Подходит, когда открытие уже передаёт стандартные параметры; не работает, если вызывающий код ничего не передаёт
Самый надёжный для своего кода; требует изменения всех мест открытия
Удобен как дополнительный маркер; ограничен одним значением
Даёт точный ответ для чужого кода; требует возможности остановить сеанс
Безопасен на рабочей базе; даёт лишь косвенную локализацию
Типичные ошибки и ограничения
Частая ошибка — попытка определить источник в обработчике ПриОткрытии на клиенте по признакам, доступным только на сервере. Вся диагностика параметров должна выполняться в ПриСозданииНаСервере, а на клиент передаваться уже готовое решение (например, через реквизиты формы или условное оформление).
Вторая ошибка — рассчитывать, что Параметры.Свойство() отличит «параметр не передан» от «параметр передан пустым». Метод вернёт Истина, если ключ есть, даже со значением Неопределено, поэтому после проверки свойства нужно проверять и само значение.
Третья ловушка — динамическое открытие через ОткрытьЗначение() и навигационные ссылки: в этих случаях платформа сама формирует параметры, и вмешаться в них нельзя. Для таких сценариев остаются только косвенные признаки и отладчик.
Проверка результата
После внедрения механизма определения источника проверьте все сценарии открытия формы: из списка, копированием, на основании, из каждой обработки и команды интерфейса. Для каждого сценария поведение формы должно соответствовать ожиданию, а непредусмотренные источники должны попадать в ветку «по умолчанию», а не вызывать ошибку.
Полезно временно добавить запись источника в журнал регистрации на период тестирования — это покажет реальные сценарии, о которых вы могли не подумать, например открытие по ссылке из письма или из избранного.
Что важно запомнить
Готового свойства источника открытия нет: используйте стандартные параметры формы, передавайте собственный маркер при программном открытии, а для чужого кода ищите место вызова отладчиком через стек вызовов. Всю диагностику выполняйте в ПриСозданииНаСервере.
Частые вопросы
Можно ли узнать, что форму открыли из конкретной обработки, не меняя её код?
Напрямую — нет. Если обработка не передаёт опознавательных параметров, остаются косвенные признаки (состав отборов, значения заполнения) или отладчик со стеком вызовов, который покажет точное место открытия.
Чем отличается ОткрытьФорму() от ОткрытьЗначение() с точки зрения определения источника?
ОткрытьФорму() позволяет передать произвольную структуру параметров, владельца и ключ уникальности — это даёт полный контроль. ОткрытьЗначение() открывает объект по ссылке, и параметры формирует платформа, поэтому передать маркер нельзя.
Работает ли анализ параметров в обычных формах (не управляемых)?
Да, принцип тот же: параметры передаются при ОткрытьФорму() и доступны в обработчике ПередОткрытием через свойство формы. Отличается только синтаксис обращения к параметрам.
Как понять, что форма списка открыта для выбора, а не для просмотра?
Проверьте параметр РежимВыбора в ПриСозданииНаСервере: платформа передаёт его при открытии формы из поля ввода. Дополнительно может быть заполнен параметр ЗакрыватьПриВыборе.
Можно ли определить источник открытия в расширении конфигурации?
Да, в расширении можно добавить свой обработчик ПриСозданииНаСервере с аннотацией После и проанализировать параметры формы. Изменить параметры, передаваемые типовым кодом, расширение не позволит, но проанализировать их и скорректировать поведение формы — вполне.