Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются разработчики при создании отчётов, обработок или печатных форм. Нередко требуется не просто отобразить дату в стандартном формате, а вывести её название дня недели — будь то для анализа временных рядов, формирования графиков работы или просто для удобства пользователей. В этой статье мы разберём все возможные способы получения названия дня недели, от базовых встроенных функций до кастомизированных решений с учётом локализации и особенностей платформы.
Важно понимать, что подход к решению задачи зависит от нескольких факторов: версии платформы (1С 8.2 или 8.3), необходимости многоязычной поддержки, требований к производительности (например, в больших выборках данных) и даже от того, нужно ли название на русском, английском или другом языке. Мы рассмотрим каждый из этих аспектов, чтобы вы могли выбрать оптимальный метод для своей задачи.
1. Базовый способ: функция Формат()
Самый простой и универсальный метод — использование встроенной функции Формат(). Она позволяет преобразовать дату в строку с заданным форматом, включая название дня недели. Этот способ работает во всех версиях платформы и не требует дополнительного программирования.
Синтаксис функции:
Формат(Дата, "ФорматнаяСтрока")
Для вывода дня недели используются следующие спецификаторы:
- 📅
Д— полное название дня недели (например, "понедельник") - 📅
д— сокращённое название (например, "пн") - 📅
ДД— номер дня недели (1–7, где 1 — понедельник)
Примеры использования:
// Полное название дня недели
Сообщить(Формат(ТекущаяДата(), "Д")); // Выведет: "среда"
// Сокращённое название
Сообщить(Формат(ТекущаяДата(), "д, dd.MM.yyyy")); // Выведет: "ср, 15.05.2026"
// Номер дня недели
Сообщить(Формат(ТекущаяДата(), "ДД")); // Выведет: "3" (среда)
⚠️ Внимание: Спецификаторы формата зависят от языка интерфейса пользователя. Если в системе установлен английский язык, то Формат(ТекущаяДата(), "Д") вернёт "Wednesday" вместо "среда".
2. Использование функции ДеньНедели()
Если вам нужно не строковое представление, а числовой индекс дня недели (например, для условной логики), используйте функцию ДеньНедели(). Она возвращает число от 1 до 7, где:
- 🔢
1— понедельник - 🔢
2— вторник - 🔢 ...
- 🔢
7— воскресенье
Пример:
ДеньНедели = ДеньНедели(ТекущаяДата());
Если ДеньНедели = 6 Тогда
Сообщить("Сегодня суббота — выходной!");
КонецЕсли;
Чтобы преобразовать числовой индекс в название дня, можно использовать массив или конструкцию Выбор:
Процедура ПолучитьНазваниеДня(ДеньНедели)
Название = "";
Выбор
Когда ДеньНедели = 1 Тогда Название = "Понедельник";
Когда ДеньНедели = 2 Тогда Название = "Вторник";
// ... остальные дни
Иначе Название = "Неопределён";
КонецВыбора;
Возврат Название;
КонецПроцедуры
Для ускорения работы с большими массивами дат (например, в отчётах) заранее создайте справочник соответствий числовых индексов и названий дней. Это избавит от повторных вычислений в цикле.
3. Работа с запросами и получение дня недели в выборках
При формировании отчётов или обработке данных через запросы 1С часто требуется вывести день недели непосредственно в результате выборки. Для этого используйте функцию ДЕНЬНЕДЕЛИ() в языке запросов.
Пример запроса:
Выбрать
ДатаДокумента,
ДЕНЬНЕДЕЛИ(ДатаДокумента) Как НомерДня,
ФОРМАТ(ДатаДокумента, "Д") Как НазваниеДня
Из
Документ.РеализацияТоваровУслуг
Особенности работы с ДЕНЬНЕДЕЛИ() в запросах:
- 📊 Возвращает числовой индекс (1–7), аналогично одноимённой функции встроенного языка.
- 📊 Для преобразования в строку используйте
ФОРМАТ()непосредственно в запросе. - 📊 В 1С 8.2 синтаксис может отличаться — проверьте совместимость в документации.
| Функция | Возвращаемое значение | Пример результата | Применимость |
|---|---|---|---|
ДЕНЬНЕДЕЛИ(Дата) |
Число (1–7) | 3 (среда) |
Запросы |
ФОРМАТ(Дата, "Д") |
Строка | "среда" |
Запросы, встроенный язык |
ДеньНедели(Дата) |
Число (1–7) | 3 |
Встроенный язык |
⚠️ Внимание: В 1С 8.2 функция ФОРМАТ() в запросах может не поддерживаться. В этом случае используйте постобработку результатов выборки.
4. Локализация: вывод дня недели на разных языках
Если ваша конфигурация используется в нескольких странах или требуется поддержка нескольких языков, стандартные функции Формат() могут возвращать названия дней на языке интерфейса пользователя. Чтобы принудительно вывести название на нужном языке независимо от настроек системы, используйте один из следующих подходов:
Способ 1: Справочник названий
Создайте справочник с предопределёнными элементами для каждого языка:
Справочник.ДниНеделиНаАнглийском.НайтиПоНаименованию("Wednesday")
Способ 2: Использование функции НСтр()
Функция НСтр() позволяет получить строку на заданном языке:
НазваниеДня = НСтр("ru = 'среда'; en = 'Wednesday'");
Способ 3: Внешние библиотеки
Для сложных многолязычных проектов можно подключить внешние обработки или библиотеки, например, BSL Language Server или кастомизированные решения на основе JSON-словарей.
Как добавить поддержку украинского языка?
Для украинского языка в НСтр() используйте код uk:
НазваниеДня = НСтр("ru = 'среда'; uk = 'середа'; en = 'Wednesday'");
Убедитесь, что в конфигурации установлен соответствующий языковой пакет.
5. Продвинутые решения: кастомизированные функции
Если стандартные методы не подходят (например, требуется нестандартный формат или дополнительная логика), можно создать собственную функцию. Ниже приведён пример функции, которая возвращает название дня недели с учётом пользовательских настроек:
Функция ПолучитьНазваниеДняНедели(Дата, ПолноеНазвание = Истина, Язык = "ru")
ДеньНедели = ДеньНедели(Дата);
МассивДнейРу = Новый Массив;
МассивДнейРу.Добавить("понедельник");
МассивДнейРу.Добавить("вторник");
// ... остальные дни
МассивДнейEn = Новый Массив;
МассивДнейEn.Добавить("Monday");
МассивДнейEn.Добавить("Tuesday");
// ... остальные дни
Если Язык = "ru" Тогда
Название = МассивДнейРу[ДеньНедели - 1];
ИначеЕсли Язык = "en" Тогда
Название = МассивДнейEn[ДеньНедели - 1];
КонецЕсли;
Если НЕ ПолноеНазвание Тогда
Название = Лев(Название, 2); // Сокращение до 2 символов
КонецЕсли;
Возврат Название;
КонецФункции
Преимущества кастомизированного подхода:
- 🛠️ Гибкость: можно добавить логику для любых форматов.
- 🛠️ Производительность: при частом использовании функция кэшируется.
- 🛠️ Расширяемость: легко добавить поддержку новых языков.
Определите требуемые языки|Создайте массивы названий дней|Добавьте параметры для гибкости (полное/сокращённое)|Протестируйте на крайних случаях (например, дата = 01.01.0001)
-->
6. Особенности работы с датами в 1С 8.2 vs 8.3
Хотя большинство функций для работы с датами одинаковы в 1С 8.2 и 1С 8.3, есть несколько ключевых отличий, которые стоит учитывать:
1С 8.2:
- 🔄 Функция
Формат()в запросах может не поддерживаться. - 🔄 Нет встроенной поддержки
НСтр()для многолязычности (требуется ручная реализация). - 🔄 Ограничения на длину форматной строки.
1С 8.3:
- 🔄 Полная поддержка
Формат()иНСтр()в запросах. - 🔄 Улучшенная работа с датами в клиент-серверном режиме.
- 🔄 Возможность использования
ДатаВремяс миллисекундами.
Пример кода для 1С 8.2 (обход ограничений):
// Альтернатива ФОРМАТ() в запросах для 8.2
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Дата = Выборка.ДатаДокумента;
Сообщить(Формат(Дата, "Д")); // Форматирование после выборки
КонецЦикла;
⚠️ Внимание: При миграции кода с 1С 8.2 на 8.3 проверьте совместимость функций, особенно если используете кастомизированные решения для работы с датами.
7. Практические примеры использования
Рассмотрим несколько реальных сценариев, где требуется вывод дня недели:
Пример 1: Отчёт по продажам с разбивкой по дням недели
В отчёте нужно показать сумму продаж по каждому дню недели. Используем запрос с группировкой:
Выбрать
ДЕНЬНЕДЕЛИ(Документ.Дата) Как ДеньНедели,
ФОРМАТ(Документ.Дата, "Д") Как НазваниеДня,
СУММА(Документ.СуммаДокумента) Как Итого
Из
Документ.РеализацияТоваровУслуг Как Документ
Сгруппировать По
ДЕНЬНЕДЕЛИ(Документ.Дата),
ФОРМАТ(Документ.Дата, "Д")
Упорядочить По
ДеньНедели
Пример 2: Проверка выходных дней в документе
При проведении документа нужно запретить создание записей в выходные дни:
Процедура ПередЗаписью(Отказ)
Если ДеньНедели(Дата) > 5 Тогда
Сообщить("Документ нельзя создать в выходной день!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Пример 3: Формирование графика работы сотрудников
В обработке для кадрового учёта требуется вывести дни недели с пометкой "рабочий/выходной":
Для Счётчик = 1 По 7 Цикл
День = ПолучитьНазваниеДняНедели(ТекущаяДата() + (Счётчик - 1), Истина);
Если Счётчик > 5 Тогда
Сообщить(День + " — выходной");
Иначе
Сообщить(День + " — рабочий день");
КонецЕсли;
КонецЦикла;
Для анализа временных рядов (например, продаж по дням недели) всегда используйте числовые индексы (1–7) в группировках запросов — это ускорит обработку больших данных.
FAQ: Частые вопросы по работе с днями недели в 1С
Как вывести день недели на английском, если интерфейс русский?
Используйте функцию НСтр() с явным указанием языка:
Сообщить(НСтр("en = 'Monday'; ru = 'понедельник'"));
Или создайте справочник с переводами и выбирайте нужную строку по коду языка.
Почему функция ДеньНедели() возвращает 7 для воскресенья, а не 0?
В 1С:Предприятие неделя начинается с понедельника (индекс 1), а воскресенье имеет индекс 7. Это соответствует стандарту ISO 8601, где понедельник считается первым днём недели.
Можно ли получить день недели для даты в формате строка?
Сначала преобразуйте строку в дату с помощью Дата() или СтрокаВДата():
ДатаИзСтроки = Дата(2026, 5, 15);
Сообщить(Формат(ДатаИзСтроки, "Д"));
Если строка в нестандартном формате, используйте ПарсингДаты() из библиотеки StandardLibrary.
Как вывести день недели в отчёте на СКД?
В схеме компоновки данных добавьте вычисляемое поле:
- Откройте настройки схемы.
- Перейдите на вкладку "Вычисляемые поля".
- Создайте поле с выражением:
ФОРМАТ(ДатаДокумента, "Д"). - Добавьте поле в структуру отчёта.
Почему в запросе ДЕНЬНЕДЕЛИ() возвращает неверные значения?
Проверьте:
- 🔍 Правильность передачи даты в запрос (возможно, передаётся строка вместо даты).
- 🔍 Настройки локали сервера 1С (в некоторых случаях влияет на расчёт дней).
- 🔍 Версию платформы: в 1С 8.2 могут быть ограничения.