При сопровождении высоконагруженных и объемных информационных баз 1С (например, когда документ Заказ содержит более 10 000 000 записей) любое изменение структуры метаданных может привести к многочасовому технологическому окну из-за тяжелой реструктуризации таблицы СУБД. Проанализируем, как работают определяемые и составные типы на физическом уровне, с какими подводными камнями сталкивается разработчик и какие архитектурные альтернативы позволяют вносить изменения без остановки работы пользователей.
Выясним причину, почему замена составного типа на объект метаданных ОпределяемыйТип не решает проблему длительной реструктуризации. На уровне СУБД объект ОпределяемыйТип не существует как отдельная сущность — это исключительно инструмент разработчика в дереве метаданных конфигуратора для централизованного управления типами. Во время сохранения конфигурации базы данных платформа 1С автоматически разворачивает определяемый тип в соответствующий набор типов (простой или составной).
Рассмотрим подробнее, как платформа 1С транслирует составной тип данных в физические колонки таблицы базы данных:
_TYPE) и поле бинарного идентификатора ссылки (_RTRef / _RRRef). При добавлении еще одной ссылки в состав существующего ссылочного типа состав физических полей может не меняться, однако изменение схемы метаданных все равно требует валидации данных платформой._Number, _Date, _String). Каждое расширение состава реквизита новым примитивным типом приводит к физическому добавлению новых колонок и перестроению таблицы.ОпределяемыйТип, который используется в десятках других объектов конфигурации, любое изменение состава типов в этом определяемом типе запустит параллельную реструктуризацию всех связанных таблиц в базе данных, что многократно увеличит общее время простоя.Помимо длительного обновления структуры базы данных, использование составных типов напрямую в тяжелых документах создает серьезные проблемы производительности:
Заказ.Аналитика.Код) платформа генерирует левое соединение со всеми таблицами, типы которых входят в этот составной реквизит. Если в типе указано 10 справочников, СУБД выполнит соединение сразу со всеми 10 таблицами, что кардинально замедлит выполнение запроса.Если обращение через точку к составному типу неизбежно, оптимизируем запрос с помощью явного приведения типов через оператор ВЫРАЗИТЬ, чтобы исключить лишние соединения:
ВЫБРАТЬ
Заказ.Ссылка КАК Ссылка,
ВЫРАЗИТЬ(Заказ.РеквизитАналитики КАК Справочник.Контрагенты).ИНН КАК КонтрагентИНН
ИЗ
Документ.Заказ КАК Заказ
ГДЕ
Заказ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
Разберем по шагам наиболее надежный способ добавления новой аналитики без затрагивания основной таблицы документа с 10 миллионами записей. Мы можем создать независимый или подчиненный регистр сведений.
ДополнительныеРеквизитыЗаказов.Заказ с типом ДокументСсылка.Заказ (включаем флаг Ведущее, чтобы при удалении заказа записи очищались автоматически).Заказ не блокируется и не модифицируется.Если реквизит обязательно должен находиться в шапке документа, хорошей практикой является использование промежуточного справочника. Вместо хранения составного типа в 10 миллионах строк документа добавляем в документ реквизит с простым ссылочным типом на новый справочник (например, СправочникСсылка.АналитикаЗаказов).
АналитикаЗаказов.Для задач, где состав реквизитов постоянно меняется бизнес-пользователями, используем стандартный механизм дополнительных реквизитов и сведений на базе ПланВидовХарактеристик:
1С:Предприятие администратором или пользователем без изменения метаданных в конфигураторе.ДополнительныеРеквизитыИСведения, что полностью исключает необходимость технической реструктуризации базы данных при появлении новых аналитик.Если бизнес-требования категорически требуют наличия реквизита непосредственно в самом документе, проанализируем возможности современных версий платформы 1С:Предприятие 8.3 по снижению времени простоя базы:
Заказ, что позволяет пользователям продолжать работу.