Файл .erf вместо .epf: как заставить внешний отчёт выполнять код и менять данные

· 10 мин

Содержание

Внешний отчёт в 1С может работать как обработка: в его модуле объекта и в модуле формы пишется тот же код, что и во внешней обработке, — запросы, запись объектов, загрузка файлов. Достаточно создать файл .erf в Конфигураторе, добавить свою форму с кнопкой «Выполнить» и вызвать из неё серверную процедуру модуля объекта. Второй способ — перехватить событие ПриКомпоновкеРезультата и выполнять код по стандартной кнопке «Сформировать».

Зачем вообще так делать, если есть .epf? Причин три. У пользователя есть право открывать внешние отчёты, но нет права на внешние обработки. Нужно, чтобы инструмент жил в панели «Отчёты» раздела и умел сохранять варианты. Или нужен гибрид: сначала показать таблицу с данными, а потом по кнопке их исправить.

Отчёт и обработка: что у них общее, а что разное

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

ПризнакВнешний отчёт (.erf)Внешняя обработка (.epf)
Менеджер в кодеВнешниеОтчетыВнешниеОбработки
Имя формы при открытииВнешнийОтчет.Имя.ФормаВнешняяОбработка.Имя.Форма
Основная схема компоновкиесть свойство ОсновнаяСхемаКомпоновкиДанныхнет
Варианты и пользовательские настройкихранятся штатнотолько своими средствами
Право на интерактивное открытие«Интерактивное открытие внешних отчётов»«Интерактивное открытие внешних обработок»
Вид в «Дополнительных отчётах и обработках»дополнительный отчётдополнительная обработка, печатная форма, заполнение

Из таблицы видно главное: код внутри работает одинаково. Отличаются оболочка, права и то, как файл встраивается в типовую конфигурацию .

Преобразовать готовый .epf в .erf одной командой нельзя. Создайте новый внешний отчёт, перенесите реквизиты, скопируйте текст модуля объекта и модуля формы, а элементы формы соберите заново.

Где писать код внешнего отчёта, который работает как обработка

Создание начинается в Конфигураторе: Файл → Новый → Внешний отчёт. Задайте имя на латинице или кириллице без пробелов — по нему отчёт будет виден в коде.

Дальше два пути. Выбор зависит от того, что должен увидеть пользователь.

Способ 1. Своя форма с кнопкой

Подходит для «чистой» обработки: загрузить, пересчитать, исправить.

  1. В дереве отчёта откройте ветку «Формы» и добавьте форму отчёта.
  2. В свойствах отчёта назначьте её основной формой.
  3. На вкладке «Реквизиты» формы уже есть основной реквизит Отчет. Добавьте нужные параметры — период, организацию, флажок «Только проверка».
  4. На вкладке «Команды» создайте команду Выполнить, перетащите её на форму и создайте обработчик.
  5. Тяжёлую работу перенесите в экспортную процедуру модуля объекта.

Модуль формы:

&НаКлиенте
Процедура Выполнить(Команда)
	ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	ОтчетОбъект.СнятьПометкуУдаления();
КонецПроцедуры

Модуль объекта отчёта:

Процедура СнятьПометкуУдаления() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.ПометкаУдаления
	|	И НЕ Номенклатура.ЭтоГруппа";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Обработано = 0;
	
	Пока Выборка.Следующий() Цикл
		Объект = Выборка.Ссылка.ПолучитьОбъект();
		Попытка
			Объект.УстановитьПометкуУдаления(Ложь);
			Обработано = Обработано + 1;
		Исключение
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон("%1: %2", Выборка.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			Сообщение.Сообщить();
		КонецПопытки;
	КонецЦикла;
	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = СтрШаблон("Пометка снята у элементов: %1", Формат(Обработано, "ЧЗ=0; ЧГ=0"));
	Сообщение.Сообщить();
	
КонецПроцедуры

Если серверная процедура меняет реквизиты самого отчёта (например, заполняет табличную часть для показа на форме), верните объект обратно в форму: ЗначениеВРеквизитФормы(ОтчетОбъект, "Отчет").

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

Способ 2. Код по кнопке «Сформировать»

Этот вариант удобен, когда результат нужно показать табличным документом. Отчёт получает стандартную форму, варианты, кнопку «Сформировать», а внутри выполняется ваш код.

  1. Создайте основную схему компоновки данных — её наличие нужно, чтобы стандартная форма вызывала формирование. Достаточно простого набора данных.
  2. В модуле объекта добавьте обработчик ПриКомпоновкеРезультата.
  3. Установите СтандартнаяОбработка = Ложь — тогда платформа не будет компоновать схему, а выведет то, что сформировали вы.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ ПЕРВЫЕ 100
	|	Контрагенты.Наименование КАК Наименование,
	|	Контрагенты.ИНН КАК ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	Контрагенты.ИНН = """"");
	
	Выборка = Запрос.Выполнить().Выбрать();
	НомерСтроки = 1;
	ДокументРезультат.Область(НомерСтроки, 1, НомерСтроки, 1).Текст = "Контрагенты без ИНН";
	
	Пока Выборка.Следующий() Цикл
		НомерСтроки = НомерСтроки + 1;
		ДокументРезультат.Область(НомерСтроки, 1, НомерСтроки, 1).Текст = Выборка.Наименование;
	КонецЦикла;
	
КонецПроцедуры

Пример рассчитан на конфигурацию, где у справочника «Контрагенты» есть реквизит ИНН, — как в 1С:Бухгалтерии 3.0. В другой конфигурации поправьте запрос.

Сравнение двух способов:

СпособКогда выбратьЧего ждать
Своя форма с командойОбработка без вывода: загрузка, перепроведение, исправлениеПолный контроль над формой и параметрами
ПриКомпоновкеРезультатаНужно показать результат в табличном документеСтандартная форма, варианты, но настройки СКД вы игнорируете
ГибридСначала проверка, потом исправлениеОтчёт показывает проблемы, отдельная команда их исправляет

Как подключить и запустить внешний отчёт из кода 1С

Интерактивно файл открывают через главное меню: ☰ → Файл → Открыть. Из кода есть два варианта, и они работают в разных местах.

Файл у пользователя: через временное хранилище

Так работает и тонкий, и веб-клиент. Файл передаётся на сервер, там подключается, а клиент открывает форму по полученному имени.

&НаКлиенте
Процедура ОткрытьВнешнийОтчет(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
	НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

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

&НаСервере
Функция ПодключитьНаСервере(Адрес)
	Возврат ВнешниеОтчеты.Подключить(Адрес, , Ложь);
КонецФункции

Третий параметр Подключить — безопасный режим. По умолчанию он включён (Истина). Для кода, который пишет в базу, работает с файлами или COM, его выключают явно — об ограничениях ниже.

Файл на сервере: без формы

Если файл лежит в каталоге, доступном серверу 1С, отчёт можно создать прямо на сервере и вызвать его экспортный метод. Форма не нужна.

&НаСервере
Процедура ЗапуститьНаСервере()
	ОтчетОбъект = ВнешниеОтчеты.Создать("\\srv\obrabotki\Ispravlenie.erf", Ложь);
	ОтчетОбъект.СнятьПометкуУдаления();
КонецПроцедуры

Путь указывается с точки зрения сервера, а не компьютера пользователя. В клиент-серверной базе это частая причина ошибки «файл не найден»: у службы сервера 1С нет доступа к сетевой папке под своей учётной записью.

Права, безопасный режим и защита от опасных действий

Внешний файл выполняет код с правами текущего пользователя. Поэтому тут три независимых барьера.

🔐 Права в ролях. Интерактивное открытие через Файл → Открыть требует права «Интерактивное открытие внешних отчётов». Для .epf право отдельное. Без него пользователь получит Нарушение прав доступа!. Именно разница в этих двух правах — частая причина оформлять служебный инструмент отчётом.

🛡 Безопасный режим. При подключении с БезопасныйРежим = Истина коду запрещены операции, опасные для сервера: работа с файлами, COM-объекты, внешние компоненты, запуск приложений, привилегированный режим. Права на данные при этом проверяются как обычно. Если обработка в безопасном режиме падает на записи файла — это не ошибка кода, а ограничение режима.

⚠️ Защита от опасных действий. Платформа показывает предупреждение при открытии внешнего файла, если у пользователя включён флажок «Защита от опасных действий» (свойство пользователя информационной базы в Конфигураторе: Администрирование → Пользователи). Программно это предупреждение отключают параметром ОписаниеЗащитыОтОпасныхДействий метода Подключить, у которого свойство ПредупреждатьОбОпасныхДействиях установлено в Ложь.

Не снимайте защиту всем пользователям «для удобства». Внешний файл может удалить данные или выгрузить их наружу. Открывать внешние отчёты из непроверенных источников нельзя даже администратору.

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

Встраивание в типовую конфигурацию через «Дополнительные отчёты и обработки»

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) внешние файлы не открывают через меню каждый раз, а регистрируют в справочнике. В 1С:Бухгалтерии 3.0 путь такой: Администрирование → Печатные формы, отчёты и обработки, включить флажок «Дополнительные отчёты и обработки» и открыть одноимённый список.

Чтобы файл загрузился, в модуле объекта нужна экспортная функция СведенияОВнешнейОбработке. Для отчёта она выглядит так:

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

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

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

Отладка внешнего отчёта в Конфигураторе

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

Пошаговый помощник
Откройте файл в Конфигураторе
Файл → Открыть, выберите .erf. Модули станут доступны для точек останова.

Что мешает отладке:

  • 🚫 Отчёт запущен из справочника дополнительных отчётов. БСП берёт копию файла из базы и выгружает её во временный каталог, поэтому точки останова в вашем файле не сработают. Для отладки открывайте файл с диска через меню, а в справочник загружайте уже готовую версию.
  • 🖥 Клиент-серверная база. Чтобы останавливаться в серверном коде, отладка должна быть разрешена на сервере 1С — служба запускается с ключом -debug. Перезапуск службы сервера обрывает сеансы всех пользователей, поэтому делайте это вне рабочего времени или на тестовом сервере.
  • 🔁 Кэш формы. Если правки не видны, закройте форму отчёта полностью и откройте файл заново.

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

Расширение конфигурации как альтернатива внешнему файлу

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

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

КритерийВнешний отчётОтчёт в расширении
Где хранитсяФайл на диске или в справочнике БСПВ информационной базе
ПраваПраво на открытие внешних отчётовСвоя роль расширения
Доступ к объектам конфигурацииТолько через код и запросыМожно ещё заимствовать объекты и менять их формы
Обновление типовойНе затрагивает файлРасширение остаётся, но его надо проверить после обновления
Безопасный режимЗадаётся при подключенииЗадаётся флажком у расширения

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

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

Расширение не умеет дорабатывать сам внешний отчёт: заимствуются только объекты конфигурации. Если внешний отчёт нужно поменять — правится сам файл.

Частые вопросы

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