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