Как сохранить добавленный реквизит на управляемой форме при обновлении типовой конфигурации 1С

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

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

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

Выясним причину потери элементов при обновлении

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

Для решения задачи подходят следующие методы:

  1. Использование механизма расширений конфигурации (заимствование формы).
  2. Программное добавление элементов в модуле расширения через перехват событий.
  3. Универсальное программное создание элементов через общий переопределяемый модуль основной конфигурации.
  4. Использование типового механизма БСП «Дополнительные реквизиты и сведения» без доработки структуры метаданных.

Вариант 1. Заимствование форм в расширение конфигурации

Рассмотрим использование механизма расширений. Это один из самых простых способов изолировать доработки интерфейса от типового обновления.

Разберем процесс по шагам:

  1. В дереве метаданных перейдем в меню Конфигурация — Расширения конфигурации и создадим новое расширение (убедимся, что режим совместимости расширения совпадает с режимом совместимости основной конфигурации).
  2. Найдем нужный документ в основной конфигурации, раскроем ветку Формы, кликнем правой кнопкой мыши по форме документа и выберем пункт Добавить в расширение. Важно заимствовать именно форму, а не только сам документ.
  3. Откроем заимствованную форму в расширении. Она отображает элементы и реквизиты основной конфигурации.
  4. Перетащим добавленный реквизит (например, РеглУчет) в нужное место структуры элементов формы.

Теперь форма в основной конфигурации будет обновляться без конфликтов, а пользователь всегда будет видеть форму с учетом модификаций из расширения.

Вариант 2. Программное создание элементов в расширении (оптимальный подход)

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

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


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверяем, существует ли уже элемент на форме, чтобы избежать дублирования
    Если Элементы.Найти("РеглУчет") = Неопределено Тогда
        
        // Создаем поле формы (флажок)
        НовыйЭлемент = Элементы.Добавить("РеглУчет", Тип("ПолеФормы"), Элементы.Шапка);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
        НовыйЭлемент.ПутьКДанным = "Объект.РеглУчет";
        НовыйЭлемент.Заголовок = "Отражать в регл. учете";
        
        // При необходимости перемещаем элемент относительно других полей
        Если Элементы.Найти("Дата") <> Неопределено Тогда
            Элементы.Переместить(НовыйЭлемент, НовыйЭлемент.Родитель, Элементы.Дата);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

В этом случае визуальная структура формы в расширении остается нетронутой, а элемент внедряется динамически при открытии формы на сервере.

Вариант 3. Универсальный вывод элемента через переопределяемый общий модуль

Если реквизит с одинаковым именем добавлен в десятки документов (например, в 50% документов базы), создавать расширение для каждой отдельной формы может быть трудоемко. Проанализируем способ централизованной вставки элемента через типовые точки расширения БСП.

В типовых решениях (таких как 1С:Бухгалтерия или 1С:Управление торговлей) все формы документов при создании на сервере обращаются к общим переопределяемым модулям (например, МодификацияКонфигурацииПереопределяемый или процедурам общего модуля ОбщегоНазначенияБСП).

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


// Процедура вызывается из центрального общего модуля при создании формы на сервере
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт

    // Проверяем наличие реквизита "РеглУчет" в метаданных открываемого объекта
    Попытка
        МетаданныеОбъекта = Форма.Объект.Ссылка.Метаданные();
    Исключение
        Возврат;
    КонецПопытки;

    Если МетаданныеОбъекта.Реквизиты.Найти("РеглУчет") = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Проверяем, не создан ли элемент ранее
    Если Форма.Элементы.Найти("РеглУчет") = Неопределено Тогда
        
        // Определяем родительскую группу для вставки
        РодительскаяГруппа = Неопределено;
        Если Форма.Элементы.Найти("ГруппаШапка") <> Неопределено Тогда
            РодительскаяГруппа = Форма.Элементы.ГруппаШапка;
        ИначеЕсли Форма.Элементы.Найти("Шапка") <> Неопределено Тогда
            РодительскаяГруппа = Форма.Элементы.Шапка;
        КонецЕсли;
        
        НовоеПоле = Форма.Элементы.Добавить("РеглУчет", Тип("ПолеФормы"), РодительскаяГруппа);
        НовоеПоле.Вид = ВидПоляФормы.ПолеФлажка;
        НовоеПоле.ПутьКДанным = "Объект.РеглУчет";
        НовоеПоле.Заголовок = "Регл. учет";
        
    КонецЕсли;

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

Такой подход позволяет один раз внести изменения в общий модуль конфигурации. При последующих обновлениях объединять придется только один модуль вместо десятков форм документов.

Вариант 4. Использование типовой подсистемы «Дополнительные реквизиты»

Если нет жесткого требования хранить данные в явном реквизите таблицы метаданных, рассмотрим типовой функционал Библиотеки Стандартных Подсистем (БСП):

  1. В режиме «1С:Предприятие» перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Включим использование дополнительных реквизитов и добавим свойство РеглУчет с типом Булево для необходимых видов документов.

Типовые конфигурации автоматически выводят такие реквизиты на форму (на специальную панель, вкладку или гиперссылку) без какого-либо вмешательства в код и макеты. Это полностью исключает сложности при обновлении конфигурации.

← На главную