Решение задач 1С:Предприятие 8 на примерах

Работа с датой в 1С программно: текущая дата, начало месяца, формат и разность

АлгоритмыОпубликовано

Срок оплаты, период отчёта, имя файла с датой, возраст сотрудника — задачи с датами встречаются в каждой конфигурации. В статье собраны рабочие приёмы для встроенного языка: как создать дату, чем отличаются ТекущаяДата и ТекущаяДатаСеанса, как получить начало и конец периода, прибавить день или месяц, найти разность в днях, отформатировать дату и разобрать её из строки. Работа с датами внутри запроса вынесена в отдельную статью.

Задача: создавать и обрабатывать даты в коде

Даты встречаются в любой конфигурации: срок оплаты, период отчёта, имя файла выгрузки, возраст сотрудника, разница между двумя документами. Во встроенном языке 1С для них есть набор функций, и большинство задач решается ими без самодельных вычислений. Статья о коде на встроенном языке; о датах внутри текста запроса (ДАТАВРЕМЯ, НАЧАЛОПЕРИОДА, РАЗНОСТЬДАТ) читайте в отдельной статье про дату в запросе.

Как создать дату: Дата(), литерал и строка

Значение типа «Дата» в 1С всегда содержит и дату, и время. Если время не указано, оно равно 0:00:00. Создать дату можно тремя способами.

Дата1 = Дата(2026, 11, 1);                 // 01.11.2026 0:00:00
Дата2 = Дата(2026, 11, 1, 14, 30, 0);      // 01.11.2026 14:30:00
Дата3 = Дата("20261101");                  // из строки формата ГГГГММДД
Дата4 = Дата("20261101143000");            // из строки ГГГГММДДЧЧММСС
Дата5 = '20261101';                        // литерал даты прямо в коде
ПустаяДата = Дата(1, 1, 1);                // пустая дата

Литерал в одинарных кавычках разбирается при компиляции, он быстрее и нагляднее для констант. Параметры Дата(Год, Месяц, День) проверяются при выполнении: несуществующая комбинация, например Дата(2026, 2, 30) или Дата(2026, 13, 1), вызывает исключение. Если значения приходят извне, оборачивайте создание в Попытка ... Исключение.

Текущая дата: ТекущаяДата и ТекущаяДатаСеанса

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

ФункцияЧто возвращаетКогда использовать
ТекущаяДата()Время компьютера, на котором выполняется код (на сервере — время сервера, на клиенте — клиента)Почти никогда в прикладной логике
ТекущаяДатаСеанса()Текущее время с учётом часового пояса сеанса пользователяОсновная функция: проставление дат в документах, отчёты, сроки
ТекущаяУниверсальнаяДата()Время UTCХранение меток времени, обмен между часовыми поясами

Если все пользователи находятся в одном часовом поясе с сервером, разницы можно не заметить. Но стоит появиться удалённому филиалу или серверу в другом поясе, как ТекущаяДата() начинает давать «чужое» время. Поэтому в новом коде используйте ТекущаяДатаСеанса().

Начало и конец периода

Чтобы отбросить время или получить границы периода, не нужно считать вручную — есть готовые функции.

Сегодня = ТекущаяДатаСеанса();

НачалоСегодня      = НачалоДня(Сегодня);        // сегодня 0:00:00
КонецСегодня       = КонецДня(Сегодня);         // сегодня 23:59:59
ПервоеЧисло        = НачалоМесяца(Сегодня);
ПоследнееЧисло     = КонецМесяца(Сегодня);      // последняя секунда месяца
НачалоГодаДата     = НачалоГода(Сегодня);
НачалоКварталаДата = НачалоКвартала(Сегодня);
ПонедельникНедели  = НачалоНедели(Сегодня);     // неделя начинается с понедельника
ВоскресеньеНедели  = КонецНедели(Сегодня);

// Предыдущий месяц целиком
НачалоПрошлого = НачалоМесяца(ДобавитьМесяц(Сегодня, -1));
КонецПрошлого  = КонецМесяца(НачалоПрошлого);

Функция КонецДня возвращает последнюю секунду суток, поэтому её значение удобно передавать в отбор «по дату включительно». Аналогично существуют КонецГода, КонецКвартала, НачалоЧаса, НачалоМинуты.

Прибавить день к дате и сдвиг по месяцам

Арифметика с датами проста: число, прибавляемое к дате, трактуется как количество секунд. Поэтому сутки — это 86400.

ЗавтраДата      = Дата + 86400;            // плюс один день
ЧерезНеделю     = Дата + 7 * 86400;
ВчераДата       = Дата - 86400;
ЧерезЧас        = Дата + 3600;

// Месяцы нельзя прибавлять секундами — длина месяца разная
ЧерезМесяц  = ДобавитьМесяц(Дата, 1);
ЧерезГод    = ДобавитьМесяц(Дата, 12);
МесяцНазад  = ДобавитьМесяц(Дата, -1);

Классическая ошибка новичка: Дата + 1 прибавляет не день, а одну секунду. Функция ДобавитьМесяц учитывает разную длину месяцев: если нужного дня нет в целевом месяце, возвращается его последний день, то есть 31 января плюс один месяц даст конец февраля. Время суток при этом сохраняется.

Разность дат в днях

Вычитание одной даты из другой возвращает число секунд между ними. Чтобы получить дни, делим на 86400 и при необходимости округляем.

// Полных суток между моментами
Дней = Цел((КонецПериода - НачалоПериода) / 86400);

// Календарных дней, время суток игнорируем
КалендарныхДней = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;

Возраст и стаж считают отдельной функцией, чтобы не зависеть от високосных лет:

Функция ПолныхЛет(ДатаНачала, НаДату)

    Лет = Год(НаДату) - Год(ДатаНачала);
    Если ДобавитьМесяц(ДатаНачала, Лет * 12) > НаДату Тогда
        Лет = Лет - 1;
    КонецЕсли;

    Возврат Лет;

КонецФункции

Функция ПолныхЛет подходит для расчёта возраста и стажа. Она корректно обрабатывает и дату 29 февраля, потому что опирается на ДобавитьМесяц.

Год, месяц, день, день недели

Компоненты даты извлекаются функциями с одноимёнными названиями. Все они возвращают число.

Г  = Год(Дата);
М  = Месяц(Дата);
Д  = День(Дата);
Ч  = Час(Дата);
Мин = Минута(Дата);
С  = Секунда(Дата);

ДеньНед = ДеньНедели(Дата);        // 1 — понедельник ... 7 — воскресенье
НомерНедели = НеделяГода(Дата);
ДеньВГоду = ДеньГода(Дата);

Выходной = ДеньНедели(Дата) > 5;
ДнейВМесяце = День(КонецМесяца(Дата));

Проверка на выходной по номеру дня недели не учитывает праздники и переносы: для них используют производственный календарь конфигурации.

Формат даты: Формат() и ДФ, ДЛФ

Для вывода даты в нужном виде служит функция Формат(Значение, ПараметрыФормата). Шаблон даты задаётся параметром ДФ, в котором работают привычные обозначения: dd — день, MM — месяц, yyyy — год, HH — часы в 24-часовом формате, mm — минуты, ss — секунды.

Формат(Дата, "ДФ=dd.MM.yyyy")                // 01.11.2026
Формат(Дата, "ДФ='dd.MM.yyyy HH:mm:ss'")      // 01.11.2026 14:30:00
Формат(Дата, "ДФ=yyyy-MM-dd")                 // 2026-11-01
Формат(Дата, "ДФ=yyyyMMdd")                   // 20261101, удобно для имён файлов
Формат(Дата, "ДЛФ=Д")                         // короткая дата по настройкам системы
Формат(Дата, "ДЛФ=ДД")                        // длинная дата («1 ноября 2026 г.»)
Формат(Дата, "ДЛФ=В")                         // только время

ИмяФайла = "Выгрузка_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") + ".xml";

Если шаблон содержит пробелы или двоеточия, его заключают в апострофы. Главная ловушка: регистр букв имеет значение. MM — месяц, mm — минуты; HH — 24-часовой формат, hh — 12-часовой. Вместо ДФ часто используют ДЛФ — формат, который зависит от региональных настроек: удобно для интерфейса, но не для обмена данными, где нужен предсказуемый шаблон. Функция Строка(Дата) тоже выводит дату в региональном представлении.

Преобразование строки в дату

Функция Дата("...") принимает только цифровые строки формата ГГГГММДД или ГГГГММДДЧЧММСС. Строка вида «01.11.2026» таким способом не преобразуется и вызовет ошибку. Для разных источников есть несколько способов.

// 1. Из ISO-формата 2026-11-01T14:30:00 (XML, JSON, веб-сервисы)
ДатаИзXML = XMLЗначение(Тип("Дата"), "2026-11-01T14:30:00");

// Обратное преобразование
Строка = XMLСтрока(ДатаИзXML);

Строку формата «ДД.ММ.ГГГГ» разбирают вручную:

Функция СтрокаВДату(Знач Строка)

    Части = СтрРазделить(СокрЛП(Строка), ".");
    Если Части.Количество() <> 3 Тогда
        Возврат Дата(1, 1, 1);
    КонецЕсли;

    Попытка
        Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
    Исключение
        Возврат Дата(1, 1, 1);
    КонецПопытки;

КонецФункции

Функция СтрокаВДату возвращает пустую дату, если строка не распознана, — так вызывающий код может проверить результат через ЗначениеЗаполнено. Формат XMLЗначение стоит использовать при чтении данных из внешних систем (подробнее — в статьях про JSON и XML), а в пользовательском вводе разбирайте строку по правилам нужного формата.

Пустая дата и проверка заполненности

Незаполненная дата в 1С — это 01.01.0001 0:00:00. Получить её можно как Дата(1, 1, 1) или литералом '00010101'. Для проверки используйте ЗначениеЗаполнено(), а не сравнение с датой:

Если Не ЗначениеЗаполнено(Объект.ДатаОплаты) Тогда
    Объект.ДатаОплаты = НачалоДня(ТекущаяДатаСеанса());
КонецЕсли;

// Эквивалентное сравнение
Если Объект.ДатаОплаты = '00010101' Тогда
    // дата не заполнена
КонецЕсли;

Сравнивать даты можно операторами <, > и =. Помните, что равенство учитывает и время: чтобы узнать, что два момента приходятся на один день, сравните НачалоДня(Дата1) = НачалоДня(Дата2).

Часовые пояса

1С хранит даты без часового пояса, поэтому «14:30» само по себе не говорит, в чьём это времени. Поведение определяют настройки сеанса. Для переходов между поясами есть функции:

ЧасовойПояс = ЧасовойПоясСеанса();

// Сохранённый в UTC момент показать пользователю
Местное = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс);

// Введённое пользователем время привести к UTC
Универсальное = УниверсальноеВремя(Местное, ЧасовойПояс);

// Задать пояс для сеанса (серверный код)
УстановитьЧасовойПоясСеанса("Europe/Moscow");

Практическое правило для распределённых систем: хранить и передавать метки времени в UTC, а показывать в часовом поясе пользователя.

Типичные ошибки с датами

  • Дата + 1 вместо Дата + 86400 — прибавляется секунда, а не день.
  • ТекущаяДата() в серверном коде при пользователях из разных поясов — расхождение с ожидаемым временем.
  • Шаблон "ДФ=dd.mm.yyyy" — вместо месяца выводятся минуты (нужен MM).
  • Дата("01.11.2026") — исключение; допустимы только цифровые форматы ГГГГММДД[ЧЧММСС].
  • Сравнение Дата1 = Дата2 без учёта времени — документы одного дня оказываются «неравными».
  • Расчёт месяцев делением секунд на 2 592 000 — вместо ДобавитьМесяц и сравнения границ.
  • Форматирование пустой даты без проверки заполненности — на выходе пустая или бессмысленная строка.

Функции работы с датой: шпаргалка

ЗадачаКод
Дата без времениНачалоДня(Дата)
Конец дня, месяцаКонецДня(Дата), КонецМесяца(Дата)
Прибавить деньДата + 86400
Прибавить месяцДобавитьМесяц(Дата, 1)
Разность в днях(НачалоДня(Д2) - НачалоДня(Д1)) / 86400
Дата в строкуФормат(Дата, "ДФ=dd.MM.yyyy")
Строка в датуДата("20261101"), XMLЗначение(Тип("Дата"), ...)
Пустая датаДата(1, 1, 1), проверка ЗначениеЗаполнено
Текущая дата для пользователяТекущаяДатаСеанса()

Актуальность для новых версий

Функции Дата, НачалоДня, КонецМесяца, ДобавитьМесяц, Формат и функции извлечения частей даты одинаково работают во всех версиях платформы 8.3. Функции часовых поясов сеанса (ЧасовойПоясСеанса, МестноеВремя, УниверсальноеВремя) доступны в актуальных релизах 8.3; в прикладных решениях всегда используйте ТекущаяДатаСеанса() вместо ТекущаяДата(). Результат ДЛФ зависит от региональных настроек системы.

Частые вопросы

Как прибавить день к дате в 1С?

Прибавьте 86400 секунд: ЗавтраДата = Дата + 86400. Для месяцев используйте ДобавитьМесяц(Дата, 1), потому что длина месяца разная. Выражение Дата + 1 прибавляет только одну секунду.

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает время компьютера, на котором выполняется код. ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя, поэтому подходит для прикладной логики и документов.

Как получить начало месяца в 1С?

Функцией НачалоМесяца(Дата). Конец месяца даёт КонецМесяца(Дата) — последняя секунда месяца. Аналогично работают НачалоГода, НачалоКвартала, НачалоНедели и НачалоДня.

Как преобразовать строку в дату в 1С?

Строки вида ГГГГММДД или ГГГГММДДЧЧММСС принимает функция Дата("20261101"). Формат ISO разбирает XMLЗначение(Тип("Дата"), "2026-11-01T14:30:00"). Строку «01.11.2026» нужно разобрать вручную по частям.

Обновление конфигурации 1С: типовой, платформы и сервера

Алгоритмы

Как обновить типовую конфигурацию 1С с доработками и без, что делать с поддержкой, как обновить базу данных, платформу и сервер 1С без потери данных.

Отладка в 1С: точки останова и отладка на сервере

Алгоритмы

Практическое руководство по отладчику 1С: точки останова, шаги, табло, остановка по ошибке, замер производительности и настройка отладки серверного кода и фоновых заданий.

Штрихкод в 1С: контрольная цифра EAN-13, генерация, поиск и печать

Алгоритмы

Практический разбор штрихкодов в 1С: расчёт контрольной цифры EAN-13 и EAN-8, внутренние уникальные коды, поиск товара по штрихкоду, вывод картинки в печатную форму и работа со сканером.

Процедуры и функции в 1С: синтаксис, параметры, экспорт и общие модули

Алгоритмы

Разбор процедур и функций встроенного языка 1С: отличия, параметры, возврат нескольких значений, экспортные методы, флаги общих модулей, рекурсия и динамическое выполнение кода.