Отбор по владельцу в 1С:Предприятие — это мощный инструмент, который позволяет ограничивать доступ пользователей к данным на уровне записей. Например, менеджер по продажам будет видеть только свои сделки, а руководитель — все. Без правильной настройки этой функции риски утечки конфиденциальной информации или ошибок в работе многократно возрастают.
Многие администраторы и разработчики сталкиваются с трудностями при настройке отбора по владельцу: то права доступа конфликтуют, то отбор не срабатывает для новых объектов, то пользователи жалуются на "исчезнувшие" документы. В этой статье мы разберём все способы установки отбора — от ручной настройки в конфигураторе до программных решений на встроенном языке. Особое внимание уделим типичным ошибкам, которые ломают логику работы системы, и покажем, как их избежать.
Если вы работаете с 1С:Управление торговлей, 1С:Зарплата и управление персоналом или 1С:Бухгалтерией, инструкции из этой статьи подойдут для вашей конфигурации. Мы также рассмотрим нюансы для разных версий платформы (8.3.20+).
⚠️ Важно: перед внесением изменений в конфигурацию сделайте резервную копию базы. Настройка отбора по владельцу может повлиять на видимость данных для всех пользователей.
Что такое отбор по владельцу в 1С и зачем он нужен
Отбор по владельцу — это механизм разграничения доступа, который позволяет привязывать записи в базе (документы, справочники, задачи) к конкретному пользователю или группе. В отличие от ролевого доступа, который ограничивает функционал (например, "просмотр зарплатных ведомостей"), отбор по владельцу работает на уровне конкретных данных.
Примеры использования:
- 📊 В 1С:Управление торговлей — менеджеры видят только свои заказы клиентов.
- 👥 В 1С:ЗУП — сотрудники HR-департамента работают только со "своими" сотрудниками (по подразделениям).
- 📈 В 1С:ERP — руководители проектов видят задачи только своего отдела.
Без этого механизма пришлось бы вручную настраивать права для каждой роли или использовать сложные RLS-правила (Row-Level Security), что не всегда удобно. Отбор по владельцу решает проблему проще: система автоматически фильтрует данные по полю Владелец или аналогичному реквизиту.
⚠️ Внимание: если в вашей конфигурации поле Владелец отсутствует в нужном справочнике или документе, его придётся добавлять вручную (об этом — в следующем разделе).
Подготовка: проверка структуры данных перед настройкой
Прежде чем настраивать отбор, убедитесь, что в вашей базе есть техническая возможность для его реализации. Вот что нужно проверить:
- Наличие поля "Владелец" в объекте (справочнике, документе). Если его нет — добавьте реквизит типа
СправочникСсылка.ПользователиилиСправочникСсылка.ФизическиеЛица. - Заполненность поля для существующих записей. Если поле пустое, отбор не сработает.
- Права на объект — у пользователей должна быть роль, позволяющая просматривать данные (пусть и с отбором).
Проверить наличие поля можно в конфигураторе:
- Откройте нужный объект (например, справочник
Контрагенты). - Перейдите на вкладку
Реквизиты. - Проверьте, есть ли реквизит с именем
Владелецили аналогичным (например,Менеджер,Ответственный).
Если поля нет, добавьте его:
// Пример кода для добавления реквизита "Владелец" в справочник "Контрагенты"
Справочник = Метаданные.Справочники.Контрагенты;
НовыйРеквизит = Справочник.Реквизиты.Добавить();
НовыйРеквизит.Имя = "Владелец";
НовыйРеквизит.Тип = Новый Тип("СправочникСсылка.Пользователи");
НовыйРеквизит.Пояснение = "Ответственный за контрагента";
⚠️ Внимание: после добавления реквизита обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных). Иначе новое поле не появится в пользовательском режиме.
Проверено наличие поля "Владелец" в объекте|
Поле заполнено для существующих записей|
У пользователей есть права на просмотр объекта|
Сделана резервная копия базы данных-->
Способ 1: Настройка отбора через права доступа (RLS)
Самый надёжный способ установить отбор по владельцу — использовать механизм RLS (Row-Level Security). Он работает на уровне платформы и гарантирует, что пользователь не увидит чужие данные даже через прямые запросы.
Инструкция по настройке:
- Откройте конфигуратор и перейдите в
Администрирование → Пользователи и права → Настройка прав доступа. - Выберите роль, для которой нужно настроить отбор (например,
МенеджерПоПродажам). - На вкладке
Данныенайдите объект, к которому применяется отбор (например, справочникКонтрагенты). - Нажмите
Добавить ограничениеи выберите типОтбор. - В поле
Отборукажите условие:Владелец = &ТекущийПользовательгде
&ТекущийПользователь— параметр, который будет подставляться автоматически.
Пример настройки для документа ЗаказКлиента:
| Параметр | Значение | Пояснение |
|---|---|---|
| Объект | Документ.ЗаказКлиента |
Документ, к которому применяется отбор |
| Тип ограничения | Отбор | Используем отбор, а не полное ограничение |
| Условие отбора | Менеджер = &ТекущийПользователь |
Поле Менеджер должно совпадать с текущим пользователем |
| Параметры | &ТекущийПользователь (Тип: СправочникСсылка.Пользователи) |
Параметр будет подставляться автоматически |
⚠️ Внимание: если в условии отбора используется поле, которое может быть не заполнено (например, Владелец = NULL), такие записи станут невидимыми для всех пользователей, включая администратора. Чтобы избежать этого, добавьте в условие проверку на ЗначениеЗаполнено():
ИЛИ НЕ ЗначениеЗаполнено(Владелец)
ИЛИ Владелец = &ТекущийПользователь
Если отбор не срабатывает, проверьте, что в роли пользователя не стоит галочка "Полные права" — она отменяет все ограничения, включая RLS.
Способ 2: Программная установка отбора в модулях
Если настройка через RLS невозможна (например, в устаревших конфигурациях) или требуется гибкость, отбор можно реализовать программно. Для этого используются события ПриОткрытии или ПередЗаписью в модулях объектов.
Пример кода для справочника Контрагенты (отбор при открытии формы):
Процедура ПриОткрытии(Отказ)
// Устанавливаем отбор по текущему пользователю
Отбор = Новый Структура("Владелец", Пользователи.ТекущийПользователь());
ЭлементыФормы.Список.Отбор.Добавить("Владелец", ВидСравнения.Равно, Пользователи.ТекущийПользователь());
КонецПроцедуры
Для документов (например, ЗаказКлиента) можно использовать обработчик ПередЗаписью, чтобы автоматически проставлять владельца:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если НЕ ЗначениеЗаполнено(Объект.Владелец) Тогда
Объект.Владелец = Пользователи.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
Преимущества программного подхода:
- 🔧 Гибкость: можно реализовать сложную логику (например, отбор по подразделению + владельцу).
- 📌 Совместимость: работает даже в конфигурациях без поддержки RLS.
- 🔄 Динамичность: отбор можно менять "на лету" в зависимости от условий.
Недостатки:
- ⚠️ Риск ошибок: если забыть проставить владельца при создании записи, отбор не сработает.
- 🐢 Производительность: при большом количестве данных программный отбор может тормозить.
Что делать, если отбор не применяется к новым записям?
Если программный отбор не срабатывает для вновь созданных объектов, проверьте:
1. Есть ли обработчик ПередЗаписью или ПриСозданииНаСервере, который проставляет владельца.
2. Не сбрасывается ли значение владельца в других обработчиках (например, при проведении документа).
3. Правильно ли указан тип поля "Владелец" — оно должно быть ссылкой на справочник Пользователи или ФизическиеЛица.
Способ 3: Использование механизма "Владельцы данных" (для УФ)
В управляемых формах (УФ) есть встроенный механизм "Владельцы данных", который упрощает настройку отбора. Он автоматически добавляет поле Владелец и управляет видимостью записей.
Как включить:
- Откройте нужный справочник или документ в конфигураторе.
- На вкладке
Данныенайдите параметрИспользовать владельцев данныхи установите флажок. - Укажите поле, которое будет хранить владельца (обычно это
ВладелецилиОтветственный). - Сохраните изменения и обновите конфигурацию.
После этого в пользовательском режиме:
- 🔒 Пользователи будут видеть только свои записи.
- 👥 Администраторы и пользователи с полными правами увидят все записи.
- 📝 При создании новой записи поле
Владелецбудет заполняться автоматически.
⚠️ Внимание: механизм "Владельцы данных" не работает для обычных (неуправляемых) форм. Если ваша конфигурация использует старые формы, этот способ не подойдёт.
Типичные ошибки и как их избежать
Даже опытные администраторы 1С сталкиваются с проблемами при настройке отбора по владельцу. Вот самые распространённые ошибки и способы их решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Отбор не работает для новых записей | Поле Владелец не заполняется автоматически |
Добавьте обработчик ПередЗаписью (см. Способ 2) |
| Пользователь видит все записи, несмотря на отбор | У роли стоят "Полные права" или неверно настроен RLS | Проверьте настройки прав в конфигураторе (см. Способ 1) |
| Отбор срабатывает только в списках, но не в отчётах | В запросах отчётов не учтён отбор по владельцу | Добавьте условие в текст запроса: ГДЕ Владелец = &ТекущийПользователь |
| Администратор перестал видеть все записи | Отбор применён ко всем ролям, включая администратора | Исключите роль ПолныеПрава из ограничений RLS |
Ещё одна частая проблема — конфликт отборов, когда на один объект настроено несколько правил (например, RLS + программный отбор). В этом случае система применяет самое жёсткое ограничение, что может привести к полной невидимости данных. Чтобы избежать этого:
- 🔍 Используйте один способ отбора (или RLS, или программный).
- 📋 Документируйте все настройки отборов в техническом задании.
- 🧪 Тестируйте изменения на копии базы перед применением на рабочем сервере.
Перед применением отбора по владельцу всегда проверяйте, что у администраторов и руководителей остаётся доступ ко всем данным. Используйте роль ПолныеПрава для исключений.
Как проверить, что отбор работает корректно
После настройки отбора необходимо проверить его работу в разных сценариях. Вот чек-лист для тестирования:
- Проверка видимости записей:
- 👤 Зайдите под учётной записью обычного пользователя и убедитесь, что он видит только свои данные.
- 👔 Зайдите под администратором и проверьте, что все записи отображаются.
- Тестирование новых записей:
- 📝 Создайте новую запись под пользователем и убедитесь, что поле
Владелецзаполнилось автоматически. - 🔍 Проверьте, что другая учётная запись не видит эту запись.
- 📝 Создайте новую запись под пользователем и убедитесь, что поле
- Проверка отчётов:
- 📊 Запустите отчёт, который использует данные с отбором. Убедитесь, что в результатах только разрешённые записи.
- 💻 Выполните прямой запрос к базе через
Запроси проверьте, применяется ли отбор.
Для автоматического тестирования можно использовать следующий код (выполняется в режиме 1С:Предприятие):
// Проверка отбора для справочника "Контрагенты"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Владелец КАК Владелец
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Владелец = &ТекущийПользователь";
Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());
Результат = Запрос.Выполнить();
Сообщить("Найдено записей: " + Результат.Выбрать().Количество());
Если количество записей совпадает с ожидаемым — отбор работает корректно. Если нет — проверьте настройки RLS или программный код.
FAQ: Частые вопросы по отбору по владельцу в 1С
Можно ли настроить отбор по владельцу для отчётов?
Да, но для этого нужно модифицировать текст запроса в отчёте. Добавьте условие по полю Владелец с параметром &ТекущийПользователь. Например:
ГДЕ
Документ.Владелец = &ТекущийПользователь
Если отчёт стандартный и его нельзя изменить, создайте внешний отчёт с нужным отбором.
Как сделать, чтобы руководитель видел записи своих подчинённых?
Для этого используйте иерархию подразделений:
- Добавьте в условие отбора проверку на принадлежность к подразделению:
Владелец.Подразделение = &ТекущееПодразделение - Для руководителя настройте роль с правом просмотра всех подразделений в его иерархии.
Или используйте рекурсивный запрос для определения подчинённых.
Почему после обновления 1С отбор перестал работать?
Вероятные причины:
- 🔄 Изменилась структура метаданных (например, переименовали поле
Владелец). - 🔧 Обновились настройки RLS в новой версии конфигурации.
- 📋 Внешние обработки или расширения переопределяют отбор.
Решение: сравните текущие настройки RLS с эталонной базой или проверьте журнал изменений конфигурации.
Можно ли применить отбор по владельцу к регистрам накопления?
Да, но с оговорками:
- ✅ Для регистров сведений отбор настраивается стандартным способом через RLS.
- ⚠️ Для регистров накопления придётся модифицировать запросы в отчётах или использовать виртуальные таблицы с отбором.
Пример условия для запроса к регистру:
ГДЕ
Регистр.Владелец = &ТекущийПользователь
Как убрать отбор по владельцу для конкретного пользователя?
Способы:
- 🔓 Назначьте пользователю роль с
Полными правами(не рекомендуется для обычных пользователей). - 🛠 Измените настройки RLS: исключите пользователя из ограничений или добавьте его в список исключений.
- 📝 Для программного отбора: добавьте проверку на имя пользователя в коде.