Как в запросе 1С 7.7 получить дату вместо строки при группировке по периоду

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе с запросами в платформе 1С 7.7 разработчики часто сталкиваются с особенностью обработки временных группировок (таких как День, Неделя, Месяц, Квартал, Год). Если выгрузить результат запроса в таблицу значений с помощью метода Выгрузить(), колонка периода сохраняет тип Дата. Однако при последовательном обходе результатов запроса через метод Запрос.Группировка() прямое обращение к свойству (например, Запрос.Месяц) возвращает отформатированную текстовую строку, такую как "Январь 17".

Попытки применить к такой строке стандартные функции работы с датами (например, НачМесяца()) не приводят к успеху, так как строка формата "Январь 17" не преобразуется автоматически в тип «Дата». Разберем, как получить корректную дату периода при обходе запроса.

Причины такого поведения платформы

Проанализируем механику работы 1С 7.7. При обращении к периодической группировке во время выполнения метода Группировка() платформа применяет внутреннее форматирование для представления периода в удобном для человека виде. В базе данных и во внутренней структуре запроса значение хранится как дата, но интерфейсное свойство группировки отдает именно текстовую представление.

Решение 1. Использование штатных методов «НачалоПериода» и «КонецПериода»

Для получения даты начала или конца текущего интервала группировки в объекте Запрос предусмотрены специальные встроенные методы. Это самый надежный и документированный способ получения даты.

  1. Метод Запрос.НачалоПериода() — возвращает дату начала текущего интервала группировки (тип «Дата»).
  2. Метод Запрос.КонецПериода() — возвращает дату и время окончания текущего интервала.

Рассмотрим пример использования этих методов в цикле обхода запроса:


// Создаем и выполняем запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"|Период с ДатаНач по ДатаКон;
|ОбработкаДокументов;
|Сумма = Документ.РасходнаяНакладная.Сумма;
|Группировка Месяц;";

Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка("Месяц") = 1 Цикл
        // Получаем дату начала месяца (тип Дата)
        ДатаНачала = Запрос.НачалоПериода();
        
        // Получаем текстовое представление периода для вывода
        ПредставлениеМесяца = Запрос.Месяц; // Вернет "Январь 17"
        
        Сообщить("Период: " + ПредставлениеМесяца + " начинается с " + ДатаНачала);
    КонецЦикла;
КонецЕсли;

Решение 2. Использование метода «ЗначениеГруппировки»

Существует дополнительная функция объекта Запрос — ЗначениеГруппировки(). Она принимает один параметр — порядковый номер группировки в запросе — и возвращает точное значение текущей группировки без текстового форматирования (для периодических группировок возвращается начальная дата периода).

Рассмотрим пример применения функции ЗначениеГруппировки():


Пока Запрос.Группировка(1) = 1 Цикл
    // Запрос.ЗначениеГруппировки(1) вернет дату 01.01.17 вместо строки "Январь 17"
    ТочнаяДата = Запрос.ЗначениеГруппировки(1);
    
    // Теперь с датой можно выполнять стандартные операции
    ПервыйДень = НачМесяца(ТочнаяДата);
КонецЦикла;

Решение 3. Обход через Таблицу Значений

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

Посмотрим, как это реализовать:


ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);

// В выгруженной таблице значений колонка "Месяц" содержат тип "Дата"
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ДатаМесяца = ТЗ.Месяц; // Содержит полноценную дату (например, 01.01.2017)
    Сумма = ТЗ.Сумма;
КонецЦикла;

Резюме

При необходимости работы с типом «Дата» внутри цикла обхода запроса в 1С 7.7 рекомендуется использовать метод Запрос.НачалоПериода() или выгружать данные в Таблицу Значений методом Выгрузить(). Это гарантирует правильное приведение типов и стабильность работы кода.

← На главную