Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются разработчики и пользователи. Некорректное отображение дня недели может испортить отчет, нарушить логику бизнес-процессов или даже привести к ошибкам в расчетах. Например, если ваша система автоматически начисляет бонусы по понедельникам, а код ошибочно определяет воскресенье как первый день недели, последствия будут заметны сразу.
В этой статье мы разберем 5 рабочих способов получить день недели в 1С 8.3 и 8.2 — от базовых встроенных функций до сложных запросов с учетом локализации. Вы узнаете, как вывести название дня (например, "понедельник") или его номер (от 1 до 7), как учитывать региональные настройки и избегать типичных ошибок. Все примеры приведены с готовым кодом, который можно скопировать и адаптировать под свои задачи.
Особое внимание уделим нюансам форматирования: почему функция ДеньНедели() может возвращать неожиданные значения, как правильно работать с Формат() для разных языков интерфейса, и почему в некоторых случаях лучше использовать запросы вместо встроенных методов. Если вы когда-нибудь сталкивались с тем, что отчет показывает "0" вместо названия дня или путает воскресенье с субботой — здесь вы найдете решение.
1. Базовый способ: функция ДеньНедели()
Самый простой метод — использовать встроенную функцию ДеньНедели(). Она возвращает номер дня недели (от 1 до 7) для указанной даты. По умолчанию 1 — это понедельник, но это зависит от региональных настроек системы.
Пример кода:
Сообщить(ДеньНедели(ТекущаяДата())); // Вернет число от 1 до 7
Чтобы получить название дня (например, "среда"), используйте комбинацию с функцией Формат():
Сообщить(Формат(ТекущаяДата(), "ДФ=dddd")); // Выведет "понедельник", "вторник" и т.д.
- 🔹 Плюсы: максимально просто, не требует дополнительных обработок.
- 🔸 Минусы: возвращает только номер, а не название; зависит от локализации.
- 🔶 Нюанс: в некоторых конфигурациях (например, с англоязычным интерфейсом)
Формат()вернет название на английском ("Monday").
⚠️ Внимание: Если ваша конфигурация использует нестандартную неделю (например, начинающуюся с воскресенья), функцияДеньНедели()может возвращать значения, отличные от ожидаемых. Проверьте настройки региона вАдминистрирование → Настройки программы → Региональные.
Функция ДеньНедели() возвращает номер дня (1-7), но его интерпретация зависит от региональных настроек 1С. Всегда тестируйте результат на реальных данных!
2. Форматирование даты через Формат()
Функция Формат() — универсальный инструмент для отображения дат в нужном виде. С ее помощью можно вывести полное название дня ("dddd"), сокращенное ("ddd") или даже комбинировать с другими элементами даты.
Примеры использования:
// Полное название дня недели
Сообщить(Формат(ТекущаяДата(), "ДФ=dddd")); // "понедельник"
// Сокращенное название
Сообщить(Формат(ТекущаяДата(), "ДФ=ddd")); // "пн"
// День недели + дата
Сообщить(Формат(ТекущаяДата(), "ДФ=dddd, d MMMM yyyy")); // "понедельник, 15 мая 2023"
| Формат | Пример вывода | Описание |
|---|---|---|
"dddd" |
"понедельник" | Полное название дня |
"ddd" |
"пн" | Сокращенное название (2 символа) |
"d" |
"1" | Номер дня недели (1-7) |
"ДФ=dddd, d MMMM" |
"понедельник, 15 мая" | Комбинированный формат |
Если вам нужно принудительно вывести день на определенном языке (например, на английском независимо от настроек 1С), используйте параметр Язык:
Сообщить(Формат(ТекущаяДата(), "ДФ=dddd", , "en_US")); // "Monday"
⚠️ Внимание: Формат "d" (без буквы "Д" перед "Ф") вернет номер дня в месяце (1-31), а не день недели! Это частая ошибка при копировании кода.
3. Использование запросов для гибкого вывода
Если вам нужно получить день недели в выборке данных (например, в отчете или обработке), удобнее использовать запрос. Это позволит избежать циклов по строкам и ускорит выполнение кода.
Пример запроса для вывода названия дня:
ВЫБРАТЬ
ДеньНедели(ДатаДокумента) КАК НомерДняНедели,
ФОРМАТ(ДатаДокумента, "ДФ=dddd") КАК НазваниеДняНедели
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Если требуется отсортировать данные по дням недели (например, для анализа продаж по дням), используйте конструкцию:
ВЫБРАТЬ
ДеньНедели(ДатаДокумента) КАК ДеньНедели,
СУММА(СуммаДокумента) КАК Итого
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
СГРУППИРОВАТЬ ПО
ДеньНедели(ДатаДокумента)
УПОРЯДОЧИТЬ ПО
ДеньНедели
- 📌 Преимущества запросов:
- 🔹 Работают быстрее, чем обработка в цикле.
- 🔹 Позволяют группировать и сортировать данные по дням недели.
- 🔹 Можно комбинировать с другими полями (например, вывести день недели + сумму продаж).
- 📍 Ограничения:
- 🔸 Нельзя использовать
Формат()напрямую в некоторых версиях платформы (замените наВЫРАЗИТЬ()). - 🔸 Для сложных форматирований может потребоваться пост-обработка результата.
Если запрос возвращает неверные номера дней недели, проверьте параметр НачалоНедели в региональных настройках 1С. Иногда проблема решается добавлением ПАРАМЕТРЫ НачалоНедели = 1 в начало запроса.
4. Работа с датами в отчетах (СКД)
В системе компоновки данных (СКД) вывод дня недели настраивается через параметры поля. Это удобно для отчетов, где нужно показать день недели рядом с датой документа.
Пошаговая инструкция:
- Откройте схему компоновки данных.
- Добавьте поле с датой (например,
ДатаДокумента). - В настройках поля перейдите на вкладку
Формат. - В поле
Формат датыукажитеДФ="dddd, d MMMM yyyy". - Сохраните и обновите отчет.
Если нужно вывести номер дня недели как отдельное поле:
- Создайте вычисляемое поле в СКД.
- В выражении укажите:
ДеньНедели(ДатаДокумента). - Настройте формат отображения (например, чтобы показывать "1" как "Понедельник", используйте условное оформление).
Добавить поле с датой в схему|Настроить формат через "ДФ=dddd"|Проверить региональные настройки|Обновить отчет для проверки-->
Для динамического изменения формата (например, показывать полное название в печатной форме и сокращенное на экране) используйте параметры компоновки:
ПараметрыКомпоновки.ФорматДата = ?(ДляЭкрана, "ДФ=ddd", "ДФ=dddd, d MMMM yyyy");
5. Обработка дней недели в коде (циклы, массивы, условия)
Иногда требуется не просто вывести день недели, а обработать его программно — например, проверить, является ли дата выходным, или присвоить ей специальный статус. Для этого используют комбинацию функций и условных операторов.
Пример 1: Проверка на выходной (суббота/воскресенье):
ДеньНедели = ДеньНедели(ТекущаяДата());
Если ДеньНедели = 6 Или ДеньНедели = 7 Тогда
Сообщить("Сегодня выходной!");
Иначе
Сообщить("Рабочий день.");
КонецЕсли;
Пример 2: Массив с названиями дней (полезно для многоязычных конфигураций):
ДниНедели = Новый Массив;
ДниНедели.Добавить("Понедельник");
ДниНедели.Добавить("Вторник");
// ... остальные дни
Сообщить(ДниНедели[ДеньНедели(ТекущаяДата()) - 1]);
Пример 3: Условное оформление в отчете (подсветка выходных):
Процедура ПриОформленииСтроки(ЭлементСтроки, ДанныеСтроки)
Если ДанныеСтроки.ДеньНедели >= 6 Тогда
ЭлементСтроки.ЦветФона = ВебЦвета.Красный;
КонецЕсли;
КонецПроцедуры
- 🔧 Практические советы:
- 🔹 Для проверки диапазона дней (например, "среда-пятница") используйте
ДеньНедели >= 3 И ДеньНедели <= 5. - 🔹 Если нужен массив дней на другом языке, загружайте его из справочника или внешнего файла — это упростит локализацию.
- 🔹 Для работы с историческими датами учитывайте, что в СССР выходными были разные дни (например, в 1930-х — 6-дневная неделя).
Как учитывать праздничные дни?
В 1С нет встроенного календаря праздников, но вы можете:
1. Создать справочник "ПраздничныеДни" с полем "Дата".
2. При проверке на выходной добавлять условие:
ИЛИ НайтиПоПолю(Справочники.ПраздничныеДни, "Дата", ТекущаяДата()) <> Неопределено
3. Использовать внешние сервисы (например, API календаря) для автоматического обновления праздников.
6. Нюансы работы с разными версиями 1С
Поведение функций для работы с датами может отличаться в зависимости от версии платформы и конфигурации. Вот ключевые различия:
| Версия 1С | Особенности работы с днями недели | Рекомендации |
|---|---|---|
| 8.3 (управляемые формы) | Поддерживает Формат() с параметром языка. Функция ДеньНедели() стабильна. |
Используйте Формат(Дата, "ДФ=dddd", , "ru_RU") для явного указания языка. |
| 8.2 (обычные формы) | Формат() может не поддерживать многобайтовые кодировки. Номера дней зависят от региональных настроек. |
Для многоязычных решений создавайте собственные массивы с названиями дней. |
| 8.1 и старше | Отсутствует Формат() с параметром "ДФ". Функция ДеньНедели() возвращает 0 для воскресенья. |
Используйте Неделя(Дата) или создавайте кастомные функции. |
| 1С:ERP, УТ 11, БП 3.0 | В некоторых отчетах день недели выводится автоматически (например, в "Календаре задач"). | Проверяйте настройки отчета перед ручным форматированием. |
Для обратной совместимости кода используйте конструкции вида:
Функция ПолучитьДеньНедели(Дата)
Попытка
Возврат ДеньНедели(Дата); // Для 8.2+
Исключение
Возврат ?(Неделя(Дата) = 1, 7, Неделя(Дата) - 1); // Для 8.1 (воскресенье = 7)
КонецПопытки;
КонецФункции
⚠️ Внимание: В конфигурациях на базе 1С:ERP или 1С:УТ 11 некоторые отчеты (например, "Анализ продаж") уже содержат колонку с днем недели. Добавление своего поля может привести к дублированию данных. Всегда проверяйте существующие настройки перед модификацией!
7. Типичные ошибки и как их избежать
Даже опытные разработчики иногда сталкиваются с проблемами при работе с днями недели в 1С. Вот TOP-5 ошибок и способы их решения:
- ❌ Ошибка 1: Функция
ДеньНедели()возвращает 0.🔹 Причина: В старых версиях (8.1) воскресенье кодировалось как 0.
🔹 Решение: Используйте
?(ДеньНедели(Дата) = 0, 7, ДеньНедели(Дата)). - ❌ Ошибка 2:
Формат(Дата, "d")выводит номер дня в месяце, а не недели.🔹 Причина: Опечатка в формате (пропущена буква "Д" перед "Ф").
🔹 Решение: Используйте
Формат(Дата, "ДФ=d")для номера дня недели. - ❌ Ошибка 3: Названия дней выводятся на английском.
🔹 Причина: Язык интерфейса 1С установлен как
en_US.🔹 Решение: Явно укажите язык:
Формат(Дата, "ДФ=dddd", , "ru_RU"). - ❌ Ошибка 4: Запрос с
ДеньНедели()работает медленно.🔹 Причина: Функция вычисляется для каждой строки отдельно.
🔹 Решение: Используйте временные таблицы или вычисляйте день недели на клиенте.
- ❌ Ошибка 5: В отчете СКД день недели отображается как число, а не текст.
🔹 Причина: Неверный формат поля в схеме компоновки.
🔹 Решение: Измените формат на
ДФ=ddddв настройках поля.
Если вы работаете с историческими датами (до 1918 года), помните, что в России до революции использовался юлианский календарь. Для корректной работы добавьте поправку:
Функция ЮлианскийВГригорианский(Дата)
Если Дата < '19180214' Тогда
Возврат Дата + 13;
Иначе
Возврат Дата;
КонецЕсли;
КонецФункции
FAQ: Частые вопросы по выводу дня недели в 1С
🔹 Как вывести день недели на английском, если интерфейс русский?
Используйте параметр языка в функции Формат():
Сообщить(Формат(ТекущаяДата(), "ДФ=dddd", , "en_US")); // "Monday"
Для других языков замените "en_US" на нужный код (например, "uk_UA" для украинского).
🔹 Почему ДеньНедели() возвращает 7 для воскресенья, а не 1?
Это зависит от региональных настроек 1С. В большинстве конфигураций по умолчанию:
1— понедельник,7— воскресенье.
Чтобы изменить это, перейдите в Администрирование → Настройки программы → Региональные и настройте параметр Начало недели.
🔹 Можно ли получить день недели для даты в формате строки?
Да, но сначала преобразуйте строку в дату:
ДатаИзСтроки = Дата('2023-05-15');
Сообщить(Формат(ДатаИзСтроки, "ДФ=dddd"));
Если строка в нестандартном формате (например, "15.05.2023"), используйте:
ДатаИзСтроки = ДатаЗначение("15.05.2023", "DD.MM.YYYY");
🔹 Как в отчете СКД вывести день недели цветом (например, красным для выходных)?
Настройте условное оформление в схеме компоновки:
- Откройте настройки отчета → "Условное оформление".
- Добавьте новое правило.
- В условии укажите:
ДеньНедели(ДатаДокумента) >= 6. - Выберите цвет фона (например, красный).
Для динамического изменения цвета в коде используйте обработчик ПриОформленииСтроки.
🔹 Где хранится информация о начале недели (понедельник/воскресенье) в 1С?
Этот параметр определяется в:
- Региональных настройках:
Администрирование → Настройки программы → Региональные → Начало недели. - Настройках пользователя: иногда начало недели можно переопределить в личном профиле.
- Конфигурации: в некоторых решениях (например, 1С:ERP) это настраивается в параметрах учета.
Если значение не меняется, проверьте права доступа к настройкам.