Типы данных 1СПредприятие 8.x в MS SQL 2008

13 января 2013

Файлы для загрузки:

Тестовая информационная база с примерами

Таблица соответствия типов 1С:Предприятие 8.x и MS SQL 2008

Предисловие

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

Например, такие типы как "COMObject", "COMSafeArray", "УправляемаяФорма" поддерживаются платформой, но непосредственное их сохранение в БД невозможно. Существует ограниченный перечень типов, которые поддерживаются системой управления базы данных для хранения (см. следующий скриншот).

Поддерживаемые типы данных платформой 1С:Предприятие 8.x для хранения в базе

Сегодня в статье будет идти речь о том, как платформа хранит тот или иной тип в SQL-базе. Для анализа будем использовать Microsoft SQL Server 2008 with Advanced Services. В завершении статьи коснемся вопросов производительности и сделаем выводы.

Все рассмотренные далее примеры Вы можете посмотреть в тестовой конфигурации (ссылка в конце статьи), либо в таблице сервиса Google Drive по ссылке

О поддерживаемых типах

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

Примитивные

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

1С:Предприятие 8.x поддерживает следующие примитивные типы: строка, число, дата и время, булево.

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

Сложные типы

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

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

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

Составной тип данных

Составной тип данных

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

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

В каком-то смысле такие типы как "Любая ссылка" и "Характеристика" также могут считаться  составным типом данных, поскольку ссылаются на объекты разных типов, но в статье мы отнесли их к сложным типам для удобства описания.

Хранение в базе данных

Теперь рассмотрим как платформа 1С:Предприятие 8.x хранит описанные выше типы в базе данных на SQL-сервере. Напомню, что анализировать будем работу с MS SQL Server 2008.

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

Примитивные типы данных

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

Типы данных MSSQL для чисел в 1С:Предприятие 8.x

Как мы видим, для числа при любых настройках используется тип NUMERIC. Изменяется лишь длина и точность. Настройка "Неотрицательное" для числа вообще никак не влияет на используемый тип колонки и его настройки в SQL-базе.

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

Типы данных MSSQL для строк в 1С:Предприятие 8.x

По данным таблицы выше делаем вывод, что для неограниченной строки используется тип NTEXT, который позволяет сохранять до 1073741823 байт. Для строк с фиксированной и переменной длинной используются соответственно varcar и nchar. Различия типов заключается в способе хранения данных в базе.. 

Типы булево и дата хранятся в таблицах MSSQL со следующими типами (см. след. таблицу).

Типы данных MSSQL для строк в 1С:Предприятие 8.x

Платформа 1С:Предприятие 8.x хранит дату в SQL-таблицах с помощью типа datetime вне зависимости от настроек  Для хранения типа булево используется тип двоичных данных binary c длинной 1 байт.

Интересно, что платформа не использует для болевого значения специально созданный тип в T-SQL - bit. Вместо этого булевые значения хранятся с типом binary(1). Возможно это сделано для совместимости работы платформы с другими СУБД.

Сложные и составные типы данных

Теперь речь пойдет о типах данных, свойственных только для платформы 1С:Предприятие 8.x. Это ссылочные типы, хранилище значений и уникальный идентификатор.

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

Начнем с рассмотрения уникального идентификатора и хранилища значений. Обратимся к следующей таблице.

Типы данных MSSQL для уникальных идентификаторов и хранилища значений в 1С:Предприятие 8.x

Как Вы могли заметить, в таблице выше представлены представлены данные по двум ресурсам регистра сведений "ТипыДанных", который мы используем в примерах. Каждый из ресурсов хранит ссылки, соответственно, на справочник и документ. В обоих случаях для хранения ссылки в SQL-базе используется тип binary(16). Выше было сказано, что ссылки на объекты информационной базы представляют собой уникальные идентификаторы. Именно поэтому тип в базе SQL для GUID'ов и ссылочных на объекты одинаковый.

Интересным моментом в работе платформы 1С:Предприятия 8.x с MS SQL является хранение составных типов данных, и в отдельности типов "ЛюбаяСсылка" и "Характеристика" (для плана видов характеристик). Следующая таблица содержит информацию о работе платформы с СУБД в этих случаях.

Типы данных MSSQL для составных типов данных в 1С:Предприятие 8.x, а также типов "ЛюбаяСсылка" и "Характеристика"

Обратим внимание на следующее: если составной тип состоит только из ссылочных типов данных, то в этом случае будут созданы три поля в SQL-таблице:

  1. <имя>_TYPE c типом binary(1),
  2. <имя>_RTRef с типом binary(4).
  3. <имя>_RRRef с типом binary(16).

Для чего существует поле "&lt;имя&gt;_RRRef" понятно по типу binary(16). В ней хранятся уникальный идентификатор ссылки на объект (запись) в информационной базе, значение которого присвоено этому полю. Поле &lt;имя&gt;_TYPE хранит ссылку на непосредственно используемый тип данных, а &lt;имя&gt;_RTRef ссылается на таблицу, где значение хранится. Если узнать, например для отбора в SQL-запросе, значение для поля "*_RRRef" не сложно, то  узнать двоичное значение для типа или таблицы сложнее. В рамках статьи мы не будем рассматривать этот вопрос, отмечу лишь, что самым надежным способом является трассировка необходимого запроса платформы.

Выше сказанное о составном ссылочном поле характерно для любых составных типов, набор которых включает в себя только ссылкb на объекты информационной базы. В нашем примере это "Любая ссылка" и "Ссылка на все справочники". Если же мы добавляем в состав реквизита примитивные типы данных, то добавляются новые колонки таблицы:

  • Для строки - поле <имя>_S.
  • Для числа - поле <имя>_N.
  • Для даты - <имя>_T.
  • Для булево - <имя>_L.

Пример Вы можете посмотреть в таблице выше для полей "Характеристика", "Составной ссылочный тип с примитивными типами" и "Составной тип с примитивными типами". В последнем из перечисленных полей, поскольку в составе отсутствуют ссылочные типы, такие колонки как "&lt;имя&gt;_RTRef" и "&lt;имя&gt;_RRRef" отсутствуют, так как нет необходимости хранить значения ссылок на объект БД и таблицу, где этот объект находится.

Отрицательные стороны составного типа данных

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

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

Выводы

В статье рассмотрены соответствия для типов платформы 1С:Предприятие 8.x и MS SQL 2008. Прочитав статью, при разработке Вы можете точно ответить, как СУБД будет хранить данные из таблицы объектов и регистров. Данная информация поможет при создании оптимальной структуры метаданных конфигурации.

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

В последующих статьях более подробно будут рассматриваться вопросы производительности и оптимизации работы платформы с MS SQL и других СУБД.


comments powered by Disqus