Как настроить автоматическую отправку отчета «Ведомость по товарам на складах с ценами и резервом» на электронную почту

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Автоматизация отчетности — одна из ключевых задач в работе с современными конфигурациями 1С. Часто руководители или менеджеры хотят получать актуальные остатки товаров с ценами и резервами каждое утро, не заходя в саму программу. Разберем, как реализовать механизм ежедневной рассылки такого отчета, почему прямой запрос к базе данных часто не дает нужного результата и как правильно использовать возможности платформы.

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

Наиболее правильным и надежным способом является использование встроенного механизма БСП (Библиотеки стандартных подсистем) — Рассылка отчетов. Это решение не требует написания кода и отлично подходит для типовых конфигураций, таких как УТ 11, ERP 2 или КА 2.

Проанализируем шаги по настройке этого механизма:

  1. Перейдем в раздел Администрирование (или «НСИ и администрирование») — Печатные формы, отчеты и обработки — Рассылки отчетов.
  2. Создадим новую рассылку. В поле «Отчет» выберем «Ведомость по товарам на складах».
  3. Важный нюанс: Отчет с ценами и резервами часто является не отдельным объектом, а вариантом отчета. В настройках рассылки обязательно укажите именно нужный вариант из списка доступных.
  4. На вкладке «Расписание» установим флаг «Выполнять по расписанию» и настроим ежедневный запуск, например, в 8:00 утра.
  5. На вкладке «Доставка (Email)» укажем адрес получателя и текст письма.
  6. На вкладке «Настройки отчета» проверим параметры: выберем нужный Вид цены и убедимся, что установлены правильные отборы по складам или группам номенклатуры.

Этот метод хорош тем, что 1С сама сформирует отчет, упакует его в нужный формат (PDF, Excel, MXL) и отправит через системную учетную запись почты.

Почему не получается просто «вытащить запрос» из отчета?

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

Динамическое формирование текста: В современных отчетах итоговый запрос не является статичным. Система компоновки данных модифицирует его «на лету» в зависимости от настроек пользователя, добавляя соединения с регистрами цен или остатков только тогда, когда выбраны соответствующие поля. Если вы просто скопируете текст из конфигуратора, вы можете не получить данные по резервам или ценам, так как они могут рассчитываться через внешние наборы данных или сложные вычисляемые поля.

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

Решение 2: Программное подключение к отчету через СКД

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

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


// Получаем объект отчета
ОтчетОбъект = Отчеты.ВедомостьПоТоварамНаСкладах.Создать();

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

Если ВариантНастройки <> Неопределено Тогда
    Настройки = ВариантНастройки.Настройки;
Иначе
    Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
КонецЕсли;

// Устанавливаем обязательные параметры (например, дату)
ПараметрДата = Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
Если ПараметрДата <> Неопределено Тогда
    ПараметрДата.Значение = ТекущаяДата();
    ПараметрДата.Использование = Истина;
КонецЕсли;

// Подготавливаем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, Настройки);

// Выполняем компоновку
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// Выводим результат в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Сохраняем во временный файл для отправки
ПутьКФайлу = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Проанализируем этот подход. Мы используем КомпоновщикМакетаКомпоновкиДанных и ПроцессорКомпоновкиДанных. Это гарантирует, что отчет будет сформирован именно так, как его видит пользователь в интерфейсе, со всеми группировками, итогами и оформлением.

Важные технические нюансы

При реализации автоматической отправки важно учитывать следующие моменты:

  1. Права доступа: Регламентное задание, которое будет выполнять отправку, обычно запускается под определенным системным пользователем. Убедитесь, что у этого пользователя есть права на чтение регистров ТоварыНаСкладах, ЦеныНоменклатуры и СвободныеОстатки (или аналогичных в вашей конфигурации).
  2. Настройка цен: Отчет «Ведомость по товарам на складах с ценами» требует обязательного указания типа цен в параметрах. Если параметр не заполнен программно, отчет будет пустым.
  3. Фоновое выполнение: В клиент-серверном варианте (SQL) формирование отчета происходит на стороне сервера. Убедитесь, что на сервере 1С настроена системная учетная запись почты, иначе метод ОтправитьПочту может выдать ошибку прав или отсутствия профиля.
  4. Резервы: Данные по резервам могут существенно зависеть от того, используется ли на предприятии ордерная схема. Если вы используете программный вызов, проверьте, учитывает ли ваш ВариантНастройки все необходимые регистры заказов.

Выясним причину, по которой иногда проще «допилить» копию отчета. Если вам нужно очень специфическое поведение (например, фильтрация данных в зависимости от того, какому менеджеру уходит письмо), вы можете создать копию типового отчета в конфигураторе. В модуле объекта этого отчета можно добавить экспортную процедуру, которая будет сама заполнять настройки и возвращать готовый ТабличныйДокумент. Это упростит код внешней обработки-рассыльщика.

Таким образом, для большинства задач идеально подходит Рассылка отчетов. К программному коду стоит прибегать только в случае уникальных требований к логике формирования или отправки файлов.

← На главную