При разработке отчетов в 1С 7.7 многие сталкиваются с задачей настройки специфического периода группировки. Часто возникает необходимость, чтобы «неделя» начиналась не с понедельника, а, например, со среды или любого другого дня. В этой статье мы разберем, почему штатные средства платформы не позволяют это сделать и как решить данную задачу с помощью собственной логики обработки данных.
Первое, что приходит на ум при возникновении такой задачи — изменить настройки в Панели управления Windows или параметры SQL Server. Однако важно понимать, что 1С 7.7 является платформой со встроенным жестко запрограммированным механизмом работы с датами. Функции ядра, отвечающие за группировку Неделя, опираются на внутренний алгоритм, который всегда считает понедельник первым днем недели.
Более того, даже при использовании SQL-версии базы данных, 1С принудительно устанавливает параметры сессии, игнорируя настройки сервера. Поэтому попытки повлиять на поведение группировки через SET DATEFIRST или изменение региональных стандартов операционной системы не принесут результата. Группировка Неделя в запросах 1С — это «черный ящик», который работает по своим правилам.
Так как повлиять на ядро платформы невозможно, единственным верным архитектурным решением является отказ от использования стандартной группировки Неделя в тексте запроса. Вместо этого мы будем вычислять начало недели самостоятельно. Разберем этот процесс по шагам.
Вместо группировки Неделя в запросе мы будем использовать либо детализацию до дня, либо вовсе не указывать группировку периодов. Наша задача — получить детальные записи (документы или обороты) за требуемый интервал времени. Выгрузим полученные данные в ТаблицуЗначений.
Для корректной группировки нам необходимо создать функцию, которая для любой переданной даты будет возвращать дату начала недели, соответствующую вашим требованиям. Например, если неделя начинается со среды:
Функция ПолучитьНачалоНедели(ДатаЗаписи)
// Определяем день недели (1 - пн, 7 - вс)
ДеньНедели = _GetDayOfWeek(ДатаЗаписи);
// Вычисляем смещение: если хотим среду (3),
// корректируем дату так, чтобы среда стала первым днем
Смещение = (ДеньНедели - 3 + 7) % 7;
НачалоНедели = ДатаЗаписи - Смещение;
Возврат НачалоНедели;
КонецФункции
Используя метод _GetDayOfWeek, мы получаем текущий номер дня и с помощью несложной арифметики сдвигаем дату к нужному нам «началу недели».
Теперь, когда у нас есть вспомогательная функция, проанализируем, как внедрить её в отчет:
ТаблицуЗначений, добавьте в нее колонку ПериодНедели.ПолучитьНачалоНедели для даты каждой записи.ПериодНедели полученными значениями.Свернуть объекта ТаблицаЗначений, указав колонку ПериодНедели в качестве группировочного поля.Такой подход дает нам огромную гибкость. Вы не ограничены календарной неделей: при желании вы можете исключать из периодов праздничные дни или объединять их по производственному календарю. Это превращает жесткую структуру 1С 7.7 в гибкий инструмент, который подстраивается под нужды вашего учета.
Рассмотрим, почему именно такой подход является профессиональным:
ТаблицеЗначений на стороне клиента происходит достаточно быстро для большинства типовых отчетов 1С 7.7.Подводя итог, можно сказать, что хотя 1С 7.7 не дает инструментов для прямого вмешательства в системные периоды, программное управление данными позволяет легко обойти это ограничение. Мы с вами рассмотрели, как превратить неудобное ограничение платформы в возможность реализовать индивидуальные правила группировки данных.