Работа с датами и временем является одной из фундаментальных задач при разработке конфигураций на платформе 1С:Предприятие. Часто возникает необходимость не просто узнать текущую дату, но и определить, какой именно день недели ей соответствует. Это требуется для построения сложных алгоритмов расчета зарплаты, формирования графиков работы или ограничения возможностей пользователей в выходные дни.
В языке запросов и встроенном языке платформы существуют различные подходы к решению этой задачи. Некоторые из них возвращают числовое значение, другие — текстовое представление, а третьи позволяют оперировать перечислениями. Понимание различий между этими методами критически важно для написания эффективного кода и предотвращения логических ошибок в учетной системе.
В этой статье мы детально разберем все доступные способы получения дня недели, от использования встроенных функций до манипуляций с датами в запросах. Вы узнаете о нюансах нумерации дней, особенностях локализации и способах оптимизации выборки данных при работе с большими массивми информации.
Использование встроенной функции ДеньНедели
Самым прямым и очевидным способом определения дня недели в коде 1С является вызов встроенной функции ДеньНедели(). Эта функция принимает в качестве аргумента дату типа Date и возвращает значение перечисления ДеньНедели. Возвращаемое значение представляет собой не просто число, а полноценный элемент предопределенного перечисления платформы.
Важно понимать, что нумерация дней в этом перечислении начинается с понедельника. То есть, если функция вернет ноль, это будет означать понедельник, а шестерка — воскресенье. Такая логика соответствует стандарту ISO 8601, который широко используется в деловой документации и международных расчетах. Однако при выводе на экран пользователю это числовое значение нужно будет преобразовать в понятный текст.
Для преобразования значения перечисления в строку можно использовать метод Представление() или функцию Строка(). Это позволит отобразить название дня на языке интерфейса пользователя, что особенно актуально для многопользовательских систем с разными языковыми настройками. Ниже приведен пример корректного использования данной функции в модуле объекта.
ТекущаяДата = ТекущаяДата();
День = ДеньНедели(ТекущаяДата);
Если День = Перечисления.ДеньНедели.Суббота Или День = Перечисления.ДеньНедели.Воскресенье Тогда
Сообщить("Сегодня выходной день!");
КонецЕсли;
⚠️ Внимание: Функция
ДеньНедели()работает только с типом Дата. Если вы передаете ей строку или число, возникнет ошибка выполнения. Всегда приводите данные к типу Дата перед вызовом.
Использование перечислений делает код более читаемым и защищенным от ошибок. Вместо магических чисел вы оперируете понятными сущностями, такими как Перечисления.ДеньНедели.Понедельник. Это упрощает поддержку конфигурации и снижает риск того, что другой разработчик неверно интерпретирует логику работы вашего алгоритма.
Функция ДеньНедели возвращает элемент перечисления, где 0 — это понедельник, а 6 — воскресенье, что соответствует международным стандартам.
Получение номера дня недели через функцию ЧислоДней
Иногда в legacy-коде или в специфических задачах можно встретить подход, основанный на вычислении разницы дат. Хотя прямой функции для получения номера дня (1-7) нет, некоторые разработчики используют математические выкладки. Однако, более стандартным методом получения именно числового индекса без использования перечислений является приведение результата функции ДеньНедели к числу.
Если вам необходимо получить число от 1 до 7, где 1 — понедельник, а 7 — воскресенье, достаточно выполнить простое арифметическое действие над результатом встроенной функции. Это часто требуется при экспорте данных в сторонние системы, где день недели ожидается в виде целого числа, либо при сохранении данных в регистры сведений с числовыми измерениями.
- 📅 Понедельник соответствует числу 1 в бизнес-логике большинства компаний.
- 📅 Воскресенье часто маркируется числом 7 для удобства фильтрации в отчетах.
- 📅 Числовое представление упрощает сортировку данных по дням недели в табличных документах.
Следует помнить, что прямое преобразование типа ДеньНедели в число даст значение от 0 до 6. Поэтому для получения привычного диапазона 1-7 необходимо добавить единицу к результату. Это простое действие избавит от путаницы при стыковке с внешними системами учета или календарными планировщиками.
Для быстрого получения числа от 1 до 7 используйте конструкцию: Число(ДеньНедели(Дата)) + 1. Это универсальное решение для любых задач нумерации.
Определение дня недели в запросах 1С
Работа с днями недели непосредственно в языке запросов 1С имеет свои особенности, так как синтаксис запросов отличается от встроенного языка. В запросах нет прямой функции, аналогичной ДеньНедели(), которая возвращала бы перечисление. Однако платформа предоставляет мощные инструменты для работы с составными частями даты.
Для выделения дня недели в запросе обычно используется функция ДЕНЬНЕДЕЛИ(). Она возвращает целое число, обозначающее день недели. Важно учитывать, что в контексте запроса нумерация также начинается с понедельника (0) и заканчивается воскресеньем (6). Это позволяет эффективно фильтровать выборки, например, отбирая только рабочие дни или анализируя продажи по выходным.
Рассмотрим пример запроса, который выбирает документы и добавляет к ним вычисляемое поле с номером дня недели. Такой подход позволяет группировать данные непосредственно на уровне базы данных, не загружая лишнюю информацию в память приложения. Это особенно важно при работе с большими объемами данных в регистрах накопления.
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.Дата КАК Дата,
ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.Дата) КАК ДеньНедели
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.Дата) < 5
В приведенном примере условие ГДЕ фильтрует документы, созданные с понедельника по пятницу (дни с номерами от 0 до 4). Использование функций даты в условиях отбора позволяет оптимизировать выполнение запроса, так как сервер 1С может эффективно использовать индексы по полям даты.
Форматирование даты для отображения названия дня
Часто перед разработчиком стоит задача не просто получить числовой код дня, а вывести его полное или сокращенное название на форму документа или в печатную форму отчета. Для этих целей в 1С существует мощный механизм форматирования строк, позволяющий гибко управлять представлением дат.
Функция Формат() принимает дату и строку формата, в которой можно указать специальные параметры для вывода дня недели. Используя параметр ДФ (Date Format), можно задать шаблон, который автоматически подставит название дня в нужном падеже и длине. Это избавляет от необходимости создавать справочники дней недели или писать громоздкие условия Если-Тогда.
| Параметр формата | Описание | Пример результата (для Понедельника) |
|---|---|---|
ДФ='д' |
Краткое название дня | пн |
ДФ='dddd' |
Полное название дня | понедельник |
ДФ='ddd' |
Сокращенное название (3 буквы) | пон |
ДФ='Д' |
Полное название с заглавной буквы | Понедельник |
При использовании функции Формат() следует учитывать настройки локали пользователя. Если интерфейс 1С переключен на английский язык, то те же самые параметры формата вернут названия дней на английском (Monday, Mon и т.д.). Это обеспечивает автоматическую локализацию ваших отчетов без дополнительного программирования.
⚠️ Внимание: Параметры формата чувствительны к регистру. Использование
'д'и'Д'может давать разный результат в зависимости от версии платформы и региональных настроек операционной системы.
Гибкость формата позволяет создавать сложные шаблоны, комбинируя день недели с датой и временем. Например, можно вывести строку вида "Понедельник, 25 марта 2026 г.", что значительно улучшает восприятие информации пользователем в печатных формах накладных или актов выполненных работ.
Секреты локализации
Если вам нужно жестко задать язык вывода дня недели независимо от настроек пользователя, используйте параметр ЛН (Язык) в строке формата, например: Формат(Дата, "ДФ='dddd'; ЛН='ru'").
Работа с предопределенными значениями и перечислениями
В платформе 1С тип данных ДеньНедели является полноценным перечислением. Это означает, что вы можете использовать его значения в качестве констант в коде, передавать их в параметры функций и хранить в переменных. Работа с перечислениями предпочтительнее использования "магических чисел", так как повышает надежность программного кода.
Предопределенные значения доступны через коллекцию Перечисления. Вы можете обратиться к конкретному дню, используя точечную нотацию, например, Перечисления.ДеньНедели.Вторник. Такой подход делает код самодокументируемым: читая его, сразу понятно, о каком дне идет речь, без необходимости вспоминать, какое число соответствует вторнику.
- ✅ Использование констант перечисления защищает от ошибок при изменении внутренней нумерации (хотя в 1С это маловероятно).
- ✅ Упрощается рефакторинг кода и поиск мест использования конкретного дня недели.
- ✅ Повышается читаемость условий в операторах ветвления и циклах.
При сравнении дат или дней недели всегда используйте значения перечислений. Это гарантирует, что ваша логика будет работать корректно на любой версии платформы 1С:Предприятие, независимо от возможных внутренних изменений реализации типов данных. Кроме того, это соответствует лучшим практикам разработки на этой платформе.
Если вам нужно получить все возможные значения дня недели для заполнения выпадающего списка на форме, вы можете использовать метод ПолучитьЗначения() для соответствующего перечисления. Это позволит динамически сгенерировать список дней, учитывая текущие настройки системы.
☑️ Проверка корректности работы с перечислениями
Особенности расчета рабочих дней и holidays
Простое определение дня недели часто недостаточно для бизнес-задач, где требуется учет производственных календарей. В России и других странах существуют официальные праздничные дни, которые могут выпадать на будни, и переносы выходных. Поэтому логика определения "рабочего" дня требует более сложного подхода, чем просто проверка на субботу или воскресенье.
Для решения таких задач в типовых конфигурациях 1С, таких как 1С:Зарплата и управление персоналом или 1С:Управление торговлей, существуют специальные регистры сведений, хранящие производственные календари. При разработке собственных решений рекомендуется реализовать аналогичный механизм или использовать внешние сервисы для получения актуального графика работы.
Алгоритм проверки обычно выглядит следующим образом: сначала определяется день недели, и если это суббота или воскресенье, день считается нерабочим. Если же это будний день, выполняется дополнительная проверка по таблице праздников. Только после прохождения обоих тестов день может считаться рабочим для целей планирования или расчета сроков.
Функция ЭтоРабочийДень(ПроверяемаяДата)
День = ДеньНедели(ПроверяемаяДата);
// Проверка на стандартные выходные
Если День = Перечисления.ДеньНедели.Суббота
Или День = Перечисления.ДеньНедели.Воскресенье Тогда
Возврат Ложь;
КонецЕсли;
// Проверка по производственному календарю (псевдокод)
Если ПроизводственныйКалендарь.ЭтоПраздник(ПроверяемаяДата) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
⚠️ Внимание: Производственные календари утверждаются правительством ежегодно. Не зашивайте даты праздников жестко в код программы, иначе ваша система будет неактуальна уже в следующем году. Используйте справочники или внешние источники.
Учет переносов выходных дней также критически важен. Иногда суббота может быть рабочим днем, а понедельник — выходным. Реализация гибкой системы календарей позволит вашей конфигурации 1С корректно рассчитывать сроки сдачи отчетности, оплаты счетов и отгрузки товаров в соответствии с реальным графиком работы организации.
Для точного определения рабочих дней недостаточно знать только день недели — необходимо использовать производственный календарь с учетом государственных праздников и переносов.
Как получить название дня недели на английском языке в 1С?
Для получения названия дня на английском языке используйте функцию Формат() с указанием параметра языка. Пример: Формат(ТекущаяДата(), "ДФ='dddd'; ЛН='en'). Это вернет полное название дня, например, "Monday", независимо от языка интерфейса пользователя.
Почему ДеньНедели возвращает 0 для понедельника?
Нумерация с нуля для понедельника принята в соответствии со стандартом ISO 8601 и внутренней логикой платформы 1С. Это позволяет легко использовать остаток от деления и другие математические операции при расчете интервалов дат, считая начало недели первым элементом.
Можно ли изменить нумерацию дней недели в 1С?
Нет, внутреннее представление перечисления ДеньНедели изменить нельзя. Однако вы можете создать свою функцию-обертку, которая будет возвращать нужную вам нумерацию (например, от 1 до 7 или с воскресенья как первого дня), добавляя или вычитая смещение из стандартного значения.
Как определить первый день месяца в 1С?
Для получения первого дня месяца используйте функцию НачалоМесяца(Дата). Чтобы узнать день недели для этой даты, передайте результат этой функции в функцию ДеньНедели(). Комбинация этих функций часто используется для расчетов зарплаты и начислений.