Как в СКД настроить заполнение параметра по умолчанию (Текущая Дата)?

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

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

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

---

Метод 1. Использование поля «Выражение» в параметрах СКД (Декларативный способ)

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

Выполним настройку по шагам:

  1. Откроем схему компоновки данных нашего отчета и перейдем на вкладку «Параметры».
  2. Найдем параметр, который отвечает за дату отчета (например, ДатаОтчета или Период).
  3. В колонке «Выражение» напишем стандартную функцию встроенного языка СКД: ТекущаяДата().

Важный нюанс: Почему у некоторых разработчиков этот способ «не работает» сразу после настройки? Разберем основные причины:

1. Влияние кэша пользовательских настроек. Платформа 1С при повторном открытии отчета пытается восстановить те настройки, с которыми пользователь работал в прошлый раз. Если ранее отчет открывался с пустой датой, это пустое значение из кэша перекроет выражение ТекущаяДата(). Чтобы проверить работоспособность выражения, обязательно сбросьте настройки отчета в режиме «1С:Предприятие» к стандартным (команда Еще -> Установить стандартные настройки).

2. Ограничение доступности. Если этот параметр рассчитывается автоматически и пользователю не требуется редактировать его вручную на форме, установите для него флаг «Ограничение доступности» в таблице параметров. В этом случае СКД гарантированно применит выражение при формировании отчета, игнорируя старый пользовательский кэш.

3. Проблема со временем (секундами). Функция ТекущаяДата() возвращает дату с точностью до секунды (например, 07.10.2023 14:35:12). Если в запросе СКД используется условие вида Период <= &ДатаОтчета, то документы, проведенные позже этой секунды текущего дня, не попадут в отчет. Чтобы избежать потери детальных записей, рекомендуется приводить дату к концу дня. Напишите в поле «Выражение» следующее:

КонецПериода(ТекущаяДата(), "День")

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

НачалоПериода(ТекущаяДата(), "День") ---

Метод 2. Использование типа данных «Стандартный период»

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

Рассмотрим, как связать стандартный период с реальными параметрами запроса:

  1. Перейдем на вкладку «Параметры» в СКД.
  2. Добавим новый параметр с именем ПериодОтчета и выберем для него тип данных СтандартныйПериод.
  3. В колонке «Значение» для параметра ПериодОтчета выберем значение по умолчанию (например, Этот месяц).
  4. Для системных параметров вашего запроса &ДатаНачала и &ДатаОкончания установим флаг «Ограничение доступности», чтобы скрыть их от пользователя.
  5. В поле «Выражение» для параметра ДатаНачала пропишем формулу связи: &ПериодОтчета.ДатаНачала.
  6. В поле «Выражение» для параметра ДатаОкончания пропишем: &ПериодОтчета.ДатаОкончания.

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

---

Метод 3. Программная установка параметров в модуле отчета

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

Для реализации этого метода откроем модуль объекта нашего отчета и найдем предопределенную процедуру ПриКомпоновкеРезультата.

Типичная ошибка новичков: Написание громоздкого кода с отключением стандартной обработки (СтандартнаяОбработка = Ложь) и ручным созданием процессора вывода. Это усложняет код и лишает отчет стандартного поведения платформы.

Мы сделаем это правильно и элегантно. Мы оставим СтандартнаяОбработка = Истина, но внесем изменения в компоновщик настроек. При этом учтем работу с управляемыми формами, где параметры могут быть выведены в состав Пользовательских настроек (так называемые быстрые настройки на форме).

Проанализируем и внедрим следующий код в модуль отчета:


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

КонецПроцедуры

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

---

Что делать, если пропала вкладка «Параметры» или настройки на форме?

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

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

← На главную