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

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

Коллеги, работая с платформой 1С:Предприятие 8.3, мы часто используем расширения для адаптации типовых конфигураций под нужды бизнеса. Это мощный инструмент, позволяющий дополнять функциональность без изменения основной конфигурации. Однако иногда возникают ситуации, когда, казалось бы, проверенные решения перестают работать. Одна из таких загадочных проблем – это исчезновение реквизитов, добавленных в документ через расширение, для пользователей с ограниченными правами, в то время как под полными правами они видны и корректно работают.

Представим типичную ситуацию: несколько лет назад мы добавили новые реквизиты в документ «Счет покупателя» с помощью расширения. Все работало безупречно до недавнего времени. После обновления копии базы для разработки из рабочей базы мы обнаруживаем, что эти реквизиты, будучи частью объекта документа, перестали отображаться на форме для пользователей с ролью «Менеджер». При этом под полными правами и в структуре объекта они по-прежнему присутствуют. Очевидные шаги, такие как проверка прав доступа, очистка кэша, обновление формы, уже были предприняты, но безрезультатно. В этом руководстве мы подробно рассмотрим, почему это может происходить и какие шаги можно предпринять для устранения проблемы, а также обсудим лучшие практики.

Глубокая проверка прав доступа к объектам расширения

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

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

Мы рекомендуем зайти в конфигуратор, открыть ваше расширение, перейти к разделу «Роли» и внимательно проверить настройки прав доступа для всех заимствованных ролей, особенно для тех, которые используются проблемными пользователями. Убедитесь, что напротив ваших новых реквизитов (которые находятся в разделе «Реквизиты» заимствованного объекта или в «Общих реквизитах» расширения) стоят все необходимые галки на «Чтение» и «Просмотр».

Пересоздание формы в расширении: радикальный, но часто эффективный метод

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

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

Этот метод позволяет исключить возможные внутренние повреждения или некорректные метаданные, связанные с конкретной формой в расширении. Он обеспечивает своего рода «перезагрузку» формы в контексте расширения.

Сброс пользовательских настроек формы: исключаем влияние локальных параметров

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

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

Если после сброса пользовательских настроек реквизиты появятся, это означает, что проблема заключалась именно в них. Мы можем проинструктировать пользователей, как избежать случайного скрытия важных полей, или рассмотреть возможность программного управления видимостью, чтобы предотвратить такие ситуации в будущем.

Очистка кэша и обновление конфигурации: убедимся в актуальности данных

Проблемы с отображением элементов, особенно после обновлений, очень часто связаны с некорректным кэшированием данных как на стороне клиента, так и на стороне сервера. Несмотря на то, что автор сообщения 0 уже предпринимал шаги по очистке кэша, мы рассмотрим этот аспект более детально, чтобы убедиться, что все возможные источники устаревших данных исключены.

  1. Очистка кэша на клиентском ПК: Мы должны убедиться, что на компьютере пользователя не осталось устаревших данных кэша.
    1. Через запуск 1С: При запуске 1С:Предприятия из списка баз можно выбрать проблемную базу, нажать «Изменить», затем «Далее» до шага «Дополнительные параметры запуска» и установить галку «Очищать кэш 1С:Предприятия».
    2. Вручную: Мы можем вручную удалить кэш. Закройте все сеансы 1С:Предприятия. Перейдите в каталог пользователя: обычно это C:\Users\ИмяПользователя\AppData\Roaming\1C\1CE\ и C:\Users\ИмяПользователя\AppData\Local\1C\1CE\. В этих папках находятся подкаталоги с длинными GUID-именами. Удалите все эти подкаталоги. После этого запустите 1С:Предприятие снова.
  2. Очистка кэша на сервере и обновление расширения: Хотя автор и выгружал/загружал базу, это не всегда гарантирует полное обновление всех метаданных в расширении.
    1. Обновление расширения формы в конфигураторе: После любых изменений в основной конфигурации или если мы подозреваем, что форма расширения не синхронизирована, мы можем открыть форму в расширении в конфигураторе. Нажмите на форму правой кнопкой мыши и выберите команду «Обновить расширение формы». Это заставит расширение подтянуть актуальное состояние формы из основной конфигурации.
    2. Полная перезагрузка конфигурации: Для окончательной уверенности, после всех изменений в расширении, обновите конфигурацию базы данных (F7). Если есть возможность, перезапустите сервер 1С:Предприятия или рабочие процессы (рабочие процессы кластера).

Мы должны быть внимательны, так как кэш может быть очень «цепким», и даже после нескольких попыток очистки проблема может оставаться, пока мы не удалим все его следы.

Программное добавление реквизитов на форму: лучшая практика для управляемых форм

Сообщения 7 и 8 на форуме справедливо указывают на то, что программное изменение форм и добавление реквизитов является более предпочтительным методом. Это особенно актуально для управляемых форм и при работе с расширениями, так как значительно облегчает дальнейшую поддержку конфигурации и снижает вероятность возникновения проблем после обновлений. Мы не можем удалить расширение из-за данных за 3 года, но можем рассмотреть модификацию подхода к отображению реквизитов.

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

Почему программное добавление лучше?

  1. Гибкость: Мы можем динамически определять, какие реквизиты и в каком виде должны отображаться, в зависимости от прав пользователя, настроек, условий.
  2. Устойчивость к обновлениям: Изменения вносятся в коде, который обычно более предсказуем при обновлениях, чем изменения структуры формы в конфигураторе. Меньше вероятность конфликтов при обновлении типовой конфигурации.
  3. Централизованное управление: Вся логика отображения собрана в одном месте – в обработчике события формы, чаще всего ПриСозданииНаСервере.

Как реализовать программное добавление реквизитов?

Мы будем работать с обработчиком формы ПриСозданииНаСервере. В нем мы можем программно создавать элементы формы, привязывать их к реквизитам объекта и управлять их видимостью и доступностью.


// Обработчик события формы "ПриСозданииНаСервере"

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Прежде всего, вызываем стандартный обработчик, если это необходимо
    // СтандартнаяОбработка = Ложь; // Если мы хотим полностью переопределить стандартное поведение

    // Предполагаем, что у нас есть группа элементов на форме, куда мы хотим добавить новые реквизиты.
    // Например, это может быть группа "ГруппаДополнительныеРеквизиты".
    // Если такой группы нет, мы можем создать ее программно или добавить на форму вручную через конфигуратор.
    Если Элементы.Есть("ГруппаДополнительныеРеквизиты") Тогда
        ГруппаДляРеквизитов = Элементы.ГруппаДополнительныеРеквизиты;

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

        // Пример 2: Добавление флажка для булевого реквизита "ФлажокОсобыеУсловия"
        Если Объект.Метаданные().Реквизиты.Найти("ФлажокОсобыеУсловия") <> Неопределено Тогда
            НовыйЭлементФлажок = Элементы.Добавить("ПолеФлажокОсобыеУсловия", Тип("ПолеФормы"), ГруппаДляРеквизитов);
            НовыйЭлементФлажок.Вид = ВидПоляФормы.ПолеФлажка;
            НовыйЭлементФлажок.ПутьКДанным = "Объект.ФлажокОсобыеУсловия";
            НовыйЭлементФлажок.Заголовок = "Установлены особые условия";
            НовыйЭлементФлажок.РастягиватьПоГоризонтали = Ложь;
            
            // Управление видимостью и доступностью
            Если ДоступноПраво("ПросмотрФлажкаОсобыеУсловияРасширения") Тогда
                НовыйЭлементФлажок.Видимость = Истина;
                НовыйЭлементФлажок.Доступность = ДоступноПраво("РедактированиеФлажкаОсобыеУсловияРасширения");
            Иначе
                НовыйЭлементФлажок.Видимость = Ложь;
                НовыйЭлементФлажок.Доступность = Ложь;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;

    // ... Другие действия при создании на сервере ...

КонецПроцедуры

// Пример вспомогательной функции для проверки прав (может быть в модуле формы)
&НаСервере
Функция ДоступноПраво(ИмяПрава)
    // Здесь мы можем реализовать собственную логику проверки прав,
    // например, через проверки ролей текущего пользователя.
    // Для примера используем стандартный механизм.
    Возврат УправлениеДоступом.ДоступноПраво(ИмяПрава); 
    // Предполагается, что 'ИмяПрава' соответствует созданному нами праву
    // в ролях расширения, например, "ПросмотрДополнительногоТекстаРасширения"
    // или "РедактированиеДополнительногоТекстаРасширения".
КонецФункции

// Пример вспомогательной функции для проверки доступности роли (может быть в модуле формы)
&НаСервере
Функция РольДоступна(ИмяРоли)
    Возврат Пользователи.ИмеетПолныеПрава() ИЛИ Пользователи.ДоступнаРоль(ИмяРоли);
КонецФункции

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

Для реализации этого подхода, нам необходимо будет:

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

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

Дополнительные нюансы и рекомендации

Мы также рассмотрим несколько других моментов, которые могут быть полезны в данной ситуации:

  1. Влияние нескольких расширений: Если вы используете несколько расширений, которые затрагивают одну и ту же форму, мы должны проверить порядок их применения и убедиться, что они не конфликтуют. Расширения применяются последовательно, и последнее примененное расширение может перекрыть изменения предыдущего, если оно не содержит те же реквизиты.
  2. Журнал регистрации: Мы всегда должны проверять журнал регистрации 1С:Предприятия на предмет ошибок, связанных с доступом, формами или выполнением кода расширения. Иногда система явно указывает на проблему.
  3. Версия платформы: Автор сообщения 1 упоминает о запуске на старой платформе. Если проблема появилась после обновления платформы, мы можем попробовать запустить копию базы на предыдущей стабильной версии платформы. Это поможет нам выяснить, связана ли проблема с изменениями в самой платформе. Современные версии 1С:Предприятие (начиная с 8.3.14) значительно расширили возможности расширений, и иногда переход на новую версию может привести к необходимости адаптации старых расширений.
  4. Обновление структуры данных: Сообщение 8 напоминает, что при реструктуризации базы данных (например, при обновлении конфигурации) реквизиты, добавленные расширением, могут очищаться или требовать повторного внимания. Это еще один аргумент в пользу более осторожного подхода к изменениям метаданных через расширения, а не только форм.

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

← На главную