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

В этой статье мы разберем 5 рабочих способов получить день недели в 1С 8.3 и 8.2 — от базовых встроенных функций до сложных запросов с учетом локализации. Вы узнаете, как вывести название дня (например, "понедельник") или его номер (от 1 до 7), как учитывать региональные настройки и избегать типичных ошибок. Все примеры приведены с готовым кодом, который можно скопировать и адаптировать под свои задачи.

Особое внимание уделим нюансам форматирования: почему функция ДеньНедели() может возвращать неожиданные значения, как правильно работать с Формат() для разных языков интерфейса, и почему в некоторых случаях лучше использовать запросы вместо встроенных методов. Если вы когда-нибудь сталкивались с тем, что отчет показывает "0" вместо названия дня или путает воскресенье с субботой — здесь вы найдете решение.

📊 Какой версии 1С вы пользуетесь?
8.3 (управляемые формы)
8.2 (обычные формы)
8.1 или старше
Не знаю

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. Работа с датами в отчетах (СКД)

В системе компоновки данных (СКД) вывод дня недели настраивается через параметры поля. Это удобно для отчетов, где нужно показать день недели рядом с датой документа.

Пошаговая инструкция:

  1. Откройте схему компоновки данных.
  2. Добавьте поле с датой (например, ДатаДокумента).
  3. В настройках поля перейдите на вкладку Формат.
  4. В поле Формат даты укажите ДФ="dddd, d MMMM yyyy".
  5. Сохраните и обновите отчет.

Если нужно вывести номер дня недели как отдельное поле:

  1. Создайте вычисляемое поле в СКД.
  2. В выражении укажите: ДеньНедели(ДатаДокумента).
  3. Настройте формат отображения (например, чтобы показывать "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");
🔹 Как в отчете СКД вывести день недели цветом (например, красным для выходных)?

Настройте условное оформление в схеме компоновки:

  1. Откройте настройки отчета → "Условное оформление".
  2. Добавьте новое правило.
  3. В условии укажите: ДеньНедели(ДатаДокумента) >= 6.
  4. Выберите цвет фона (например, красный).

Для динамического изменения цвета в коде используйте обработчик ПриОформленииСтроки.

🔹 Где хранится информация о начале недели (понедельник/воскресенье) в 1С?

Этот параметр определяется в:

  1. Региональных настройках: Администрирование → Настройки программы → Региональные → Начало недели.
  2. Настройках пользователя: иногда начало недели можно переопределить в личном профиле.
  3. Конфигурации: в некоторых решениях (например, 1С:ERP) это настраивается в параметрах учета.

Если значение не меняется, проверьте права доступа к настройкам.