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