В процессе обновления доработанных типовых конфигураций (например, 1С:УПП 1.3 или 1С:Комплексная автоматизация) разработчики нередко сталкиваются с ситуацией, когда фирма «1С» удаляет устаревший регистр накопления из типовой конфигурации. Однако в рабочей базе на этот регистр могут оставаться ссылки в нетиповых или доработанных документах. При попытке избавиться от регистра возникает так называемый замкнутый круг: если убрать регистр из движений документа, платформа выдает ошибку метаданных «Регистр накопления не имеет регистраторов», а стандартный пункт меню «Удалить» для самого регистра остается неактивным.
Разберем детально, почему возникает такое поведение платформы, и рассмотрим пошаговые методы корректного удаления объекта из метаданных.
Проанализируем архитектурные ограничения платформы 1С, приводящие к блокировке:
Ctrl+S или применение обновлений по F7). Если регистратор отвязан, а сам регистр еще не удален, конфигуратор фиксирует критическую ошибку.Редактируется с сохранением поддержки), платформа запрещает его удаление из дерева метаданных. Кнопка удаления будет заблокирована до тех пор, пока сам регистр и все подчиненные ему реквизиты, ресурсы и измерения не будут полностью сняты с поддержки.Рассмотрим основной и самый быстрый способ удаления регистра без промежуточного сохранения конфигурации.
Ctrl+S) и не обновляем конфигурацию базы данных (F7) на этом этапе, иначе платформа выдаст ошибку отсутствия регистратора.Delete) и выбираем пункт «Удалить». Так как объект снят с поддержки, команда станет доступной.F7.Если в конфигурации задействовано множество связей и не удается удалить объект за один шаг, применим обходной метод с фиксацией структуры через временный объект.
ВременныйДокументДляУдаления.Ctrl+S). Ошибка метаданных не возникнет, так как у регистра есть назначенный временный регистратор.Ctrl) и удалим их оба нажатием клавиши Delete.F7.Если регистр содержал миллионы записей, удаление объекта через конфигуратор может вызвать длительную реструктуризацию и блокировку таблиц на уровне СУБД. Рекомендуется перед удалением метаданных предварительно очистить движения программно в режиме 1С:Предприятие, записывая пустые наборы записей по документам-регистраторам.
Для программной очистки движений перед удалением используем следующий пример кода:
Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Записать(); // Запись пустого набора удаляет движения документа
Также перед удалением метаданных полезно нажать правой кнопкой мыши по регистру и выбрать «Найти ссылки в объекте», чтобы исключить регистр из подписок на события и планов обмена вручную.