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

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

При разработке в среде «1С:Предприятие 8.3» с использованием механизма расширений программисты часто сталкиваются с неприятной ситуацией: создается новая роль в расширении, назначаются права на документ, форма успешно заимствуется, кнопка «Создать» активна, но при открытии новой формы абсолютно все реквизиты заблокированы для редактирования. Форма ведет себя так, будто для нее программно установлено свойство ТолькоПросмотр = Истина. При этом у пользователей с более широкими правами (например, с полными правами) всё работает корректно.

В этой статье мы подробно и по шагам разберем, почему возникает этот эффект и как вернуть доступность реквизитам формы документа в расширении. Мы рассмотрим как аппаратные причины (связанные с кэшированием), так и тонкие нюансы настройки прав платформы 1С и взаимодействия с программным кодом типовых конфигураций (на примере БСП).

Решение 1. Очистка кэша сервера и локального кэша клиента

Как показывает практика (и решение автора темы на форуме), одной из самых частых и неочевидных причин блокировки элементов формы после обновления метаданных в расширении является рассинхронизация кэша. При динамическом обновлении конфигурации или частом применении расширений в конфигураторе сервер «1С:Предприятия» может некорректно сопоставлять кэшированные структуры метаданных основной конфигурации и расширения.

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

  1. Для серверной базы: Выполните очистку серверного кэша. Самый надежный способ — это плановая перезагрузка службы сервера «1С:Предприятие» (процесса ragent). Если перезагрузить сервер целиком невозможно, удалите содержимое папки snccntx в каталоге кластера серверов для конкретной базы данных или перезапустите рабочий процесс rphost.
  2. Для файловой базы: Полностью удалите базу из списка запуска в стартере 1С и добавьте ее заново. Это приведет к очистке локального кэша метаданных на компьютере пользователя.
  3. Очистка временных файлов пользователя: Вручную удалите содержимое папок %userprofile%\AppData\Local\1C\1cv8 и %userprofile%\AppData\Roaming\1C\1cv8.

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

Решение 2. Проверка прав на стандартные реквизиты документа

Очень распространенная ошибка разработчиков при создании собственных ролей в расширении — это настройка прав исключительно на добавленные или заимствованные реквизиты шапки и табличных частей, при этом игнорируя стандартные реквизиты объекта.

Платформа 1С устроена так, что если у роли пользователя нет прав на просмотр или редактирование хотя бы одного ключевого стандартного реквизита (такого как Дата, Номер, Проведен или ПометкаУдаления), система автоматически блокирует всю форму для редактирования, переводя ее в режим «Только просмотр».

Давайте проверим эти настройки по шагам:

  1. Откройте конфигуратор расширения и перейдите к вашей созданной роли.
  2. Найдите в дереве объектов заимствованный документ (например, РасходныйКассовыйОрдер).
  3. Перейдите на вкладку «Права» и убедитесь, что у объекта установлены права «Ввод новых», «Редактирование» и «Интерактивное добавление».
  4. Нажмите кнопку «Стандартные реквизиты» (она находится в верхней панели окна настройки роли или доступна через контекстное меню).
  5. В открывшемся списке стандартных реквизитов убедитесь, что для реквизитов Дата, Номер, Проведен, ПометкаУдаления установлены флаги «Просмотр» и «Редактирование».

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

Решение 3. Учет правила «первой роли» в расширении

Поведение платформы «1С:Предприятие» кардинально меняется в зависимости от того, присутствуют ли роли в самом расширении:

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

Решение 4. Конфликт с программным кодом конфигурации (БСП)

В современных типовых конфигурациях (таких как Управление торговлей 11.4, ERP, Комплексная автоматизация) доступность элементов формы регулируется не только на уровне СУБД и метаданных ролей, но и программно. За это отвечают механизмы БСП (Библиотеки стандартных подсистем), такие как даты запрета изменения данных, подсистемы управления доступом и функциональные опции.

При открытии формы срабатывают процедуры ПриСозданииНаСервере или ПриОткрытии, которые проверяют роли текущего пользователя. Поскольку ваша роль создана в расширении, типовой программный код основной конфигурации ничего не знает о ней. Алгоритмы БСП анализируют только роли основной конфигурации, приходят к выводу, что у пользователя нет прав на редактирование данного вида документа, и принудительно выполняют команду:

ЭтаФорма.ТолькоПросмотр = Истина;

Чтобы обойти эту блокировку, мы можем использовать программное расширение формы документа. Давайте разберем, как это сделать:

  1. Заимствуйте форму документа в расширение.
  2. В модуле заимствованной формы добавьте обработчик события ПриСозданииНаСервере с аннотацией &После.
  3. Напишите код, который принудительно возвращает доступность формы, если пользователю доступна ваша роль:

&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверяем доступность нашей роли программным путем
    Если РольДоступна("Расш1_ПравоНаРКО") Тогда
        
        // Снимаем глобальную блокировку формы на чтение
        ЭтаФорма.ТолькоПросмотр = Ложь;
        
        // Дополнительно разрешаем изменение данных объекта
        ЭтаФорма.Доступность = Истина;
        
        // При необходимости можно принудительно включить доступность ключевых элементов
        Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
            Если ТипЗнч(Элемент) = Тип("ПолеФормы") ИЛИ ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
                Элемент.Доступность = Истина;
                Элемент.ТолькоПросмотр = Ложь;
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Использование аннотации &После гарантирует, что наш код выполнится в самую последнюю очередь — уже после того, как отработают все типовые механизмы БСП основной конфигурации, и мы сможем переопределить результат их работы в пользу нашей роли.

Решение 5. Рассинхронизация формы в расширении

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

Для исправления этой ситуации:

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

Систематический подход к анализу прав на стандартные реквизиты, программного кода БСП и своевременное обслуживание кэша помогут вам быстро и безболезненно решать подобные проблемы при разработке в 1С.

← На главную