При проектировании структуры регистров сведений у разработчиков часто возникает вопрос: существуют ли ограничения на длину строковых полей в ресурсах и можно ли указывать длину в 1000 символов или делать строку неограниченной длины. Разберем технические особенности работы платформы 1С:Предприятие, поведение СУБД и влияние выбранного типа данных на производительность системы.
Проанализируем, как платформа 1С контролирует типы и длины данных для разных элементов регистра сведений:
ХранилищеЗначения (например, регистр сведений ВерсииОбъектов).Рассмотрим, как выбранный тип строки транслируется на физический уровень хранения данных:
NVARCHAR(1000) в Microsoft SQL Server или varchar(1000) в PostgreSQL. Данные сохраняются непосредственно в основной строке таблицы. Это обеспечивает быстрое постраничное чтение данных и предсказуемый размер записи.NVARCHAR(MAX) в MS SQL Server или TEXT в PostgreSQL. При превышении определенного объема такие данные выносятся СУБД за пределы основной страницы таблицы данных в специальные структуры переполнения (TOAST в PostgreSQL / LOB-страницы в MS SQL Server).Выясним, какие ограничения накладываются на работу с полями в запросах в зависимости от выбранного типа длины строки:
Для строк ограниченной длины (включая 1000 символов) доступны все стандартные операции языка запросов 1С: группировка, упорядочивание, соединение таблиц по условию равенства и сравнение значений.
Для строк неограниченной длины действуют строгие правила:
СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, в операциях сравнения (=, <>, >, <), а также в условиях связи таблиц ПО.ОБЪЕДИНИТЬ без модификатора ВСЕ.ВЫРАЗИТЬ.Посмотрим на пример правильного приведения типа в тексте запроса:
ВЫБРАТЬ
ВЫРАЗИТЬ(Регистр.ДлинныйТекст КАК Строка(1000)) КАК ТекстСообщения,
КОЛИЧЕСТВО(Регистр.Объект) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ЛогСобытий КАК Регистр
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(Регистр.ДлинныйТекст КАК Строка(1000))
Разберем разницу между ресурсами и реквизитами в регистре сведений:
На уровне физической таблицы СУБД ресурсы и реквизиты регистра сведений хранятся одинаково — в виде обычных колонок одной таблицы (в отличие от регистров накопления, где для ресурсов формируются отдельные таблицы итогов).
Однако логика работы платформы различается:
СрезПоследних и СрезПервых по умолчанию ориентированы на извлечение ресурсов. Если в ресурсе хранится тяжелый текст, считывание срезов для большого числа записей может создавать избыточную нагрузку на дисковую подсистему и оперативную память.Подведем итог и сформулируем правила выбора типа данных:
Строка(1000)). Это сохранит возможность гибкой работы с полем в запросах и СКД.ХранилищеЗначения.ХранилищеЗначения со сжатием предпочтительно, если данные не требуется анализировать через операторы ПОДОБНО в запросах — это существенно экономит дисковое пространство базы данных.