При работе с запросами в платформе 1С 7.7 разработчики часто сталкиваются с особенностью обработки временных группировок (таких как День, Неделя, Месяц, Квартал, Год). Если выгрузить результат запроса в таблицу значений с помощью метода Выгрузить(), колонка периода сохраняет тип Дата. Однако при последовательном обходе результатов запроса через метод Запрос.Группировка() прямое обращение к свойству (например, Запрос.Месяц) возвращает отформатированную текстовую строку, такую как "Январь 17".
Попытки применить к такой строке стандартные функции работы с датами (например, НачМесяца()) не приводят к успеху, так как строка формата "Январь 17" не преобразуется автоматически в тип «Дата». Разберем, как получить корректную дату периода при обходе запроса.
Проанализируем механику работы 1С 7.7. При обращении к периодической группировке во время выполнения метода Группировка() платформа применяет внутреннее форматирование для представления периода в удобном для человека виде. В базе данных и во внутренней структуре запроса значение хранится как дата, но интерфейсное свойство группировки отдает именно текстовую представление.
Для получения даты начала или конца текущего интервала группировки в объекте Запрос предусмотрены специальные встроенные методы. Это самый надежный и документированный способ получения даты.
Запрос.НачалоПериода() — возвращает дату начала текущего интервала группировки (тип «Дата»).Запрос.КонецПериода() — возвращает дату и время окончания текущего интервала.Рассмотрим пример использования этих методов в цикле обхода запроса:
// Создаем и выполняем запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"|Период с ДатаНач по ДатаКон;
|ОбработкаДокументов;
|Сумма = Документ.РасходнаяНакладная.Сумма;
|Группировка Месяц;";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Пока Запрос.Группировка("Месяц") = 1 Цикл
// Получаем дату начала месяца (тип Дата)
ДатаНачала = Запрос.НачалоПериода();
// Получаем текстовое представление периода для вывода
ПредставлениеМесяца = Запрос.Месяц; // Вернет "Январь 17"
Сообщить("Период: " + ПредставлениеМесяца + " начинается с " + ДатаНачала);
КонецЦикла;
КонецЕсли;
Существует дополнительная функция объекта Запрос — ЗначениеГруппировки(). Она принимает один параметр — порядковый номер группировки в запросе — и возвращает точное значение текущей группировки без текстового форматирования (для периодических группировок возвращается начальная дата периода).
Рассмотрим пример применения функции ЗначениеГруппировки():
Пока Запрос.Группировка(1) = 1 Цикл
// Запрос.ЗначениеГруппировки(1) вернет дату 01.01.17 вместо строки "Январь 17"
ТочнаяДата = Запрос.ЗначениеГруппировки(1);
// Теперь с датой можно выполнять стандартные операции
ПервыйДень = НачМесяца(ТочнаяДата);
КонецЦикла;
Если логика обработки требует наличия дат в явном виде и выполнения дополнительных манипуляций (сортировка, поиск строк), эффективным решением будет выгрузка результата запроса в Таблицу Значений.
Посмотрим, как это реализовать:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);
// В выгруженной таблице значений колонка "Месяц" содержат тип "Дата"
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
ДатаМесяца = ТЗ.Месяц; // Содержит полноценную дату (например, 01.01.2017)
Сумма = ТЗ.Сумма;
КонецЦикла;
При необходимости работы с типом «Дата» внутри цикла обхода запроса в 1С 7.7 рекомендуется использовать метод Запрос.НачалоПериода() или выгружать данные в Таблицу Значений методом Выгрузить(). Это гарантирует правильное приведение типов и стабильность работы кода.