Как лучше размещать нетиповые реквизиты на форме в 1С:УНФ 3.0: программно или через расширение формы?

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

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

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

Основные подходы к размещению нетиповых реквизитов и элементов

Мы рассмотрим два ключевых метода, которые чаще всего применяются при доработке форм с использованием расширений, а также затронем альтернативный штатный механизм.

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

Подход 1: Добавление формы в расширение

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

Как это работает?

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

Преимущества подхода:

  1. Визуальная разработка: Для многих разработчиков это самый привычный и удобный способ. Все изменения видны сразу, элементы легко перетаскивать и настраивать их свойства.
  2. Простота для новичков: Не требует глубоких знаний программного API для работы с элементами формы.
  3. Полный контроль над формой: Мы можем изменять не только макет, но и свойства существующих элементов, добавлять новые обработчики событий.

Недостатки и риски при обновлении:

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

  1. Форма "разлетается": При обновлении конфигурации, типовая форма может быть изменена (удалены, переименованы, перенесены элементы или группы, изменены их типы). Поскольку наша форма в расширении является её "слепком" на момент заимствования, она не получает эти изменения автоматически. В результате, могут появиться ошибки, элементы могут отображаться некорректно или вовсе исчезать.
  2. Ручное слияние изменений: При каждом обновлении нам придется вручную сравнивать нашу заимствованную форму с новой типовой, переносить свои доработки и адаптировать их под новые изменения. Это может быть очень трудоемко и отнимать много времени.
  3. Потеря функционала: Если типовой элемент, с которым мы работали в нашей заимствованной форме, был удален или его функционал кардинально изменился, наша доработка может стать неработоспособной.

Работа с модулем формы в расширении:

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

Для доступа к модулю формы расширения, после добавления формы в расширение, мы просто открываем ее в конфигураторе и переходим на вкладку "Модуль".

Подход 2: Программное размещение реквизитов и элементов на форме

Этот подход считается более надежным с точки зрения устойчивости к обновлениям, но требует более глубоких знаний программного API и навыков кодирования.

Как это работает?

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

Преимущества подхода:

  1. Устойчивость к обновлениям: Это главное преимущество. Поскольку мы не заимствуем форму, она всегда остается типовой и автоматически обновляется вместе с конфигурацией поставщика. Наши программно добавленные элементы "встраиваются" в текущую структуру формы. Если разработчики 1С изменят расположение групп или элементов, наш код может быть скорректирован для поиска нужного места вставки, но сама типовая форма при этом не конфликтует с нашим расширением.
  2. Гибкость: Программно мы можем создавать динамические формы, добавлять элементы по условию, изменять их свойства в зависимости от данных или прав пользователя.
  3. Минимальное вмешательство: Мы изменяем только то, что необходимо, не создавая "копии" типовых объектов, что в теории снижает риски конфликтов.

Недостатки и сложности:

  1. Требуются навыки программирования: Этот метод требует понимания объектной модели форм, работы с коллекциями элементов и реквизитов, а также знания методов для их создания и настройки.
  2. Сложнее отлаживать: Отсутствие визуального редактора может затруднить разработку и отладку сложного интерфейса.
  3. Зависимость от имен типовых элементов: Если мы хотим вставить наши элементы в определенную группу на форме, нам нужно знать имя этой группы. Если разработчики 1С переименуют или удалят эту группу, наш код придется корректировать.

Пример программного добавления реквизита и элемента на форму:

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

Прежде всего, нам нужно программно добавить реквизит формы. Это можно сделать в обработчике события ПриСозданииНаСервере():


// В модуле формы расширения
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    // Вызываем типовую процедуру, если она есть
    // Например, в типовых формах на БСП обычно есть что-то подобное
    // ВыполнитьДействиеРасширенияФормыПриСозданииНаСервере(ЭтаФорма, Отказ);

    // Добавляем новый реквизит формы
    Если Не ЭтаФорма.Реквизиты.Найти("МойНовыйРеквизит") Тогда
        ЭтаФорма.ДобавитьРеквизит("МойНовыйРеквизит", Новый ОписаниеТипов("Строка", , , Новый КвалификаторыСтроки(20)));
    КонецЕсли;

    // После добавления реквизита, нам нужно создать элемент формы
    // И привязать его к нашему реквизиту.
    // Найдем группу, куда хотим поместить наш элемент.
    // Например, если хотим добавить его в основную группу (обычно 'ГруппаРеквизиты')
    ГруппаДляЭлемента = ЭтаФорма.Элементы.Найти("ГруппаРеквизиты"); // Это может быть любая другая группа

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

    // Можно также добавить обработчик события для нового элемента
    // Например, при изменении
    // Если НовыйЭлемент.ЕстьСобытие("ПриИзменении") Тогда
    //     НовыйЭлемент.УстановитьДействие("ПриИзменении", "МойНовыйЭлементПриИзменении");
    // КонецЕсли;
КонецПроцедуры

// Пример обработчика события (если нужен)
&НаКлиенте
Процедура МойНовыйЭлементПриИзменении(Элемент)
    Сообщить("Значение реквизита изменилось: " + Элемент.Значение);
КонецПроцедуры

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

Альтернативный механизм: Дополнительные реквизиты (БСП)

Прежде чем приступать к программному добавлению реквизитов на формы, мы должны рассмотреть штатный механизм "Дополнительные реквизиты", доступный в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как УНФ 3.0. Этот механизм предназначен специально для добавления произвольных реквизитов к объектам конфигурации без изменения самой конфигурации.

Преимущества использования Дополнительных реквизитов:

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

Шаги для подключения Дополнительных реквизитов:

Для того чтобы объект мог использовать дополнительные реквизиты, необходимо выполнить несколько шагов:

  1. Добавление табличной части: В объекте конфигурации (например, в документе или справочнике), к которому мы хотим добавить доп. реквизиты, необходимо добавить табличную часть с именем ДополнительныеРеквизиты. Мы можем скопировать её, например, из справочника Пользователи, который уже использует этот механизм.
  2. Добавление группы на форму: На форме элемента объекта (документа или справочника) необходимо разместить группу элементов с наименованием ГруппаДополнительныеРеквизиты. В эту группу система автоматически будет выводить поля дополнительных реквизитов.
  3. Настройка предопределенного элемента: В справочнике НаборыДополнительныхРеквизитовИСведений необходимо создать или найти предопределенный элемент для нашего объекта и убедиться, что для него установлен флаг Используется в значение Истина.
  4. Доработка модуля формы: В модуле формы элемента объекта (в типовой конфигурации) необходимо разместить определенные фрагменты кода в процедурах ПриСозданииНаСервере, ПриЧтенииНаСервере и ОбработкаПроверкиЗаполненияНаСервере. Эти фрагменты кода отвечают за инициализацию, чтение и проверку заполнения дополнительных реквизитов. Эти методы обычно находятся в общем модуле УправлениеСвойствами.

    Пример кода, который может быть размещен в модуле формы объекта для поддержки дополнительных реквизитов (используя точки расширения в расширении):

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

Для программной работы с дополнительными реквизитами, например, для чтения или записи их значений, мы можем использовать методы из общего модуля УправлениеСвойствами.

Общие рекомендации по работе с расширениями

Независимо от выбранного подхода к доработке форм, при работе с расширениями важно придерживаться некоторых общих принципов:

  1. Минимальное вмешательство: Всегда старайтесь изменять только то, что абсолютно необходимо. Чем меньше мы трогаем типовой функционал, тем проще будет обновляться.
  2. Единственное расширение: По возможности, стремитесь к использованию одного расширения для всех доработок. Большое количество расширений может усложнить сопровождение, отладку и негативно сказаться на производительности.
  3. Аннотации: Активно используйте аннотации &Перед, &После, &Вместо для вмешательства в типовые процедуры и функции. Это позволяет точечно изменять логику, не копируя весь типовой код.
  4. Резервное копирование: Перед любыми значительными изменениями или обновлениями всегда делайте резервную копию базы данных и конфигурации.
  5. Проверка совместимости: При каждом обновлении типовой конфигурации обязательно проверяйте совместимость вашего расширения с новой версией платформы и конфигурации. Обновляйте формы в расширении из основной конфигурации, если это применимо.

Выбор подхода: Резюме

Таким образом, мы видим, что каждый подход имеет свои сильные и слабые стороны:

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

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

← На главную