Как получить максимальную дату из колонки таблицы в 1С

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

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

Способ 1: Использование запроса к таблице значений (Временные таблицы)

Если данные уже находятся в оперативной памяти (например, в объекте ТаблицаЗначений или в табличной части документа), наиболее эффективным и «чистым» с точки зрения архитектуры способом будет использование механизма запросов. Запросы позволяют использовать агрегатную функцию МАКСИМУМ, которая работает крайне быстро.

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

  1. Создадим новый запрос.
  2. Передадим таблицу значений в качестве параметра.
  3. Опишем структуру таблицы для менеджера временных таблиц.
  4. Выполним расчет.

// Предположим, ТЗ уже заполнена данными
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ВТ_Данные.ДатаДобавленияСтроки КАК Дата
    |ПОМЕСТИТЬ ВТ_Таблица
    |ИЗ
    |    &ТЗ КАК ВТ_Данные
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    МАКСИМУМ(ВТ_Таблица.Дата) КАК МаксДата
    |ИЗ
    |    ВТ_Таблица КАК ВТ_Таблица";

Запрос.УстановитьПараметр("ТЗ", Результат);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    МаксимальнаяДата = Выборка.МаксДата;
КонецЕсли;

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

Способ 2: Сортировка таблицы значений

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

Рассмотрим алгоритм действий:

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

// Сортируем таблицу по колонке ДатаДобавленияСтроки в обратном порядке
Результат.Сортировать("ДатаДобавленияСтроки Убыв");

Если Результат.Количество() > 0 Тогда
    МаксимальнаяДата = Результат[0].ДатаДобавленияСтроки;
КонецЕсли;

Этот метод удобен тем, что не требует написания текста запроса и работы с менеджером временных таблиц. Однако помните, что сортировка физически меняет порядок строк в вашей таблице.

Способ 3: Обход коллекции в цикле (Перебор)

Иногда, как шутливо заметили участники обсуждения («считаем перебором»), разработчики используют прямой цикл. Это оправдано, если вы параллельно выполняете другие расчеты в этом же цикле.

Проанализируем ситуацию на примере:


МаксимальнаяДата = '00010101'; // Инициализируем пустой датой
Для Каждого СтрокаТЗ Из Результат Цикл
    Если СтрокаТЗ.ДатаДобавленияСтроки > МаксимальнаяДата Тогда
        МаксимальнаяДата = СтрокаТЗ.ДатаДобавленияСтроки;
    КонецЕсли;
КонецЦикла;

Несмотря на простоту, для очень больших таблиц (десятки тысяч строк) этот метод будет работать медленнее, чем оптимизированный запрос платформы 1С.

Способ 4: Особенности «динамических колонок» и Динамического списка

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

Если вам нужно получить максимум из того, что пользователь видит на экране в динамическом списке (с учетом всех его фильтров и поисковых строк), используйте следующий подход (доступно в 8.3.14+):

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

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

Способ 5: Вычисление максимума в макете печатной формы

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

Разберем, как это сделать:

  1. В макете выделите ячейку, где должен быть итог.
  2. В свойствах ячейки установите тип Формула.
  3. В тексте формулы напишите: Максимум(ИмяОбласти.ДатаПоставки).

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

Способ 6: Использование Построителя отчета

Для тех, кто работает в «старом стиле» или на Обычных формах, отличным инструментом является ПостроительОтчета. Он умеет принимать в качестве источника данных ТаблицаЗначений. Его преимущество в том, что он автоматически считает итоги.


Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат);
// Построитель автоматически может рассчитать итоги, если это настроено в его структуре

Резюме и рекомендации

Выбор конкретного метода зависит от контекста вашей задачи:

Помните, что использование МАКСИМУМ в запросе — это наиболее масштабируемый подход, который убережет вашу программу от «тормозов» при росте объема данных в документах.

← На главную