При внесении изменений в конфигурацию 1С (особенно при удалении объектов метаданных — документов, справочников и т. д.) разработчики часто сталкиваются со сбоем: процесс 1С падает без вывода понятной ошибки. Проблема наиболее выражена в крупных базах, где присутствуют регистры сведений с миллионами записей и измерением составного типа (например, регистр ВерсииОбъектов из библиотеки стандартных подсистем).
Выясним причину такого поведения платформы и разберем проверенные способы решения этой проблемы.
Проанализируем ситуация на физическом уровне СУБД. Когда измерение регистра сведений имеет составной тип (например, ссылается на все документы и справочники), платформа 1С хранит его в таблице SQL в виде нескольких служебных колонок:
_TYPE — определяющей тип ссылки;_RTRef — хранящей номер таблицы объекта;_RRRef — содержащей уникальный идентификатор (GUID) ссылки.При удалении любого объекта метаданных из конфигурации составной тип измерения уменьшается на один тип. В классическом режиме реструктуризации платформа перебирает **все** записи таблицы регистра сведений для пересчета типов данных и проверки уникальности записей.
Если в регистре содержатся миллионы строк (2,5 миллиона и более), вызов реструктуризации через 32-разрядный процесс 1cv8.exe или рабочий процесс сервера rphost приводит к быстрому исчерпанию оперативной памяти и падению приложения («программа вызвала недопустимую ошибку и будет закрыта»).
Самый простой и эффективный способ обхода ошибки — очистить регистр от ссылок на удаляемый объект метаданных **до** того, как сам объект будет удален из конфигурации.
При удалении метаданных все ссылки на этот объект все равно станут «битыми», поэтому хранить их в регистре ВерсииОбъектов нет смысла. Разберем по шагам, как выполнить очистку программой перед реструктуризацией:
Выборка = Документы.УдаляемыйДокумент.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Выборка.Ссылка);
НаборЗаписей.Записать();
КонецЦикла;
После вычистки конкретных записей объем данных, требующих преобразования типов, значительно сократится, и реструктуризация в Конфигураторе пройдет без ошибок.
Если очистка записей невозможна или не дает результата из-за общего объема регистра, разделим процесс обновления схемы базы данных на два этапа:
Начиная с версии платформы 8.3.11, разработчики 1С добавили оптимизированный механизм обновления баз данных на стороне СУБД. В этом режиме вместо ресурсоемкой переливки строк через оперативную память Конфигуратора выполняются точечные SQL-команды ALTER TABLE и UPDATE непосредственно на сервере баз данных.
Чтобы включить данный режим, разберем порядок действий:
conf.cfg в каталоге установки 1С (например, C:\Program Files\1cv8\conf\conf.cfg).
UpdateDBSchemaInServerMode=v2
После перезапуска Конфигуратора реструктуризация таблиц с составными типами будет выполняться прямо на сервере SQL без аварийного завершения работы платформы.
Если размер таблицы регистра критический, а реструктуризацию нужно выполнить срочно, применим метод переноса данных:
ВерсииОбъектов во внешнюю таблицу СУБД или с помощью обработки «Выгрузка загрузка данных XML».Рассмотренные подходы позволяют избежать аварийного завершения Конфигуратора и обеспечивают успешную реструктуризацию даже при миллионных объемах записей в регистре сведений.