Как исправить ошибку проведения документа по складу в 1С:ERP и настроить права доступа без изменения кода

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

При администрировании и разработке в крупных корпоративных системах на базе 1С:ERP Управление предприятием 2.4 (а также КА 2.5 и УТ 11) специалисты часто сталкиваются со следующей проблемой: два пользователя имеют абсолютно одинаковый набор ролей в системе, но один из них может беспрепятственно проводить документы по выбранному складу, а у второго система выдает ошибку прав доступа.

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

Анализ проблемы: типовой функционал против кастомной доработки

Рассмотрим ситуацию, описанную коллегами на форуме. Пользователь пытается провести документ, но получает ошибку. При этом роли у текущего сотрудника и у ответственного лица, указанного в карточке склада, полностью идентичны. Логично возникает вопрос: почему права ведут себя по-разному?

Для начала проанализируем поведение реквизита Ответственный в справочнике Склады в стандартной (коробочной) конфигурации 1С:ERP. В типовом решении этот реквизит выполняет исключительно информационную и представительную функцию:

  1. Он используется для автоматической подстановки материально ответственного лица (МОЛ) в печатные формы документов (например, ТОРГ-12 в поле "Груз принял", МХ-1, МХ-3 при передаче на ответственное хранение, ИНВ-3 при инвентаризации).
  2. В стандартном программном коде проведения документов (будь то "Реализация товаров и услуг", "Перемещение товаров" или "Ордер на отражение излишков") нет и никогда не было проверки на равенство: ТекущийПользователь() = Склад.Ответственный.

Поэтому, если ваша система физически блокирует проведение документа пользователем только из-за того, что он не указан в поле "Ответственный" карточки склада, — это 100% кастомная доработка. Чаще всего такие проверки внедряются через механизмы расширений конфигурации или подписки на события ПередЗаписью / ОбработкаПроведения.

Как быстро найти виновника ошибки с помощью отладки

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

  1. Запустите конфигуратор под учетной записью с правами администратора.
  2. Включите режим отладки и запустите сеанс "1С:Предприятие" от имени пользователя, у которого возникает ошибка проведения.
  3. В конфигураторе откройте меню Отладка — Остановка по ошибке. Установите флаг "Останавливаться по ошибке". Это позволит остановить выполнение кода в тот самый момент, когда система попытается вызвать исключение или вывести предупреждение.
  4. Попробуйте провести проблемный документ в режиме предприятия.
  5. Как только выполнение программы прервется, обратите внимание на стек вызовов. Вы увидите конкретный общий модуль или модуль расширения, из которого пришло ограничение.

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


// Пример кастомной проверки в расширении перед записью документа
&После("ПередЗаписью")
Процедура Инт_ПередЗаписьюПроверитьОтветственного(Отказ, РежимЗаписи, РежимПроведения)
    
    Если РежимПроведения = РежимПроведенияДокумента.Проведение Тогда
        
        // Проверяем наличие реквизита Склад в документе
        Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтотОбъект, "Склад") Тогда
            ТекущийСклад = ЭтотОбъект.Склад;
            
            Если ЗначениеЗаполнено(ТекущийСклад) И ЗначениеЗаполнено(ТекущийСклад.Ответственный) Тогда
                // Сравниваем авторизованного пользователя с ответственным на складе
                Если ТекущийСклад.Ответственный <> ПараметрыСеанса.ТекущийПользователь Тогда
                    ТекстСообщения = "Ошибка! Проводить документы по складу '" + СокрЛП(ТекущийСклад) + "' может только ответственный: " + СокрЛП(ТекущийСклад.Responsibility);
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
                    Отказ = Истина;
                КонецЕсли;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Правильное типовое решение: настройка RLS по складам

Для того чтобы решить задачу ограничения прав проведения документов по складам без написания кода и создания кастомных расширений, необходимо использовать встроенный штатный механизм платформы — RLS (Row-Level Security), или ограничение доступа на уровне записей.

Именно благодаря RLS у двух пользователей могут быть абсолютно одинаковые профили и роли, но разные права на фактические данные (в данном случае — на склады). Разберем по шагам, как настроить такое ограничение:

Шаг 1. Включение ограничения доступа на уровне записей

Для начала убедимся, что механизм RLS активирован в нашей информационной базе. Выполним следующие действия:

  1. Перейдем в раздел НСИ и администрирование.
  2. В блоке "Настройки параметров системы" выберем пункт Настройка пользователей и прав.
  3. Развернем группу настроек "Группы доступа" и установим флаг напротив опции Ограничивать доступ на уровне записей.

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

Шаг 2. Создание и настройка групп доступа

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

  1. В том же подразделе "Настройка пользователей и прав" перейдем по ссылке Группы доступа.
  2. Создадим новую группу доступа (например, "Кладовщики Склада №1").
  3. В поле Профиль выберем стандартный профиль, например, "Кладовщик" (у обоих сотрудников профиль останется один и тот же, что гарантирует идентичность их ролей).
  4. Перейдем на вкладку Участники и добавим туда первого пользователя, который должен работать только со Складом №1.
  5. Перейдем на вкладку Ограничения доступа. Здесь мы увидим виды доступа, доступные для данного профиля. Найдем строку с видом доступа Склады.
  6. В колонке "Значение доступа" установим режим "Разрешены только выбранные" (или "Все запрещены, кроме указанных").
  7. В появившейся табличной части добавим конкретный склад — "Склад №1".
  8. Запишем и закроем группу доступа.

Для второго пользователя проделаем аналогичную операцию: создадим группу доступа "Кладовщики Склада №2", укажем тот же профиль "Кладовщик", добавим в участники второго пользователя, а в ограничениях доступа по складам выберем "Склад №2".

Что в итоге получит пользователь?

После настройки RLS система начнет автоматически фильтровать данные на уровне СУБД:

Таким образом, мы проанализировали проблему разграничения прав, выяснили причины странного поведения одинаковых ролей и научились решать бизнес-задачи наиболее эффективным, встроенным в 1С:ERP методом.

← На главную