Работа с датами в 1С

Работа с датами — практика для новичков

Откуда берётся дата в коде?

1) Конструктор (надёжный способ)

Лето = Дата(2014, 6, 1);         // Год, Месяц, День, (часы, минуты, секунды — опционально)
Сообщить(Лето);

2) Текущая дата/время

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

3) Ввод от пользователя

ДатаПользователя = Неопределено;   // или '00010101'
ВвестиДату(ДатаПользователя);
ОткрытьЗначение(ДатаПользователя);

Совет: строковый литерал 'YYYYMMDD' удобен для быстрых примеров,
но для вычислений безопаснее Дата(Г,М,Д) — меньше шансов ошибиться.


Разбор готовой даты на части

Г = Год(Сегодня);
М = Месяц(Сегодня);
Д = День(Сегодня);
Сообщить(Г + "-" + М + "-" + Д);

Полезные «нормализаторы»:

НачалоСуток   = НачалоДня(Сегодня);
КонецСуток    = КонецДня(Сегодня);
НачалоМесяца  = НачалоМесяца(Сегодня);
КонецМесяца   = КонецМесяца(Сегодня);

Арифметика дат: что можно и как правильно

+/- секунды (прямо):

Завтра = Сегодня + 24 * 60 * 60;   // сутки = 86400 секунд
Вчера  = Сегодня - 24 * 60 * 60;

Сдвиги «календарно» (надёжнее):

ЧерезНеделю  = ДобавитьМесяц(Сегодня, 0) + 7 * 24 * 60 * 60; // неделя — ок
ЧерезМесяц   = ДобавитьМесяц(Сегодня, 1);  // именно календарный месяц
ГодНазад     = ДобавитьМесяц(Сегодня, -12);

Почему для месяцев — через ДобавитьМесяц?
Количество дней в месяце разное. Прибавлять «секундами» легко промахнуться.

Разница между датами (в секундах):

Секунд = '20140101' - '20100101';  //  разница как число секунд
Дней   = Цел(Секунд / 86400);
Сообщить("Прошло дней: " + Дней);

Календарные функции, которые постоянно выручают

НомерДняНедели = ДеньНедели(Сегодня);   // 1..7 (1 — понедельник)
НомерДняГода   = ДеньГода(Сегодня);     // 1..366
НомерНедели    = НеделяГода(Сегодня);   // ISO-нумерация

Форматирование даты (красиво вывести)

Текст = Формат(Сегодня, "ДФ='dd.MM.yyyy HH:mm'");
Сообщить(Текст);     // например: 12.09.2025 14:35

Мини-кейсы

1) «Через сколько секунд наступит завтра 00:00?»

Сейчас     = ТекущаяДата();
Завтра0000 = НачалоДня(Сейчас + 24 * 60 * 60);
СекундДо   = Завтра0000 - Сейчас;
Сообщить(СекундДо);

2) «Последний день текущего месяца»

ПоследнийДеньМесяца = КонецДня(КонецМесяца(Сегодня));
Сообщить(ПоследнийДеньМесяца);

3) «Дата следующего месяца в тот же день (или конец месяца, если дня нет)»

ТаЖеДатаВСледМесяце = ДобавитьМесяц(Сегодня, 1);
Сообщить(ТаЖеДатаВСледМесяце);

Частые ошибки и как не попасться

  • Складывать «секундами» месяцы/годы. Делай сдвиг месяцами через ДобавитьМесяц, год — ДобавитьМесяц(…, 12).
  • Сравнивать «сырые» даты, когда нужна только дата без времени. Нормализуй: НачалоДня(Дата1) = НачалоДня(Дата2).
  • Хранить даты строками и пытаться считать. Для вычислений — всегда тип Дата.
  • Путать локальный формат вывода с внутренним значением. Для отображения используй Формат.

Тренировка (с краткими подсказками)

  1. Функция «ДеньНеделиСтрокой»
    Вход: дата. Выход: «понедельник»..«воскресенье».
    Подсказка: ДеньНедели() и массив со строками дней.
  2. «Какой сегодня день недели?»
    Используй функцию из п.1 + ТекущаяДата().
  3. «ДР в этом году прошёл?»
    Ввод: дата рождения.
  • Сформируй дату ДР на текущий год: Дата(Год(Сегодня), Месяц(Рождения), День(Рождения)).
  • Сравни с Сегодня.
  • Если прошёл — сообщение. Иначе — посчитай секунды до ДР.
  1. Бонус: «Сколько полных недель осталось до конца месяца?»
    Подсказка: КонецМесяца(Сегодня), разница в секундах, делим на 7*86400.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *