При разработке и доработке конфигураций 1С (в частности, в обычных формах, например, в 1С:Бухгалтерия предприятия 2.0) разработчики часто сталкиваются с ситуацией: в процедуре-обработчике ПередОткрытием свойство формы принудительно сбрасывается в Ложь, однако при переходе в событие ПриОткрытии форма снова переключается в ЭтаФорма.ТолькоПросмотр = Истина. Выясним причину такого поведения и разберем по шагам, как отловить строку кода или платформенный механизм, блокирующий редактирование.
Когда пошаговая отладка не позволяет быстро обнаружить место изменения свойства из-за большого количества вызовов типовых функций, наиболее эффективным инструментом выступает замер производительности конфигуратора. Разберем порядок действий:
ПередОткрытием формы документа.ПриОткрытии.ПередОткрытием) перейдем в конфигуратор и включим замер производительности через меню Отладка — Замер производительности.ПриОткрытии).ТолькоПросмотр или отсортируем выполненные строки по модулям.Данный подход позволяет зафиксировать все строки кода в общем модуле или модуле формы, которые были выполнены между этими двумя событиями.
В обычных формах платформы 1С:Предприятие 8 событие ОбновлениеОтображения вызывается платформой автоматически при любых изменениях контекста формы и элементов управления. Типовой код конфигураций часто размещает установку доступности кнопок и блокировку редактирования именно в этом обработчике.
Проанализируем модуль формы документа: найдем процедуру ОбновлениеОтображения или подключенные через УстановитьДействие обработчики и проверим, не переопределяется ли свойство ТолькоПросмотр при вызове процедур обновления интерфейса:
Процедура ОбновлениеОтображения()
// Проверка условий доступности формы
Если Не ПравоРедактирования Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
В типовых конфигурациях (таких как 1C:Бухгалтерия) проверка прав пользователя и даты запрета изменения данных вынесена за пределы модуля конкретной формы. В процедуре ПередОткрытием или служебных вызовах происходит обращение к процедурам общих модулей, отвечающих за работу с документами, контроль прав и даты запрета редактирования.
Рассмотрим, как локализовать такой код:
.ТолькоПросмотр = Истина.ПередОткрытием используем переход с заходом внутрь процедур (клавиша F11), не пропуская вызовы типовых сервисных функций общего назначения.Если замер производительности и поиск по коду не показывают явного присвоения значения свойству, переключение режима может происходить на уровне самой платформы 1С:
ТолькоПросмотр = Истина в момент считывания данных объекта между событиями открытия. Проверим поведение документа под учетной записью с полными административными правами.ТолькоПросмотр = Истина до вызова метода Открыть().Если выяснено, что платформенный или типовой механизм отрабатывает корректно, но специфика бизнес-логики требует принудительно разрешить интерактивную работу с документом для текущего пользователя, переопределим свойство в финальной точке инициализации интерфейса — в обработчике ПриОткрытии:
Процедура ПриОткрытии()
// Основная типовая логика открытия формы
// ...
// Принудительное снятие признака только для чтения
Если ПользователюРазрешеноРедактирование Тогда
ЭтаФорма.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецПроцедуры
Важно: Программный сброс свойства ТолькоПросмотр в значение Ложь позволит редактировать реквизиты на форме, но если у пользователя отсутствуют права на запись объекта в базе данных, при попытке сохранения система выдаст ошибку нарушения прав доступа.