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

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

При сопровождении типовых конфигураций 1С (таких как «1С:Бухгалтерия 8», «1С:ERP Управление предприятием», «1С:Управление торговлей» и др.) перед разработчиком регулярно встает задача кастомизации: добавление новых кнопок, сервисных обработок в командные панели журналов и документов, сокрытие лишних элементов или переопределение типовой бизнес-логики. Главная цель при этом — не превратить конфигурацию в труднообновляемый проект.

Разберем по шагам современные методики доработки типовых решений на базе Библиотеки стандартных подсистем (БСП) и управляемых форм, проанализируем иерархию подходов к модификации и подробно рассмотрим примеры программного изменения интерфейса.

Иерархия методов модификации по сложности последующей поддержки

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

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

Использование штатных механизмов БСП и переопределяемых модулей

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

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

Доработка интерфейса через расширения конфигурации

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

Рассмотрим правила корректного перехвата логики формы через расширение:

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

Пример программного добавления кнопки с подменю на управляемую форму

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


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

Клиентские процедуры-обработчики созданных команд объявляются в этом же модуле формы расширения:


&НаКлиенте
Процедура Расш_ВыполнитьЗагрузку(Команда)
    // Вызов сервисной обработки или открытие формы
    ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма");
КонецПроцедуры

&НаКлиенте
Процедура Расш_ВыполнитьСверку(Команда)
    // Логика сверки
    ОткрытьФорму("Обработка.СверкаОстатков.Форма");
КонецПроцедуры

Сокрытие типовых элементов и управление видимостью

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

  1. Через программное управление свойствами:
    
    // В обработчике ПриСозданииНаСервере (&После)
    ЭлементКнопка = Элементы.Найти("ИмяТиповойКнопки");
    Если ЭлементКнопка <> Неопределено Тогда
        ЭлементКнопка.Видимость = Ложь;
    КонецЕсли;
    

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

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

Важные рекомендации при работе с расширениями и типовыми формами

  1. Контроль применимости: после каждого обновления типовой конфигурации проверяйте применимость расширений в конфигураторе. Платформа отслеживает соответствие типов и сигнатур методов, предотвращая сбои в рабочей базе.
  2. Очистка серверного и клиентского кэша: при динамической установке или обновлении расширений для корректного применения изменений модулей форм требуется перезапуск пользовательских сеансов.
  3. Использование префиксов: всем создаваемым в расширениях объектам, процедурам, элементам формы и командам необходимо задавать уникальный префикс (например, Расш_ или префикс проекта), чтобы исключить конфликты имен при появлении новых реквизитов поставщика.
← На главную