Как настроить автоматическую отправку внешнего отчета по расписанию в 1С и исправить ошибку варианта запуска

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

При работе с внешними отчетами в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Розница 2.3, 1С:УНФ 1.6 или 1С:Управление торговлей 11, программисты часто сталкиваются с проблемой: при попытке назначить расписание для команды отчета система выдает ошибку: «Неприменимо для команд с вариантом запуска "Вызов серверного метода"» (или аналогичную для открытия формы). Проанализируем, почему это происходит, и разберем по шагам, как заставить внешний отчет отправляться на почту автоматически.

Выясняем причину ограничения

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

  1. Дополнительные обработки — предназначены для выполнения действий (заполнение документов, очистка данных, обмен). Им разрешено иметь регламентные задания прямо в справочнике.
  2. Дополнительные отчеты — предназначены для получения данных. Для них механизм регламентных заданий в интерфейсе справочника заблокирован, так как для автоматизации отчетов существует отдельный мощный инструмент — Рассылки отчетов.

Посмотрим на программный код типовой конфигурации. В справочнике ДополнительныеОтчетыИОбработки при заполнении команд срабатывает проверка варианта запуска. Если вид объекта — «Отчет», система намеренно выводит предупреждение о неприменимости серверного вызова для регламентного задания, так как ожидает, что вы воспользуетесь механизмом рассылок.

Решение 1: Использование стандартного механизма «Рассылки отчетов»

Это наиболее правильный и «чистый» способ с точки зрения системы. Рассмотрим подробнее, как подготовить отчет, чтобы он появился в списке доступных для рассылки.

Шаг 1. Проверка структуры отчета. Ваш отчет обязательно должен быть выполнен на базе Системы компоновки данных (СКД). Если вы формируете отчет чисто программно в модуле объекта без использования основной схемы компоновки, механизм рассылок его просто не увидит. Проверьте, чтобы в конфигураторе была назначена ОсновнаяСхемаКомпоновкиДанных.

Шаг 2. Корректировка функции регистрации. В модуле объекта внешнего отчета необходимо правильно заполнить сведения. Проанализируем пример кода:


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

Шаг 3. Регистрация и размещение в разделах. После загрузки файла в справочник «Дополнительные отчеты и обработки» крайне важно выполнить два действия:

  1. Нажать на гиперссылку «Разместить в разделах».
  2. Выбрать хотя бы один раздел (например, «Продажи»).

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

Шаг 4. Настройка рассылки. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Рассылки отчетов. Создадим новую рассылку. В поле «Отчеты» теперь можно будет выбрать ваш внешний отчет. Настройте расписание, формат файла (PDF, Excel) и получателей. Проблема решена без написания сложного кода.

Решение 2: Обходной путь через «Дополнительную обработку»

Если вам по какой-то причине (например, сложная программная логика подготовки данных, не укладывающаяся в СКД) нужно именно регламентное задание, мы можем «обмануть» систему, зарегистрировав отчет как обработку. Разберем этот вариант подробнее.

Шаг 1. Меняем тип объекта. В функции СведенияОВнешнейОбработке меняем вид на ДополнительнаяОбработка.


ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
// Теперь используем вызов серверного метода
ДобавитьКоманду(ТаблицаКоманд, "Запустить рассылку выручки", "ВыполнитьРассылку", "ВызовСерверногоМетода", Ложь);

Шаг 2. Реализация серверного метода. Теперь в модуле объекта нам нужно прописать процедуру ВыполнитьКоманду, которая будет делать всю работу за отчет. Проанализируем ситуацию: поскольку это теперь «обработка», кнопка «Сформировать» сама не появится. Нам нужно программно инициализировать СКД и отправить результат на почту.


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

Важное примечание: При таком подходе обязательно установите БезопасныйРежим = Ложь в сведениях о регистрации, иначе 1С заблокирует запись файла на диск и отправку почты.

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

Мы проанализировали два принципиально разных подхода. Подведем итоги:

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

Помните, что ошибка Неприменимо для команд... — это не баг, а указание системы на то, что вы используете инструмент не по назначению. Следуя логике БСП, вы сделаете ваше решение более стабильным и простым в поддержке.

← На главную