В практике разработчика 1С часто встречается ситуация, когда форма документа в «обычном» приложении (например, в УПП или УТ 10.3) неожиданно открывается в режиме Только просмотр. Самое загадочное в этой ситуации — поведение системы в процессе отладки: программист видит, что в конце процедуры ПередОткрытием свойство ЭтаФорма.ТолькоПросмотр равно Ложь, но уже в начале процедуры ПриОткрытии оно магическим образом меняется на Истина.
В этой статье мы подробно разберем, что происходит «за кулисами» платформы «1С:Предприятие 8» в промежутке между этими событиями, и составим пошаговый план поиска «виновника» блокировки формы.
Важно понимать, что между вызовами обработчиков ПередОткрытием и ПриОткрытии платформа выполняет целый ряд системных проверок. Даже если вы программно попытаетесь принудительно разрешить редактирование, платформа может переопределить это решение, основываясь на метаданных и правах доступа.
Рассмотрим основные причины такого поведения:
ТолькоПросмотр установится в Истина именно в момент инициализации формы перед выводом пользователю.Разберем ситуацию на примере из практики. Вы обнаружили, что форма блокируется для роли «Менеджер по продажам». Для решения проблемы нам необходимо проанализировать состав ролей пользователя. Выясним причину, проверив настройки в Конфигураторе:
Откройте роль пользователя, перейдите к нужному документу и проверьте состояние флагов в колонке прав. Обратите особое внимание на «Интерактивные» права:
Интерактивное изменение проведенных;Интерактивная пометка удаления;Интерактивное снятие пометки удаления.Если хотя бы одно из этих условий не выполняется для текущего состояния объекта (например, документ проведен), платформа проигнорирует ваш код ЭтаФорма.ТолькоПросмотр = Ложь; и установит режим чтения. Для проверки прав конкретных пользователей на чтение и изменение объектов конфигурации можно использовать отчет по анализу прав пользователей с детализацией по объектам.
Проанализируем ситуацию, когда права на уровне метаданных есть, но форма все равно недоступна. Здесь в игру вступает RLS (Ограничение доступа на уровне записей).
В 1С проверка RLS на «Изменение» может срабатывать не одновременно с проверкой на «Чтение». Пользователь может видеть документ в списке, так как условие для чтения выполняется, но при попытке открытия формы платформа обнаруживает, что текущая запись не удовлетворяет условиям ограничения для изменения. В результате форма открывается только для ознакомления.
Для диагностики этого случая попробуйте временно запустить систему под пользователем с полными правами. Если проблема исчезнет — дело определенно в настройках RLS или ролях. Для комплексного анализа ролей, профилей и ограничений RLS подойдёт обработка для анализа и настройки прав доступа.
В типовых конфигурациях, таких как Управление производственным предприятием (УПП), активно используется механизм дат запрета редактирования. Несмотря на то что проверка часто прописывается в коде (например, в процедуре НастройкаПравДоступа.ОпределитьДоступностьВозможностьИзмененияДокументаПоДатеЗапрета), в некоторых «допиленных» конфигурациях этот механизм может быть вынесен в подписки на события или глобальные модули.
Если дата документа меньше установленной даты запрета для пользователя или организации, система заблокирует форму. Проверьте регистр сведений «Даты запрета изменения данных».
Иногда причина кроется не в правах, а в том, как именно вызывается форма. Рассмотрим пример программного вызова:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
Если форма открывается с ключом ТолькоПросмотр = Истина, то даже ручная корректировка этого свойства в ПередОткрытием может быть сброшена платформой. Платформа «помнит», с какими намерениями вызывалась форма.
Также не стоит забывать про подписки на события. В УПП и других крупных системах часто встречаются подписки с видом события ОбработкаЗаполнения или специфические проверки в модуле объекта. Выясним причину, пройдя отладчиком не только код формы, но и Модуль объекта, а именно процедуры ПередЗаписью и ПриУстановкеНовогоНомера, так как там могут устанавливаться параметры сеанса, влияющие на доступность.
Если вы не понимаете, в какой момент меняется состояние формы, воспользуйтесь следующим алгоритмом:
ПередОткрытием.ПриОткрытии.Ложь, а во второй Истина — значит, вмешалась платформа (права, RLS, заблокированные периоды).&После или &Вместо может перехватывать управление.Проанализируем еще один тривиальный, но часто забываемый момент. Проверьте палитру свойств самой формы в дизайнере. Если в конфигураторе у формы жестко установлено свойство «Только просмотр» (стоит галочка), то программное изменение этого свойства в коде может работать нестабильно, так как платформа всегда будет стремиться вернуть форму к ее «дизайнерскому» состоянию при инициализации графического интерфейса.
Мы разобрали, что режим «Только просмотр» в 1С — это не всегда результат работы кода программиста. Чаще всего это комплексная реакция платформы на совокупность прав доступа, настроек RLS и бизнес-логики (проведенность документа, даты запрета). При возникновении подобной проблемы всегда начинайте с проверки права «Интерактивное изменение проведенных» — в 90% случаев в УПП причина кроется именно в нем.