Как добавить новый реквизит на форму справочника Договоры контрагентов при наличии нескольких расширений

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

В процессе сопровождения сложных систем на базе 1С:ERP Управление предприятием 2.5 программисты часто сталкиваются с ситуацией, когда один и тот же объект (например, справочник ДоговорыКонтрагентов) уже модифицирован в нескольких расширениях. При попытке добавить новый реквизит в основную конфигурацию возникает проблема: он не отображается в редакторе формы, так как форма «перехвачена» расширением. Рассмотрим, как правильно выполнить такую доработку, сохранив стабильность системы и удобство будущих обновлений.

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

Когда вы добавляете реквизит в справочник в основной конфигурации, он физически создается в таблице базы данных. Однако, если форма этого справочника уже добавлена в одно или несколько расширений, визуальный редактор в основной конфигурации может игнорировать эти изменения. Это происходит потому, что расширение подменяет собой типовую форму. Форма в расширении — это своего рода «слепок» на момент её захвата. Пока новый реквизит не будет явно добавлен в расширение или не будет обновлена сама форма в расширении, вы не сможете увидеть его в списке доступных полей для перетаскивания на форму.

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

Решение 1: Использование типового механизма дополнительных реквизитов

Прежде чем приступать к кодингу, проанализируем типовые возможности 1С:ERP. В системе существует мощный механизм Дополнительных реквизитов и сведений. Если ваша задача — просто добавить флаг «Отсутствует документ с подписями», это можно сделать без изменения метаданных.

  1. Перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Найдем в списке справочник ДоговорыКонтрагентов.
  3. Добавим новый дополнительный реквизит с типом Булево и наименованием «Документ с подписями отсутствует».

Преимущества этого метода: не нужно менять конфигурацию, объект не снимается с поддержки, реквизит автоматически появится на специальной вкладке «Дополнительные реквизиты» в карточке договора. Однако, если заказчик требует расположить флажок строго в «шапке» формы рядом с номером договора, этот метод может не подойти без программной доработки.

Решение 2: Программное добавление элемента формы (Best Practice)

Профессиональным подходом при работе с расширениями считается программное создание элементов формы. Это позволяет избежать «заморозки» формы в расширении и минимизирует конфликты при обновлении конфигурации от 1С. Рассмотрим алгоритм действий.

Шаг 1. Добавление реквизита в метаданные. Захватим справочник ДоговорыКонтрагентов в хранилище основной конфигурации и добавим в него реквизит ОтсутствуетОригиналСПодписями (тип Булево). Это обеспечит хранение данных в основной базе.

Шаг 2. Создание обработчика в расширении. Нам необходимо программно добавить флажок на форму. Для этого выберем одно из существующих расширений (или создадим новое «общее» расширение для интерфейсных правок). Найдем форму объекта справочника ДоговорыКонтрагентов, добавим её в расширение и создадим в модуле формы обработчик события ПриСозданииНаСервере с аннотацией &После.

Шаг 3. Написание кода. Проанализируем структуру формы в конфигураторе, чтобы найти имя группы, в которую мы хотим поместить наш флажок (например, ГруппаШапка). Далее используем следующий код:


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

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

Решение 3: Интерактивное добавление через расширение

Если программный метод кажется слишком сложным, можно воспользоваться стандартным механизмом расширений, но сделать это правильно:

  1. Захватите реквизит ОтсутствуетОригиналСПодписями из основной конфигурации в расширение (правой кнопкой мыши по реквизиту — Добавить в расширение).
  2. Захватите форму справочника в это же расширение.
  3. Теперь в редакторе формы в дереве данных (справа) вы увидите свой реквизит внутри объекта. Перетащите его мышкой в нужное место на форме.

Важный нюанс: при таком подходе вы должны следить за тем, чтобы форма была захвачена только в ОДНОМ расширении. Если она захвачена в двух, изменения из первого могут перекрываться вторым. Также помните о рисках обновления конфигурации, описанных выше.

Обработка конфликтов при наличии нескольких расширений

Если форма справочника уже изменена в двух расширениях, придерживайтесь следующих правил:

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

← На главную