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

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

Если вы работаете с 1С:Управление торговлей, 1С:Зарплата и управление персоналом или 1С:Бухгалтерией, инструкции из этой статьи подойдут для вашей конфигурации. Мы также рассмотрим нюансы для разных версий платформы (8.3.20+).

⚠️ Важно: перед внесением изменений в конфигурацию сделайте резервную копию базы. Настройка отбора по владельцу может повлиять на видимость данных для всех пользователей.

Что такое отбор по владельцу в 1С и зачем он нужен

Отбор по владельцу — это механизм разграничения доступа, который позволяет привязывать записи в базе (документы, справочники, задачи) к конкретному пользователю или группе. В отличие от ролевого доступа, который ограничивает функционал (например, "просмотр зарплатных ведомостей"), отбор по владельцу работает на уровне конкретных данных.

Примеры использования:

  • 📊 В 1С:Управление торговлей — менеджеры видят только свои заказы клиентов.
  • 👥 В 1С:ЗУП — сотрудники HR-департамента работают только со "своими" сотрудниками (по подразделениям).
  • 📈 В 1С:ERP — руководители проектов видят задачи только своего отдела.

Без этого механизма пришлось бы вручную настраивать права для каждой роли или использовать сложные RLS-правила (Row-Level Security), что не всегда удобно. Отбор по владельцу решает проблему проще: система автоматически фильтрует данные по полю Владелец или аналогичному реквизиту.

⚠️ Внимание: если в вашей конфигурации поле Владелец отсутствует в нужном справочнике или документе, его придётся добавлять вручную (об этом — в следующем разделе).

📊 Какой конфигурацией 1С вы чаще всего пользуетесь?
1С:Бухгалтерия
1С:Управление торговлей
1С:Зарплата и Управление Персоналом (ЗУП)
1С:ERP
Другая конфигурация

Подготовка: проверка структуры данных перед настройкой

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

  1. Наличие поля "Владелец" в объекте (справочнике, документе). Если его нет — добавьте реквизит типа СправочникСсылка.Пользователи или СправочникСсылка.ФизическиеЛица.
  2. Заполненность поля для существующих записей. Если поле пустое, отбор не сработает.
  3. Права на объект — у пользователей должна быть роль, позволяющая просматривать данные (пусть и с отбором).

Проверить наличие поля можно в конфигураторе:

  1. Откройте нужный объект (например, справочник Контрагенты).
  2. Перейдите на вкладку Реквизиты.
  3. Проверьте, есть ли реквизит с именем Владелец или аналогичным (например, Менеджер, Ответственный).

Если поля нет, добавьте его:


// Пример кода для добавления реквизита "Владелец" в справочник "Контрагенты"

Справочник = Метаданные.Справочники.Контрагенты;

НовыйРеквизит = Справочник.Реквизиты.Добавить();

НовыйРеквизит.Имя = "Владелец";

НовыйРеквизит.Тип = Новый Тип("СправочникСсылка.Пользователи");

НовыйРеквизит.Пояснение = "Ответственный за контрагента";

⚠️ Внимание: после добавления реквизита обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных). Иначе новое поле не появится в пользовательском режиме.

Проверено наличие поля "Владелец" в объекте|

Поле заполнено для существующих записей|

У пользователей есть права на просмотр объекта|

Сделана резервная копия базы данных-->

Способ 1: Настройка отбора через права доступа (RLS)

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

Инструкция по настройке:

  1. Откройте конфигуратор и перейдите в Администрирование → Пользователи и права → Настройка прав доступа.
  2. Выберите роль, для которой нужно настроить отбор (например, МенеджерПоПродажам).
  3. На вкладке Данные найдите объект, к которому применяется отбор (например, справочник Контрагенты).
  4. Нажмите Добавить ограничение и выберите тип Отбор.
  5. В поле Отбор укажите условие:
    Владелец = &ТекущийПользователь

    где &ТекущийПользователь — параметр, который будет подставляться автоматически.

Пример настройки для документа ЗаказКлиента:

Параметр Значение Пояснение
Объект Документ.ЗаказКлиента Документ, к которому применяется отбор
Тип ограничения Отбор Используем отбор, а не полное ограничение
Условие отбора Менеджер = &ТекущийПользователь Поле Менеджер должно совпадать с текущим пользователем
Параметры &ТекущийПользователь (Тип: СправочникСсылка.Пользователи) Параметр будет подставляться автоматически

⚠️ Внимание: если в условии отбора используется поле, которое может быть не заполнено (например, Владелец = NULL), такие записи станут невидимыми для всех пользователей, включая администратора. Чтобы избежать этого, добавьте в условие проверку на ЗначениеЗаполнено():

ИЛИ НЕ ЗначениеЗаполнено(Владелец)

ИЛИ Владелец = &ТекущийПользователь

💡

Если отбор не срабатывает, проверьте, что в роли пользователя не стоит галочка "Полные права" — она отменяет все ограничения, включая RLS.

Способ 2: Программная установка отбора в модулях

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

Пример кода для справочника Контрагенты (отбор при открытии формы):

Процедура ПриОткрытии(Отказ)

// Устанавливаем отбор по текущему пользователю

Отбор = Новый Структура("Владелец", Пользователи.ТекущийПользователь());

ЭлементыФормы.Список.Отбор.Добавить("Владелец", ВидСравнения.Равно, Пользователи.ТекущийПользователь());

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

Для документов (например, ЗаказКлиента) можно использовать обработчик ПередЗаписью, чтобы автоматически проставлять владельца:

Процедура ПередЗаписью(Отказ, РежимЗаписи)

Если НЕ ЗначениеЗаполнено(Объект.Владелец) Тогда

Объект.Владелец = Пользователи.ТекущийПользователь();

КонецЕсли;

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

Преимущества программного подхода:

  • 🔧 Гибкость: можно реализовать сложную логику (например, отбор по подразделению + владельцу).
  • 📌 Совместимость: работает даже в конфигурациях без поддержки RLS.
  • 🔄 Динамичность: отбор можно менять "на лету" в зависимости от условий.

Недостатки:

  • ⚠️ Риск ошибок: если забыть проставить владельца при создании записи, отбор не сработает.
  • 🐢 Производительность: при большом количестве данных программный отбор может тормозить.
Что делать, если отбор не применяется к новым записям?

Если программный отбор не срабатывает для вновь созданных объектов, проверьте:

1. Есть ли обработчик ПередЗаписью или ПриСозданииНаСервере, который проставляет владельца.

2. Не сбрасывается ли значение владельца в других обработчиках (например, при проведении документа).

3. Правильно ли указан тип поля "Владелец" — оно должно быть ссылкой на справочник Пользователи или ФизическиеЛица.

Способ 3: Использование механизма "Владельцы данных" (для УФ)

В управляемых формах (УФ) есть встроенный механизм "Владельцы данных", который упрощает настройку отбора. Он автоматически добавляет поле Владелец и управляет видимостью записей.

Как включить:

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

После этого в пользовательском режиме:

  • 🔒 Пользователи будут видеть только свои записи.
  • 👥 Администраторы и пользователи с полными правами увидят все записи.
  • 📝 При создании новой записи поле Владелец будет заполняться автоматически.

⚠️ Внимание: механизм "Владельцы данных" не работает для обычных (неуправляемых) форм. Если ваша конфигурация использует старые формы, этот способ не подойдёт.

Типичные ошибки и как их избежать

Даже опытные администраторы 1С сталкиваются с проблемами при настройке отбора по владельцу. Вот самые распространённые ошибки и способы их решения:

Ошибка Причина Решение
Отбор не работает для новых записей Поле Владелец не заполняется автоматически Добавьте обработчик ПередЗаписью (см. Способ 2)
Пользователь видит все записи, несмотря на отбор У роли стоят "Полные права" или неверно настроен RLS Проверьте настройки прав в конфигураторе (см. Способ 1)
Отбор срабатывает только в списках, но не в отчётах В запросах отчётов не учтён отбор по владельцу Добавьте условие в текст запроса: ГДЕ Владелец = &ТекущийПользователь
Администратор перестал видеть все записи Отбор применён ко всем ролям, включая администратора Исключите роль ПолныеПрава из ограничений RLS

Ещё одна частая проблема — конфликт отборов, когда на один объект настроено несколько правил (например, RLS + программный отбор). В этом случае система применяет самое жёсткое ограничение, что может привести к полной невидимости данных. Чтобы избежать этого:

  • 🔍 Используйте один способ отбора (или RLS, или программный).
  • 📋 Документируйте все настройки отборов в техническом задании.
  • 🧪 Тестируйте изменения на копии базы перед применением на рабочем сервере.
💡

Перед применением отбора по владельцу всегда проверяйте, что у администраторов и руководителей остаётся доступ ко всем данным. Используйте роль ПолныеПрава для исключений.

Как проверить, что отбор работает корректно

После настройки отбора необходимо проверить его работу в разных сценариях. Вот чек-лист для тестирования:

  1. Проверка видимости записей:
    • 👤 Зайдите под учётной записью обычного пользователя и убедитесь, что он видит только свои данные.
    • 👔 Зайдите под администратором и проверьте, что все записи отображаются.
  2. Тестирование новых записей:
    • 📝 Создайте новую запись под пользователем и убедитесь, что поле Владелец заполнилось автоматически.
    • 🔍 Проверьте, что другая учётная запись не видит эту запись.
  3. Проверка отчётов:
    • 📊 Запустите отчёт, который использует данные с отбором. Убедитесь, что в результатах только разрешённые записи.
  • Тестирование программных методов:
    • 💻 Выполните прямой запрос к базе через Запрос и проверьте, применяется ли отбор.
    • Для автоматического тестирования можно использовать следующий код (выполняется в режиме 1С:Предприятие):

      // Проверка отбора для справочника "Контрагенты"
      

      Запрос = Новый Запрос;

      Запрос.Текст =

      "ВЫБРАТЬ

      | Контрагенты.Ссылка КАК Ссылка,

      | Контрагенты.Владелец КАК Владелец

      |ИЗ

      | Справочник.Контрагенты КАК Контрагенты

      |ГДЕ

      | Контрагенты.Владелец = &ТекущийПользователь";

      Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());

      Результат = Запрос.Выполнить();

      Сообщить("Найдено записей: " + Результат.Выбрать().Количество());

      Если количество записей совпадает с ожидаемым — отбор работает корректно. Если нет — проверьте настройки RLS или программный код.

      FAQ: Частые вопросы по отбору по владельцу в 1С

      Можно ли настроить отбор по владельцу для отчётов?

      Да, но для этого нужно модифицировать текст запроса в отчёте. Добавьте условие по полю Владелец с параметром &ТекущийПользователь. Например:

      ГДЕ
      

      Документ.Владелец = &ТекущийПользователь

      Если отчёт стандартный и его нельзя изменить, создайте внешний отчёт с нужным отбором.

      Как сделать, чтобы руководитель видел записи своих подчинённых?

      Для этого используйте иерархию подразделений:

      1. Добавьте в условие отбора проверку на принадлежность к подразделению:
        Владелец.Подразделение = &ТекущееПодразделение
      2. Для руководителя настройте роль с правом просмотра всех подразделений в его иерархии.

    Или используйте рекурсивный запрос для определения подчинённых.

    Почему после обновления 1С отбор перестал работать?

    Вероятные причины:

    • 🔄 Изменилась структура метаданных (например, переименовали поле Владелец).
    • 🔧 Обновились настройки RLS в новой версии конфигурации.
    • 📋 Внешние обработки или расширения переопределяют отбор.

    Решение: сравните текущие настройки RLS с эталонной базой или проверьте журнал изменений конфигурации.

    Можно ли применить отбор по владельцу к регистрам накопления?

    Да, но с оговорками:

    • ✅ Для регистров сведений отбор настраивается стандартным способом через RLS.
    • ⚠️ Для регистров накопления придётся модифицировать запросы в отчётах или использовать виртуальные таблицы с отбором.

    Пример условия для запроса к регистру:

    ГДЕ
    

    Регистр.Владелец = &ТекущийПользователь

    Как убрать отбор по владельцу для конкретного пользователя?

    Способы:

    • 🔓 Назначьте пользователю роль с Полными правами (не рекомендуется для обычных пользователей).
    • 🛠 Измените настройки RLS: исключите пользователя из ограничений или добавьте его в список исключений.
    • 📝 Для программного отбора: добавьте проверку на имя пользователя в коде.