При разработке в среде «1С:Предприятие 8.3» с использованием механизма расширений программисты часто сталкиваются с неприятной ситуацией: создается новая роль в расширении, назначаются права на документ, форма успешно заимствуется, кнопка «Создать» активна, но при открытии новой формы абсолютно все реквизиты заблокированы для редактирования. Форма ведет себя так, будто для нее программно установлено свойство ТолькоПросмотр = Истина. При этом у пользователей с более широкими правами (например, с полными правами) всё работает корректно.
В этой статье мы подробно и по шагам разберем, почему возникает этот эффект и как вернуть доступность реквизитам формы документа в расширении. Мы рассмотрим как аппаратные причины (связанные с кэшированием), так и тонкие нюансы настройки прав платформы 1С и взаимодействия с программным кодом типовых конфигураций (на примере БСП).
Как показывает практика (и решение автора темы на форуме), одной из самых частых и неочевидных причин блокировки элементов формы после обновления метаданных в расширении является рассинхронизация кэша. При динамическом обновлении конфигурации или частом применении расширений в конфигураторе сервер «1С:Предприятия» может некорректно сопоставлять кэшированные структуры метаданных основной конфигурации и расширения.
Если вы уверены, что все права настроены верно, но форма все равно заблокирована, выполните следующие действия:
ragent). Если перезагрузить сервер целиком невозможно, удалите содержимое папки snccntx в каталоге кластера серверов для конкретной базы данных или перезапустите рабочий процесс rphost.%userprofile%\AppData\Local\1C\1cv8 и %userprofile%\AppData\Roaming\1C\1cv8.Только после исключения проблемы с кэшем имеет смысл переходить к глубокому анализу настроек метаданных и программного кода.
Очень распространенная ошибка разработчиков при создании собственных ролей в расширении — это настройка прав исключительно на добавленные или заимствованные реквизиты шапки и табличных частей, при этом игнорируя стандартные реквизиты объекта.
Платформа 1С устроена так, что если у роли пользователя нет прав на просмотр или редактирование хотя бы одного ключевого стандартного реквизита (такого как Дата, Номер, Проведен или ПометкаУдаления), система автоматически блокирует всю форму для редактирования, переводя ее в режим «Только просмотр».
Давайте проверим эти настройки по шагам:
РасходныйКассовыйОрдер).Дата, Номер, Проведен, ПометкаУдаления установлены флаги «Просмотр» и «Редактирование».Без этих флагов пользователь сможет нажать кнопку «Создать», но платформа не позволит ему записать документ, так как он не может управлять его датой и номером, вследствие чего форма откроется заблокированной.
Поведение платформы «1С:Предприятие» кардинально меняется в зависимости от того, присутствуют ли роли в самом расширении:
Это может приводить к тому, что даже пользователи с Полными правами из основной конфигурации потеряют возможность редактировать объекты расширения. Чтобы этого избежать, обязательно заимствуйте типовую роль ПолныеПрава (или аналогичную административную роль из вашей конфигурации) в ваше расширение и предоставьте ей полные права на все новые и измененные вами объекты.
В современных типовых конфигурациях (таких как Управление торговлей 11.4, ERP, Комплексная автоматизация) доступность элементов формы регулируется не только на уровне СУБД и метаданных ролей, но и программно. За это отвечают механизмы БСП (Библиотеки стандартных подсистем), такие как даты запрета изменения данных, подсистемы управления доступом и функциональные опции.
При открытии формы срабатывают процедуры ПриСозданииНаСервере или ПриОткрытии, которые проверяют роли текущего пользователя. Поскольку ваша роль создана в расширении, типовой программный код основной конфигурации ничего не знает о ней. Алгоритмы БСП анализируют только роли основной конфигурации, приходят к выводу, что у пользователя нет прав на редактирование данного вида документа, и принудительно выполняют команду:
ЭтаФорма.ТолькоПросмотр = Истина;
Чтобы обойти эту блокировку, мы можем использовать программное расширение формы документа. Давайте разберем, как это сделать:
ПриСозданииНаСервере с аннотацией &После.
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверяем доступность нашей роли программным путем
Если РольДоступна("Расш1_ПравоНаРКО") Тогда
// Снимаем глобальную блокировку формы на чтение
ЭтаФорма.ТолькоПросмотр = Ложь;
// Дополнительно разрешаем изменение данных объекта
ЭтаФорма.Доступность = Истина;
// При необходимости можно принудительно включить доступность ключевых элементов
Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ПолеФормы") ИЛИ ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
Элемент.Доступность = Истина;
Элемент.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Использование аннотации &После гарантирует, что наш код выполнится в самую последнюю очередь — уже после того, как отработают все типовые механизмы БСП основной конфигурации, и мы сможем переопределить результат их работы в пользу нашей роли.
Если форма документа была заимствована в расширение давно, а после этого основная конфигурация обновлялась, структура элементов формы в расширении могла устареть. Это также приводит к различным графическим аномалиям и блокировкам элементов управления.
Для исправления этой ситуации:
Систематический подход к анализу прав на стандартные реквизиты, программного кода БСП и своевременное обслуживание кэша помогут вам быстро и безболезненно решать подобные проблемы при разработке в 1С.