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