Как исправить аварийное завершение 1С при реструктуризации регистра сведений с составным типом?

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

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

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

Почему 1С падает при реструктуризации большого регистра?

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

  1. _TYPE — определяющей тип ссылки;
  2. _RTRef — хранящей номер таблицы объекта;
  3. _RRRef — содержащей уникальный идентификатор (GUID) ссылки.

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

Если в регистре содержатся миллионы строк (2,5 миллиона и более), вызов реструктуризации через 32-разрядный процесс 1cv8.exe или рабочий процесс сервера rphost приводит к быстрому исчерпанию оперативной памяти и падению приложения («программа вызвала недопустимую ошибку и будет закрыта»).

Способ 1. Предварительная вычистка записей удаляемого типа

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

При удалении метаданных все ссылки на этот объект все равно станут «битыми», поэтому хранить их в регистре ВерсииОбъектов нет смысла. Разберем по шагам, как выполнить очистку программой перед реструктуризацией:

  1. Создадим обработку или запустим код в режиме «1С:Предприятие», который найдет и удалит все записи регистра, относящиеся к удаляемому типу.
  2. Выполним удаление с помощью набора записей:

Выборка = Документы.УдаляемыйДокумент.Выбрать();
Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Выборка.Ссылка);
    НаборЗаписей.Записать();
КонецЦикла;

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

Способ 2. Двухэтапная реструктуризация

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

  1. Этап 1: В Конфигураторе исключаем удаляемый объект из состава типов измерения регистра сведений (или временно отвязываем тип). Применяем изменения и обновляем конфигурацию базы данных. На этом шаге платформа изменит состав типов, но не будет пытаться удалить метаданные самого объекта.
  2. Этап 2: Полностью удаляем объект метаданных из дерева конфигурации и повторно обновляем базу данных. Второй шаг пройдет за доли секунды, так как регистр больше не содержит ссылок на этот тип.

Способ 3. Включение нового режима реструктуризации (v2)

Начиная с версии платформы 8.3.11, разработчики 1С добавили оптимизированный механизм обновления баз данных на стороне СУБД. В этом режиме вместо ресурсоемкой переливки строк через оперативную память Конфигуратора выполняются точечные SQL-команды ALTER TABLE и UPDATE непосредственно на сервере баз данных.

Чтобы включить данный режим, разберем порядок действий:

  1. Найдем файл конфигурации платформы conf.cfg в каталоге установки 1С (например, C:\Program Files\1cv8\conf\conf.cfg).
  2. Добавим в него параметр:

UpdateDBSchemaInServerMode=v2

После перезапуска Конфигуратора реструктуризация таблиц с составными типами будет выполняться прямо на сервере SQL без аварийного завершения работы платформы.

Способ 4. Временная очистка регистра с переносом данных

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

  1. Выгрузим содержимое регистра сведений ВерсииОбъектов во внешнюю таблицу СУБД или с помощью обработки «Выгрузка загрузка данных XML».
  2. Очистим регистр сведений в рабочем режиме (набор записей без отбора).
  3. Выполним обновление конфигурации базы данных на пустой таблице — процедура займет несколько секунд.
  4. Загрузим данные регистра обратно в систему.

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

← На главную