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

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

Что можно подключить через подсистему

Файлы двух форматов: внешние обработки (.epf) и внешние отчёты (.erf). Внутри подсистемы они делятся на виды:

ВидГде появляется командаФайл
ПечатнаяФормаМеню «Печать» в форме объекта или спискаepf
ЗаполнениеОбъектаМеню «Заполнить» в форме объекта или спискаepf
СозданиеСвязанныхОбъектов«Создать на основании» → «Создание связанных объектов»epf
ОтчетМеню «Отчеты» в форме объекта или спискаerf
ДополнительнаяОбработкаРаздел «Дополнительные обработки» в выбранных подсистемахepf
ДополнительныйОтчетРаздел «Дополнительные отчеты» в выбранных подсистемахerf

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

Что ещё даёт подсистема поверх «просто открыть файл»:

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

Регистрационные данные: что возвращает СведенияОВнешнейОбработке

Функция возвращает структуру. Основные поля:

  • Вид — строка из таблицы выше. Значения удобно брать функциями ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки...(). Минимально обязательное поле.
  • Назначение — массив строк вида "Документ.РеализацияТоваровУслуг"; нужен для назначаемых видов.
  • Наименование — имя элемента справочника; если пусто, берётся синоним обработки.
  • Версия и Информация — строки для карточки.
  • БезопасныйРежим — булево.
  • ВерсияБСП — версия библиотеки, под которую написана обработка; нужна для совместимости.
  • Команды — таблица значений с колонками Представление, Идентификатор, Использование, ПоказыватьОповещение, Модификатор.

Типы команд и вызываемые методы

Колонка Использование задаёт тип команды. В связке с видом он определяет, какой экспортный метод вызовет БСП:

Тип командыВидЧто вызывается
ВызовСерверногоМетодаПечатнаяФормаПечать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) в модуле объекта
ВызовСерверногоМетодаДополнительнаяОбработка, ДополнительныйОтчетВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения)
ВызовСерверногоМетодаЗаполнениеОбъектаВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения)
ВызовСерверногоМетодаСозданиеСвязанныхОбъектовВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения)
ВызовКлиентскогоМетодалюбойэкспортная процедура в основной форме обработки, &НаКлиенте
ОткрытиеФормылюбойоткрывается основная форма, в параметрах — ссылка на обработку и идентификатор команды

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

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

Пример: внешняя печатная форма

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

1С
// Регистрационные данные для подсистемы «Дополнительные отчеты и обработки».
Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();

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

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

	Возврат ПараметрыРегистрации;

КонецФункции

Модификатор ПечатьMXL говорит БСП, что результат — табличный документ. Теперь процедура печати. Обратите внимание: это процедура, коллекцию печатных форм создаёт и передаёт сама БСП, пересоздавать её не нужно.

1С
// Вызывается подсистемой «Печать» по команде с типом ВызовСерверногоМетода.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

	ИдентификаторФормы = "НакладнаяАльтернативная";
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИдентификаторФормы) Тогда
		ТабличныйДокумент = СформироватьНакладную(МассивОбъектов, ОбъектыПечати);
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			ИдентификаторФормы, "Накладная (альтернативная)", ТабличныйДокумент);
	КонецЕсли;

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

Функция СформироватьНакладную(МассивОбъектов, ОбъектыПечати)

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НакладнаяАльтернативная";
	Макет = ПолучитьМакет("Накладная");

	Для Каждого Документ Из МассивОбъектов Цикл

		Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;

		ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
		ОбластьШапка.Параметры.Номер = Документ.Номер;
		ОбластьШапка.Параметры.Дата = Формат(Документ.Дата, "ДЛФ=D");
		ОбластьШапка.Параметры.Контрагент = Документ.Контрагент;
		ТабличныйДокумент.Вывести(ОбластьШапка);

		// Привязка области к документу нужна для отправки по почте и сохранения по объектам
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало,
			ОбъектыПечати, Документ);

	КонецЦикла;

	Возврат ТабличныйДокумент;

КонецФункции

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

Пример серверной команды дополнительной обработки

Для вида ДополнительнаяОбработка с серверной командой:

1С
// Точка входа для серверных команд дополнительной обработки.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

	Если ИдентификаторКоманды = "ЗакрытьСтарыеЗаказы" Тогда
		ЗакрытьСтарыеЗаказы();
	Иначе
		ВызватьИсключение СтрШаблон("Неизвестная команда: %1", ИдентификаторКоманды);
	КонецЕсли;

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

Такую команду можно поставить в расписание в карточке справочника — и получить регламентное задание без доработки конфигурации.

Подключение к базе

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

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

Отладка дополнительных обработок

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

  • Открыть файл напрямую. «Файл → Открыть» в клиенте, запущенном из конфигуратора в режиме отладки, и вызвать нужный экспортный метод из формы-обёртки. Логика печати и обработки при этом та же.
  • Вынести логику в отдельный метод с явными параметрами (ссылка, массив ссылок) и отлаживать его, а Печать и ВыполнитьКоманду оставить тонкими.
  • Остановка по ошибке. Временно добавить ВызватьИсключение в нужном месте и включить в отладчике «Останавливаться по ошибке».
  • Небезопасный режим. Для части сценариев помогает временно выставить БезопасныйРежим = Ложь, перерегистрировать обработку, открыть тот же файл через «Файл → Открыть», закрыть и запустить команду из справочника.
  • Режим публикации «Режим отладки», чтобы не показывать сырую версию всем пользователям.

Самая частая причина «изменения не работают» — забыли перезагрузить файл в справочник.

Типичные ошибки

  • Нет Экспорт у СведенияОВнешнейОбработке, Печать или ВыполнитьКоманду — регистрация не пройдёт или команда не выполнится.
  • Неверное назначение. Опечатка в "Документ.РеализацияТоваровУслуг" — кнопка не появится.
  • Пересоздание КоллекцияПечатныхФорм внутри Печать — БСП не увидит результат.
  • Небезопасные операции в безопасном режиме: работа с файлами, COM, привилегированный режим без разрешений.
  • Отсутствие основной формы при типе ВызовКлиентскогоМетода или ОткрытиеФормы.
Дополнительная обработка хороша, пока остаётся тонкой надстройкой. Если она начинает менять поведение форм и проводок — это уже задача для расширения.

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

Итог

  • Подсистема БСП подключает .epf и .erf к типовой конфигурации без снятия с поддержки.
  • Обязательна экспортная СведенияОВнешнейОбработке(); заготовку структуры даёт ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке().
  • Вид и тип команды определяют, где появится кнопка и какой метод вызовется: Печать, ВыполнитьКоманду или форма.
  • Печатная форма выводится через УправлениеПечатью.НужноПечататьМакет и ВывестиТабличныйДокументВКоллекцию.
  • Отлаживать удобнее через «Файл → Открыть» и тонкие точки входа.