Как программно открыть форму документа 1С в режиме «Только просмотр»?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Решение для обычного приложения (Обычные формы)

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

Проанализируем пример кода, который часто не работает должным образом:


Форма = Регистратор.ПолучитьФорму("ФормаДокумента");
Форма.ТолькоПросмотр = Истина;
Форма.Открыть();

Выясним причину неудачи: при вызове метода Открыть() платформа запускает цепочку событий, таких как ПриОткрытии. В типовых конфигурациях (например, УПП 1.3 или старые редакции БП 2.0) внутри этих событий прописаны программные проверки прав, статусов документа или дат запрета редактирования. Эти процедуры могут принудительно переустановить значение свойства ТолькоПросмотр в Ложь, основываясь на правах текущего пользователя.

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


Форма = Регистратор.ПолучитьФорму("ФормаДокумента");
Форма.Открыть();
Форма.ТолькоПросмотр = Истина;

В этом случае наше программное изменение происходит последним в очереди и перекрывает все стандартные настройки, выполненные системой при инициализации. Однако, как справедливо замечено в обсуждении, если в форме документа реализованы сложные обработчики (например, при изменении даты), свойство может «отвалиться» позже. В таких случаях требуется более глубокое вмешательство в модуль формы.

Современный подход для управляемых форм (v8.3)

В управляемом приложении работа с формами строится иначе. Использование метода ПолучитьФорму на клиенте считается устаревшим. Вместо этого мы используем функцию ОткрытьФорму, которая позволяет передать параметры открытия в структуре. Это более надежный и «чистый» способ, так как платформа учитывает эти параметры еще на этапе создания формы на сервере.

Разберем по шагам, как это реализовать:

  1. Подготовим структуру параметров.
  2. Укажем стандартный параметр ТолькоПросмотр (или ReadOnly для англоязычного синтаксиса).
  3. Вызовем открытие формы.

ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ключ", ОбъектСсылка); // Ссылка на документ
ПараметрыОткрытия.Вставить("ТолькоПросмотр", Истина);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыОткрытия);

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

Влияние Библиотеки стандартных подсистем (БСП)

Если вы работаете в современных конфигурациях (ERP, УТ 11, БП 3.0), важно учитывать влияние БСП. В таких системах за доступность данных отвечают целые подсистемы: «Запрет редактирования дат», «Версионирование», «Управление доступом».

Проанализируем ситуацию: даже если вы установили ТолькоПросмотр = Истина, в модуле формы может сработать процедура ПриЧтенииНаСервере, которая вызывает типовой механизм обновления доступности элементов. В БСП часто используется параметр формы ReadOnly. Если передать его явно, типовой код конфигурации поймет, что форму нужно держать в режиме просмотра.

Иногда полезно использовать параметр КлючНазначенияИспользования. Это позволяет системе «запомнить» настройки формы именно для этого контекста открытия и не смешивать их с обычным режимом редактирования.

Различие между ТолькоПросмотр и Доступность

Часто программисты путают два свойства: ТолькоПросмотр и Доступность. Разберем разницу:

Важный совет: Принудительная установка свойства формы ТолькоПросмотр — это интерфейсное решение. Оно не заменяет настройку ролей и прав доступа (RLS). Если у пользователя есть права на редактирование объекта, он может попытаться обойти ваше ограничение через консоль кода или групповую обработку объектов. Для обеспечения реальной безопасности данных всегда комбинируйте программные методы открытия с настройкой прав в конфигураторе.

Что делать, если режим просмотра сбрасывается?

Если вы столкнулись с тем, что после открытия форма все равно становится доступной для редактирования (например, при нажатии на какие-то кнопки или смене даты), проанализируйте модуль формы на наличие вызовов функций типа УстановитьДоступностьЭлементов(). Для интерактивной проверки и отладки свойств элементов открытых форм подойдёт обработка для редактирования свойств управляемых форм в режиме предприятия.

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


&После("ОбновитьДоступностьФормы")
Процедура Расш_ОбновитьДоступностьФормы()
    ЭтаФорма.ТолькоПросмотр = Истина;
КонецПроцедуры

Таким образом, мы гарантируем, что какие бы расчеты ни проводила типовая конфигурация, финальное состояние формы всегда будет соответствовать режиму «Только просмотр».

← На главную