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