Как программно сформировать и сохранить отчет СКД с пользовательскими настройками

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

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

Понимание механизмов хранения настроек в СКД

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

  1. Настройки (Объект НастройкиКомпоновкиДанных): Это основной каркас отчета (структура группировок, выбранные поля).
  2. Пользовательские настройки (Объект ПользовательскиеНастройкиКомпоновкиДанных): Это те параметры и отборы, которые пользователь вынес на форму для быстрого изменения.

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

Способ 1: Использование Библиотеки стандартных подсистем (БСП)

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


// Предположим, ВариантСсылка — это элемент справочника "Варианты отчетов"
НастройкиСтруктура = ВариантыОтчетов.НастройкиВарианта(ВариантСсылка);

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

// Загружаем основные настройки варианта
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиСтруктура.Настройки);

// Загружаем пользовательские настройки (отборы, параметры на форме)
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НастройкиСтруктура.ПользовательскиеНастройки);

// Важно выполнить восстановление для синхронизации настроек
ОтчетОбъект.КомпоновщикНастроек.Восстановить();

После этого можно приступать к компоновке результата в ТабличныйДокумент и его сохранению.

Способ 2: Хранение настроек в макете (статичный метод)

Иногда требуется зафиксировать определенную конфигурацию отчета, которая не должна зависеть от изменений пользователя в интерфейсе. В этом случае мы можем настроить отчет один раз, сохранить его настройки в XML-файл и добавить в конфигурацию как макет типа «Текстовый документ».

Разберем алгоритм действий:

  1. В режиме «1С:Предприятие» настройте отчет и сохраните настройки в XML через стандартное меню.
  2. Создайте макет в отчете или обработке, назовите его НастройкиВариантаXML и вставьте туда содержимое файла.
  3. Используйте следующий код для инициализации отчета:

// Читаем текст из макета
ТекстНастроек = ПолучитьМакет("НастройкиВариантаXML").ПолучитьТекст();

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстНастроек);

// Десериализация настроек из XML
НастройкиВарианта = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("НастройкиКомпоновкиДанных"));

ОтчетОбъект = Отчеты.АнализНачисленийИУдержаний.Создать();
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиВарианта);

// Формируем отчет
ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабДок);
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Программная корректировка параметров (Дата, Период)

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

Посмотрим на пример правильной установки параметра Период:


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

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

Типичные ошибки и способы их решения

Проанализируем распространенную ошибку: «Отчет не сформирован. Включите хотя бы одну группировку...». Эта ситуация возникает, когда вы создаете новый объект НастройкиКомпоновкиДанных и пытаетесь загрузить его в компоновщик. По умолчанию новый объект пуст — в нем нет ни выбранных полей, ни структуры группировок.

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


ОтчетОбъект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОтчетОбъект.СхемаКомпоновкиДанных));

Работа через системное хранилище

Если конфигурация не использует БСП, мы можем обратиться напрямую к платформенному хранилищу вариантов. Выясним, как получить настройку по её имени (представлению):


КлючОбъекта = "Отчет.ВедомостьПоТоварамНаСкладах";
СписокВариантов = ХранилищеВариантовОтчетов.Выбрать(КлючОбъекта);

Пока СписокВариантов.Следующий() Цикл
    Если СписокВариантов.Представление = "Мой Пользовательский Вариант" Тогда
        КлючНастроек = СписокВариантов.КлючНастроек;
        Настройки = ХранилищеВариантовОтчетов.Получить(КлючОбъекта, КлючНастроек);
        
        ОтчетОбъект = Отчеты.ВедомостьПоТоварамНаСкладах.Создать();
        ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
        Прервать;
    КонецЕсли;
КонецЦикла;

Важный нюанс при работе в фоне: Если код выполняется в регламентном задании (на сервере без контекста пользователя), убедитесь, что у пользователя, под которым запущена служба 1С, достаточно прав для чтения настроек других пользователей, либо настройки должны быть помечены как "Общие".

Подводя итог, отметим, что наиболее стабильным решением является использование методов БСП ВариантыОтчетов.НастройкиВарианта(), так как они автоматически учитывают и структуру варианта, и пользовательские изменения, обеспечивая полную идентичность программно сформированного отчета тому, что видит пользователь на экране.

← На главную