Почему после записи элементы формы объекта становятся недоступными для редактирования в 1С?

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

Рассмотрим довольно интересную и нетривиальную ситуацию, с которой периодически сталкиваются разработчики в среде 1С:Предприятие 8. Суть проблемы заключается в следующем: мы создаем новый документ (или справочник), открываем его форму — все элементы управления доступны. Однако стоит нам записать объект и попытаться переоткрыть его форму, как все выведенные на нее элементы становятся недоступными для редактирования. Даже стандартная кнопка «Записать» блокируется. Давайте разберем эту проблему по шагам и выясним истинную причину такого странного поведения платформы.

Анализ исходных данных и симптомов проблемы

Проанализируем типичный сценарий возникновения ошибки. Имеется небольшая конфигурация с собственным документом. В базе данных нет заведенных пользователей, но создана общая роль, которая назначена в свойстве конфигурации Основные роли. В этой роли предоставлены полные права на рассматриваемый документ.

Разработчик начинает искать причину и проверяет следующие моменты:

  1. В модуле формы нет никакого программного кода, который бы управлял свойством Доступность элементов.
  2. В конфигурации отсутствуют функциональные опции, которые могли бы скрывать или блокировать реквизиты.
  3. Добавление физического пользователя в режиме предприятия и явное назначение ему полных прав не решает проблему.
  4. Права на «Редактирование» или изменение проведенных/записанных документов в роли установлены корректно.

Несмотря на все эти проверки, форма упорно открывается в режиме просмотра. Почему так происходит? Посмотрим на архитектуру управляемых форм более внимательно.

Истинная причина блокировки формы объекта

Как показывает практика и анализ платформенных механизмов, описанная ситуация не является ошибкой или багом 1С:Предприятия. Это стандартное, заложенное разработчиками платформы поведение управляемых форм. Выясним причину: всё дело в форме списка, из которой мы открываем наш объект.

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

Рассмотрим подробнее, как именно работает этот механизм блокировки:

  1. Игнорирование полных прав: Переход формы в режим только для просмотра — это интерфейсное ограничение, а не ограничение прав доступа. Поэтому наличие у пользователя полных прав на изменение документа платформой игнорируется.
  2. Защита данных: Платформа считает, что если пользователь работает со списком в режиме просмотра, то и детализация данных (форма объекта) не должна предполагать изменений. Автоматически становятся неактивными (серыми) все кнопки стандартных команд записи и проведения: «Записать», «Провести», «Записать и закрыть».
  3. Частичная доступность: Несмотря на полную блокировку редактирования реквизитов, некоторые интерактивные элементы остаются активными. Например, у полей ввода, содержащих ссылочные типы данных (ссылки на справочники или другие документы), остается доступной кнопка «Открыть» (иконка лупы). Это сделано для того, чтобы пользователь мог продолжить навигацию и просмотр связанных данных.

Приоритет режимов: Только просмотр vs Доступность

Важно понимать разницу между свойствами формы и элементов. Свойство ТолькоПросмотр (на уровне формы или динамического списка) и свойство Доступность (у конкретного поля или кнопки) — это два независимых механизма.

Если форма перешла в режим только просмотра из-за родительского списка, то этот режим имеет высший приоритет. Даже если вы попытаетесь в коде модуля формы (например, в обработчике ПриСозданииНаСервере) явно написать обращение к элементу и установить ему Доступность = Истина, этот элемент всё равно останется недоступным для пользователя. Платформа жестко пресекает попытки обойти глобальный запрет редактирования на уровне свойств отдельных контролов.

Варианты решения проблемы

Теперь, когда мы выяснили причину, разберем по шагам, как можно исправить ситуацию и вернуть пользователям возможность редактировать документы.

Решение 1: Изменение свойств динамического списка

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

Решение 2: Программное переопределение открытия формы

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

Сделаем это путем перехвата стандартного события открытия. В модуле формы списка у таблицы динамического списка нужно создать обработчик события Выбор. В нем мы откажемся от стандартной обработки и откроем форму программно, используя метод ОткрытьФорму.

Посмотрим на пример реализации:


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

Проанализируем этот код. Когда пользователь дважды кликает по строке, срабатывает событие. Мы устанавливаем параметр СтандартнаяОбработка в значение Ложь, предотвращая автоматическое открытие. Затем мы формируем структуру параметров, передавая в свойство Ключ ссылку на выбранный документ. И самое главное: при вызове функции ОткрытьФорму() мы опускаем параметр Владелец. Именно отсутствие владельца позволяет форме объекта открыться в своем независимом режиме, игнорируя настройки списка «Только просмотр».

Подведение итогов

Мы подробно разобрали, почему элементы формы объекта могут внезапно стать недоступными для редактирования после записи. Запомните главное правило: в управляемых формах 1С контекст вызова имеет огромное значение. Настройки родительской формы или списка (такие как ТолькоПросмотр) транслируются на дочерние окна. Используйте ролевую модель для ограничения доступа к данным, а если требуется специфическое поведение интерфейса — грамотно переопределяйте стандартные события с помощью программного кода.

← На главную