Администрирование · 11 мин
Что такое разделители в 1С и как они работают
Разделители в 1С — что это, как работают в режиме разделения данных, где настраиваются, типичные ошибки при использовании и проверка результата.
Разделители в 1С — это механизм платформы, который позволяет хранить в одной физической информационной базе данные нескольких независимых областей (абонентов) и при этом изолировать их друг от друга. Пользователь одной области видит только «свои» справочники, документы и регистры, хотя физически они лежат в тех же таблицах, что и данные соседних областей.
Технически разделитель — это специальный общий реквизит конфигурации, у которого включено свойство «Разделение данных». Платформа автоматически добавляет значение этого реквизита во все запросы к разделённым объектам: и при чтении, и при записи. Разработчику не нужно вручную прописывать условия отбора — фильтрация происходит на уровне платформы.
Механизм чаще всего применяется в сервисах по модели SaaS (облачные «1С:Фреш» и аналогичные решения), где одна база обслуживает сотни организаций-клиентов. Но разделители используются и в коробочных решениях — например, для разделения данных по организациям внутри одной базы или для технологических нужд самой платформы.
Как устроен механизм разделения данных
В основе механизма лежат общие реквизиты конфигурации. У общего реквизита есть свойство «Разделение данных» с тремя вариантами: «Не использовать», «Разделять» и «Независимо и совместно». Как только выбран вариант «Разделять», реквизит становится разделителем, и у объектов метаданных появляется возможность включить его в свой состав.
Для каждого объекта (справочника, документа, регистра) в свойстве «Разделение данных» указывается, какие разделители к нему применяются. После этого платформа при обращении к объекту автоматически добавляет условие «разделитель = текущее значение». Если сеанс работает без установленного значения разделителя, доступны только неразделённые данные либо возникает ошибка при обращении к разделённым объектам — в зависимости от режима.
Физически в таблицах СУБД появляется дополнительное поле (например, _Fld с номером разделителя), и каждая запись помечается значением области. Индексы платформа строит с учётом этого поля, чтобы выборки внутри области оставались быстрыми.
Режимы разделения: независимый и совместный
У разделителя есть дополнительное свойство — «Использование разделителя», определяющее режим работы. Вариант «Независимо» означает, что данные каждой области полностью автономны: запросы видят только записи текущей области. Вариант «Независимо и совместно» добавляет возможность хранить общие (неразделённые) записи, доступные всем областям одновременно.
Режим «Независимо и совместно» удобен для общих справочников — например, классификаторов валют или единиц измерения, которые одинаковы для всех абонентов. При этом в коде нужно явно указывать, работаете ли вы с разделённой частью данных или с общей, иначе можно получить непредсказуемые выборки.
Выбор режима фиксируется на этапе проектирования конфигурации. Смена режима на работающей базе с данными — рискованная операция: часть записей может оказаться «не той» области, и потребуется их ручная миграция.
Сравнение режимов
Полная изоляция областей. Подходит для данных абонентов: документы, остатки, контрагенты. Общих записей быть не может.
Области изолированы, но есть общие записи для всех. Подходит для классификаторов и настроек сервиса. Требует аккуратности в коде.
Где разделители применяются на практике
Основной сценарий — облачные сервисы 1С. Менеджер сервиса (специальная конфигурация из библиотеки стандартных подсистем) создаёт области данных, назначает каждой значение разделителя и управляет абонентами. Прикладная база при этом одна, обновление конфигурации выполняется централизованно для всех областей сразу.
Второй сценарий — коробочные базы с несколькими организациями, где требуется жёсткая изоляция на уровне платформы, а не только права доступа. Это встречается реже: обычно для таких задач хватает RLS (ограничения доступа на уровне записей), который не требует перестройки структуры базы.
Третий сценарий — служебные разделители самой платформы и БСП, например для разделения регистров очередей заданий, версий объектов или данных обмена между областями сервиса.
Как включить и настроить разделитель
Настройка выполняется в конфигураторе и требует монопольного доступа к базе. Порядок действий одинаков для любой конфигурации, но в типовых решениях на БСП большинство разделителей уже созданы — добавлять свои нужно только в собственных доработках.
После реструктуризации у всех существующих записей значение разделителя будет пустым (нулевым). Если база уже содержала данные, их нужно распределить по областям вручную — обработкой, которая проставит корректные значения, иначе записи окажутся недоступны ни одной области.
УстановитьЗначениеРазделенияСеанса(НомерОбласти);
УстановитьИспользованиеРазделенияСеанса(Истина);
// дальше все запросы работают только внутри области НомерОбластиЧем разделители отличаются от RLS и прав доступа
Права доступа и RLS ограничивают видимость данных на уровне логики безопасности: запись физически доступна, но платформа или запрос её отфильтровывает. Разделитель работает глубже — условие по области добавляется в каждый запрос к разделённой таблице автоматически, и обойти его прикладным кодом нельзя.
RLS гибче: можно строить сложные условия по подразделениям, контрагентам, датам. Разделитель проще и надёжнее для жёсткой изоляции «клиент от клиента», но не умеет ничего, кроме равенства значению области. В сервисах оба механизма обычно сочетаются: разделитель отсекает чужие области, RLS настраивает доступ внутри своей.
По производительности разделитель выгоднее: условие по числовому полю с индексом дешевле, чем развёрнутые шаблоны RLS с соединениями таблиц.
Проверьте ИспользованиеРазделенияСеанса() и ЗначениеРазделенияСеанса()
Сверьте значение области сеанса со значением в записях
Проверьте значения разделителя в таблицах до и после обновления
Типичные ошибки и ограничения
Самая частая ошибка разработчика — забыть установить значение разделителя в фоновом задании или регламентной операции. Фоновые задания не наследуют разделение сеанса автоматически: его нужно передавать явно, иначе задание либо упадёт с ошибкой, либо запишет данные «в никуда».
Вторая группа ошибок связана с запросами в режиме «Независимо и совместно»: разработчик рассчитывает на общие записи, а сеанс работает в разделённом режиме, и выборка возвращается пустой. Обратная ситуация опаснее — когда в разделённый отчёт случайно попадают общие записи и искажают итоги.
Есть и архитектурные ограничения: разделители нельзя применить к некоторым объектам (например, критериям отбора и ряду служебных таблиц), а количество разделителей в конфигурации разумно держать минимальным — каждый добавляет поле во все разделённые таблицы и усложняет индексы.
Как проверить, что разделение работает правильно
Проверка выполняется на тестовой копии базы с минимум двумя областями данных. Создайте в каждой области по одному характерному документу, затем переключайте значение разделителя сеанса и контролируйте видимость: каждая область должна видеть только свой документ, общие справочники (если режим совместный) — обе.
Дополнительно проверьте фоновые задания, обмены данными и отчёты — именно там чаще всего всплывают проблемы с неустановленным разделением. Полезно также выполнить контрольный запрос к таблице напрямую через консоль СУБД и убедиться, что поле разделителя заполнено корректно у всех записей.
Как проверить результат
Видны только документы своей области
Видны чужие документы или список пуст
У всех записей проставлено значение области
Есть записи с пустым (нулевым) значением
Задания выполняются, данные пишутся в нужную область
Ошибки доступа или записи вне области
Итоги совпадают с данными области
Итоги завышены за счёт общих или чужих записей
Что важно запомнить
Разделитель — это общий реквизит с включённым разделением данных, изолирующий области внутри одной базы. Платформа сама фильтрует запросы по значению разделителя. Главные правила: устанавливайте разделение в каждом сеансе и фоновом задании, мигрируйте данные при включении разделителя на существующей базе и используйте RLS для доступа внутри области.
Частые вопросы
Можно ли добавить разделитель в типовую конфигурацию без снятия с поддержки?
Технически общие реквизиты и их свойства изменяются в режиме поддержки с ограничениями, но любое изменение состава разделителей затрагивает типовые объекты и усложнит последующие обновления. Безопаснее использовать расширение конфигурации, если задача позволяет, либо оценить, не решается ли она через RLS.
Чем разделитель отличается от разделения базы на несколько файловых баз?
Отдельные базы дают полную изоляцию, но требуют обновления и обслуживания каждой копии. Разделители позволяют держать одну конфигурацию и одну базу на всех абонентов, обновляя её централизованно, — за счёт этого и строится экономика облачных сервисов.
Что произойдёт, если не установить значение разделителя в сеансе?
При обращении к разделённым объектам платформа выдаст ошибку нарушения прав доступа либо вернёт пустые выборки — поведение зависит от того, включено ли использование разделения. Неразделённые объекты при этом остаются доступны.
Сколько разделителей можно создать в одной конфигурации?
Жёсткого практического лимита для типовых задач нет, но каждый разделитель добавляет поле во все разделённые им таблицы и включается в индексы. На практике конфигурации обходятся одним-двумя разделителями: основным (область данных) и, при необходимости, вспомогательным.
Можно ли перенести данные между областями?
Да, для этого в библиотеке стандартных подсистем есть механизмы выгрузки и загрузки областей данных. Перенос выполняется через выгрузку области в файл и загрузку её в новую область с другим значением разделителя — напрямую менять значение у записей в таблицах не рекомендуется.
Влияют ли разделители на скорость работы базы?
Условие по разделителю добавляется во все запросы к разделённым таблицам, но оно учитывается в индексах платформы, поэтому при корректной структуре влияние на производительность минимально. Замедление обычно свидетельствует о нехватке подходящих индексов или о чрезмерном количестве разделителей.