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

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

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

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

Метод 1. Использование физической таблицы и вложенного запроса

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

Проанализируем ситуацию: если мы просто выберем МИНИМУМ(Период) в группировке по объекту, мы получим только дату, но не сможем вытащить значения ресурсов (например, стоимость или состояние ОС). Поэтому нам нужно соединить таблицу саму с собой.

Рассмотрим пример построения такого запроса:


ВЫБРАТЬ
    ОсновныеСредства.ОсновноеСредство КАК ОС,
    МИНИМУМ(ОсновныеСредства.Период) КАК ДатаПервойЗаписи
ПОМЕСТИТЬ ВТ_МинимальныеДаты
ИЗ
    РегистрСведений.ОсновныеСредстваМеждународныйУчет КАК ОсновныеСредства
ГРУППИРОВАТЬ ПО
    ОсновныеСредства.ОсновноеСредство
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_МинимальныеДаты.ОС КАК ОС,
    ДанныеРегистра.Состояние КАК СостояниеНаНачало,
    ДанныеРегистра.Стоимость КАК СтоимостьНаНачало,
    ВТ_МинимальныеДаты.ДатаПервойЗаписи КАК ДатаВвода
ИЗ
    ВТ_МинимальныеДаты КАК ВТ_МинимальныеДаты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСредстваМеждународныйУчет КАК ДанныеРегистра
        ПО ВТ_МинимальныеДаты.ОС = ДанныеРегистра.ОсновноеСредство
            И ВТ_МинимальныеДаты.ДатаПервойЗаписи = ДанныеRec.Период

Обратите внимание на важный нюанс: если в одну и ту же секунду по одному объекту было введено несколько записей, такое соединение приведет к дублированию строк. Чтобы этого избежать, в реальных задачах рекомендуется использовать дополнительную группировку или выбирать МИНИМУМ(НомерСтроки) или МИНИМУМ(Регистратор) во временной таблице.

Метод 2. Тонкая настройка параметров в СКД (Механизм {} )

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

Выясним причину такого поведения: это работает механизм Автозаполнения. Чтобы получить данные на «самое начало» вне зависимости от настроек периода в отчете, нам нужно «пнуть» СКД, как выразились на форуме, — то есть явно указать, какие параметры использовать.

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


ВЫБРАТЬ
    Регистр.ОсновноеСредство,
    Регистр.Период,
    Регистр.Стоимость
ИЗ
    РегистрСведений.ОсновныеСредстваМеждународныйУчет КАК Регистр
ГДЕ
    (Регистр.ОсновноеСредство, Регистр.Период) В
        (ВЫБРАТЬ
            ВнРегистр.ОсновноеСредство,
            МИНИМУМ(ВнРегистр.Период)
        ИЗ
            РегистрСведений.ОсновныеСредстваМеждународныйУчет КАК ВнРегистр
        // Здесь мы НЕ указываем период, чтобы получить самую первую запись в истории
        ГРУППИРОВАТЬ ПО
            ВнReg.ОсновноеСредство)

Если же вам нужно объединить это со СрезомПоследних на дату отчета, используйте конструкцию {...} для параметров виртуальной таблицы, чтобы разделить влияние глобального периода отчета на разные части запроса.

Метод 3. Использование двух наборов данных в СКД

Проанализируем еще один эффективный способ — разделение запросов на разные наборы данных. Это зачастую самый прозрачный и надежный метод для сложных отчетов.

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

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

Оптимизация производительности

Посмотрим на ситуацию с точки зрения быстродействия. Запросы к физическим таблицам регистров сведений с использованием МИНИМУМ могут работать медленно на миллионах записей. Чтобы ускорить выполнение, убедитесь, что:

Подводим итоги

Для получения данных на «самую первую запись» без конкретной даты в СКД необходимо:

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

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

← На главную