Как добавить дополнительную форму к документу без изменения основной формы в расширении

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

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

Вариант 1. Использование механизма дополнительных отчетов и обработок

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

Рассмотрим структуру функции СведенияОВнешнейОбработке, которая позволяет системе понять, куда и как добавить команду. Разберем пример кода для регистрации такой обработки:


#Область СВЕДЕНИЯ_О_ВНЕШНЕЙ_ОБРАБОТКЕ

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

    // Описываем команду
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = "Открыть форму обмена...";
    НоваяКоманда.Идентификатор = "ОткрытьФормуОбмена";
    НоваяКоманда.Использование = "ОткрытиеФормы"; // Важно: команда просто открывает форму обработки
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);
    
    Возврат РегистрационныеДанные;
КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

#КонецОбласти

Преимущества: Конфигурация остается полностью типовой. При обновлении программы вам не нужно заботиться о совместимости форм. Кнопка «приклеивается» к документу силами БСП.

Вариант 2. Глобальные команды в расширении

Если нам все же необходимо использовать расширение (например, для хранения самой формы внутри базы), мы можем воспользоваться механизмом Общих команд. Этот способ позволяет добавить кнопку на командную панель любой формы без её редактирования.

Разберем алгоритм действий:

  1. Создаем расширение для конфигурации.
  2. В расширении создаем новый объект ОбщаяКоманда.
  3. В свойстве Тип параметра команды указываем типы документов, в которых должна появиться кнопка (например, ДокументСсылка.НачислениеЗарплаты).
  4. В свойстве Группа выбираем стандартную группу, например, Командная панель формы.Важное или Форма.Перейти.
  5. В модуле команды пишем код открытия нашей формы, передавая туда ссылку на текущий документ.

Проанализируем пример кода обработчика команды:


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

Важный момент: Платформа автоматически добавит эту команду на формы всех указанных документов. Нам не нужно открывать редактор формы документа и перетаскивать туда элементы управления.

Вариант 3. Программное добавление элементов через общий модуль

Этот метод считается наиболее профессиональным при работе с расширениями. Мы используем перехват события создания формы. Выясним, как это реализовать:

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

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


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

Для реализации обработчика на клиенте также потребуется добавить клиентский метод в расширение формы. Хотя здесь мы «затронули» форму в расширении, мы не меняли её структуру в визуальном конструкторе, что значительно снижает риски при обновлениях.

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

В современных конфигурациях (ЗУП 3.1, ЗиК ГУ) реализован мощный механизм подключаемых команд. Он позволяет добавлять команды в стандартные подменю через специальные переопределяемые модули.

Разберем, как это работает пошагово:

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

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


Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкаКоманд, Параметры) Экспорт
    
    Команда = НастройкаКоманд.Добавить();
    Команда.Вид = "ЗаполнениеОбъекта"; // Группа, где появится кнопка
    Команда.Представление = "Загрузить из внешней таблицы";
    Команда.Идентификатор = "ЗагрузкаИзВИД";
    Команда.Обработчик = "МойОбщийМодульКлиент.ВыполнитьЗагрузку";
    
КонецПроцедуры

Как узнать версию БСП в вашей конфигурации?

Поскольку многие из описанных методов зависят от версии Библиотеки Стандартных Подсистем, важно уметь её определять. Рассмотрим два простых способа:

  1. В режиме конфигуратора: Найдите общий модуль СтандартныеПодсистемыСервер. В его тексте найдите функцию ВерсияБиблиотеки(). Она возвращает строку с точным номером версии.
  2. В режиме предприятия: Перейдите в раздел Администрирование — Обслуживание — Описание изменений программы. Там обычно указывается версия используемой БСП в заголовке или тексте описания обновлений.

Рекомендации по выбору метода

Проанализируем ситуацию: какой метод выбрать именно вам? Если задача разовая и нужно быстро добавить кнопку — используйте Внешнюю обработку (Вариант 1). Это самый безопасный путь. Если вы разрабатываете тиражное решение или функционал, который должен быть жестко вшит в базу, но при этом нельзя трогать формы — используйте Глобальные команды в расширении (Вариант 2). Если вам нужно внедрить кнопку в строго определенное место (например, внутрь подменю «Заполнить» рядом с типовыми кнопками) — используйте Подключаемые команды БСП (Вариант 4).

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

← На главную