При разработке отчетов на базе Схемы компоновки данных (СКД) разработчики часто сталкиваются с типовыми задачами, которые вызывают вопросы как у новичков, так и у опытных специалистов. К таким задачам относятся: правильная установка временных границ (например, получение данных строго на конец месяца с учетом последней секунды суток), настройка гибких отборов по нескольким элементам или счетам учета, а также работа со сложными источниками данных. В этой статье мы подробно разберем все эти сценарии, изучим механизмы платформы 1С:Предприятие и решим возникающие проблемы оптимальными способами.
Очень распространенная проблема при формировании отчетов — это потеря документов и движений, проведенных в самый последний день периода. По умолчанию, если пользователь выбирает дату (например, 31 октября 2023 года), система может интерпретировать ее как начало дня, то есть 31.10.2023 00:00:00. В результате все операции, совершенные в течение этого дня, просто не попадут в отчет. Нам необходимо сделать так, чтобы дата автоматически сдвигалась на конец дня или месяца — 31.10.2023 23:59:59.
Рассмотрим три основных способа решения этой задачи в зависимости от архитектуры вашего отчета.
Способ 1. Использование функций языка запросов
Если данные выбираются стандартным запросом, мы можем преобразовать параметр даты непосредственно при обращении к таблицам базы данных. Для этого в языке запросов предусмотрена функция КОНЕЦПЕРИОДА. Проанализируем пример использования этой функции при получении остатков по регистру бухгалтерии:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК Счет,
ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(КОНЕЦПЕРИОДА(&ПериодОтчета, МЕСЯЦ), , , ) КАК ХозрасчетныйОстатки
В данном случае, какой бы день месяца ни указал пользователь в параметре &ПериодОтчета, платформа автоматически рассчитает дату последнего дня этого месяца и установит время на 23:59:59. Это гарантирует полноту и достоверность выводимых данных.
Способ 2. Выражения параметров в СКД (без изменения запроса)
Бывают ситуации, когда редактировать сам текст запроса нежелательно или невозможно (например, если используется типовой отчет или запрос слишком сложен). В СКД реализован прекрасный альтернативный механизм — выражения параметров. Разберем по шагам, как настроить автосдвиг даты на вкладке «Параметры»:
КонецПериода).КонецПериода(&КонецПериода, "Месяц"). Если требуется округление до конца дня, используем: КонецПериода(&КонецПериода, "День").Система самостоятельно выполнит это преобразование перед передачей параметра в СУБД, избавив нас от необходимости вручную дописывать код в запросе.
Способ 3. Использование типа «СтандартныйПериод»
Для обеспечения максимального удобства пользователей рекомендуется использовать специальный тип данных СтандартныйПериод. Вместо двух отдельных полей ввода дат начала и окончания на форме отчета появится одно удобное поле с возможностью быстрого выбора («Этот месяц», «Прошлый квартал», «Этот год» и т.д.). Выясним, как связать стандартный период с параметрами запроса:
ПериодОтчета и установим для него тип СтандартныйПериод.&НачалоПериода и &КонецПериода установим флажок Ограничение доступности. Это скроет их от пользователя, чтобы не загромождать интерфейс.&НачалоПериода укажем: &ПериодОтчета.ДатаНачала.&КонецПериода укажем: &ПериодОтчета.ДатаОкончания.Преимущество этого метода заключается в том, что платформа 1С автоматически приводит свойство ДатаОкончания к концу выбранного интервала с точностью до секунды. Это полностью исключает возникновение ошибок, связанных с человеческим фактором при ручном вводе дат.
В процессе обсуждения часто можно встретить мнение, что построить отчет в СКД без использования классического SQL-подобного запроса невозможно. Это глубокое заблуждение. Компоновка данных умеет работать не только с наборами данных типа «Запрос», но и с наборами типа «Объект».
Представим ситуацию, когда данные для отчета необходимо получить из внешнего файла (например, Excel или JSON), рассчитать по сложному алгоритму во временных таблицах в коде модуля или запросить через веб-сервис из сторонней ERP-системы. В таких случаях мы можем сформировать обычную ТаблицаЗначений на сервере, а затем передать ее в СКД для отрисовки, группировки и оформления.
Посмотрим на пример программной инициализации и вывода отчета на основе внешнего набора данных. Сначала в схеме компоновки данных мы добавляем Набор данных - объект, указываем его имя (например, ВнешнийИсточник) и описываем структуру колонок (полей). Затем пишем следующий код:
// 1. Создаем и заполняем таблицу значений на встроенном языке
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Счет", Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"));
ТаблицаДанных.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
// Наполним таблицу демонстрационными данными
СтрокаДанных = ТаблицаДанных.Добавить();
СтрокаДанных.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
СтрокаДанных.Сумма = 145000.50;
СтрокаДанных = ТаблицаДанных.Добавить();
СтрокаДанных.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("26");
СтрокаДанных.Сумма = 89000.00;
// 2. Подготавливаем внешние наборы данных для процессора компоновки
ВнешниеДанные = Новый Структура;
ВнешниеДанные.Вставить("ВнешнийИсточник", ТаблицаДанных);
// 3. Выполняем стандартный программный вывод отчета СКД
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеДанные);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат); // Результат - это ТабличныйДокумент на форме
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Таким образом, мы получаем всю мощь настроек СКД (пользовательские группировки, условное оформление, сортировки, отборы) для данных, которые изначально даже не находились в базе данных 1С!
Когда пользователю требуется сформировать отчет не по одному конкретному счету, а сразу по нескольким (например, проанализировать затраты по счетам 20, 25 и 26), стандартный отбор с видом сравнения «Равно» не подходит. Разберем, как правильно реализовать множественный выбор.
В настройках отчета на форме или в конфигураторе в качестве вида сравнения вместо знака равенства необходимо выбрать:
Если отбор накладывается внутри запроса через параметры (например, в условиях виртуальной таблицы), обязательно обратите внимание на настройку этого параметра в СКД. Перейдите на вкладку Параметры и убедитесь, что для соответствующего параметра (например, &СписокСчетов) установлен флажок Доступен список значений. Если этого не сделать, система выдаст ошибку при попытке передать массив или список значений в качестве параметра.
Для удобства конечного пользователя не забудьте вынести этот отбор в категорию Быстрые настройки. Тогда поле для выбора списка счетов будет отображаться прямо в верхней части формы отчета, и пользователю не придется открывать дополнительные диалоговые окна настроек.
Иногда при выгрузке данных или интеграции отчетов с внешними системами требуется получить текстовое представление Уникального Идентификатора (UUID) ссылки прямо в отчете. Посмотрим, как это сделать оптимально на разных версиях платформы.
Начиная с версии платформы 1С:Предприятие 8.3.22, разработчикам доступна встроенная функция языка запросов УникальныйИдентификатор(). Мы можем использовать ее напрямую:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
УникальныйИдентификатор(Контрагенты.Ссылка) КАК УИН
ИЗ
Справочник.Контрагенты КАК Контрагенты
Если же вы работаете на более старых версиях платформы, где функция УникальныйИдентификатор() в запросах еще не поддерживалась, эту задачу можно элегантно решить средствами СКД с помощью Вычисляемых полей:
УИН.XMLСтрока(Ссылка). Платформа автоматически преобразует переданную ссылку в строковый формат GUID.ОбщегоНазначения.ПолучитьУникальныйИдентификаторСтрокой(Ссылка).Изученные нами приемы позволяют гибко управлять поведением СКД, делать отчеты удобными для пользователей, избегать досадных ошибок с потерей данных на границах временных периодов и успешно решать сложные интеграционные задачи.