При работе с 1С часто возникает ситуация, когда необходимо внести изменения в предопределенные элементы, созданные разработчиком в конфигураторе. Например, изменить реквизиты у системного пользователя "Администратор" или добавить новые свойства предопределенным счетам учета. Основная проблема заключается в том, что при последующем обновлении конфигурации из файла .cfu платформа может перезаписать все ваши изменения, вернув предопределенные элементы к состоянию из конфигурации поставщика. Разберем, как этого избежать и заставить систему сохранять ваши правки.
Многие разработчики, столкнувшись с этой задачей, первым делом обращаются к свойствам корневого объекта конфигурации. Там есть свойство ОбновлениеПредопределенныхДанных, которое, казалось бы, должно управлять всем процессом. Часто ему устанавливают значение НеОбновлятьАвтоматически в надежде, что это запретит любые обновления предопределенных данных во всей системе.
Однако на практике это не дает ожидаемого результата. После загрузки обновления (.cfu) все ручные изменения в предопределенных элементах все равно затираются.
Выясним причину. Оказывается, свойство ОбновлениеПредопределенныхДанных в корне конфигурации имеет очень ограниченную область действия:
.cf).Таким образом, эта настройка не влияет на процесс обновления уже существующей информационной базы. Платформа 1С при обновлении руководствуется настройками каждого конкретного объекта метаданных, а не общей настройкой конфигурации.
Чтобы гарантированно защитить предопределенные элементы от перезаписи, необходимо настроить каждый объект метаданных (справочник, план счетов, план видов характеристик и т.д.) по отдельности. Рассмотрим этот процесс по шагам.
Пользователи.Alt + Enter или выбрать в контекстном меню "Свойства").ОбновлениеПредопределенныхДанных.Авто на НеОбновлятьАвтоматически.F7).Теперь при обновлении информационной базы платформа будет игнорировать изменения в предопределенных данных для тех объектов, где вы установили этот флаг. Ваши правки будут в безопасности.
Чтобы лучше понимать механику процесса, давайте подробно рассмотрим, что означает каждое из возможных значений этого свойства:
Авто — это поведение по умолчанию. В этом режиме платформа сама решает, обновлять данные или нет. При обновлении существующей базы это практически всегда означает "обновлять". Система смотрит на настройки родительских объектов или на общую настройку конфигурации, но для стандартных конфигураций это приводит к перезаписи данных.
ОбновлятьАвтоматически — это принудительное указание платформе всегда обновлять предопределенные данные для этого объекта, даже если в родительской группе или в корне конфигурации установлено иное.
НеОбновлятьАвтоматически — это именно то, что нам нужно. Данное значение является прямым запретом на обновление предопределенных данных для конкретного объекта. Платформа пропустит этот объект при реструктуризации базы данных в части предопределенных элементов.
Если объектов, которые нужно защитить от обновления, много, изменять свойства для каждого вручную может быть утомительно. В этом случае можно воспользоваться небольшой обработкой, которая программно изменит нужные свойства для выбранных объектов метаданных. Рассмотрим пример такого кода:
Процедура УстановитьСвойствоОбновления(ИмяМетаданного, Значение)
МетаданныеОбъекта = Метаданные[ИмяМетаданного];
Если МетаданныеОбъекта = Неопределено Тогда
Сообщить("Объект метаданных '" + ИмяМетаданного + "' не найден!");
Возврат;
КонецЕсли;
Попытка
// Для платформы 8.3.6 и выше
ОбъектКонфигурации = Конфигурация.Получить(МетаданныеОбъекта);
ОбъектКонфигурации.ОбновлениеПредопределенныхДанных = Значение;
Конфигурация.Записать();
Сообщить("Свойство для объекта '" + ИмяМетаданного + "' успешно установлено.");
Исключение
Сообщить("Не удалось изменить свойство для объекта '" + ИмяМетаданного + "'. " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Пример вызова для справочника "Пользователи"
// Возможные значения: Авто, НеОбновлятьАвтоматически, ОбновлятьАвтоматически
УстановитьСвойствоОбновления("Справочники.Пользователи", "НеОбновлятьАвтоматически");
Важно: для выполнения такого кода требуется запуск 1С с особыми правами и параметрами, позволяющими программно изменять конфигурацию. Этот способ подходит для опытных разработчиков и требует осторожности.
Подводя итог, запомним простое правило: для защиты предопределенных данных от обновления при реструктуризации базы данных всегда используйте свойство ОбновлениеПредопределенныхДанных на уровне конкретного объекта метаданных, устанавливая его в значение НеОбновлятьАвтоматически.