1с ускорить вывод отчета скд

Обновлено: 06.07.2024

Дабы избежать комментариев типа "тоже мне открытие!", оговорюсь сразу: статья рассчитана на неискушённых СКД-разработчиков, тем кто это и так знает не обязательно высказывать своё "фи!", поймите, то что очевидно для вас - не всегда бывает очевидно остальным.

Для наглядного представления реализации части трюков я сделал небольшие заготовки в виде внешних схем СКД. Описание трюков и скриншоты постарался делать так, чтобы суть и техника реализации трюка были понятны без необходимости скачивания схем. Для кого-то этого будет вполне достаточно, но если что-то непонятно, то всегда можно скачать соответствующую схему и посмотреть непосредственно реализацию.

Трюк №1. Многоликость правого значения.

Итак, для разогрева начнём с чего-нибудь попроще. В таких механизмах СКД, как "Отбор" или "Условное форматирование" вы наверняка сталкивались с колонками "Поле" (или "Левое значение") и "Значение" (или "Правое значение"). Профессионалы, наверняка знают этот трюк, но начинающим не всегда легко догадаться, что поле компоновки данных можно использовать как слева, так и справа (т.е. сравнивать не только заданные фиксированные значения, но и другие поля СКД в пределах одной строки). Для этого достаточно в поле правого значения зайти в режим редактирования, нажать кнопку очистки значения ("кретик"), затем нажать появившуюся кнопку выбора типа (буква "Т") и выбрать тип "Поле компоновки данных".

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" - найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:



Трюк №2. Отбор на группировках.

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

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) - по статьям затрат.

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный".
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:



Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

Следующий трюк можно представить, как продолжение предыдущего. Если вы обратили внимание, в получившемся отчёте несмотря на то, что фактически у нас выводится только одно субконто, в шапку попадают оба (и "Субконто1" и "Субконто2"). К сожалению разработчики СКД не предусмотрели возможность регулирования видимостью шапки или использования какого-нибудь служебного символа, при установке которого в качестве заголовка, шапка поля бы не формировалась. Но, как вы уже, наверное, догадались есть трюк, который в какой-то степени поможет обойти данное ограничение.

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!


А затем задайте для группировки "Субконто2" имя "Невидимка":


И вуаля. шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:


Спросите, почему макет оформления задаётся через имя, а не через указание конкретного поля группировки? Просто так получается более универсальное решение и впоследствии это имя группировки можно задать в вариантах отчёта на любой группировке, а вот менять предопределённый макет в вариантах уже не получится.

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь

Большинство разработчиков СКД знают, как можно задать заголовок поля запроса. На закладке СКД "Наборы данных", достаточно поставить галочку отмены автозаголовка и внести в поле "Заголовок" необходимый текст. Минус состоит в том, что в пользовательском режиме, этот способ недоступен, а переименовать заголовок хочется не прибегая к помощи конфигуратора. Так вот в настройках вариантов отчёта есть не только способ переименовать заголовки полей, но и "накрыть" их группировочной "шапкой". Для этого на закладке "Выбранные поля" необходимо выделить нужные поля и нажать правую кнопку мыши. Как видно на скриншоте для полей доступны опции "Установить заголовок" и "Сгруппировать поля".
Обратите внимание, что для полей группировок установку заголовка необходимо делать также именно через закладку "Выбранные поля", а не через контекстное меню "Установить имя" в верхней (структурной) части настройки варианта!




После всех настроек вариант отчёта выглядит вот так:




P.S.
Небольшая подсказка для тех, кто будет качать схему. Схема - одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:

Доброго времени суток.
История началась с того, что расчет себестоимости (УПП 1.3.151, используется РАУЗ) стал выполняться больше 24 часов. Запустив из конфигуратора (копии базы) обычное приложения и включив замер производительности, я запустил на ночь расчет себестоимости.
По результатам замера получилось, что больше всего времени (98%) занимается строка в общем модуле УчетЗатрат :
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести(ПроцессорКомпоновкиДанных)

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

По сути эта процедура с помощью компоновщика макета компоновки данных "генерирует" макет на основании схемы компоновки и настроек компоновки (последний получаются на основе схемы и настройки базы отдельной функцией, затем на нее накладываются параметры для конкретной строки правил ). А потом с помощью процессора компоновки данных и процессора вывода результата компоновки данных в коллекцию значений возвращает коллекцию значений (а именно, таблицу значений), которая присваивается реквизиту строки таблицы правил распределения .

И именно при вызове метода вывести тратиться огромное количество времени.
Чтобы не возиться с модулей я сделал обработку (сначала на обычной, потом на управляемой для выполнения кода на сервере, т.к. модуль "учет затрат" именно серверный), которая по сути проделывает часть алгоритма обработки проведения до проблемного места.

По началу в обработке вывод выполнялся относительно быстро (за 5-10 минут, наверно, не больше). Я уже обрадовался (тогда я выяснил, что возвращается таблица значений с базой, в которой около 32 тыс. строк), но после выходных, вывод стал занимать по 3 часа без результата (я просто закрывал отладку, не дождавшись). Тогда я связал быстрый вывод с перезапуском сервера 1С перед выходными.

Затем, я заменил часть кода, чтобы вывод был поэлементно. И вот тут всплыл интересный (для меня момент), т.к. при всех вызовах функции получение именно третьего элемента процессором вывода .
В обработке я сделал сохранение схемы компоновки в файл для изучения. Загрузив схему компоновки в консоль СКД я обнаружил, что:
1) стоит ограничение на параметры Организация (по ней отбирается одна аналитика для регистра учета затрат), Дата начала и дата окончания (используется для обращения к параметров виртуальной таблицы с оборотами регистра учета затрат).
2) вывод в коллекцию значений выполнялся быстро (5-10 минут по сравнению с несколькими часами).

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

Сам в СКД я не силен, поэтому обращаюсь с вопросом: почему в модуле вывод в коллекцию может длиться так долго (тем более по сравнению с консолью), учитывая, что это схема создается на основании "типовой" (есть макет у регистра учет затрат), да и остальной функционал РАУЗа не изменялся.
Я подозревал и платформу (для упп рекомендована 8.3.14, а у нас стоит 8.3.12), но в описании новых версий нет ничего про изменения СКД. Потом было подозрение на сам сервер 1С (учитывая, что модуль выполняется на сервере).

Сталкивался ли кто-нибудь с подобным поведение процессора вывода результата?
Заранее, благодарю. Схему компоновки я прикрепил в файлах.

Поток вопросов по СКД в Мастер-группе не прекращается. Сегодняшняя подборка тому подтверждение. Вопросы связаны и с платформенными изменениями самой системы компоновки данных, и с развитием БСП, и с расширением практик применения СКД в современных типовых решениях.


Вопрос №1: “Почему могут быть не доступны варианты отчетов на СКД в пользовательском режиме?”

Несколько раз сталкивался с тем, что варианты отчета, настроенные в конфигураторе, в пользовательском режиме не видны или виден только Основной вариант. Из этого я даже сделал вывод, что больше одного предопределенного варианта делать не имеет смысла. Судя по всему, вывод мой неправильный, в тестовой базе не воспроизводится. Почему могут быть не видны варианты и как это “лечить”?

Ответ

Если такая база базируется на БСП, то тут еще могут влиять механизмы БСП. Например, пользователю по ограничениям доступа недоступен конкретный вариант отчета, поэтому он его и не видит. Также для подсистемы БСП “Варианты отчетов” в общем модуле ВариантыОтчетовПереопределяемый в процедуре НастроитьВариантыОтчетов нужно явно описывать используемые варианты отчетов и запустить приложение с ключом ЗапуститьОбновлениеИнформационнойБазы.

Пример подключения отчетов к подсистеме “Варианты отчетов” есть на странице нашего сайта – Подключение отчетов к подсистеме “Варианты отчетов”. Возможно, в вашем случае какое-то из описанных действий не было выполнено.


Вопрос №2: “Можно ли делать отбор на уровне детальных записей по вычисляемым полям в СКД?”

Ошибка

(нажмите, чтобы увеличить картинку)

Ответ

Ошибка не будет возникать, если для отбора на уровне детальных записей изменить настройку Применение – указать значение “После группировки или для иерархии”:

Исправление ошибки

(нажмите, чтобы увеличить картинку)

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


Вопрос №3: “В каком случае можно установить значения параметров в процедуре ПередКомпоновкойМакета модуля менеджера отчета?”

В видео-уроке есть пример, где параметры отчета определяются и устанавливаются в модуле менеджера этого отчета в процедуре ПередКомпоновкойМакета(). Мне непонятно вот что:

Модуль менеджера

Ответ

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

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

Следовательно, в модуле менеджера отчета можно доработать компоновщик, например, установить значения параметров. Инициируется этот вызов в процедуре ПриКомпоновкеРезультата.

Подобные фрагменты кода есть и в других конфигурациях, основанных на БСП, например, в УТ 11. Получается, что для доработок отчетов на БСП есть универсальные точки входа, где можно размещать свой код. В отчетах для конфигураций не на БСП этот подход работать не будет.

  1. Это зависит от того, для какой конфигурации разрабатывается отчет. Если конфигурация создается с нуля, то такой метод из модуля менеджера просто некому будет вызвать. Если конфигурация базируется на БСП, то можно “подсмотреть” в типовых отчетах, как они разработаны. Также в документации по БСП, размещенной на сайте ИТС, можно изучить подробное устройство подсистемы Варианты отчетов.
  2. Да, во внешних отчетах и обработках в принципе не существует модуля менеджера.


Вопрос №4: “Как вывести изображение в колонтитулах отчета на СКД?”

Подскажите, есть ли возможность в колонтитулах отчета выводить изображение (например, логотип фирмы)?

Ответ

Да, начиная с платформы 8.3.15 появилась возможность добавить картинку в колонтитул.

В конфигураторе это можно сделать в меню Таблица – Настройки печати – Колонтитулы:

Картинка в колонтитул

(нажмите, чтобы увеличить картинку)


Вопрос №5: “Каким образом можно программно получать настройки отчета на СКД?”

Насколько я понимаю, чтобы учесть значения, заданные пользователем на форме, нужно получать настройки так:

Но во многих видео настройки получаются такой строкой:

И далее по этим настройкам формируется отчет. Почему так? Зачем нам могут быть нужны настройки, которые не содержат значений, заданных пользователем? В каких случаях и каким способом нужно получать настройки?

Ответ

Чтобы решить, какие именно настройки следует использовать, нужно задавать себе вопрос “Отчет с какими настройками мне нужно сформировать для решения поставленной задачи?”

  1. Чаще всего на практике нужно учитывать пользовательские настройки, значит, используем метод:

В таком случае из компоновщика получаем настройки, которые уже включают в себя и пользовательские, и фиксированные настройки. С этими “результирующими” настройками компонуем отчет. В методе ПриКомпоновкеРезультата в модуле отчетов чаще всего встречается именно этот вариант

  1. Если нужно взять настройки не из компоновщика, а из схемы компоновки, то воспользуемся настройками по умолчанию:

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

  1. СКД часто используется в обработках – для заполнения ТЧ, списка справочников или документов для обработки. Настройки компоновщика размещаются на форме, пользователь может их редактировать – настраивать отборы по своему усмотрению. А пользовательские настройки в таком случае не используются, поскольку мы не отчет разрабатываем, а всего лишь обработку. Значит, можно взять настройки из компоновщика:
Это примеры разобранных вопросов из Мастер-группы курса
Профессиональная разработка отчетов в 1С 8.3 на СКД .

Комментарии / обсуждение (2):

Добрый день!
Подскажите пожалуйста, проблема с округлением Вычисляемого поля в СКД:

Добрый день!
Без данных и конкретного отчета, конечно, трудно определить причину.

Пришла в голову идея, что разные результаты получаются, потому что

Таблица

Пример.

Предполагаю, что разные числа перемножаются, поэтому и результаты разные.

Читайте также: