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