Как изменить первый день недели в отчетах и системе 1С:Предприятие

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

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

Метод 1: Настройка региональных установок информационной базы

Самый простой и эффективный способ изменить поведение системы глобально — это корректировка региональных настроек самой информационной базы. Проанализируем, как это влияет на работу платформы. Когда мы изменяем настройки ИБ, платформа автоматически корректирует работу встроенных функций языка запросов и СКД (Системы компоновки данных).

Разберем по шагам, где найти эти настройки в современном интерфейсе (Управляемые формы):

  1. Перейдем в раздел Администрирование.
  2. Выберем пункт Региональные установки.
  3. В открывшемся окне найдем параметр Первый день недели.
  4. Установим значение "Воскресенье" (или любой другой день по требованию).

Важно понимать, что при установке этого значения платформа начнет иначе интерпретировать функцию НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ). Теперь для любой даты результатом функции будет именно то воскресенье, которое предшествует этой дате. Проанализируем ситуацию: если ранее стандартный отчет при группировке "По неделям" собирал данные с понедельника по воскресенье, то после смены настройки он будет автоматически собирать их с воскресенья по субботу. Это наиболее "чистый" метод, так как он не требует внесения изменений в конфигурацию или код отчетов.

Метод 2: Настройка на уровне операционной системы

Если в настройках 1С выбран вариант "Использовать установки системной локали", платформа будет опираться на настройки операционной системы. Рассмотрим нюансы этого подхода для разных вариантов развертывания.

Для файловой базы настройки берутся из текущей сессии пользователя Windows или Linux. В Windows это настраивается через "Региональные стандарты" в Панели управления. Однако в клиент-серверном варианте ситуация сложнее. Здесь критически важны настройки локали именно на стороне сервера приложений 1С. Поскольку расчет периодов в запросах выполняется на сервере баз данных под управлением сервера 1С, именно его региональные стандарты будут определять начало недели.

Выясним причину, почему это может не работать: если на сервере установлена английская локаль (US), неделя начнется с воскресенья. Если русская (RU) — с понедельника. Если вы хотите изменить это поведение, не меняя настройки самой 1С, вам придется корректировать настройки профиля пользователя, под которым запущена служба ragent (сервер приложений 1С).

Метод 3: Программное смещение дат в запросах (СКД)

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

Рассмотрим пример кода для языка запросов 1С, который позволяет получить начало "американской" недели (с воскресенья) при стандартных "русских" настройках системы. Логика заключается в том, что мы искусственно сдвигаем дату на один день вперед, определяем начало недели и возвращаем результат на один день назад:


ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(Продажи.Период, ДЕНЬ, 1), НЕДЕЛЯ), ДЕНЬ, -1) КАК НачалоНеделиСВоскресенья,
    СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
СГРУППИРОВАТЬ ПО
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(Продажи.Период, ДЕНЬ, 1), НЕДЕЛЯ), ДЕНЬ, -1)

Проанализируем этот код: функция ДОБАВИТЬКДАТЕ(Продажи.Период, ДЕНЬ, 1) превращает воскресенье в понедельник. Функция НАЧАЛОПЕРИОДА(..., НЕДЕЛЯ) находит начало недели для этого понедельника (т.е. этот же понедельник). Затем внешняя функция ДОБАВИТЬКДАТЕ(..., ДЕНЬ, -1) возвращает нас обратно в исходное воскресенье. Таким образом, группировка будет всегда указывать на воскресенье как на начало периода.

Метод 4: Использование производственных календарей

В сложных системах, таких как 1С:ERP или 1С:ЗУП, существует объект Производственные календари. Мы можем использовать их для построения произвольных группировок. Это более сложный, но гибкий путь. Разберем его суть: мы создаем запрос к виртуальной таблице или справочнику календаря, где заранее размечены все даты. Мы можем добавить в этот календарь дополнительный реквизит, указывающий на номер или начало недели в нужном нам формате. При формировании отчета мы просто соединяем таблицу данных с таблицей календаря по полю Дата и группируем результат по нашему пользовательскому полю начала недели.

Нюансы работы в веб-клиенте

При использовании веб-клиента (через браузер) важно учитывать, что настройки могут наследоваться от языковых предпочтений самого браузера. Посмотрим на ситуацию: у пользователя в тонком клиенте отчет может выглядеть корректно (с понедельника), а в Google Chrome — с воскресенья, если язык браузера установлен как English (US). Чтобы избежать такой рассинхронизации, мы настоятельно рекомендуем жестко фиксировать региональные настройки в параметрах информационной базы 1С, о чем мы говорили в первом методе. Это гарантирует единообразие данных для всех типов клиентов.

Параметры запуска для отдельных сеансов

Если вам нужно запустить систему с определенной локалью только для одного конкретного сеанса (например, для проверки отчета в "американском" режиме), вы можете использовать параметр запуска /L. Посмотрим на пример команды запуска:

1cv8.exe ENTERPRISE /F "C:\Bases\MyBase" /L en_US

Использование ключа en_US принудительно заставит платформу считать воскресенье первым днем недели, изменит формат отображения дат и чисел. Это полезно для тестировщиков и разработчиков при отладке функционала, ориентированного на разные страны.

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

← На главную