Как сохранить пользовательские предопределенные элементы в типовых справочниках и планах счетов при обновлении 1С?

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

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

Выясним причину: почему сбрасывается признак предопределенности

Чтобы понять, как избежать этой проблемы, разберем по шагам механизмы работы платформы «1С:Предприятие 8.3» и Библиотеки Стандартных Подсистем (БСП):

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

Способ 1. Правильная настройка правила сравнения и объединения конфигураций

Если доработка уже выполнена через добавление предопределенных элементов в Конфигураторе, необходимо корректно выполнять процедуру обновления информационной базы.

Рассмотрим порядок действий при обновлении:

  1. При вызове процедуры «Сравнить, объединить с конфигурацией из файла» ни в коем случае не используйте полное замещение объектов (планов счетов или справочников).
  2. В дереве сравнения разверните дорабатываемый объект до таблицы предопределенных элементов.
  3. Убедитесь, что для ваших доработанных элементов снят режим замещения и сохранено объединение, чтобы они не были удалены из метаданных.
  4. Чтобы избежать совпадения имен, если фирма «1С» в будущих релизах добавит счет или элемент с аналогичным кодом, обязательно используйте уникальные идентификаторы и префиксы (например, имя: Преф_Счет_90_01, код: 90.01.П).

Способ 2. Программное создание элементов при обновлении ИБ (Рекомендуемый подход)

Современный стандарт разработки на платформе 1С рекомендует полностью отказаться от добавления предопределенных элементов в Конфигураторе для типовых объектов. Вместо этого задействуется программное создание элементов при вызове обработчиков обновления БСП.

Рассмотрим подробнее алгоритм реализации этого подхода:

  1. Создаем обычный элемент в режиме «Предприятие» программно с помощью кода в модуле обновления.
  2. Сохраняем ссылку на созданный элемент в константу или специальный регистр сведений.
  3. В прикладном коде обращаемся к элементу не через точку от менеджера (Справочники.Номенклатура.МойЭлемент), а через получение ссылки из константы (Константы.МойЭлемент.Получить()).

Посмотрим на пример кода процедур-обработчиков при обновлении информационной базы:


Процедура ПриОбновленииИнформационнойБазы() Экспорт

    // Проверяем наличие элемента в базе
    СсылкаНаЭлемент = Константы.НашаСлужебнаяУслуга.Получить();
    
    Если Не ЗначениеЗаполнено(СсылкаНаЭлемент) Или СсылкаНаЭлемент.ПометкаУдаления Тогда
        
        СправочникОбъект = Справочники.Номенклатура.СоздатьЭлемент();
        СправочникОбъект.Наименование = "Служебная услуга (доработка)";
        СправочникОбъект.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга;
        
        Попытка
            СправочникОбъект.Записать();
            Константы.НашаСлужебнаяУслуга.Установить(СправочникОбъект.Ссылка);
        Исключение
            ЗаписьЖурналаРегистрации("Обновление ИБ", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        КонецПопытки;
        
    КонецЕсли;

КонецПроцедуры

Способ 3. Использование отдельного служебного справочника

Проанализируем еще одно архитектурное решение, позволяющее полностью изолировать пользовательские настройки от изменений в типовой конфигурации. Вы можете создать собственный справочник (например, ПредопределенныеЗначения) в ветке метаданных вашей доработки.

Структура такого справочника выглядит следующим образом:

  1. Добавляются необходимые предопределенные элементы непосредственно в ваш собственный справочник (он не затирается при обновлении типовых блоков).
  2. В данный справочник добавляется реквизит Значение с произвольным типом (или ссылкой на нужные типовые справочники / планы счетов).
  3. В режиме «Предприятие» в этот реквизит записывается ссылка на соответствующий элемент типового справочника.

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

← На главную