Работа с датами и временем — это фундаментальная часть разработки конфигураций на платформе 1С:Предприятие. Часто перед программистом или бухгалтером встает задача не просто вывести календарное число, а определить, на какой день недели приходится конкретная дата. Это необходимо для формирования печатных форм, настройки алгоритмов расчета зарплаты или создания сложных отчетов.
В языке запросов и встроенном языке платформы существует несколько способов решить эту задачу. Выбор конкретного метода зависит от того, где именно выполняется код: в запросе, в процедуре модуля объекта или в обработке данных. Понимание различий между этими подходами позволит писать более эффективный и читаемый код.
В данной статье мы подробно разберем все доступные инструменты. Мы рассмотрим использование функции Формат, работу со встроенными свойствами типа Дата, а также нюансы локализации. Вы научитесь получать как полное название дня, так и его сокращенную версию в зависимости от требований вашей задачи.
Использование функции Формат для вывода названия
Самым универсальным и часто используемым способом получения текстового представления дня недели является применение встроенной функции Формат. Этот метод позволяет гибко настраивать вывод, выбирая между полным названием (например, «Понедельник») и кратким («Пн»). Функция принимает дату и строку формата, определяющую структуру результата.
Для получения полного имени дня используется спецификатор ДФ='Д'. Если же требуется сокращенный вариант, применяется модификатор ДФ='Дк'.
СокращенныйДень = Формат(ТекущаяДата(), "ДФ='Дк'");
ПолныйДень = Формат(ТекущаяДата(), "ДФ='Д'");
Однако стоит учесть, что вывод зависит от установленных региональных настроек операционной системы или параметров сеанса 1С. Если система настроена на английский язык, то вместо «Вторник» вы получите «Tuesday». Это поведение является нормальным и позволяет создавать мультиязычные интерфейсы без написания дополнительного кода.
⚠️ Внимание: Функция
Форматвозвращает строковое значение. Не пытайтесь использовать результат этой функции в арифметических операциях или сравнениях дат, так как это приведет к ошибкам типа «Несоответствие типов».
При работе с большими массивами данных использование функции форматирования в цикле может незначительно снизить производительность. В большинстве стандартных задач это незаметно, но при обработке миллионов записей в цикле лучше рассмотреть альтернативные варианты получения числового индекса дня.
Получение числового индекса дня недели
Иногда для логики программы требуется не имя дня, а его порядковый номер. В 1С дни недели нумеруются от 1 до 7, где 1 соответствует понедельнику, а 7 — воскресенью. Получить это значение можно через свойство ДеньНедели объекта типа Дата.
Этот подход особенно полезен при написании условных операторов. Например, если вам нужно выполнить определенное действие только в выходные дни, проверка числового значения будет работать быстрее и надежнее, чем сравнение строк. Числовой индекс независим от языковых настроек интерфейса.
- 🔢 Значение 1 всегда означает Понедельник.
- 🔢 Значение 6 и 7 соответствуют Субботе и Воскресенью.
- 🔢 Свойство доступно для любой переменной типа Дата.
Рассмотрим пример кода, где мы определяем, является ли текущий день рабочим. Здесь мы используем свойство ДеньНедели для принятия логического решения. Такой код легко читается и поддерживается другими разработчиками.
Если ТекущаяДата().ДеньНедели > 5 Тогда
Сообщить("Сегодня выходной день");
Иначе
Сообщить("Сегодня рабочий день");
КонецЕсли;
Важно отметить, что нумерация дней недели в 1С строго фиксирована и не меняется в зависимости от настроек календаря. Это гарантирует стабильность работы алгоритмов даже при переносе базы данных на сервер с другой локалью.
Применение функции ДатаВСтроку
Еще одним инструментом в арсенале разработчика является функция ДатаВСтроку. Хотя она чаще используется для полного форматирования даты (день, месяц, год), с её помощью также можно извлечь информацию о дне недели. Синтаксис этой функции немного отличается от Формат, но результат может быть идентичным.
Для получения дня недели необходимо указать соответствующий формат в третьем параметре функции. Использование ДатаВСтроку может быть предпочтительным в тех случаях, когда вы уже используете эту функцию для формирования других частей даты и хотите сохранить единый стиль кода.
| Функция | Параметр формата | Результат (пример) | Тип возврата |
|---|---|---|---|
| Формат | "ДФ='Д'" | Понедельник | Строка |
| Формат | "ДФ='Дк'" | Пн | Строка |
| ДатаВСтроку | 3, "Д" | Понедельник | Строка |
| Свойство | .ДеньНедели | 1 | Число |
Стоит обратить внимание на производительность. Функция ДатаВСтроку является более тяжелой по сравнению с прямым обращением к свойству объекта. Если ваша задача состоит только в определении дня, использование специализированных средств будет более оптимальным решением.
При частом вызове функций форматирования в циклах по большим выборкам, старайтесь выносить расчет дня недели за пределы цикла или использовать числовые индексы для ускорения обработки.
Особенности локализации и многоязычности
При разработке конфигураций, которые планируется использовать в разных странах или регионах, вопрос локализации выходит на первый план. Как сообщить день недели в 1С так, чтобы пользователь увидел его на родном языке? Платформа решает эту задачу автоматически, опираясь на настройки сеанса.
Если пользователь зашел в базу с английским интерфейсом, функция Формат вернет «Monday». При переключении на немецкий язык результат изменится на «Montag». Вам не нужно писать словари переводов вручную для дней недели, так как это встроенная функциональность ядра платформы 1С:Предприятие.
Однако бывают ситуации, когда требуется жестко задать язык вывода, независимо от настроек пользователя. Например, при формировании экспортного файла для иностранного контрагента. В таких случаях можно временно изменять параметры региональных настроек в коде или использовать специфические ключи форматирования.
⚠️ Внимание: Интерфейсы и алгоритмы работы с датами могут незначительно отличаться в различных версиях платформы. Всегда проверяйте поведение функций в той версии 1С, на которой развернута ваша конфигурация.
Разработчикам следует быть осторожными при хардкоде строковых значений дней недели в коде. Сравнение строки "Понедельник" с результатом функции будет работать только в русской локализации. Для кросс-платформенного кода лучше использовать числовые значения свойства ДеньНедели.
Использование в запросах и СКД
Часто задача отображения дня недели возникает непосредственно в запросах к базе данных или в системах компоновки данных (СКД). В языке запросов 1С также доступна функция Формат, которая работает аналогично встроенному языку. Это позволяет формировать красивые заголовки группировок в отчетах без дополнительной обработки на стороне клиента.
В запросе вы можете создать вычисляемое поле, которое будет содержать название дня. Это особенно удобно при построении отчетов по продажам или движению товаров, где анализ часто ведется в разрезе дней недели. Группировка по такому полю позволит увидеть нагрузку на склад в разные дни.
ВЫБРАТЬ
Документ.Ссылка КАК Документ,
Формат(Документ.Дата, "ДФ='Д'") КАК ДеньНедели
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
При использовании в СКД можно настроить форматирование поля непосредственно в настройках отчета. Это дает пользователю возможность самостоятельно выбирать, видеть ли ему полное название дня или сокращение, через интерфейс настроек отчета.
Нюансы работы с NULL в запросах
Если поле Дата может быть пустым (NULL), функция Формат вернет пустую строку. Убедитесь, что ваша логика обработки отчета корректно работает с пустыми значениями, чтобы избежать ошибок отображения.
Использование вычисляемых полей в запросах увеличивает нагрузку на сервер баз данных. Если отчет формируется очень часто и выборка огромна, возможно, стоит рассмотреть вариант кэширования значения дня недели в отдельном регистре сведений при проведении документа.
Практические примеры и лучшие практики
Рассмотрим реальную задачу: необходимо запретить проведение документов в выходные дни. Для этого мы создадим процедуру проверки, которая будет вызываться перед записью документа. Здесь мы совместим получение числового индекса и вывод сообщения пользователю.
В этом примере мы используем свойство ДеньНедели для быстрой проверки условия. Если условие нарушено, мы формируем сообщение об ошибке, используя функцию Формат для красивого отображения названия дня в тексте предупреждения. Это сочетание обеспечивает и скорость работы, и удобство интерфейса.
- ✅ Всегда проверяйте тип данных перед форматированием.
- ✅ Используйте константы или перечисления для дней недели, если логика сложная.
- ✅ Учитывайте часовой пояс сервера при работе с распределенными базами.
Хорошим тоном считается выносить логику определения рабочих дней в отдельный общий модуль. Это позволяет переиспользовать код в разных местах конфигурации: в документах, в регистрах расчета и в отчетах. Централизованное управление правилами календаря упрощает поддержку системы.
Оптимальный подход: используйте числовое свойство ДеньНедели для логики программы (if/else) и функцию Формат только для финального отображения текста пользователю.
Помните, что производственный календарь может отличаться от стандартной сетки «понедельник-пятница». В России, например, бывают переносы выходных дней. Для учета таких нюансов простого определения дня недели недостаточно, потребуется обращение к производственному календарю, хранящемуся в базе.
Как получить день недели для даты в прошлом?
Алгоритм получения дня недели абсолютно идентичен для прошлых, текущих и будущих дат. Просто передайте в функцию Формат или свойство ДеньНедели нужную дату. Платформа корректно рассчитает день недели согласно григорианскому календарю для любого диапазона дат, поддерживаемого типом Дата.
Можно ли изменить нумерацию дней (сделать воскресенье первым)?
Нет, свойство ДеньНедели в 1С жестко зафиксировано: 1 — Понедельник, 7 — Воскресенье. Изменить эту нумерацию на уровне платформы нельзя. Если вам нужна другая нумерация для расчетов, вам придется программно сдвигать значение (например, прибавлять 1 и брать остаток от деления).
Почему функция Формат возвращает пустую строку?
Чаще всего это происходит, если в качестве параметра передано значение Null (Неопределено) или значение несовместимого типа. Убедитесь, что переменная, которую вы форматируете, действительно содержит дату. Также проверьте правильность написания строки формата (кавычки, символы Д и Дк).
Влияет ли смена часового пояса на определение дня недели?
Да, влияет. Дата и время в 1С хранятся с учетом времени. Если сервер находится в одном часовом поясе, а пользователь в другом, и время близко к полуночи, то для сервера это может быть еще вторник, а для пользователя — уже среда. Учитывайте это при разработке распределенных систем.
Как быстро перевести номер дня недели в название без Формат?
Можно использовать массив или соответствие (Structure/Map), где ключом будет номер от 1 до 7, а значением — строка с названием. Это работает быстрее функции Формат в высоконагруженных циклах, но требует инициализации массива и не поддерживает автоматическую локализацию.