Как настроить СКД: убрать кэш заголовков, разбить период на произвольные интервалы и сопоставить разные даты

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

Приветствуем вас, уважаемые разработчики! Сегодня мы детально разберем три крайне популярные и одновременно каверзные проблемы, с которыми регулярно сталкиваются специалисты при проектировании отчетов на базе Системы компоновки данных (СКД) в 1С. Эти вопросы часто ставят в тупик из-за неочевидного поведения платформы. Мы подробно проанализируем каждую ситуацию, выясним внутренние причины такого поведения системы и разберем по шагам готовые практические решения.

Проблема 1. Почему СКД упорно выводит старый заголовок и как победить кэширование настроек

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

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

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

Способ 1.1. Сброс к стандартным настройкам в режиме «1С:Предприятие»

Это самый простой и быстрый способ для конечного пользователя или разработчика в процессе отладки. Чтобы заставить систему перечитать настройки из Конфигуратора, выполним следующие действия:

  1. Откроем форму отчета в режиме «1С:Предприятие».
  2. Нажмем кнопку Еще на командной панели отчета.
  3. Выберем пункт Установить стандартные настройки (или перейдем в Выбрать вариант и выберем стандартный предопределенный вариант).

После выполнения этого действия старый кэш в пользовательских настройках будет перезаписан актуальными данными из вашей схемы компоновки.

Способ 1.2. Очистка кэша через административную панель БСП

Если вам необходимо сбросить старые заголовки или варианты настроек сразу у нескольких пользователей централизованно, воспользуемся стандартными возможностями БСП:

  1. Перейдем в раздел НСИ и администрирование (или Администрирование в зависимости от вашей конфигурации).
  2. Найдем пункт Печатные формы, отчеты и обработки и перейдем по ссылке Отчеты.
  3. В появившемся списке найдем наш проблемный отчет.
  4. Развернем список сохраненных вариантов этого отчета и удалим устаревшие пользовательские настройки и варианты.

Способ 1.3. Программный сброс настроек

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


// Пример программного сброса пользовательских настроек для конкретного отчета
Процедура СброситьНастройкиОтчета() Экспорт
    ИмяОтчета = "ИмяВашегоОтчета";
    ОбъектМетаданных = Метаданные.Отчеты[ИмяОтчета];
    
    Если ОбъектМетаданных <> Неопределено Тогда
        // Вызываем метод БСП для сброса сохраненных вариантов и настроек пользователей
        ВариантыОтчетов.СброситьПользовательскиеНастройки(ОбъектМетаданных);
    КонецЕсли;
КонецПроцедуры

Использование этого метода гарантирует, что при первом запуске обновленной конфигурации все пользователи гарантированно увидят новый заголовок и актуальную структуру отчета.

Проблема 2. Как разбить месяц на произвольные интервалы (например, 1–7, 8–14 дни)

Перейдем ко второму вопросу. Иногда стандартных периодов группировки в СКД (таких как день, неделя, декада, месяц) оказывается недостаточно. Бизнес-пользователи могут потребовать разбить данные по специфическим интервалам внутри каждого месяца. Например, нам нужно вывести колонки с 1 по 7 число, с 8 по 14, с 15 по 21, с 22 по 28, а также остаток месяца.

Проанализируем ситуацию: стандартная группировка по неделям здесь не подойдет, так как неделя может начинаться в одном месяце, а заканчиваться в другом, ломая строгую привязку к календарному месяцу. Нам нужны изолированные интервалы внутри каждого конкретного месяца. Разберем два отличных варианта реализации этой задачи.

Вариант А. Использование вычисляемых полей СКД

Этот способ хорош тем, что нам не нужно усложнять сам запрос к базе данных. Запрос остается максимально простым и извлекает базовую дату операции. Всю логику распределения по интервалам мы перекладываем на плечи процессора компоновки данных.

Разберем по шагам настройку вычисляемого поля:

  1. Откроем вкладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новую строку со следующими параметрами:
    • Путь к данным: ИнтервалМесяца
    • Заголовок: "Интервал месяца"
    • Выражение: (см. код ниже)

В поле Выражение напишем следующую логическую конструкцию выбора:


Выбор 
    Когда День(Дата) <= 7 Тогда "01-07"
    Когда День(Дата) <= 14 Тогда "08-14"
    Когда День(Дата) <= 21 Тогда "15-21"
    Когда День(Дата) <= 28 Тогда "22-28"
    Иначе "29+"
Конец

После этого перейдем на вкладку Настройки. В структуре отчета (если вы используете Таблицу) в области Колонки добавим сначала группировку по месяцу (используем системное поле или выражение НАЧАЛОПЕРИОДА(Дата, "МЕСЯЦ")), а внутрь этой группировки поместим подчиненную группировку по нашему новому вычисляемому полю ИнтервалМесяца. Теперь данные будут разложены по заданным периодам внутри каждого месяца.

Вариант Б. Расчет интервалов непосредственно в запросе

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


ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    Продажи.СуммаОбороты КАК Сумма,
    НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК МесяцПериода,
    ВЫБОР
        КОГДА ДЕНЬ(Продажи.Период) <= 7 ТОГДА "01-07"
        КОГДА ДЕНЬ(Продажи.Период) <= 14 ТОГДА "08-14"
        КОГДА ДЕНЬ(Продажи.Период) <= 21 ТОГДА "15-21"
        КОГДА ДЕНЬ(Продажи.Период) <= 28 ТОГДА "22-28"
        ИНАЧЕ "29+"
    КОНЕЦ КАК ИнтервалМесяца
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи

Важное предостережение для обоих вариантов: Если в каком-то интервале (например, с 8 по 14 число) не было совершено ни одной операции, эта колонка просто пропадет из результирующей таблицы отчета. Чтобы пустые интервалы гарантированно выводились на экран (даже с нулевыми значениями), вам потребуется в тексте запроса сделать левое соединение вашей таблицы продаж с искусственным календарем-генератором, содержащим все интервалы для выбранного периода.

Проблема 3. Как сопоставить разные даты (счет в апреле, оплата в мае) в одной шкале периодов

Это классическая проблема многомерного анализа данных в СКД. Представим ситуацию: у нас есть счета на оплату, выставленные в апреле, и платежные поручения, подтверждающие их оплату в мае. Пользователь хочет видеть горизонтальную временную шкалу по месяцам (Апрель, Май, Июнь...), где сумма счета попадет строго в колонку «Апрель», а сумма оплаты по этому же счету — строго в колонку «Май».

Если вы попытаетесь связать эти данные напрямую и сгруппировать по дате счета, то оплата майская привяжется к апрелю. Если сгруппируете по дате оплаты — апрельский счет «переедет» в май. Нам необходимо выполнить нормализацию данных, объединив разные временные показатели в единую хронологическую шкалу. Рассмотрим два профессиональных метода реализации этой задачи.

Способ 3.1. Нормализация данных через предложение ОБЪЕДИНЕНИЕ ВСЕ в запросе

Этот подход является наиболее производительным и рекомендуемым для большинства задач. Мы разделяем одну строку (где есть и счет, и оплата) на две независимые записи с общим виртуальным полем Период. Посмотрим на структуру такого запроса:


// Объединяем начисления (счета) и движения денежных средств (оплаты) в единую таблицу
ВЫБРАТЬ
    Счет.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(Счет.Дата, МЕСЯЦ) КАК Период,
    Счет.СуммаДокумента КАК СуммаСчета,
    0 КАК СуммаОплаты
ИЗ
    Документ.СчетНаОплату КАК Счет
ГДЕ
    Счет.Проведен = ИСТИНА

ОБЪЕДИНЕНИЕ ВСЕ

ВЫБРАТЬ
    Оплата.Контрагент КАК Контрагент,
    НАЧАЛОПЕРИОДА(Оплата.Дата, МЕСЯЦ) КАК Период,
    0 КАК СуммаСчета,
    Оплата.СуммаДокумента КАК СуммаОплаты
ИЗ
    Документ.ОплатаПокупателя КАК Оплата
ГДЕ
    Оплата.Проведен = ИСТИНА

После того как текст запроса готов, правильно настроим СКД:

  1. Перейдем на вкладку Ресурсы и сделаем поля СуммаСчета и СуммаОплаты ресурсами (с функцией Сумма(СуммаСчета) и Сумма(СуммаОплаты) соответственно).
  2. Перейдите на вкладку Настройки.
  3. Добавьте в структуру отчета таблицу. В Строки таблицы поместите группировку по полю Контрагент.
  4. В Колонки таблицы поместите группировку по полю Период (оформив его представление как Месяц).
  5. В область Выбранные поля добавьте ваши ресурсы СуммаСчета и СуммаОплаты.

Теперь система отработает идеально: за апрель вы увидите сумму выставленного счета, а за май — сумму пришедшей оплаты, и все это будет находиться в рамках одной красивой и понятной таблицы.

Способ 3.2. Объединение наборов данных средствами СКД

Если исходные запросы для получения счетов и оплат слишком сложные, громоздкие или собираются из разных источников, использовать один тяжелый SQL-запрос с ОБЪЕДИНЕНИЕ ВСЕ может быть неудобно. В таком случае на помощь приходит встроенный механизм СКД по объединению наборов данных:

  1. В схеме компоновки данных создайте Набор данных - запрос с именем НаборДанныхСчета. Напишите туда запрос, извлекающий данные по счетам. Поле даты назовите Период, сумму — СуммаСчета.
  2. Создайте второй Набор данных - запрос с именем НаборДанныхОплаты. Напишите туда запрос, извлекающий оплаты. Поле даты также назовите Период, сумму — СуммаОплаты.
  3. Правой кнопкой мыши кликните по корневому элементу дерева наборов данных и добавьте Набор данных - объединение. Назовите его, например, ОбъединениеДанных.
  4. Перетащите мышкой оба созданных ранее набора данных внутрь этого объединения.
  5. На вкладке сопоставления полей убедитесь, что поля Контрагент и Период из обоих наборов сопоставлены друг с другом.

При формировании отчета процессор СКД самостоятельно выполнит аналог операции UNION ALL на уровне внутренней обработки данных, предоставив вам единую аналитическую картину.

Мы подробно рассмотрели три важнейших аспекта разработки сложных отчетов в СКД. Надеемся, что эти практические приемы помогут вам создавать быстрые, точные и удобные отчеты для ваших пользователей. Успешной разработки!

← На главную