Файл .erf вместо .epf: как заставить внешний отчёт выполнять код и менять данные
Содержание
Внешний отчёт в 1С может работать как обработка: в его модуле объекта и в модуле формы пишется тот же код, что и во внешней обработке, — запросы, запись объектов, загрузка файлов. Достаточно создать файл .erf в Конфигураторе, добавить свою форму с кнопкой «Выполнить» и вызвать из неё серверную процедуру модуля объекта. Второй способ — перехватить событие ПриКомпоновкеРезультата и выполнять код по стандартной кнопке «Сформировать».
Зачем вообще так делать, если есть .epf? Причин три. У пользователя есть право открывать внешние отчёты, но нет права на внешние обработки. Нужно, чтобы инструмент жил в панели «Отчёты» раздела и умел сохранять варианты. Или нужен гибрид: сначала показать таблицу с данными, а потом по кнопке их исправить.
Отчёт и обработка: что у них общее, а что разное
С точки зрения платформы внешний отчёт — почти та же обработка, к которой добавлена схема компоновки данных. Модуль объекта, реквизиты, табличные части, формы и макеты есть у обоих. Выполнять произвольный код может и тот и другой.
| Признак | Внешний отчёт (.erf) | Внешняя обработка (.epf) |
|---|---|---|
| Менеджер в коде | ВнешниеОтчеты | ВнешниеОбработки |
| Имя формы при открытии | ВнешнийОтчет.Имя.Форма | ВнешняяОбработка.Имя.Форма |
| Основная схема компоновки | есть свойство ОсновнаяСхемаКомпоновкиДанных | нет |
| Варианты и пользовательские настройки | хранятся штатно | только своими средствами |
| Право на интерактивное открытие | «Интерактивное открытие внешних отчётов» | «Интерактивное открытие внешних обработок» |
| Вид в «Дополнительных отчётах и обработках» | дополнительный отчёт | дополнительная обработка, печатная форма, заполнение |
Из таблицы видно главное: код внутри работает одинаково. Отличаются оболочка, права и то, как файл встраивается в типовую конфигурацию .
Преобразовать готовый .epf в .erf одной командой нельзя. Создайте новый внешний отчёт, перенесите реквизиты, скопируйте текст модуля объекта и модуля формы, а элементы формы соберите заново.
Где писать код внешнего отчёта, который работает как обработка
Создание начинается в Конфигураторе: Файл → Новый → Внешний отчёт. Задайте имя на латинице или кириллице без пробелов — по нему отчёт будет виден в коде.
Дальше два пути. Выбор зависит от того, что должен увидеть пользователь.
Способ 1. Своя форма с кнопкой
Подходит для «чистой» обработки: загрузить, пересчитать, исправить.
- В дереве отчёта откройте ветку «Формы» и добавьте форму отчёта.
- В свойствах отчёта назначьте её основной формой.
- На вкладке «Реквизиты» формы уже есть основной реквизит
Отчет. Добавьте нужные параметры — период, организацию, флажок «Только проверка». - На вкладке «Команды» создайте команду
Выполнить, перетащите её на форму и создайте обработчик. - Тяжёлую работу перенесите в экспортную процедуру модуля объекта.
Модуль формы:
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ОтчетОбъект.СнятьПометкуУдаления();
КонецПроцедуры
Модуль объекта отчёта:
Процедура СнятьПометкуУдаления() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления
| И НЕ Номенклатура.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать();
Обработано = 0;
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Попытка
Объект.УстановитьПометкуУдаления(Ложь);
Обработано = Обработано + 1;
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("%1: %2", Выборка.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Сообщение.Сообщить();
КонецПопытки;
КонецЦикла;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Пометка снята у элементов: %1", Формат(Обработано, "ЧЗ=0; ЧГ=0"));
Сообщение.Сообщить();
КонецПроцедуры
Если серверная процедура меняет реквизиты самого отчёта (например, заполняет табличную часть для показа на форме), верните объект обратно в форму: ЗначениеВРеквизитФормы(ОтчетОбъект, "Отчет").
Пример меняет данные справочника. Перед запуском на рабочей базе сделайте резервную копию и сначала прогоните код на копии.
Способ 2. Код по кнопке «Сформировать»
Этот вариант удобен, когда результат нужно показать табличным документом. Отчёт получает стандартную форму, варианты, кнопку «Сформировать», а внутри выполняется ваш код.
- Создайте основную схему компоновки данных — её наличие нужно, чтобы стандартная форма вызывала формирование. Достаточно простого набора данных.
- В модуле объекта добавьте обработчик
ПриКомпоновкеРезультата. - Установите
СтандартнаяОбработка = Ложь— тогда платформа не будет компоновать схему, а выведет то, что сформировали вы.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДокументРезультат.Очистить();
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 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С:Предприятия подключится к отладчику автоматически.☰ → Файл → Открыть и тот же путь к .erf. Нажмите кнопку — выполнение остановится на точке.Что мешает отладке:
- 🚫 Отчёт запущен из справочника дополнительных отчётов. БСП берёт копию файла из базы и выгружает её во временный каталог, поэтому точки останова в вашем файле не сработают. Для отладки открывайте файл с диска через меню, а в справочник загружайте уже готовую версию.
- 🖥 Клиент-серверная база. Чтобы останавливаться в серверном коде, отладка должна быть разрешена на сервере 1С — служба запускается с ключом
-debug. Перезапуск службы сервера обрывает сеансы всех пользователей, поэтому делайте это вне рабочего времени или на тестовом сервере. - 🔁 Кэш формы. Если правки не видны, закройте форму отчёта полностью и откройте файл заново.
Тестировать изменяющий код удобно в режиме «только проверка»: добавьте на форму флажок, и при включённом флажке выводите список объектов вместо записи. Первый прогон — всегда так.
Расширение конфигурации как альтернатива внешнему файлу
Внешний отчёт — файл, который легко потерять, переслать не той версии или открыть без проверки. Если инструмент нужен постоянно, его можно перенести в расширение конфигурации.
Расширения появились в платформе 8.3.6. В расширение добавляется собственный отчёт (не внешний): тот же модуль объекта, те же формы, та же основная схема. Разница — он хранится в базе и не требует открытия файла.
| Критерий | Внешний отчёт | Отчёт в расширении |
|---|---|---|
| Где хранится | Файл на диске или в справочнике БСП | В информационной базе |
| Права | Право на открытие внешних отчётов | Своя роль расширения |
| Доступ к объектам конфигурации | Только через код и запросы | Можно ещё заимствовать объекты и менять их формы |
| Обновление типовой | Не затрагивает файл | Расширение остаётся, но его надо проверить после обновления |
| Безопасный режим | Задаётся при подключении | Задаётся флажком у расширения |
Расширение загружают в Конфигураторе (Конфигурация → Расширения конфигурации) или в пользовательском режиме. В 1С:Бухгалтерии 3.0 список открывается из Администрирование → Печатные формы, отчёты и обработки по ссылке «Расширения». При загрузке в пользовательском режиме проверьте флажки «Безопасный режим» и «Защита от опасных действий»: с включённым безопасным режимом расширение не сможет писать файлы и вызывать COM.
Комбинированная схема тоже рабочая: в расширении — общая команда, которая вызывает ВнешниеОтчеты.Создать для файла в известном серверном каталоге. Файл можно менять без перезагрузки расширения, а команда стоит в нужном разделе.
Расширение не умеет дорабатывать сам внешний отчёт: заимствуются только объекты конфигурации. Если внешний отчёт нужно поменять — правится сам файл.
Частые вопросы
Может ли внешний отчёт записывать данные в базу?
Работает ли такой отчёт в веб-клиенте?
ВнешниеОтчеты.Подключить. Открыть файл по пути на диске пользователя из веб-клиента сервер не может.Почему отчёт открывается, а кнопка «Сформировать» ничего не делает?
ПриКомпоновкеРезультата находится в модуле формы, а не в модуле объекта.Сломается ли внешний отчёт после обновления типовой конфигурации?
Можно ли запустить внешний отчёт без открытия формы?
ВнешниеОтчеты.Создать с путём к файлу и вызовите его экспортную процедуру.