Функция ДЕНЬГОДА

Язык запросов

Синтаксис и применение Функция ДЕНЬГОДА в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

Функция ДЕНЬГОДА

Данная функция предназначена для вычисления дня года из значения типа ДАТА. День года находится в диапазоне 1 – 366.

Параметр функции – это выражение, имеющее тип ДАТА.

Если в качестве параметра фигурирует значение типа ДАТА, то результатом функции будет значение типа ЧИСЛО. Если в качестве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и приводят к ошибке исполнения запроса.

см. также: Функции языка запросов

Практические примеры

Части даты: разобрать своё учебное событие 6 октября

Один параметр Дата возвращается в нескольких календарных проекциях. Число месяца, день недели и день года не смешиваются; дополнительно наблюдаем сохранение NULL в функции ГОД.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

Процедура ВыполнитьПример() Экспорт
    ДатаСобытия = Дата(2026, 10, 6, 12, 30, 45);
    Если ТипЗнч(ДатаСобытия) <> Тип("Дата") Тогда
        ВызватьИсключение "Передайте собственную дату события, не строку";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ГОД(&ДатаСобытия) КАК ГодСобытия,
    |    МЕСЯЦ(&ДатаСобытия) КАК МесяцСобытия,
    |    ДЕНЬ(&ДатаСобытия) КАК ДеньМесяца,
    |    ЧАС(&ДатаСобытия) КАК ЧасСобытия,
    |    МИНУТА(&ДатаСобытия) КАК МинутаСобытия,
    |    СЕКУНДА(&ДатаСобытия) КАК СекундаСобытия,
    |    КВАРТАЛ(&ДатаСобытия) КАК КварталСобытия,
    |    НЕДЕЛЯ(&ДатаСобытия) КАК НеделяСобытия,
    |    ДЕНЬНЕДЕЛИ(&ДатаСобытия) КАК ДеньНедели,
    |    ДЕНЬГОДА(&ДатаСобытия) КАК ДеньГода,
    |    ГОД(NULL) КАК НетГода";
    Запрос.УстановитьПараметр("ДатаСобытия", ДатаСобытия);
    Таблица = Запрос.Выполнить().Выгрузить();
    Если Таблица.Количество() <> 1 Тогда
        ВызватьИсключение "Ожидалась одна собственная строка частей даты";
    КонецЕсли;
    Событие = Таблица[0];
    Сообщить(Событие.ГодСобытия = 2026);
    Сообщить(Событие.МесяцСобытия = 10);
    Сообщить(Событие.ДеньМесяца = 6);
    Сообщить(Событие.ЧасСобытия = 12);
    Сообщить(Событие.МинутаСобытия = 30);
    Сообщить(Событие.СекундаСобытия = 45);
    Сообщить(Событие.КварталСобытия = 4);
    Сообщить(Событие.НеделяСобытия = 41);
    Сообщить(Событие.ДеньНедели = 2);
    Сообщить(Событие.ДеньГода = 279);
    Сообщить(ТипЗнч(Событие.НетГода) = Тип("Null"));
КонецПроцедуры

Разбор по шагам

  1. Собственная ДатаСобытия фиксирована: 06.10.2026 12:30:45. Не использовать ТекущаяДата, иначе контроль зависит от дня запуска.

  2. Передать значение типа Дата параметром запроса. Строка 06.10.2026 не является датой только потому, что похожа на неё.

  3. ГОД/МЕСЯЦ/ДЕНЬ извлекают 2026/10/6. ЧАС/МИНУТА/СЕКУНДА — 12/30/45, а не длительность между двумя событиями.

  4. КВАРТАЛ возвращает 4 для октября. НЕДЕЛЯ здесь даёт 41; это номер недели года, не число недель от создания заявки.

  5. ДЕНЬНЕДЕЛИ нумерует понедельник 1 и воскресенье 7. 6 октября 2026 — вторник, поэтому 2. ДЕНЬГОДА считает позицию даты в году: 279, а не 6.

  6. ГОД(NULL) возвращает NULL. Проверить его тип, не подставлять молча год 0 и не считать NULL текстом.

  7. До чтения Таблица[0] проверить одну строку. В каждой строке вывода проверяется свой календарный смысл, не строковое представление даты.

Как проверить результат

  1. Одиннадцать сообщений Истина. Известная учебная дата даёт календарные значения 2026/10/6, 12:30:45, квартал 4, неделю 41, вторник 2, день года 279 и отдельное NULL-поле.

  2. Замените только время на 0:0:0: час, минута и секунда изменятся, календарный день останется тем же. Для строкового ДатаСобытия защита останавливает пример до выполнения запроса.

Ожидаемый результат

Дата разложена на реально вычисляемые календарные признаки без обращения к производственным документам и без зависимости от текущего времени.

На что обратить внимание

  1. Число месяца, номер недели, день месяца, день недели и день года — разные величины. Не используйте один показатель вместо другого.

  2. Номер недели на границах года требует согласования правила недель с задачей. Контроль 41 относится только к этой фиксированной дате; он не объявляет универсальное правило календарной отчётности.

  3. Тип Дата 1С не хранит здесь часовой пояс. Извлечение ЧАС не выполняет преобразование UTC в местное время.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.