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

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

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

Принцип работы внешних обработок в контексте интерфейса БСП

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

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

Шаг 1. Формирование сведений о внешней обработке

Рассмотрим структуру функции СведенияОВнешнейОбработке в модуле объекта нашей обработки. Здесь критически важно правильно указать вид обработки и режим запуска команды. Посмотрим на пример кода:


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

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

Шаг 2. Реализация клиентской логики

Теперь выясним причину, по которой нам нужен именно клиентский метод. При его вызове БСП передает в обработку структуру ПараметрыВыполненияКоманды, которая содержит уникальный объект — ЭтаФорма. Это контекст той самой формы справочника (например, формы сотрудника), из которой была нажата кнопка.

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


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

Шаг 3. Взаимодействие с данными формы

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

1. Получение ссылки: Обычно объект в форме находится в реквизите Объект. Мы можем считать ФормаВладелец.Объект.Ссылка.

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

Шаг 4. Улучшение визуального представления (Группировка)

Если ваша задача — избавиться от «каши» в стандартном меню печати, проанализируем возможность использования групп БСП. Даже если вы используете стандартный вид Печать для внешней обработки, в модуле менеджера (или в настройках команды) можно указать родительскую группу. Это позволит вашим 100 формам аккуратно спрятаться в подпапку «Наши внутренние формы» внутри стандартной кнопки «Печать».

Рекомендации по реализации

Рассмотрим подробнее наиболее стабильный алгоритм действий для создания отдельной кнопки:

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

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

Таким образом, мы выяснили, что даже без расширений программист 1С обладает мощным инструментарием для модификации поведения форм через механизмы дополнительных отчетов и обработок БСП. Главное — правильно использовать контекст ЭтаФорма, передаваемый в клиентские методы обработки.

← На главную