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