Как программно добавить реквизиты во все формы документов в 1С:Бухгалтерия 3.0 через общий модуль?

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

Введение в задачу глобальной модификации форм

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

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

Вариант 1. Использование механизма «Модификация конфигурации» (Рекомендуемый)

Начнем с наиболее архитектурно верного решения, которое заложено разработчиками 1С в современные версии БСП. Этот подход позволяет перехватывать создание форм большинства объектов без привязки к конкретным подсистемам.

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

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


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

    // Массив добавляемых реквизитов
    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("НашНовыйРеквизит", Новый ОписаниеТипов("Строка"), "", "Доп. Инфо", Истина));
    
    // Изменяем структуру формы (ресурсоемкая операция!)
    Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    // Добавляем элемент на форму
    НовыйЭлемент = Форма.Элементы.Добавить("НашНовыйРеквизитЭлемент", Тип("ПолеФормы"), Форма);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "НашНовыйРеквизит";

КонецПроцедуры

Вариант 2. Использование событий подсистемы интеграции (СобытияФормИС)

В обсуждении коллеги справедливо заметили, что в БП 3.0 широко используется модуль СобытияФормИСПереопределяемый (или СобытияФормИС). Это часть подсистемы интеграции, но де-факто вызов этого модуля встроен во многие ключевые документы (Реализация, Поступление и т.д.).

Рассмотрим, как это работает. При открытии формы документа система вызывает процедуру ПриСозданииНаСервере из этого модуля. Если мы внедримся туда через расширение, мы получим доступ к управлению формой.

Преимущество этого метода в том, что вызовы СобытияФормИС уже прописаны в конкретных документах товародвижения, что само по себе является своего рода фильтром — ваш код не сработает в совершенно неожиданных местах типа формы настроек отчета, где нет этого вызова.


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

КонецПроцедуры

Вариант 3. Использование подсистемы «Подключаемые команды»

Еще один интересный вариант, предложенный в обсуждении — использовать модуль ПодключаемыеКоманды. Механизм подключаемых команд (например, для печати или отчетов) присутствует практически во всех документах БСП.

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

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

Критические моменты при программной модификации

Независимо от того, какую точку входа вы выберете (МодификацияКонфигурации, СобытияФормИС или ПодключаемыеКоманды), необходимо соблюдать строгие правила разработки, чтобы не "сломать" базу.

  1. Фильтрация форм: Никогда не применяйте код добавления реквизитов ко всем формам подряд. В системе существуют служебные формы, формы выбора, формы без реквизита Объект. Попытка обратиться к Форма.Объект там, где его нет, вызовет критическую ошибку у пользователя. Всегда используйте конструкцию Если ... Тогда для проверки имени формы или типа объекта.
  2. Производительность метода ИзменитьРеквизиты: Метод ИзменитьРеквизиты заставляет сервер перестраивать контекст формы. Это "тяжелая" операция. Вызывать её нужно строго один раз за сеанс создания формы. Не допускайте вызова этого метода в цикле.
  3. Конфликты имен: При программном добавлении реквизитов всегда добавляйте уникальный префикс к имени (например, расш1_КомментарийЛогиста). Это убережет вас от конфликтов, если 1С в будущем обновлении добавит в типовую форму реквизит с таким же именем.

Альтернатива: Штатный механизм дополнительных реквизитов

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

Почему это может быть лучше:

Программную доработку стоит выбирать только в том случае, если требуется сложная логика поведения элементов (скрытие/показ по условию, сложные расчеты при изменении) или специфическое визуальное оформление, которое нельзя реализовать типовыми средствами.

Заключение

Для реализации задачи мы рекомендуем использовать механизм Расширений конфигурации. Наиболее "чистым" способом является подписка на событие ПриСозданииНаСервере модуля МодификацияКонфигурацииПереопределяемый. Если по каким-то причинам в вашей версии конфигурации он недоступен, можно использовать хуки в СобытияФормИС или ПодключаемыеКоманды.

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

← На главную