Как найти код, который устанавливает свойство ТолькоПросмотр в форме документа 1С?

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

При разработке и доработке конфигураций 1С (в частности, в обычных формах, например, в 1С:Бухгалтерия предприятия 2.0) разработчики часто сталкиваются с ситуацией: в процедуре-обработчике ПередОткрытием свойство формы принудительно сбрасывается в Ложь, однако при переходе в событие ПриОткрытии форма снова переключается в ЭтаФорма.ТолькоПросмотр = Истина. Выясним причину такого поведения и разберем по шагам, как отловить строку кода или платформенный механизм, блокирующий редактирование.

Способ 1. Локализация с помощью замера производительности

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

  1. Установим точку останова в самом конце процедуры ПередОткрытием формы документа.
  2. Установим вторую точку останова в самом начале процедуры ПриОткрытии.
  3. Запустим сеанс в режиме отладки и откроем целевой документ.
  4. При остановке на первой точке останова (в ПередОткрытием) перейдем в конфигуратор и включим замер производительности через меню Отладка — Замер производительности.
  5. Нажмем клавишу F5 для продолжения выполнения программы до следующей точки останова (в ПриОткрытии).
  6. Как только управление перейдет во вторую точку, сразу отключим замер производительности.
  7. В открывшейся таблице результатов замера выполним поиск по тексту ТолькоПросмотр или отсортируем выполненные строки по модулям.

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

Способ 2. Проверка события ОбновлениеОтображения

В обычных формах платформы 1С:Предприятие 8 событие ОбновлениеОтображения вызывается платформой автоматически при любых изменениях контекста формы и элементов управления. Типовой код конфигураций часто размещает установку доступности кнопок и блокировку редактирования именно в этом обработчике.

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


Процедура ОбновлениеОтображения()
    // Проверка условий доступности формы
    Если Не ПравоРедактирования Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

Способ 3. Поиск логики в общих модулях типовых подсистем

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

Рассмотрим, как локализовать такой код:

  1. Выполним глобальный поиск по конфигурации (сочетание клавиш Ctrl + Shift + F) по выражению .ТолькоПросмотр = Истина.
  2. Обратим внимание на общие модули, отвечающие за проверку даты запрета изменения данных и настройку прав пользователей (например, регистр сведений Настройки прав пользователей).
  3. При пошаговой отладке в процедуре ПередОткрытием используем переход с заходом внутрь процедур (клавиша F11), не пропуская вызовы типовых сервисных функций общего назначения.

Способ 4. Платформенные причины и ограничения прав (RLS)

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

  1. Ограничение прав на уровне записей (RLS) и роли: Если у пользователя отсутствует право интерактивного изменения или действуют ограничения RLS, платформа автоматически устанавливает ТолькоПросмотр = Истина в момент считывания данных объекта между событиями открытия. Проверим поведение документа под учетной записью с полными административными правами.
  2. Блокировка объекта: Если документ уже открыт и заблокирован для изменения другим сеансом либо фоновым заданием, платформа переводит форму в режим только для чтения.
  3. Открытие формы с параметрами: Форма могла быть вызвана из внешнего журнала или отчета с уже переданным параметром или свойством ТолькоПросмотр = Истина до вызова метода Открыть().

Программное переопределение режима в ПриОткрытии

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


Процедура ПриОткрытии()
    // Основная типовая логика открытия формы
    // ...
    
    // Принудительное снятие признака только для чтения
    Если ПользователюРазрешеноРедактирование Тогда
        ЭтаФорма.ТолькоПросмотр = Ложь;
    КонецЕсли;
КонецПроцедуры

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

← На главную