Почему в 1С:БСП слетают права доступа и как это исправить?

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

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

Прежде чем углубляться в детали, важно понимать фундаментальный принцип работы БСП с правами. БСП обладает собственным, высокоприоритетным механизмом управления правами доступа. Этот механизм разработан для централизованного и стандартизированного управления разрешениями пользователей, предпочитая настройки, заданные в режиме "Предприятие" через справочники "Профили групп доступа" и "Группы доступа". Прямые изменения ролей в конфигураторе, минуя этот механизм, часто игнорируются или, что еще хуже, перезаписываются при определенных системных событиях. Проблема возникает из-за конфликта между ручными, "прямыми" настройками и автоматическими процедурами БСП, которые могут активироваться при различных событиях, таких как обновление конфигурации, запуск регламентных заданий или выполнение служебных обработок БСП.

Основные причины "слетания" прав доступа в 1С:БСП

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

  1. Приоритет механизма БСП над ручными изменениями в конфигураторе.

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

  2. Автоматическое или ручное выполнение обработки ОбновлениеВспомогательныхДанных.

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

  3. Модификация типовых профилей доступа в режиме "Предприятие" без соответствующей доработки конфигурации.

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

  4. Наличие "полных" прав у пользователя и их влияние на другие роли.

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

  5. Ошибки или недоработки в пользовательском коде, затрагивающем права доступа.

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

Комплексные решения для стабильного управления правами в БСП

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

1. Всегда используйте механизм БСП для назначения прав в режиме "Предприятие"

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

  1. Мы должны открыть раздел "Администрирование" в режиме "Предприятие".
  2. Далее переходим в подраздел "Настройки пользователей и прав".
  3. Основная работа ведется со справочниками "Профили групп доступа" и "Группы доступа". Здесь мы формируем наборы прав и привязываем к ним пользователей.
  4. Назначаем пользователей в соответствующие группы доступа, а группам доступа - профили, которые определяют набор ролей.
  5. Помним: галка "Показывать все" в свойствах пользователя в режиме предприятия позволяет видеть все доступные профили и роли.

2. Создавайте собственные профили групп доступа вместо изменения типовых

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

  1. В режиме "Предприятие" открываем справочник "Профили групп доступа".
  2. Создаем новый элемент (профиль), например, "Бухгалтер (расширенный функционал)" или "Менеджер с доступом к архиву".
  3. Включаем в этот новый профиль все необходимые роли, которые требуются для выполнения функционала. Это могут быть как типовые, так и ваши нетиповые роли, которые вы добавили в конфигурацию.
  4. Далее создаем или используем существующую "Группу доступа" и связываем ее с нашим новым, пользовательским профилем.
  5. Включаем нужных пользователей в эту новую группу доступа.

3. Доработка процедуры ПриЗаполненииПоставляемыхПрофилейГруппДоступа для сохранения нетиповых ролей в типовых профилях

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

Мы предлагаем следующий алгоритм действий:

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

    Найдите процедуру ПриЗаполненииПоставляемыхПрофилейГруппДоступа в модуле УправлениеДоступомПереопределяемый. Добавьте вызов вашего собственного модуля, как показано в примере:

    
    Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт
        
        // Стандартное заполнение профилей БСП (или конфигурации, использующей БСП)
        УправлениеДоступомБП.ЗаполнитьПоставляемыеПрофилиПользователей(ОписанияПрофилей);
        
        // Пример вызова модулей других подсистем, которые также дополняют профили
        // РаспознаваниеДокументов
        РаспознаваниеДокументов.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления);
        // Конец РаспознаваниеДокументов
        
        // _НТ добавлено начало - В этом месте мы интегрируем нашу собственную логику
        // Вызываем обработчик ПриЗаполненииПоставляемыхПрофилейГруппДоступа из добавленного нетипового модуля.
        // В этой процедуре будет выполнено дозаполнение типовых Описаний профилей нетиповыми ролями,
        // а также, при необходимости, добавление полностью нетиповых описаний профилей.
        УправлениеДоступомБТ.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления);
        // _НТ добавлено конец
        
    КонецПроцедуры
    

    В данном примере УправлениеДоступомБТ — это имя вашего собственного (нетипового) общего модуля. Важно создать этот модуль и задать ему свойства "Сервер", "Клиент (обычное приложение)", "Клиент (управляемое приложение)" и "Внешнее соединение", чтобы он был доступен во всех необходимых контекстах. Ваше имя модуля должно быть уникальным и не конфликтовать с существующими модулями БСП.

  2. Создаем собственный общий модуль (например, УправлениеДоступомБТ) и добавляем в него процедуры. В этом модуле мы опишем всю необходимую логику для корректировки наборов ролей в типовых профилях. Мы будем работать с массивом структур ОписанияПрофилей, который передается в процедуру. Каждая структура в этом массиве содержит свойство Наименование (имя профиля) и Роли (массив имен ролей).

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

    В этом подробном примере мы видим, как можно добавить нетиповые роли (например, ДобавлениеИзменениеДанныхБухгалтерииБТ) к стандартным профилям "Главный бухгалтер" и "Бухгалтер". Также показано, как удалить нежелательные стандартные роли с помощью вспомогательной процедуры УдалитьРольИзОписанияПрофиля. Такой подход гарантирует, что ваши изменения будут сохраняться даже после регулярных обновлений конфигурации, так как они будут программно восстанавливаться при каждом заполнении типовых профилей, когда система обращается к модулю УправлениеДоступомПереопределяемый.

4. Проведение отладки для выявления конкретной причины "слетания" прав

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

  1. Мы должны установить точки останова в критических местах, связанных с управлением правами. Это могут быть процедуры в общем модуле УправлениеДоступом, особенно те, которые отвечают за инициализацию профилей, групп доступа, или их сохранение.
  2. Внимательно проверяем вызовы процедуры ОбновлениеВспомогательныхДанных. Установите точки останова внутри этой обработки, чтобы понять, какие именно действия она выполняет с правами. Обратите внимание на параметры, с которыми она запускается.
  3. После срабатывания точки останова, мы изучаем стек вызовов. Это покажет нам последовательность функций, которые привели к текущему моменту, помогая отследить источник проблемы.
  4. Также полезно просмотреть журнал регистрации 1С на предмет записей, касающихся изменения прав или выполнения регламентных заданий, которые могли повлиять на подсистему прав.

5. Проверка релизов платформы и конфигурации

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

6. Перезапись профиля и пользователя как первое действие

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

  1. Открываем элемент справочника "Профили групп доступа" в режиме "Предприятие", который предположительно вызывает проблемы.
  2. Вносим любое незначительное изменение (например, добавляем пробел в описание и сразу удаляем его, чтобы фактически ничего не изменилось).
  3. Записываем элемент.
  4. Повторяем аналогичные действия для элемента справочника "Пользователи", который испытывает проблемы с правами.

Этот простой шаг иногда помогает устранить временные несоответствия в кэше или внутренних структурах данных системы.

7. Осторожное использование обработки ОбновлениеВспомогательныхДанных

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

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

← На главную