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

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

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

Опасности и последствия удаления значений перечисления

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

  1. Появление битых ссылок в данных. В реквизитах существующих документов, справочников и записей регистров на месте удаленного значения отобразится строка вида <Объект не найден...>. Это нарушает ссылочную целостность базы и приводит к невозможности корректного перепроведения документов или формирования отчетов по историческим данным.
  2. Ошибки компиляции и времени выполнения кода. Если в программных модулях конфигурации присутствуют прямые обращения к значению вида Перечисления.ИмяПеречисления.ИмяУдаленногоЗначения, база выдаст фатальную ошибку времени выполнения при попытке исполнения такого фрагмента.
  3. Поломка отчетов и интерфейсных механизмов. Имена значений перечислений могут быть жестко зашиты в формулах вычисляемых полей системы компоновки данных (СКД), в пользовательских настройках отборов, в условиях динамических списков или в правилах условного оформления форм. Удаление значения ломает эти механизмы, часто без явного падения всей системы, но с искажением отображаемых данных.

Подводные камни при добавлении новых значений

Считается, что добавление нового элемента абсолютно безопасно, так как оно не разрушает существующие ссылки. Однако это верно лишь отчасти. Выясним причину, почему добавление нового значения также может привести к сбою:

  1. Нарушение жестких ветвлений в алгоритмах. Во многих программных модулях и запросах логика строится через конструкции Если ... ИначеЕсли ... Иначе или конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ. Если разработчик не предусмотрел появление нового значения, логика выполнения автоматически уйдет в ветку Иначе, что нередко приводит к совершенно непредвиденным последствиям при расчете себестоимости, проведении или заполнении реквизитов.
  2. Сбои в механизмах интеграции и РИБ. При использовании распределенных информационных баз (РИБ), планов обмена по формату EnterpriseData или сторонних REST/SOAP веб-сервисов появление нового значения перечисления приведет к ошибке десериализации или передачи данных, если принимающая сторона еще не получила обновленную структуру метаданных.

Пошаговый регламент безопасного удаления значения перечисления

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

  1. Анализ использования в метаданных и коде. В конфигураторе необходимо вызвать команду «Поиск ссылок в метаданных» для конкретного значения перечисления, а также выполнить глобальный поиск по всем текстам конфигурации (включая модули, макеты и права). Убедимся, что значение не зашито жестко в алгоритмах, СКД или константах.
  2. Добавление новых значений. Сначала добавляем новые варианты в дерево метаданных, если требуется заменить старое значение другим.
  3. Поиск и замена ссылок в базе данных. Перед удалением значения из метаданных необходимо запустить базу в пользовательском режиме и воспользоваться механизмом поиска и замены дублирующихся или устаревших ссылок (например, типовой обработкой «Поиск и замена значений» или собственной обработкой). Все ссылки в документах, справочниках и регистрах должны быть заменены на актуальные значения.
  4. Проверка ссылочной целостности. Выполняем стандартную процедуру «Поиск ссылок на объект» для удаляемого значения. Список найденных мест использования в данных должен быть абсолютно пуст.
  5. Удаление и синтаксический контроль. Только после успешной очистки всех ссылок в данных удаляем значение из перечисления в конфигураторе, обновляем конфигурацию базы данных и обязательно запускаем «Синтаксический контроль модулей».

Посмотрим на пример простой сервисной обработки, которая заменяет старое значение перечисления на новое в проведенных документах определенного вида:


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

Альтернативные решения: скрытие значений и переход на справочники

Рассмотрим альтернативный подход, который избавляет от необходимости переписывать исторические данные. Поскольку платформа «1С:Предприятие» не поддерживает пометку на удаление для значений перечислений, неактуальное значение можно просто скрыть от пользователя в интерфейсе.

Для этого в форме документа при выборе значения переопределяют состав доступных элементов. Посмотрим на пример кода в обработчике события начала выбора реквизита на форме:


&НаКлиенте
Процедура СтатусНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Список = Новый СписокЗначений;
    Список.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.ВРаботе"));
    Список.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Закрыт"));
    Элемент.СписокВыбора = Список;
КонецПроцедуры

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

Если же бизнес-требования предполагают регулярное добавление, удаление или отключение элементов классификатора, проанализируем целесообразность замены объекта метаданных Перечисление на Справочник. Справочники позволяют изменять набор доступных позиций в режиме «1С:Предприятие» без реструктуризации базы данных, поддерживают пометку на удаление, настройку прав доступа и дополнительные реквизиты.

← На главную