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

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При выгрузке конфигурации из клиент-серверной базы данных (MS SQL Server или PostgreSQL) и ее последующей загрузке в пустую файловую базу разработчики часто сталкиваются с ошибкой реструктуризации: «Длина ключа таблицы превышает максимально допустимую». В тексте ошибки платформа указывает служебное имя таблицы, например _InfoReg24791. Разберем по шагам, почему возникает эта проблема, как найти проблемный объект и какими способами ее можно устранить.

Причины возникновения ошибки и особенности файлового формата

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

  1. Ограничение на размер индекса: В файловой базе данных (формат .1CD) максимально допустимая суммарная длина ключа в одном индексе составляет 1920 байт. В клиент-серверных СУБД этот лимит значительно выше, поэтому база прекрасно работает на сервере, но отказывается обновляться в файловом варианте.
  2. Индексация измерений регистра сведений: Для любого регистра сведений платформа автоматически формирует первичный индекс, в который входят все его измерения (а также поле периода для периодических регистров). Если в составе измерений используется строковое поле с большой длиной (например, 500–1024 символов) или составной тип данных, суммарный размер индекса легко превышает предел в 1920 байт.
  3. Кодировка символов: Стоит учитывать, что размер строковых полей рассчитывается с учетом кодировки Unicode (где каждый символ занимает более одного байта), из-за чего строка длиной даже в 500 символов в сочетании с другими измерениями превышает допустимый порог.

Почему в структуре нет таблицы из текста ошибки

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

Как точно определить проблемный регистр сведений

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

  1. Анализ измерений регистров сведений: В первую очередь необходимо проверить все регистры сведений на наличие измерений с типом Строка. Обращайте внимание на поля, где задана высокая длина (например, 200, 500, 1024 символа).
  2. Проверка составных типов данных: Если измерение имеет составной тип, платформа добавляет в индекс дополнительные служебные поля (идентификаторы типов и ссылок), что также резко увеличивает итоговую длину ключа.
  3. Проверка индексируемых ресурсов и реквизитов: Ошибку может вызывать не только первичный индекс по измерениям. Если у ресурса или реквизита с типом Строка установлено свойство Индексировать или Индексировать с доп. упорядочиванием, платформа создает отдельный индекс по этому полю.
  4. Использование функции ПолучитьСтруктуруХраненияБазыДанных(): В исходной серверной базе можно выполнить программный код для получения полного соответствия имен таблиц СУБД и объектов метаданных.

Пример кода для поиска сопоставления таблиц и анализа длины полей:


СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураБазы Цикл
    Если СтрНачинаетсяС(Таблица.ИмяТаблицыХранения, "_INFOREG") Тогда
        Сообщить("Таблица: " + Таблица.ИмяТаблицыХранения + " -> Объект: " + Таблица.ИмяТаблицы);
    КонецЕсли;
КонецЦикла;

Способы решения проблемы

Разберем основные варианты исправления структуры регистра для успешного разворачивания файловой базы:

  1. Уменьшение длины строки в измерении: Если длина строки была задана с избытком (например, 1024 или 500 символов), уменьшите её в дереве метаданных до разумного значения (например, 100 или 150 символов).
  2. Перенос поля из измерений в ресурсы: Если уникальность записей по данному строковому полю не требуется для бизнес-логики регистра, перенесите поле из секции Измерения в Ресурсы. Ресурсы по умолчанию не входят в первичный индекс регистра.
  3. Замена строки на Справочник: Вместо хранения длинного текста напрямую в измерении создайте отдельный Справочник и используйте ссылку на него. Ссылочные типы имеют фиксированный и минимальный размер в индексе.
  4. Отключение индексирования: Для реквизитов и ресурсов убедитесь, что свойство Индексировать установлено в значение Не индексировать.
← На главную