При работе с внешними отчетами в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Розница 2.3, 1С:УНФ 1.6 или 1С:Управление торговлей 11, программисты часто сталкиваются с проблемой: при попытке назначить расписание для команды отчета система выдает ошибку: «Неприменимо для команд с вариантом запуска "Вызов серверного метода"» (или аналогичную для открытия формы). Проанализируем, почему это происходит, и разберем по шагам, как заставить внешний отчет отправляться на почту автоматически.
Для начала разберем архитектуру БСП. В типовых решениях механизмы ДополнительныеОтчетыИОбработки и РегламентныеЗадания имеют четкое разделение ролей. Разработчики 1С заложили следующую логику:
Посмотрим на программный код типовой конфигурации. В справочнике ДополнительныеОтчетыИОбработки при заполнении команд срабатывает проверка варианта запуска. Если вид объекта — «Отчет», система намеренно выводит предупреждение о неприменимости серверного вызова для регламентного задания, так как ожидает, что вы воспользуетесь механизмом рассылок.
Это наиболее правильный и «чистый» способ с точки зрения системы. Рассмотрим подробнее, как подготовить отчет, чтобы он появился в списке доступных для рассылки.
Шаг 1. Проверка структуры отчета. Ваш отчет обязательно должен быть выполнен на базе Системы компоновки данных (СКД). Если вы формируете отчет чисто программно в модуле объекта без использования основной схемы компоновки, механизм рассылок его просто не увидит. Проверьте, чтобы в конфигураторе была назначена ОсновнаяСхемаКомпоновкиДанных.
Шаг 2. Корректировка функции регистрации. В модуле объекта внешнего отчета необходимо правильно заполнить сведения. Проанализируем пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
ПараметрыРегистрации.Вставить("Наименование", "Отчет по выручке (рассылка)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Для отчета, который будет в рассылках, лучше использовать ОткрытиеФормы
ДобавитьКоманду(ТаблицаКоманд, "Сформировать отчет", "ВыручкаКоманда", "ОткрытиеФормы", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 3. Регистрация и размещение в разделах. После загрузки файла в справочник «Дополнительные отчеты и обработки» крайне важно выполнить два действия:
Если отчет не привязан к разделу интерфейса, подсистема рассылок не сможет его обнаружить.
Шаг 4. Настройка рассылки. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Рассылки отчетов. Создадим новую рассылку. В поле «Отчеты» теперь можно будет выбрать ваш внешний отчет. Настройте расписание, формат файла (PDF, Excel) и получателей. Проблема решена без написания сложного кода.
Если вам по какой-то причине (например, сложная программная логика подготовки данных, не укладывающаяся в СКД) нужно именно регламентное задание, мы можем «обмануть» систему, зарегистрировав отчет как обработку. Разберем этот вариант подробнее.
Шаг 1. Меняем тип объекта. В функции СведенияОВнешнейОбработке меняем вид на ДополнительнаяОбработка.
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
// Теперь используем вызов серверного метода
ДобавитьКоманду(ТаблицаКоманд, "Запустить рассылку выручки", "ВыполнитьРассылку", "ВызовСерверногоМетода", Ложь);
Шаг 2. Реализация серверного метода. Теперь в модуле объекта нам нужно прописать процедуру ВыполнитьКоманду, которая будет делать всю работу за отчет. Проанализируем ситуацию: поскольку это теперь «обработка», кнопка «Сформировать» сама не появится. Нам нужно программно инициализировать СКД и отправить результат на почту.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыполнитьРассылку" Тогда
// 1. Получаем схему и настройки
ЭтотОбъект = РеквизитФормыВЗначение("Объект"); // Если вызывается из формы
// Или загружаем схему напрямую из макета
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
// 2. Формируем отчет в ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// 3. Сохраняем и отправляем (нужно настроить учетную запись почты)
ПутьКФайлу = КаталогВременныхФайлов() + "Отчет.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
// Здесь должен быть ваш код отправки письма через встроенные средства 1С
КонецЕсли;
КонецПроцедуры
Важное примечание: При таком подходе обязательно установите БезопасныйРежим = Ложь в сведениях о регистрации, иначе 1С заблокирует запись файла на диск и отправку почты.
Мы проанализировали два принципиально разных подхода. Подведем итоги:
Помните, что ошибка Неприменимо для команд... — это не баг, а указание системы на то, что вы используете инструмент не по назначению. Следуя логике БСП, вы сделаете ваше решение более стабильным и простым в поддержке.