При внесении изменений в структуру метаданных конфигурации 1С разработчики нередко сталкиваются с ситуацией: удаление всего одного неиспользуемого значения перечисления приводит к многочасовому обновлению информационной базы. При этом процесс затрагивает таблицы документов, справочников и регистров, в которых данный тип данных, казалось бы, вообще не фигурирует. Рассмотрим подробно, почему платформа инициирует масштабную реструктуризацию и как оптимизировать данный процесс.
Проанализируем архитектурные особенности платформы 1С, приводящие к проверке и перестроению несвязанных на первый взгляд объектов:
ЛюбаяСсылка или ПеречислениеСсылка), платформа включает данные таблицы в контур реструктуризации. Любое изменение в составе входящих в составной тип типов данных требует пересмотра описания колонок на уровне СУБД или файла .1CD.Разберем наиболее безопасный и быстрый практический подход, не требующий тяжелой реструктуризации таблиц базы данных. Если значение перечисления стало неактуальным, его не обязательно удалять из дерева метаданных конфигуратора физически.
Удалить_Значение или НеИспользуется_Значение). Синоним также можно изменить на (Не используется).СписокВыбора у соответствующих элементов форм документов или справочников.Посмотрим на пример программного исключения устаревшего значения из выпадающего списка на форме:
// Ограничиваем список доступных значений перечисления на форме
ЭлементФормы = Элементы.ВидОперации;
ЭлементФормы.РежимВыбораИзСписка = Истина;
ЭлементФормы.СписокВыбора.Очистить();
Для Каждого ЗначениеПеречисления Из Метаданные.Перечисления.ВидыОпераций.ЗначенияПеречисления Цикл
Если Не Найти(ЗначениеПеречисления.Имя, "Удалить_") = 1 Тогда
ЭлементФормы.СписокВыбора.Добавить(Перечисления.ВидыОпераций[ЗначениеПеречисления.Имя], ЗначениеПеречисления.Синоним);
КонецЕсли;
КонецЦикла;
Такое изменение метаданных затрагивает только имена и синонимы, благодаря чему обновление информационной базы применяется за несколько секунд без изменения структуры таблиц хранения данных.
Если удаление значения из метаданных строго необходимо, перед сохранением конфигурации обязательно проверим ссылочную целостность, чтобы избежать появления битых ссылок вида Объект не найден. Разберем, как найти и очистить ссылки программно:
// Поиск мест использования удаляемого значения перечисления
МассивДляПоиска = Новый Массив;
МассивДляПоиска.Добавить(Перечисления.ВидыОпераций.УстаревшееЗначение);
ТаблицаСсылок = НайтиПоСсылкам(МассивДляПоиска);
Для Каждого СтрокаСсылки Из ТаблицаСсылок Цикл
// СтрокаСсылки.Данные содержит ссылку на объект, где используется значение
Сообщить("Найдено использование в объекте: " + Строка(СтрокаСсылки.Данные));
КонецЦикла;
После выявления всех объектов заменим устаревшее значение на актуальное или очистим реквизит перед удалением свойства в конфигураторе.
Выясним причину разницы в скорости работы между платформами. Начиная с релизов платформы 8.3, механизм реструктуризации был кардинально переработан и оптимизирован:
Если проект позволяет, рекомендуется выполнять реструктуризацию и обновление конфигурации на актуальных версиях платформы 8.3. Даже при включенном режиме совместимости с более старыми версиями, оптимизированный движок реструктуризации платформы отрабатывает в разы быстрее, избегая избыточных многочасовых блокировок таблиц.
Для предотвращения избыточных реструктуризаций в будущем проанализируем конфигурацию на наличие слишком широких типов данных:
ЛюбаяСсылка или включения всех перечислений в составной тип.Исключение избыточных составных типов локализует изменения: при корректировке конкретного перечисления платформа будет реструктурировать исключительно те объекты, где это перечисление действительно задействовано.