Разработка и Конфигурация · 12 мин
Внешний отчет 1С как обработка: когда и как это сделать
Как использовать внешний отчет 1С как обработку: создание формы, подключение через механизм дополнительных отчетов, примеры кода и типичные ошибки.
В 1С внешний отчет и внешняя обработка — два разных формата файлов (.erf и .epf), но на практике их роли часто пересекаются. Многие задачи, которые формально относятся к обработкам (заполнение данных, пакетные операции, сервисные действия), удобно реализовать именно в файле внешнего отчета, потому что он изначально поддерживает схему компоновки данных, настройки вариантов и привычную пользователю форму с кнопкой «Сформировать».
Подход «отчет как обработка» означает: файл формата внешнего отчета регистрируется в подсистеме дополнительных отчетов и обработок (БСП) как обработка либо запускается пользователем через «Файл → Открыть», а внутри него по команде выполняется не только построение табличного документа, но и изменение данных, выгрузка файлов, вызов сервисов. Это законный и широко применяемый прием, но у него есть ограничения и риски, о которых нужно знать заранее.
Ниже разобрано, когда такой прием оправдан, как правильно оформить модуль, какие функции БСП нужно реализовать для регистрации и как проверить, что обработка-отчет не ломает данные в базе.
Когда оправдано использовать отчет в роли обработки
Формат отчета выигрывает у обработки, когда результат действия нужно показать пользователю в виде таблицы или печатной формы, а настройки удобно задавать через отборы СКД. Типичный сценарий: пользователь отбирает документы за период, нажимает «Сформировать», а отчет не только выводит список, но и, например, проставляет в найденных документах нужный реквизит или формирует файл выгрузки.
Обратная ситуация — когда действий много, а результата-таблицы нет. Если задача сводится к пакетному изменению данных без визуального результата, честнее сделать именно внешнюю обработку (.epf): у нее проще модуль объекта, нет лишней схемы компоновки, и она не вводит пользователя в заблуждение кнопкой «Сформировать».
Еще один аргумент в пользу отчета — встроенные варианты. Если разным пользователям нужны разные наборы настроек одной и той же операции (свой отбор, свой шаблон выгрузки), варианты отчета решают это без единой строчки кода.
Сравнение вариантов
Подходит, когда есть табличный результат, отборы СКД и варианты настроек. Ограничение: избыточен для чистых сервисных операций без вывода данных.
Подходит для сервисных действий без табличного результата: заполнение, исправление, обмен. Ограничение: нет встроенных вариантов настроек и СКД.
Подходит, когда нужно и действие, и результат, и интеграция в интерфейс (команды заполнения, печати). Требует соблюдения программного интерфейса БСП.
Создание файла: форма, команды и модуль
Создайте в конфигураторе новый внешний отчет через «Файл → Новый → Внешний отчет». Если пользователь должен видеть результат, добавьте схему компоновки данных — даже минимальную, с одним набором данных-запросом. Если отчет чисто «действующий», схему можно не создавать, а всю логику разместить в модуле объекта или в форме.
Для управляемого приложения добавьте основную форму отчета и разместите на ней свои команды: «ВыполнитьЗаполнение», «ВыгрузитьВФайл» и тому подобное. Стандартная команда «Сформировать» продолжит работать и вызовет компоновку, если схема есть. Код действия размещайте в клиент-серверной процедуре формы с директивой &НаСервере, чтобы обращаться к данным напрямую.
&НаСервере
Процедура ВыполнитьЗаполнениеНаСервере()
НачатьТранзакцию();
Попытка
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Начало И &Конец");
Запрос.УстановитьПараметр("Начало", НачалоПериода);
Запрос.УстановитьПараметр("Конец", КонецПериода);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокОбъект.Комментарий = "Обработано внешним отчетом";
ДокОбъект.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
КонецПроцедурыОбратите внимание: массовые изменения обязательно оборачивайте в транзакцию. Если обработка упадет на середине, база останется в согласованном состоянии, а не с наполовину измененными документами.
Регистрация в подсистеме дополнительных отчетов и обработок
Чтобы файл работал как полноценная обработка внутри интерфейса (а не только через «Файл → Открыть»), его нужно зарегистрировать в справочнике «Дополнительные отчеты и обработки». Для этого в модуле объекта отчета реализуется экспортная функция СведенияОВнешнейОбработке(), возвращающая структуру с параметрами регистрации.
В структуре указываются вид обработки, версия, безопасный режим и таблица команд. Вид определяет, где появится команда: «ДополнительнаяОбработка» — в общем списке, «ЗаполнениеОбъекта» — в кнопке «Заполнение» формы документа, «ПечатнаяФорма» — в меню «Печать», «СозданиеСвязанныхОбъектов» — в меню «Ввести на основании». Даже если физически это файл отчета, вид выбирайте по смыслу действия.
- 1Создайте внешний отчет и добавьте в модуль объекта функцию СведенияОВнешнейОбработке() с видом и командами
- 2Реализуйте процедуру ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) в модуле объекта или форме
- 3Откройте в режиме Предприятия: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки
- 4Добавьте файл, проверьте, что команды распознались, назначьте разделы и объекты назначения
- 5Откройте назначенный документ или раздел и проверьте выполнение команды на тестовых данных
Пример функции сведений
Минимальный каркас функции выглядит так: создается структура с полями Вид, Версия, БезопасныйРежим, Информация, затем таблица команд с колонками Идентификатор, Представление, Использование, Модификатор. Для команд, выполняющихся на сервере без открытия формы, использование ставится «ВызовСерверногоМетода», для команд с формой — «ОткрытиеФормы».
Получение результата и обратная связь с пользователем
Обработка, замаскированная под отчет, должна честно сообщать, что она сделала. Минимум — вывод сообщений через Сообщить() с количеством обработанных объектов и перечнем ошибок. Лучше — формировать табличный документ с результатом: список измененных документов, их состояние до и после, причины пропуска.
Удобный прием — использовать саму схему компоновки для отчета о выполнении: после выполнения действия программно заполнить внешний набор данных (таблицу значений) и передать его в компоновщик. Пользователь получает привычный отчет с возможностью отбора и сохранения, а вы — не пишете отдельный макет.
Для длительных операций в управляемом приложении учитывайте, что серверный вызов блокирует форму. Если обработка может идти минутами, рассмотрите выполнение через фоновое задание (в БСП — методы длительных операций) с индикатором прогресса.
Проверка результата и типичные ошибки
После первого запуска обязательно сверьте результат по контрольным точкам: количество обработанных объектов совпадает с ожиданием, значения реквизитов корректны, связанные данные (движения, регистры) не нарушены. Для документов, которые перепроводятся, проверьте, что последовательности и итоги регистров остались актуальными.
Как проверить результат
Совпадает с числом строк в отборе или осмысленно меньше с пояснением причин пропуска
Обработано больше, чем отобрано, или число не объяснимо
Соответствуют задуманному алгоритму на выборочных документах
Значения сдвинуты, пустые или относятся к другому объекту
Документы проведены, движения соответствуют данным документа
Документы остались непроведенными или движения рассинхронизированы
Обработка идемпотентна: повтор не создает дублей и не меняет уже корректные данные
Повторный запуск дублирует записи или портит результат первого
Ограничения и безопасность
Внешние файлы выполняются в безопасном режиме, если администратор не снял ограничение: в нем недоступны операции с файловой системой сервера, COM-объекты и некоторые другие возможности. Если обработка должна выгружать файлы или обращаться к внешним ресурсам, это нужно учесть — либо запрашивать профиль безопасности, либо выносить действие на клиента с явным согласием пользователя.
Права доступа внешний отчет не расширяет: код выполняется под правами текущего пользователя. Это и защита, и источник ошибок — пользователь с урезанными правами получит отказ на записи. Проверяйте права явно и сообщайте о недоступных объектах, а не пропускайте их молча.
Если обработка используется регулярно и критична для учета, правильнее со временем перенести ее в конфигурацию или в расширение: так код попадает под контроль версий, обновляется централизованно и не зависит от того, какой файл кто-то открыл.
Как выбрать действие
Что важно запомнить
Внешний отчет 1С успешно работает как обработка, если добавить в него команды действий и зарегистрировать через механизм дополнительных отчетов и обработок с правильным видом. Все изменения данных выполняйте в транзакции, проверяйте права, тестируйте на копии базы и давайте пользователю отчет о результате выполнения.
Частые вопросы
Можно ли открыть файл .erf как обработку без регистрации в БСП?
Да, через «Файл → Открыть» в режиме Предприятия. Откроется основная форма отчета, и все размещенные на ней команды будут работать. Регистрация в справочнике дополнительных отчетов и обработок нужна только для интеграции в интерфейс: кнопок печати, заполнения, назначения разделов.
Чем отличается команда «ВызовСерверногоМетода» от «ОткрытиеФормы» при регистрации?
«ВызовСерверногоМетода» выполняет процедуру ВыполнитьКоманду в модуле объекта без открытия формы — подходит для быстрых действий вроде заполнения документа. «ОткрытиеФормы» показывает пользователю форму, где он задает параметры и запускает действие сам. Выбор зависит от того, нужен ли диалог перед выполнением.
Почему команда заполнения не появляется в документе после регистрации?
Чаще всего не заполнен список объектов назначения в карточке дополнительной обработки — укажите там нужный вид документа. Также проверьте, что вид обработки задан как «ЗаполнениеОбъекта», а в функции сведений команда объявлена корректно и файл перечитан после изменений.
Безопасно ли открывать внешние отчеты из непроверенных источников?
Нет. Файл содержит исполняемый код, который при открытии может выполнить произвольные действия в пределах прав пользователя. Открывайте только файлы из доверенных источников, при возможности просматривайте модуль в конфигураторе перед запуском и не снимайте безопасный режим без необходимости.
Можно ли внутри внешнего отчета использовать СКД и одновременно менять данные?
Да, это один из главных аргументов за такой формат. Запрос схемы отбирает объекты, результат выводится пользователю, а отдельная команда по тому же отбору выполняет изменение. Важно, чтобы действие и вывод результата были логически разделены и пользователь понимал, какая кнопка что делает.
Что делать, если обработка изменила лишние документы?
Штатной кнопки отмены нет. Варианты: восстановить базу из резервной копии, сделанной до запуска, либо написать обратную обработку, если исходные значения известны или сохранились в журнале. Поэтому перед массовыми операциями всегда делайте копию и по возможности сохраняйте в отчете о выполнении старые значения реквизитов.