Хранение констант в 1С:Предприятие 8 и возможности по параллельной работе с ними

Способ хранения констант в 1С:Предприятие 8 менялся в зависимости от версии платформы. Так, в платформе до версии 8.2.14 (или платформах выше версии, но с включенным режимом совместимости 8.2.13 и ниже), константы хранятся в одной таблице СУБД, начиная с версии 8.2.14, для каждой константы создается своя таблица СУБД. Данное изменение было сделано для увеличения параллельности работы пользователей. Давайте рассмотрим подробнее механизмы хранения констант в системе 1С:Предприятие 8.

Подготовка базы данных

Во-первых, подготовим базу для нашего исследования. Для этого создадим пустую базу данных, в нее добавим 4 константы, а также 1 справочник. Константам назначим типы:

  1. «Константа1»: Строка, длина 10
  2. «Константа2»: Дата
  3. «Константа3»: СправочникСсылка.Справочник1
  4. «Константа4»: Составной тип данных: Строка, длина 10; Дата; СправочникСсылка.Справочник1
Создание объектов метаданных
Создание объектов метаданных

Во-вторых, создадим две простых обработки:

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

Платформа до версии 8.2.14, а также версии выше с включенным режимом совместимости 8.2.13 и ниже

Структура хранения констант

Как видно по структуре хранения, действительно, в СУБД создана одна таблица для хранения констант, называется она «Consts». Причем, структура этой таблицы такова, что каждая колонка таблицы отвечает за значение одной из констант. Дополнительно к этим полям, в таблице присутствует поле ключа записи «RecordKey». Здесь стоит упомянуть, что результатом метода ПолучитьСтруктуруХраненияБазыДанных() является все же не сама структура СУБД, а некоторая ее интерпретация (при выборе режима «В терминах 1С:Предприятие»).

Структура хранения констант в 1С:Предприятие (до 8.2.14)
Структура хранения констант в 1С:Предприятие (до 8.2.14)

Для того чтобы получить более глубокое понимание структуры таблицы на уровне СУБД, необходимо перейти в среду управления соответствующей СУБД (или переключить обработку в режим «В терминах СУБД»). В моем случае, для СУБД MS SQL Server, этим инструментом является Management Studio. Открыв структуру нужной таблицы, мы обнаружим, что реальная структура таблицы в СУБД очень похожа на ту, что выдал нам метод ПолучитьСтруктуруХраненияБазыДанных(). Отличие между этими структурами заключается лишь в том, что для поля Fld27 (Константа 4) в СУБД создано целых 4 поля (Fld27_TYPE, Fld27_T, Fld27_S, Fld27_RRRef)! Это связано со способом хранения платформой значений составного типа и в данной статье не рассматривается.

Структура хранения констант в СУБД
Структура хранения констант в СУБД

Как вы уже, наверное, догадались, поскольку значения констант хранятся в отдельных колонках, значит, в таблице существует только 1 запись с этими значениями. Это так же можно проверить выполнив простой запрос к данной таблице как на рисунке и получить в результате выборки только 1 строку.

Выборка из таблицы хранения констант
Выборка из таблицы хранения констант

Возможности по параллельной работе с константами

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

В режиме автоматических блокировок

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

Автоматический режим Константа 2. Чтение Константа 2. Запись
Константа 1. Чтение Параллельно Последовательно
Константа 1. Запись Последовательно Последовательно

В режиме управляемых блокировок

Конкурентная запись может выполняться только последовательно, даже если действия выполняются над разными константами. Конкурентное чтение может выполняться параллельно. Вопрос с конкуретными операции записи и чтения констант не так прост как кажется на первый взгляд. Поведение системы будет зависеть от порядка действий: запись, потом чтение; или чтение, потом запись. Также влиять будет фактор того, изменяется ли в действительности значение константы при записи или остается тем же (причина такого поведения мне не понятна, если Вы знаете почему — напишите в комментариях). И, конечно же, от наличия явных управляемых блокировок — т.к. с помощью данного механизма разработчик явным образом меняет поведение системы, будем считать что явные блокировки не устанавливаются. В этом случае параллельность работы будет представлена следующим образом: если модификации значения константы в действительности не происходит, тогда возможны параллельная запись и чтение. Если модификация константы происходит, но сначала выполняется чтение, а затем запись — параллельная работа возможна. В оставшемся случае, когда происходит модификация значения константы и сначала происходит запись, а потом чтение — возможна только последовательная работа.

Управляемый режим Константа 2. Чтение Константа 2. Запись
Константа 1. Чтение Параллельно Особые условия (см. выше)
Константа 1. Запись Особые условия (см. выше) Последовательно

Платформа с версии 8.2.14 без режима совместимости (или с совместимостью выше 8.2.13)

Структура хранения констант

Как видно, в отличие от платформы 8.2.13, для хранения каждой из констант создается своя таблица в базе (Const30, Const31, Const32, Const33). Как мы можем догадаться, это лучшим образом скажется на параллельности работы, будут ликвидированы «узкие» места связанные с записью разных констант.

Структура таблиц хранения констант. 1С:Предприятие 8.2.14
Структура таблиц хранения констант. 1С:Предприятие 8.2.14

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

Структура таблиц хранения констант SQL. 1С:Предприятие 8.2.14
Структура таблиц хранения констант SQL. 1С:Предприятие 8.2.14

Количество записей в каждой из таблиц не изменилось (в каждой таблице 1 запись), что можно проверить методом, аналогичным первой части.

Возможности по параллельной работе с константами

Вследствие изменения структуры хранения констант, любые действия с разными константами могут выполняться параллельно. Таким образом, ограничения на параллельную работу будут только для констант одного вида. Помимо этого, появилось еще одно свойство, влияющее на параллельность работы — для платформы 8.3 на уровне СУБД была включена возможность использования нового уровня изоляции транзакций — Read Committed Snapshot.

В режиме автоматических блокировок

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

В режиме управляемых блокировок (без Read Committed Snapshot)

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

В режиме управляемых блокировок (c Read Committed Snapshot)

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

Практическая проверка материала

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *