Почему ЭтаФорма.ТолькоПросмотр не блокирует табличную часть и как это исправить

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

В практике разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартные механизмы ведут себя непредсказуемо. Типичный пример: при установке свойству формы ТолькоПросмотр значения Истина все элементы управления блокируются, кроме табличной части. Это создает серьезные риски для целостности данных, так как пользователи могут редактировать строки документа, который формально считается утвержденным и закрытым для правок. Разберем детально, почему это происходит и как решить проблему несколькими способами.

Механизм работы свойства ТолькоПросмотр

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

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

Причина 1: Десинхронизация метаданных при копировании объектов

Выясним одну из самых неочевидных причин. Если документ или форма были созданы путем копирования другого существующего объекта, в структуре XML-описания формы может произойти сбой идентификаторов (UUID). Элемент таблицы на форме визуально связан с данными Объект.ТабличнаяЧасть, но на внутреннем уровне платформы связь нарушена.

В этом случае глобальная команда формы «заблокировать всё» просто не доходит до «битого» элемента. Разберем по шагам, как это исправить:

  1. Откроем форму документа в конфигураторе.
  2. Найдем в списке элементов управления проблемную таблицу.
  3. Запомним (или выпишем) все её настройки: путь к данным, обработчики событий (ПриИзменении, Выбор и т.д.), состав колонок.
  4. Удалим элемент таблицы с формы.
  5. Перетянем табличную часть из раздела «Данные» (правая часть окна редактора формы) обратно в дерево элементов.
  6. Восстановим настройки и привязки событий.

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

Причина 2: Свойство Изменяет данные и основной реквизит

Посмотрим на настройки элемента формы. У каждой таблицы на управляемой форме есть свойство Изменяет данные. Рассмотрим ситуацию: если это свойство по какой-то причине снято, или если таблица связана не с основным реквизитом (например, Объект), а с произвольным реквизитом формы, поведение может измениться.

Проанализируем ключевые моменты:

Если данные таблицы не помечены как сохраняемые, платформа может считать их вспомогательными и не блокировать при общем запрете редактирования формы.

Причина 3: Принудительная программная разблокировка

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

Рассмотрим пример кода, который поможет гарантированно заблокировать таблицу, если стандартный механизм дал сбой:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Проверяем условие утверждения документа
    Если ТекущийОбъект.Утвержден Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
        
        // Принудительная блокировка элемента, если платформенный механизм не сработал
        Элементы.ТаблицаТовары.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

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

Диагностика с помощью отладчика

Если вы не уверены, в какой момент таблица становится доступной, воспользуйтесь следующим алгоритмом диагностики:

  1. Добавьте на форму временную команду (кнопку) с программным кодом вывода состояния свойств.
  2. В обработчике команды напишите следующий код:
    
    &НаКлиенте
    Процедура ПроверитьСтатус(Команда)
        Сообщить("ТолькоПросмотр формы: " + ЭтаФорма.ТолькоПросмотр);
        Сообщить("ТолькоПросмотр таблицы: " + Элементы.ТаблицаТовары.ТолькоПросмотр);
        Сообщить("Доступность таблицы: " + Элементы.ТаблицаТовары.Доступность);
    КонецПроцедуры
    
  3. Запустите предприятие, откройте проблемный документ и нажмите кнопку.

Если отладчик показывает, что ЭтаФорма.ТолькоПросмотр = Истина, а Элементы.ТаблицаТовары.ТолькоПросмотр = Ложь, значит, имеет место либо программное переопределение свойства где-то в коде, либо описанный выше баг метаданных после копирования объекта.

Защита на уровне записи объекта

Помните, что ограничение видимости на форме — это лишь интерфейсная мера. Чтобы пользователи не могли «обмануть» систему (например, через групповое изменение реквизитов или программные обработки), обязательно дублируйте проверку в модуле объекта. Разберем, как это сделать:


// В модуле документа
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Проверка ссылки, чтобы не блокировать создание нового документа
    Если ЗначениеЗаполнено(Ссылка) И Ссылка.Утвержден Тогда
        // Проверяем, не пытается ли пользователь изменить уже утвержденный документ
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Нельзя изменять утвержденный документ!";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

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

Резюме

Подводя итог, проанализируем последовательность действий при возникновении данной проблемы: сначала проверяем путь к данным и основной реквизит, затем пробуем принудительную блокировку элемента в коде ПриЧтенииНаСервере, и если это не помогает — пересоздаем элемент таблицы на форме вручную. Эти шаги позволяют устранить 99% проблем, связанных с некорректным поведением свойства ТолькоПросмотр.

← На главную