Как исправить ошибку «Длина ключа индекса превышает максимально допустимую» при загрузке или обновлении базы 1С

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

При переносе информационной базы 1С:Предприятие из клиент-серверного (SQL) варианта в файловый или при переходе на новые релизы платформы (начиная с 8.3.15 и выше) разработчики часто сталкиваются с критическим сбоем СУБД. Ошибка сопровождается системным сообщением вида: «Длина ключа индекса превышает максимально допустимую» с указанием конкретной таблицы, например, _AccumRg18431_ByDims_TSSSSSNN.

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

---

Почему возникает эта ошибка?

Для того чтобы понять природу проблемы, проанализируем ограничения систем управления базами данных (СУБД) и внутренние механизмы платформы 1С:

  1. Ограничения файловой СУБД (1Cv8.1CD). Встроенный движок файловых баз данных 1С имеет жесткий физический лимит: максимальная длина составного ключа индекса не может превышать 1920 байт. В клиент-серверных версиях (MS SQL Server, PostgreSQL) этот лимит значительно шире либо обрабатывается СУБД по другим алгоритмам. Поэтому на сервере база может годами работать без сбоев, а при попытке загрузить её в файловый вариант (через выгрузку .dt) или при тестировании и исправлении происходит аварийное завершение работы.
  2. Кодировка UTF-8 и расчет длины. Платформа 1С резервирует под каждый символ строкового поля в индексе до 3 байт. Если в регистре объявлено несколько измерений типа «Строка» с суммарной длиной, например, 300–400 символов, то только они займут в индексе более 1000 байт.
  3. Влияние версии платформы (сдвиг с релиза 8.3.15). Начиная с версии платформы 8.3.15, разработчики 1С оптимизировали работу с регистрами для ускорения расчетов и снижения количества взаимоблокировок. В составной индекс по измерениям (индекс _ByDims) было принудительно включено скрытое служебное поле хеша измерений _DimHash, а также разделитель итогов _Splitter (если включено разделение итогов). Добавление этих полей увеличило общую длину ключа индекса. В результате базы данных, которые успешно работали на платформе 8.3.11, начали аварийно завершать реструктуризацию при обновлении на современные релизы.

---

Анатомия проблемного индекса

Рассмотрим детально имя индекса из сообщения об ошибке: _AccumRg18431_ByDims_TSSSSSNN.

---

Шаг 1. Локализация проблемного объекта в конфигурации

Попытки найти таблицу по имени в конфигураторе «вручную» часто ни к чему не приводят. Нам необходимо сопоставить имя физической таблицы СУБД (в нашем случае _AccumRg18431) с реальным именем регистра в метаданных 1С. В доступной для входа базе найти соответствующий объект и посмотреть его измерения можно через просмотр метаданных и физических таблиц. Обработка не исправляет индекс; совместимость со старыми версиями 8.3 не подтверждена.

Для этого мы воспользуемся встроенной функцией платформы ПолучитьСтруктуруХраненияБазыДанных(). Обратите внимание, что выполнять этот код необходимо в той базе, которая успешно открывается (например, в работающей клиент-серверной версии на старой платформе).

Создадим внешнюю обработку и запустим в ней следующий код:


Процедура ПоискПроблемногоРегистра() Экспорт
    
    ИмяИскомойТаблицы = "_ACCUMRG18431"; // Имя таблицы из ошибки в верхнем регистре
    ТаблицыСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
    
    Найден = Ложь;
    Для Каждого Таблица Из ТаблицыСтруктуры Цикл
        Если ВРег(Таблица.ИмяТаблицыХранения) = ИмяИскомойТаблицы Тогда
            Сообщить("====================================================");
            Сообщить("Найден проблемный объект метаданных!");
            Сообщить("Имя в конфигурации: " + Таблица.ИмяТаблицы);
            Сообщить("Назначение: " + Таблица.Метаданные);
            Сообщить("====================================================");
            Найден = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если Не Найден Тогда
        Сообщить("Таблица с именем " + ИмяИскомойТаблицы + " не найдена в структуре хранения.");
    КонецЕсли;
    
КонецПроцедуры

Этот код безошибочно укажет нам на конкретный объект метаданных (например, РегистрНакопления.ПродажиКомпании или РегистрСведений.ДополнительныеРеквизиты), из-за которого происходит сбой.

---

Шаг 2. Способы решения проблемы

В зависимости от архитектурных требований и конечной цели интеграции выберите один из трех вариантов решения.

Вариант А. Оптимизация структуры метаданных (Рекомендуемый путь)

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

  1. Сократите длину строковых измерений. Пересмотрите свойства измерений регистра, имеющих тип «Строка». Часто разработчики устанавливают длину 150, 250 или даже «Неограниченная». Установите разумный лимит (например, до 30–50 символов), если это возможно по бизнес-логике.
  2. Перенесите строковые поля из измерений в реквизиты. Поля, которые находятся в блоке «Измерения», напрямую участвуют в формировании индекса _ByDims. Если по какому-то строковому полю не требуется вести учет остатков, строить разрезы итогов или выполнять быстрый поиск, его нужно перенести в «Реквизиты» регистра. Реквизиты хранятся в таблице, но не входят в составной индекс и не раздувают его длину.
  3. Избегайте составных типов данных в измерениях. Если измерение имеет составной тип (например, ссылается на справочники контрагентов, физических лиц, договоров и документов одновременно), СУБД резервирует под него избыточный объем байт в индексе для хранения информации о типе. По возможности сузьте составной тип или разделите логику на несколько простых полей.

После внесения изменений выполните реструктуризацию базы данных через Конфигуратор (меню Администрирование — Тестирование и исправление с включенным флагом «Реструктуризация таблиц информационной базы»). После этого выгрузка в .dt и загрузка в файловую базу пройдут без ошибок.

Вариант Б. Обходной путь при миграции данных

Если ваша задача — исключительно перенос справочной информации (например, Контрагентов и Номенклатуры с их реквизитами) из старой базы в новую конфигурацию (например, УТ), то исправлять структуру индексов в старой базе не обязательно.

Поскольку исходная база данных стабильно функционирует на сервере под управлением старого релиза платформы (например, 8.3.11), вы можете получить все необходимые данные напрямую, минуя процедуру создания файловой копии:

Вариант В. Выгрузка конфигурации в XML

В случаях, когда поврежден файл конфигурации .cf и вы не можете загрузить его даже в пустую файловую базу, выполните выгрузку конфигурации в файлы XML на исходном сервере:

  1. В конфигураторе источника выберите меню Конфигурация — Выгрузить конфигурацию в файлы...
  2. В пустой базе выполните обратную операцию: Конфигурация — Загрузить конфигурацию из файлов...
  3. Этот механизм позволяет обойти платформенные ограничения создания индексов на этапе импорта и точечно исправить структуру метаданных уже в новой базе.

---

Резюме

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

← На главную