Почему виртуальная таблица «СрезПоследних» в 1С возвращает лишние данные?

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

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

Разберемся в механизме работы виртуальной таблицы

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

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

Проверяем параметры запроса

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

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


// Неправильно: 
// Запрос.УстановитьПараметр("Период", ЭлементыФормы.Период.Значение); 

// Правильно (если Период - это СтандартныйПериод):
Запрос.УстановитьПараметр("Период", КонецДня(Период.ДатаОкончания));

Как получить действительно одну последнюю запись?

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

1. Использование соединения с физической таблицей

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


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

2. Использование подзапроса с конструкцией «ВЫБРАТЬ ПЕРВЫЕ 1»

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


ВЫБРАТЬ ПЕРВЫЕ 1
    Т.Период,
    Т.Сотрудник,
    Т.Начисление,
    Т.ВкладВФОТ
ИЗ
    РегистрСведений.ПлановыйФОТ КАК Т
ГДЕ
    Т.Сотрудник = &Сотрудник
УПОРЯДОЧИТЬ ПО
    Т.Период УБЫВ

Важные советы по оптимизации

  1. Индексация: Помните, что для быстрой работы виртуальных таблиц измерения, которые вы используете в условиях (в параметрах скобок), должны быть проиндексированы.
  2. Условия вне скобок: Если вы ставите условие в секции ГДЕ, а не внутри параметров виртуальной таблицы, платформа сначала выберет все данные, а потом отфильтрует их, что крайне негативно скажется на производительности при большом объеме записей.
  3. Анализ данных: Если вы все еще получаете много записей, выведите в результат запроса все измерения регистра. Скорее всего, вы увидите, что данные просто различаются по другим измерениям, о которых вы забыли в условии.

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

← На главную