132 документа
← К списку

Глава 24. Механизм разделения данных

страница

Глава 24. Механизм разделения данных

24.1. Общая информация

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

● изменяется поведение объектов конфигурации, входящих в состав общего реквизита (далее ‑ разделителя);

● для каждого разделителя в информационной базе определяется текущее значение разделителя и признак использования данного разделителя;

● объекты конфигурации, входящие в состав такого общего реквизита, называются разделенными объектами конфигурации;

● конфигурация с такими общими реквизитами считается разделенной конфигурацией;

● информационная база с разделенной конфигурацией называется разделенной информационной базой;

● данные информационной базы, доступные для выбранных значений разделителей, и данные неразделенных объектов конфигурации называются областью данных.

Во всех операциях чтения записей базы данных «1С:Предприятие» автоматически отбирает только те записи, в которых значения используемых разделителей совпадают с текущими значениями разделителей. При записи данных платформа проверяет, что записываемые данные содержат значения используемых разделителей, равные текущим значениям разделителей или равные значениям по умолчанию для соответствующих типов. Если это не так, то вызывается исключение.

Например:

Копировать в буфер обмена

// Изначально объект записан со значением разделителя Абонент = 1 Объект = СсылкаНаОбъект.ПолучитьОбъект(); // Меняем значение разделителя в текущем сеансе ПараметрыСеанса.АбонентЗначение = 2; // Объект не будет записан, и будет вызвано исключение Объект.Записать();

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

● при чтении данных отбор по этим разделителям не выполняется;

● при модификации данных используются значения, содержащиеся в записываемых данных.

В состав разделителя могут входить следующие объекты конфигурации:

● константы,

● справочники,

● документы,

● последовательности,

● журналы документов,

● планы видов характеристик,

● планы счетов,

● планы видов расчета,

● бизнес-процессы,

● задачи,

● регистры сведений,

● регистры накопления,

● регистры бухгалтерского учета,

● регистры расчета,

● планы обмена,

● регламентные задания,

● пользователи информационной базы (см. здесь).

Следует помнить, что последовательности и журналы документов являются разделенными объектами только в том случае, если в их состав входят разделенные объекты конфигурации. Состав разделителей для объектов, входящих в состав последовательности или журнала документов, должен быть идентичным.

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

Тип разделителя не может быть составным.

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

Рис. 526. Общий реквизит с разделением

**Внимание! Если использовать разделитель с типом Строка, не допускается изменение языка региональных настроек информационной базы при работе с Microsoft SQL Server.

Внимание! Не поддерживается разделение данных на СУБД Microsoft SQL Server 2000, IBM Db2 9.1, а также на СУБД IBM Db2 других версий, если в СУБД установлено сравнение строк, чувствительное к регистру букв (параметр COLLATION``_``SEQUENCE не равен значению UCA``500``R``1_``LROOT``_``AN``_``CX``_``EX``_``FX``_``HX``_``NX``_``S``2).**

24.2. Свойства общего реквизита

24.2.1. Использование разделяемых данных

Свойство Использование разделяемых данных определяет возможность использования данных разделенных объектов конфигурации в том случае, если в режиме 1С:Предприятие разделитель не используется:

● ЗначениеНезависимо ‑ запрещается любое обращение к разделенным объектам (кроме планов обмена, подробнее см. здесь), если в текущем сеансе работы с информационной базой разделитель не используется. При этом разделитель недоступен в объектной модели, в языке запросов, в формате выгрузки в XML и XDTO, а также ограничениях доступа к данным. При записи разделенных данных система автоматически заполняет значения общего реквизита значениями, установленными в текущем сеансе. В данном режиме расширения конфигурации могут дополнять данные собственных объектов конфигурации и создавать собственные объекты, хранящие данные в информационной базе.

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

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

● Значение Независимо и совместно ‑ разрешается работа с разделяемыми объектами независимо от использования разделителя в сеансе. Для такого режима будет доступна область данных, которую определяют значения используемых разделителей. При этом разделитель доступен в объектной модели, в языке запросов, в формате выгрузки в XML и XDTO, а также в ограничениях доступа к данным. В этом режиме невозможно создание предопределенных элементов для объектов, входящих в состав такого разделителя. Если в сеансе используются не все разделители, в состав которых входит объект, то работа с этим объектом будет менее эффективной. В данном режиме не поддерживается любое расширение данных.

Данный режим может использоваться в тех случаях, когда прикладное решение в большинстве случаев работает только с данными одной области данных (например, при вводе документов), а в некоторых режимах может использовать данные нескольких или всех областей, например, для получения консолидированной отчетности.

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

24.2.2. Значение разделителя и признак использования

Свойство Значение разделения данных определяет параметр сеанса, который хранит установленное в текущем сеансе значение разделителя. Тип параметра сеанса в точности должен совпадать с типом разделителя.

Свойство Использование разделения данных определяет параметр сеанса (типа Булево), который управляет использованием разделителя. Если значение указанного параметра сеанса равно Истина, то это означает, что в данном сеансе разделитель используется.

Рис. 527. Параметры сеанса и общий реквизит

Изменять значения параметров сеанса в процессе работы системы можно в том случае, если у пользователя, от лица которого работает сеанс, есть права на изменение необходимых параметров сеанса. «1С:Предприятие» не гарантирует целостность данных приложения после изменения параметров сеанса.

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

● очищается кеш объектов;

● удаляются повторно используемые значения (см. здесь) и на стороне клиента, и на стороне сервера.

Значение разделителя можно указать в командной строке запуска «1С:Предприятия 8» с помощью параметра Z или в строке соединения с помощью параметра Zn (см. здесь).

24.2.3. Разделение пользователей

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

Для определения того, доступен пользователь в сеансе или нет, можно использовать следующую таблицу (по отношению к одному разделителю):

Разделитель в сеансе используется

Разделитель в сеансе
не используется

Значение для пользователя
установлено

Доступен при равенстве значений разделителя

Доступен

Значение для пользователя
не установлено

Недоступен

Доступен

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

24.2.4. Разделение аутентификации

Свойство Разделение аутентификации служит для управления возможностью создания одноименных пользователей для разных областей данных. Если свойство установлено в значение Не использовать, то уникальность имен пользователей отслеживается для всех областей данных. Если свойство установлено в значение Разделять, то существует возможность создавать одноименных пользователей в разных областях данных. Например, можно создать несколько пользователей Администратор, которые будут различаться только значениями разделителей (в том числе и для незаданного значения разделителя).

Если существует разделитель Абонент (типа Число) и для него значение свойства Разделение аутентификации установлено в значение Разделять, то имеется возможность создать следующий список пользователей:

Имя пользователя

Значение разделителя Абонент

Администратор

Не задано

Администратор

1634

Администратор

2245

Администратор

1245

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

Имя пользователя

Значение разделителя Абонент

АдминистраторИБ

Не задано

Администратор1634

1634

Администратор2245

2245

Администратор1245

1245

24.2.5. Разделение расширений конфигурации

Свойство Разделение расширений конфигурации предназначено для управления возможностью разделения расширений между различными областями данных.

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

При изменении значения данного свойства у разделителя, следует помнить о следующих особенностях:

● При смене значения свойства с Разделять на Не использовать, данный разделитель перестает учитываться при определении доступности уже загруженных расширений.

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

Рекомендуется отключать разделение расширений для разделителя, который находится в режиме Независимо и совместно.

Смотри также:

● Расширение конфигурации (см. здесь).

● Значение разделителя (см. здесь).

24.2.6. Условное разделение

24.2.6.1. Общее описание

Условное разделение необходимо в тех случаях, когда прикладное решение предполагается использовать как в разделенном, так и в неразделенном вариантах. Например, прикладное решение может использоваться для автономной работы ‑ в этом случае разделители не используются, но в самом решении они предусмотрены, а может использоваться для работы некоторого количества абонентов, никак не связанных друг с другом (с независимым набором данных в информационной базе). Такое поведение можно реализовать с помощью условного разделения: в случае автономного использования разделение будет выключено, а в разделенном режиме ‑ включено.

Условное разделение устроено следующим образом:

● для разделителя (или объекта, входящего в состав разделителя) возможно задание объекта, который хранит состояние разделения по данному разделителю;

● изменяя значение этого объекта, можно включать или выключать разделение по данному разделителю для всех (если условное разделение установлено для самого разделителя) или выбранных объектов (если условное разделение задано для объекта, входящего в состав разделителя);

● если разделитель условно выключен, то в качестве значения разделителя будет использоваться значение по умолчанию для типа разделителя.

Примечание. Для каждого разделителя значение условного разделения не может прямо или косвенно зависеть от значения самого разделителя.

Возможно рекурсивное управление условным разделением, когда для разделителя, используемого для определения условного разделения другого разделителя, настроено условное разделение и т. д. В этом случае определение состояния условного разделения будет начинаться с такого разделителя, значение которого условно не разделяется (но оказывает влияние на другие объекты, участвующие в условном разделении) и далее по связанным разделителям до тех пор, пока не будет определено состояние условного разделения для разделителя, от состояния которого не зависит более ни один разделитель. Создать зацикленное условное разделение невозможно.

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

● Для всех объектов, входящих в состав разделителя. В этом случае следует использовать свойство разделителя Условное разделение.

● Для отдельных объектов, входящих в состав разделителя. Для этого следует воспользоваться колонкой Условное разделение в окне редактирования состава разделителя.

● Комбинацией описанных выше свойств.

При организации условного разделения следует принимать во внимание следующие особенности:

● В качестве объекта, хранящего значение условного разделения, может выступать:

● Константа типа Булево, не входящая в состав разделителя, для которого настраивается условное разделение.

● Реквизит типа Булево у ссылочного объекта конфигурации, который:

● Не входит в состав разделителя, для которого настраивается условное разделение.

● Должен выступать в качестве типа другого разделителя, и разделитель такого типа должен быть единственным.

● При запуске системы выполняется начальная установка значений параметров сеанса, хранящих признак использования и значений разделителей, в соответствии с параметрами командной строки запуска или значениями, указанными для пользователя информационной базы. Подробнее об установке значений разделителей при запуске см. здесь.

● Если разделение общего реквизита условно выключено, то:

● При чтении и записи данных текущие значения параметров сеанса, отвечающих за значение и использование разделителя, игнорируются. При этом используются следующие значения:

● Признак использования ‑ Истина (разделитель используется).

● Значение разделителя ‑ значение по умолчанию для типа разделителя.

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

● Признак использования ‑ Ложь (разделитель не используется).

● Значение разделителя ‑ не используется.

● Если значение, определяющее условное разделение, не прочитано или неоднозначно, будет выдано исключение.

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

● Если в сеансе выключены все разделители (с помощью условного разделения), то становятся доступными действия с информационной базой, которые недоступны, если используется хотя бы один разделитель.

Если настроено условное разделение и в свойстве общего реквизита (свойство общего реквизита Условное разделение), и с помощью колонки Условное разделение состава общего реквизита, то в качестве значения разделителя будет использовано одно из следующих значений:

● Текущее значение разделителя (установленное в соответствующий параметр сеанса) в том случае, если разделение условно включено и объектом (реквизит или константа), указанным в соответствующей колонке состава общего реквизита, и объектом (реквизит или константа), указанным в свойстве самого разделителя.

● Значение по умолчанию для типа разделителя, если условное разделение выключено любым способом.

Примечание. Условное разделение не работает в конфигураторе. Считается, что в сеансе конфигуратора реквизиты всегда условно включены.

24.2.6.2. Условное разделение, задаваемое в свойствах общего реквизита

24.2.6.2.1. С помощью константы

Разделитель можно полностью отключать с помощью константы. Константа должна иметь тип Булево и не должна разделяться самим реквизитом.

Рис. 528. Условное разделение с помощью константы

Внимание! При первом запуске «1С:Предприятия» (после добавления условного разделения) значение константы будет равно Ложь, и разделение будет выключено.

Рассмотрим этот случай подробнее.

Имеется общий реквизит Абонент с типом Число. В состав этого реквизита входит справочник Товары со следующим содержимым:

Код

Наименование

Абонент

1

Босоножки

0

2

Ботинки

1

3

Валенки

2

4

Кроссовки

1

5

Сланцы

0

Для общего реквизита используется условное разделение, управляемое константой РазделениеПоАбонентам. Если значение константы равно Ложь, то это означает, что разделитель не работает (разделение выключено). Если значение константы равно Истина, то это означает, что разделитель работает (разделение включено).

Таким образом, можно выделить следующие ситуации:

● Значение разделителя Абонент равно 1, разделитель используется, значение константы РазделениеПоАбонентам равно Истина. В данном сеансе разделение условно включено (для разделителя Абонент). В этой ситуации в справочнике доступны следующие элементы:

Код

Наименование

Абонент

2

Ботинки

1

4

Кроссовки

1

● Значение константы РазделениеПоАбонентам равно Ложь. В данном сеансе разделение условно выключено (для разделителя Абонент). В этой ситуации, независимо от значения параметров сеанса АбонентИспользование и АбонентЗначение, в справочнике доступны следующие элементы:

Код

Наименование

Абонент

1

Босоножки

0

5

Сланцы

0

24.2.6.2.2. С помощью реквизита объекта

Более сложный вариант управления условным разделением используется в том случае, если для условного разделения одного разделителя используются данные другого разделителя. Тогда в рамках разных областей данных возможно разное поведение разделителя, описывающего другую область данных.

Допустим, существует набор объектов конфигурации, описывающих нормативно-справочную информацию (далее НСИ): справочники Банки, Валюты, Ставки НДС. Необходимо реализовать следующую возможность:

● в информационной базе можно вести учет для разных групп компаний;

● каждая группа компаний состоит из организаций;

● содержимое объектов НСИ может быть как общим для всех организаций группы компаний, так и индивидуальным для каждой организации.

Реализация такой схемы потребует следующие объекты конфигурации:

● справочник ГруппыКомпаний с реквизитом ЕдинаяНСИ типа Булево;

● справочник Организации;

● справочник Банки;

● справочник Валюты;

● справочник СтавкиНДС;

● разделитель ГруппаКомпаний типа СправочникСсылка.ГруппыКомпаний;

● разделитель Организация типа СправочникСсылка.Организации. В состав этого разделителя входят только объекты, описывающие НСИ:

● справочник Банки,

● справочник Валюты,

● справочник СтавкиНДС.

В состав разделителя ГруппаКомпаний входят все рассматриваемые справочники (кроме справочника ГруппыКомпаний), т. к. для каждой группы компаний нам нужен свой список организаций и содержимое НСИ.

Рис. 529. Состав разделителя «ГруппаКомпаний»

В состав разделителя Организация входят только справочники Банки, Валюты и СтавкиНДС. Именно эти справочники являются НСИ, и именно для них нужно два варианта использования:

● для каждой организации выбранной группы компаний,

● для всех организаций выбранной группы компаний.

Рис. 530. Состав разделителя «Организация»

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

Теперь для каждого значения разделителя ГруппаКомпаний (элемент справочника ГруппыКомпаний) можно указать значение реквизита ЕдинаяНСИ:

● Реквизит установлен в значение Ложь ‑ условное разделение выключено, и для любого значения разделителя Организация (в рамках одного значения разделителя ГруппаКомпаний) будет единый набор значений справочников Банки, Валюты и СтавкиНДС.

● Реквизит установлен в значение Истина ‑ условное разделение включено, и для любого значения разделителя Организация (в рамках одного значения разделителя ГруппаКомпаний) будет свой набор значений справочников Банки, Валюты и СтавкиНДС.

Фактически, изменяя значение свойства ЕдинаяНСИ, происходит включение или выключение разделения по разделителю Организация.

Пусть в справочнике ГруппыКомпаний существуют следующие записи:

Наименование

ЕдинаяНСИ

Ссылка

Прогресс

Ложь

ГК1

Торговый дом

Истина

ГК2

В справочнике Организации существуют следующие записи (по две для каждого значения разделителя ГруппаКомпаний):

Наименование

ГруппаКомпаний

Ссылка

База комплектующих

ГК1

ОР1

Мир кондиционеров

ГК1

ОР2

СтройТоргВсе

ГК2

ОР3

Лайт

ГК2

ОР4

В справочнике Банки будет следующая информация:

Наименование

ГруппаКомпаний

Организация

АльфаБанк

ГК1

Пустая ссылка

СберБанк

ГК1

ОР1

ВТБ

ГК1

ОР2

Авангард

ГК2

ОР1

Уралсиб

ГК2

ОР2

Теперь рассмотрим на примере, какие данные будут доступны в каком случае.

Пример 1:

Реквизит ЕдинаяНСИ для элемента Прогресс установлен в значение Ложь.

Это значит, что разделение для справочника Банки выключено. Значит, содержимое этого справочника не зависит от значения разделителя Организация и в элемент справочника Банки (для разделителя Организация) в этом случае будет записываться значение, равное значению по умолчанию для типа разделителя. В нашем случае таким значением является пустая ссылка (так как тип разделителя Организация ‑ ссылка на справочник). Поэтому если разделитель ГруппаКомпаний установлен в значение ГК1, то список справочника Банки будет показывать только одну запись: АльфаБанк.

Пример 2:

Реквизит ЕдинаяНСИ для элемента Прогресс установлен в значение Истина.

Это значит, что разделение для справочника Банки включено. Значит, содержимое этого справочника зависит и от значения разделителя ГруппаКомпаний, и от значения разделителя Организация.

Поэтому для группы компаний Прогресс и организации Мир кондиционеров в списке банков будет только банк ВТБ.

Меняя значение реквизита ЕдинаяНСИ (и значения разделителей) во время работы системы, можно получить тот или иной состав списка справочника Банки (в соответствии с правилами условного разделения).

24.2.6.3. Условное разделение, задаваемое для объекта (в свойстве «Состав»)

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

Условное разделение может управляться как константой, так и реквизитом объекта конфигурации (см. здесь).

Рассмотрим пример такого разделения.

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

Реализация такой схемы потребует следующие объекты конфигурации:

● справочник Абоненты с реквизитом РаздельныйСписокСкладов типа Булево;

● справочник Организации;

● справочник Склады;

● разделитель Абонент типа СправочникСсылка.Абоненты;

● разделитель Организация типа СправочникСсылка.Организации.

Для организации рассмотренной схемы нам требуется выполнить следующее:

● из состава разделителя Организация нужно исключить справочник Организации;

● для справочника Склады (в составе разделителя Организация) нужно задать условное разделение через реквизит РаздельныйСписокСкладов справочника Абоненты.

Пусть в справочнике Абоненты есть две записи:

Наименование

РаздельныйСписокСкладов

Абонент 3453

Истина

Абонент 4617

Ложь

Если пользователь входит от имени абонента № 3453, то для каждой организации будет возможно вести индивидуальный список складов, т. к. реквизит РаздельныйСписокСкладов установлен в значение Истина (включено разделение справочника Склады в разделителе Организация).

В то же время при входе в систему от имени абонента № 4617 список складов будет един для всех организаций, реквизит РаздельныйСписокСкладов установлен в значение Ложь (выключено разделение справочника Склады в разделителе Организация).

24.2.6.4. Особенности условного разделения в распределенной системе

Использование условного разделения в распределенной системе имеет некоторые особенности. Эти особенности можно разделить на «логические» и «технические».

К «техническим» особенностям следует отнести невозможность произвольно изменять состояние объекта, управляющего условным разделением, в разделенном сеансе, если этот объект входит в состав разделенного плана обмена. Это связано с особенностями автоматической регистрации изменений объектов разделенными планами обмена (см. здесь). При автоматической регистрации изменений изменять объект, управляющий условным разделением, можно или в неразделенном сеансе, или в том случае, когда текущее состояние объекта равно Ложь. То есть можно только включить условное разделение, и нельзя его выключить (в автоматическом режиме).

«Логическая» особенность заключается в том, что изменение состояния условного разделения в главном узле распределенной информационной базы оказывает существенное влияние на состояние и поведение всей распределенной информационной системы. Такое изменение может затрагивать одну область данных, если условное разделение управляется реквизитом объекта, служащего типом другого разделителя (описание примера см. здесь). Также изменение состояния условного разделения может затрагивать всю информационную базу в том случае, если условное разделение служит для переключения между двумя режимами работы прикладного решения (описание примера см. здесь).

Так, в первом случае (пример с НСИ) при изменении условного разделения в периферийной базе у пользователей «пропадет» нормативно-справочная информация. Поэтому доступ к изменению реквизита, управляющего условным разделением, следует предоставлять только администратору области данных или человеку, обладающему достаточными полномочиями для принятия такого рода изменения.

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

24.3. Определение возможности выполнения действия или набора данных

В том случае, когда в системе используется несколько разделителей, для определения доступности некоторого действия с тем или иным объектом, следует применять следующее правило:

● Для каждого разделителя, который разделяет требуемый объект, определяется возможность выполнения необходимого действия так, как будто разделитель в системе один (при этом, естественно, учитывается режим разделения ‑ независимый или независимый и совместный).

● Результат по всем разделителям складывается «по И».

В дальнейших разделах будет рассматриваться выполнение того или иного действия с объектом для одного разделителя (если не будет явно описано обратное). Затем будет необходимо применить данное правило для получения итогового действия, если объект входит в состав нескольких разделителей.

Например, в системе есть два независимых разделителя: Абонент и Организация. Существуют два справочника: Номенклатура и Контрагенты. Каждый справочник разделен обоими разделителями.

Пример 1:

Необходимо определить возможность получения списка номенклатуры в случае, если разделитель Абонент используется, а разделитель Организация ‑ нет.

Так как оба разделителя независимые, то для получения списка справочника необходимо, чтобы разделитель использовался. Следовательно:

● Для разделителя Абонент список номенклатуры получить можно, т. к. разделитель используется. Результат равен значению Истина.

● Для разделителя Организация список номенклатуры получить нельзя, т. к. разделитель не используется. Результат равен значению Ложь.

● Таким образом, в сеансе с такими установками разделителей, просмотр списка справочника будет (Истина И Ложь = Ложь) невозможен.

Пример 2:

Необходимо определить возможность получения списка контрагентов, если используются оба разделителя.

Так как оба разделителя независимые, то для получения списка справочника необходимо, чтобы разделитель использовался. Следовательно:

● Для разделителя Абонент список контрагентов получить можно, т. к. разделитель используется. Результат равен значению Истина.

● Для разделителя Организация список контрагентов получить можно, т. к. разделитель используется. Результат равен значению Истина.

● Таким образом, в сеансе с такими установками разделителей просмотр списка справочника будет (Истина И Истина = Истина) возможен.

Пример 3:

Необходимо определить, какие значения для колонки Пользователь вернет метод ПолучитьЗначенияОтбораЖурналаРегистрации(). В системе создано два разделителя, при этом в текущем сеансе используется первый разделитель и не используется второй. Следовательно:

● для первого разделителя метод вернет только тех пользователей, которые зарегистрированы в журнале регистрации для значений разделителя, равному значению в текущем сеансе;

● для второго разделителя метод вернет всех пользователей (подробнее см. здесь);

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

24.4. Установка значений разделителей при запуске

24.4.1. Общая информация

При запуске «1С:Предприятия» может возникнуть необходимость указать значение разделителя непосредственно в командной строке запуска (например, для проведения аутентификации, если выбрано разделение аутентификации).

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

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

В процессе аутентификации пользователя информационной базы значения параметров сеанса, на которые ссылаются свойства Использование разделителя и Значение разделителя объекта метаданных Общий реквизит, устанавливаются в значения, указанные для пользователя. К моменту исполнения любого кода на встроенном языке (в том числе и в модуле сеанса) значения этих параметров сеанса будут установлены, и при обращении к ним не будет вызываться обработчик события УстановкаПараметровСеанса.

Следует помнить, что определение значения разделителя по его переданному идентификатору выполняется без учета использования других разделителей. То есть определение значения разделителя не зависит от порядка установки значений (и признака использования) других разделителей. Если система не может однозначно определить значение разделителя по его идентификатору (например, существуют два элемента справочника с одинаковым кодом), то будет вызвано исключение.

Если признак использования и значение разделителя (см. далее), которые указаны в строке запуска, отличаются от значений, указанных для пользователя, то:

● если пользователь имеет права на изменение параметров сеанса, хранящих значение и признак использования разделителя, то выполняется установка этих значений из командной строки запуска;

● если такие права отсутствуют, аутентификация завершается с ошибкой.

24.4.2. Командная строка клиентского приложения

Для указания значений разделителей используется параметр командной строки Z.

Синтаксис параметра:

Копировать в буфер обмена

/Z "[<Признак>][<Значение>][,[<Признак>][<Значение>]]"

Описание:

Каждая пара <Признак><Значение> отвечает за установку одного разделителя. Пропуск разделителей невозможен. Порядок следования пар <Признак><Значение> соответствует порядку расположения разделителей в окне конфигурации. Если порядок общих реквизитов меняется (например, выполнена сортировка списка общих реквизитов), необходимо изменить расположение значений в параметре Z. Пары <Признак><Значение> разделяются запятыми (",").

Параметры:

<Признак>

Признак использования данного разделителя. Может принимать значения «+» (значение по умолчанию) и «-». Если перед значением разделителя указан признак «+» (или не указано ничего), то указанное значение будет записано в параметр сеанса, хранящий значение общего реквизита, и в параметр сеанса, хранящий использование общего реквизита, будет установлено значение Истина.

Если перед значением разделителя указан признак «-», то это означает, что разделитель не используется в данном сеансе (в параметр сеанса, отвечающий за использование разделителя, будет установлено значение Ложь). Но если значение указано, оно будет записано в параметр сеанса, хранящий значение общего реквизита.

<Значение>

Указывает значение, которое будет установлено в параметр сеанса, хранящий значение соответствующего разделителя. Значение разделителя задается в текстовом виде и имеет следующий формат (в зависимости от типа разделителя):

● Для типа Булево указываются значения 0 (Ложь) или 1 (Истина).

● Для типа Число указывается число в каноническом виде.

● Для типа Дата указывается дата в формате ггггммддччиисс, где:

● гггг ‑ год (4 цифры);

● мм ‑ номер месяца (2 цифры);

● дд ‑ номер дня (2 цифры);

● чч ‑ номер часа (2 цифры);

● ии ‑ номер минуты (2 цифры);

● сс ‑ секунды (2 цифры).

При задании параметра необходимо указывать все составляющие даты, т. е. значение параметра должно состоять из 14 цифр.

● Для типа Строка указывается собственно текст.

● Для ссылочных типов указывается текстовое представление стандартного реквизита Код или Номер. Коды и номера должны быть уникальны среди всех значений соответствующего объекта конфигурации. Не допускается использование справочников с длиной кода, равной 0, и документов с нумераторами. Если типом общего реквизита, который является разделителем, является ссылка, то не допускается указание кода или номера предопределенного элемента, если предопределенные элементы в данной инфорационной базе еще не были созданы для объекта, образующего тип разделителя.

Если в начале значения параметра должен быть символ «+» или «-», он удваивается. Если в текстовой строке, описывающей значение разделителя, должен быть символ «,», то этот символ удваивается.

Если значение, указанное в параметре командной строки, может соответствовать одновременно значениям разных типов (например, значение «1» может являться значением Истина, числом «1», кодом справочника «1» и номером документа «1»), правило конвертации определяется исходя из типа соответствующего разделителя.

Если в командной строке указан только признак («+» или «-»), но не указано значение, то в качестве значения разделителя используется значение по умолчанию соответствующего типа.

Пример:

Копировать в буфер обмена

/Z " 0,+001,+,---3"

В данном примере:

● первый разделитель не используется, но указано его значение: «0»;

● второй разделитель используется, и его значение равно «001»;

● третий разделитель используется, и его значением будет значение по умолчанию для типа, указанного в качестве типа общего реквизита;

● четвертый разделитель не используется, но его значением будет «-3».

24.4.3. Веб-клиент или тонкий клиент, подключенный через веб-сервер

Указание значений разделителей при запуске веб-клиента (или тонкого клиента, подключенного через веб-сервер) возможно двумя способами: в адресной (командной) строке запуска с помощью параметра Z и в файле default.``vrd.

24.4.3.1. С помощью параметра Z

Значения разделителей могут задаваться в адресной строке с помощью параметра Z. Формат параметра для веб-клиента аналогичен командной строке запуска клиентского приложения.

Пример:

Копировать в буфер обмена

http://localhost/infobase?Z=" ПервыйРазделитель,+"

Символы, недопустимые в URL (RFC 1738, https://datatracker.ietf.org/doc/html/rfc1738.html), преобразуются в кодировку UTF-8 и кодируются в соответствии с разделом 2.2.``URL``Character``Encoding``Issues стандарта RFC 1738 (с помощью символа «%» и двух шестнадцатеричных символов).

24.4.3.2. В файле default.vrd

Существует возможность настроить доступ в информационную базу таким образом, что конкретные значения разделителей будут задаваться адресом информационной базы, а не с помощью параметра командной строки Z или строки соединения с информационной базой. Для этого следует настроить соответствующим образом элемент <``zones``> файла default.``vrd.

Также существует возможность запретить изменение значений объектов, связанных с механизмом разделения данных, в том случае, если доступ к информационной базе осуществляется с помощью веб-клиента или тонкого клиента, подключенного через веб-сервер (безопасный сеанс). Такую возможность нужно использовать, если нужна гарантия, что при доступе к информационной базе через Интернет будет невозможно получить доступ к другой области данных.

Подробнее о параметрах настройки файла default.``vrd можно посмотреть в книге.

24.4.4. Внешнее соединение и строка соединения

В строке соединения и при запуске внешнего соединения используется параметр Zn. Формат параметра аналогичен командной строке запуска клиентского приложения.

Пример:

Копировать в буфер обмена

Srvr=localhost;Ref=Demo82Srv;Zn=" ПервыйРазделитель,+,---3"

Также этот параметр можно указывать в файле default.``vrd (в строке соединения с информационной базой) при публикации на веб-сервере.

В файле default.``vrd возможен еще один способ задания значений разделителей, подробнее о котором см. здесь.

24.5. Безопасный режим разделения данных

При использовании различных регламентных операций, выполняемых в рамках сеансов с неиспользуемыми значениями разделителей, может исполняться программный код прикладного решения, «надежность» которого, в общем случае, проверить не представляется возможным. Под «надежностью» понимается работа строго в рамках поставленных ограничений, без злоупотреблений. Например, вызываемый код должен работать в рамках только тех значений разделителей, которые ему установила вызывающая сторона, без попыток перехода в другие области данных. Такая попытка может привести к несанкционированному доступу к данным «чужой» области данных.

Для предотвращения попыток смены значений разделителей (и, как следствие, области данных, в которой работает программный код) существует возможность установить безопасный режим разделения данных. Для этого используется метод УстановитьБезопасныйРежимРазделенияДанных(). Использование данного метода для разделителя аналогично указанию для данного разделителя значения атрибута safe``="``true``" для элемента zone файла default.``vrd. Описание данного файла находится в книге. Если безопасный режим разделения данных включен с помощью файла default.``vrd, то отключить его с помощью метода УстановитьБезопасныйРежимРазделенияДанных() невозможно.

В безопасном режиме разделения данных запрещено:

● Выключать использование разделителя, если разделение не является условно выключенным.

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

● Изменять объекты, которые управляют условным разделением:

● Указанные для самого разделителя;

● Указанные для объектов, входящих в состав разделителя.

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

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

Применение этого механизма может выглядеть следующим образом (в системе существует независимый разделитель Абонент):

Копировать в буфер обмена

Для Каждого ЗначениеРазделителя Из СписокЗначенийРазделителей Цикл // "переходим" в нужную область УстановитьЗначениеРазделителя(ЗначениеРазделителя); // установим безопасный режим разделения данных УстановитьБезопасныйРежимРазделенияДанных("Абонент", Истина); // вызвать нужный программный код ОбработатьДанныеОбласти(); // отключить безопасный режим разделения данных УстановитьБезопасныйРежимРазделенияДанных("Абонент", Ложь); КонецЦикла

Проверить состояние безопасного режима разделения данных можно с помощью метода БезопасныйРежимРазделенияДанных().

24.6. Удаление области данных

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

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

Удаление области данных осуществляется с помощью метода глобального контекста УдалитьДанныеИнформационнойБазы() или с помощью параметра командной строки /``EraseData пакетного режима запуска Конфигуратора. Для метода встроенного языка удаляемая область определяется значениями параметров сеанса, определяющих значения разделителей в сеансе, откуда происходит вызов метода:

● Если в текущем сеансе не используется ни один разделитель, то удаляются все данные информационной базы. После удаления состояние информационной становится таким же, как после создания новой, пустой, информационной базы и загрузки в нее конфигурации.

● Если в текущем сеансе используется хотя бы один разделитель, то удаляются полностью разделенные данные текущей области данных. В случае использования двух (и более) разделителей, которые используются одновременно (т. е. хранят свое значение и признак условного разделения в одних объектах конфигурации), метод УдалитьДанныеИнформационнойБазы() будет считать, что объект конфигурации входит в текущую область, если он разделен хотя-бы одним из разделителей из списка разделителей использующих одни и те же объекты конфигурации для хранения своих параметров. Удаление данных области приводит область в такое же состояние, как после первой установки текущего набора значений используемых разделителей до начала выполнения операций с данными.

Совет.** Сразу после выполнения метода рекомендуется сменить значения разделителей, определяющих область данных.**

Для вызова метода требуется наличие у пользователя права Администрирование и возможности получения монопольного доступа к информационной базе. Монопольный доступ рекомендуется установить с помощью явного вызова метода глобального контекста УстановитьМонопольныйРежим(). Если это не сделано, то в самом методе будет выполнена попытка установить монопольный режим. В случае ошибки получения монопольного доступа, выполнение метода завершается с ошибкой.

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

Во время удаления будут удалены следующие данные:

● Из таблиц, связанных с объектами конфигурации, входящих в состав разделителей (включая предопределенные данные и данные, которые добавлены расширениями).

● Хранилища настроек.

● История работы пользователя.

● Список пользователей информационной базы.

● Часовой пояс информационной базы ‑ если в конфигурации не определено независимых разделителей, то значение это параметра становится неопределенным, в противном случае ‑ значение удаляется.

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

● При установленном режиме совместимости с версией 8.3.2 или младше, предопределенные данные получаются значения, определенные в конфигураторе или значения по умолчанию. При отключенном режиме совместимости предопределенные данные будут созданы при первом обращении к ним.

● Значения реквизитов элемента ЭтотУзел планов обмена будут установлены в значения по умолчанию.

● Значения неразделенных констант получают значения по умолчанию, а значения разделенных констант удаляются.

● Данные регистрации информационной базы в сервисе взаимодействия.

● Для истории данных поведение метода зависит от того, в каком сеансе вызван метод:

● Неразделенная информационная база или в сеансе не используется ни один разделитель:

● Удаляются все существующие версии во всей информационной базе.

● Удаляются все настройки истории данных. Настройки версионирования приводятся в соответствие с настройками в метаданных.

● В сеансе одновременно используются независимые и совместные разделители:

● Удаляется история данных для полностью разделенных данных.

● Настройки версионирования и история метаданных не удаляются.

● В сеансе используются только независимые разделители:

● Удаляется история данных для полностью разделенных данных.

● Удаляются настройки использования истории данных для текущей комбинации разделителей.

● Удаляется история метаданных для текущей комбинации разделителей.

24.7. Особенности поведения объектов системы

Особенности поведения объектов системы в случае использования разделителей см. здесь.