Разработка конфигураций в среде 1С: Предприятие 8 невозможна без постоянного использования временных меток. Будь то формирование отчетов, расчет зарплаты или контроль доступа к документам — везде требуется точное указание момента времени. Новички часто сталкиваются с трудностями при создании объектов типа Дата, так как синтаксис платформы имеет свои особенности, отличающиеся от других языков программирования.
Понимание того, как корректно создать дату, присвоить ей значение или вычислить разницу между двумя моментами, является фундаментальным навыком для любого программиста 1С. Ошибки в датах могут привести к некорректному закрытию периодов, неверным остаткам на складах или блокировке работы пользователей. В этой статье мы детально разберем все способы работы с датами, от простых констант до динамических вычислений в реальном времени.
Мы рассмотрим не только базовый синтаксис, но и нюансы, связанные с часовыми поясами, точностью до секунды и специфическими функциями системы. Знание этих тонкостей позволит вам писать более надежный и предсказуемый код, избегая распространенных ловушек при обработке временных интервалов.
Создание даты с помощью литерала
Самый простой и распространенный способ задать фиксированную дату в коде 1С — использование специального литерала. Для этого значение даты заключается в кавычки и обязательно предваряется символом ' (апостроф). Это позволяет платформе однозначно идентифицировать строку как объект типа Дата, а не как обычную текстовую строку.
Формат записи внутри литерала строго регламентирован и должен соответствовать шаблону 'ГГГГ-ММ-ДД ЧЧ:ММ:СС'. Если время не указано явно, система автоматически подставит начало дня, то есть 00:00:00. Важно помнить, что разделителем между частями даты и времени служит пробел, а между элементами времени — двоеточие.
Рассмотрим пример присваивания переменной конкретного момента времени:
МояДата = '2026-12-31 23:59:59';
НачалоДня = '2026-01-01'; // Время будет установлено в 00:00:00 по умолчанию
Платформа автоматически конвертирует такую запись во внутренний формат хранения. Использование литералов предпочтительно для констант, так как этот способ обеспечивает максимальную читаемость кода и не требует вызова дополнительных конструкторов объектов.
⚠️ Внимание: Никогда не пытайтесь создать дату путем простого присваивания строки без апострофа (например,
Дата = "2026-01-01"). Это приведет к ошибке типизации или неявному преобразованию, которое может работать некорректно в разных версиях платформы.
Используйте литералы для статических дат в коде, это самый быстрый и безопасный способ, не требующий затрат ресурсов на создание объектов через конструктор.
Использование конструктора объекта Дата
В ситуациях, когда значения года, месяца или дня неизвестны на этапе написания кода и должны быть вычислены динамически, литералы не подходят. В этом случае разработчики прибегают к созданию нового объекта через конструктор Новый Дата(). Этот метод позволяет передавать компоненты даты отдельными параметрами.
Конструктор обладает высокой гибкостью и поддерживает различные комбинации входных параметров. Вы можете указать только год, год и месяц, или полный набор вплоть до секунд. Все пропущенные параметры будут инициализированы минимальными значениями (обычно 1 для дня и месяца, 0 для времени).
Синтаксис вызова конструктора выглядит следующим образом:
- 📅
Новый Дата(Год, Месяц, День, Час, Минута, Секунда)— полная инициализация. - 📅
Новый Дата(Год, Месяц, День)— создание даты с началом суток. - 📅
Новый Дата()— создание даты, равной текущему моменту времени системы.
Пример динамического создания даты для конца отчетного периода:
ГодОтчета = 2026;
МесяцОтчета = 5;
КонецМесяца = Новый Дата(ГодОтчета, МесяцОтчета, 1);
КонецМесяца = КонецМесяца + (30 * 86400); // Грубый пример сдвига
Использование конструктора особенно актуально в циклах или при обработке данных, полученных от пользователя или из внешних источников. Обратите внимание, что порядок аргументов всегда фиксирован: от крупных единиц времени к мелким.
Получение и манипуляция текущей датой
Частой задачей в программировании 1С является необходимость получить актуальную дату и время "здесь и сейчас". Для этих целей платформа предоставляет встроенную функцию ТекущаяДата(). Она возвращает объект типа Дата, соответствующий моменту вызова функции на стороне клиента или сервера.
Критически важно понимать разницу между клиентским и серверным временем. Если код выполняется в модуле формы или обычном приложении, ТекущаяДата() вернет время локального компьютера пользователя. Если же код работает в модуле сервера (например, при проведении документа), время будет взято с сервера 1С.
Для обеспечения консистентности данных в распределенных базах рекомендуется использовать серверное время. Однако для отображения интерфейса пользователю необходимо клиентское время. Разработчик должен явно контролировать контекст выполнения кода.
После получения текущей даты часто требуется выполнить над ней арифметические операции. Платформа 1С позволяет складывать даты с числами, где число трактуется как количество секунд. Также поддерживается вычитание дат для получения интервала.
| Операция | Описание | Пример кода |
|---|---|---|
| Сложение | Добавление секунд к дате | Дата + 3600 (плюс один час) |
| Вычитание | Разница в секундах | Дата2 - Дата1 |
| Сравнение | Проверка порядка | Если Дата1 > Дата2 Тогда... |
| Отрицание | Сдвиг в прошлое | Дата - 86400 (минус сутки) |
Помните, что все арифметические операции с датами в 1С производятся в секундах. Это означает, что для добавления одного дня нужно прибавить число 86400 (24 60 60).
⚠️ Внимание: При работе в распределенных информационных базах (РИБ) время на узлах может рассинхронизироваться. Всегда сверяйте настройки времени на серверах, чтобы избежать конфликтов при обмене данными.
Склонение даты и форматирование вывода
При формировании печатных форм, отчетов или сообщений пользователю часто требуется представить дату в текстовом виде. Простое преобразование даты в строку может дать сухой цифровой формат, который плохо воспринимается человеком. Для решения этой задачи в 1С существует функция Формат() с специальными параметрами склонения.
Параметр ДФ (Дата Формат) позволяет гибко настраивать вывод. С помощью ключевых слов ДФ='Д', ДФ='М', ДФ='Г' можно вывести день, месяц или год. Более того, платформа поддерживает автоматическое склонение слов "день", "месяц", "год" в зависимости от числа.
Рассмотрим пример формирования фразы "15 января 2026 года":
ДатаОтчета = '2026-01-15';
ТекстДаты = Формат(ДатаОтчета, "ДФ='dd MMMM yyyy'");
// Результат: 15 Января 2026
Для более сложных конструкций, где нужно склонять само слово "день" или "месяц" (например, "через 2 дня" или "через 5 дней"), используется параметр БФ (Буквенная Форма) в сочетании со специальным описанием формата. Это позволяет избежать громоздких конструкций с оператором Выбор.
Также стоит упомянуть функцию Строка(), которая выполняет простое преобразование типа. Она полезна для технической отладки или сохранения даты в полях типа Строка, но для красивого вывода пользователю лучше использовать Формат().
Секреты склонения
Для правильного склонения слов "год", "месяц", "день" используйте формат "ДФ='yyyy '"года"'; ДФ='MM '"месяца"'; ДФ='dd '"дня"'" в зависимости от контекста, но проще использовать готовые шаблоны локали.
Работа с периодами: Начало и Конец
В бухгалтерском и управленческом учете операции часто привязаны не к конкретной секунде, а к периоду: дню, месяцу, кварталу или году. Платформа 1С предоставляет мощный набор функций для работы с такими интервалами. Наиболее востребованными являются функции получения границ периода.
Функции НачалоДня(), НачалоМесяца(), НачалоГода() и их аналоги для конца периода (КонецДня() и т.д.) позволяют быстро нормализовать дату. Это необходимо, например, при отборе документов за конкретный месяц, чтобы не пропустить записи, созданные в последнюю секунду дня.
Типичный сценарий использования — формирование отчета за прошлый месяц:
- 📌 Получаем текущую дату:
Сейчас = ТекущаяДата(). - 📌 Находим начало текущего месяца:
НачалоТекМесяца = НачалоМесяца(Сейчас). - 📌 Вычисляем начало прошлого месяца:
НачалоПрошлого = НачалоТекМесяца - 1. - 📌 Находим конец прошлого месяца:
КонецПрошлого = КонецМесяца(НачалоПрошлого).
Использование этих функций гарантирует, что вы получите корректные границы независимо от количества дней в месяце или високосного года. Ошибкой будет попытка вычислить конец месяца путем простого прибавления 30 или 31 дня, так как это приведет к смещению дат в следующих периодах.
Для работы с произвольными периодами существует функция ПериодСтрока() и методы объекта РегистрСведений.Период, но базовые функции начала и конца покрывают 90% потребностей разработчика.
⚠️ Внимание: Функция
КонецДня()устанавливает время в23:59:59. Если в базе хранятся даты с точностью до миллисекунд или используются специфические настройки сервера, убедитесь, что последняя секунда дня действительно захватывает все нужные документы. В некоторых случаях безопаснее использоватьНачалоДня(Дата + 1)как верхнюю границу интервала (исключая её).
☑️ Проверка корректности периода
Извлечение компонентов даты и времени
Часто возникает обратная задача: из имеющегося объекта даты нужно получить отдельное значение — номер месяца, день недели или год. Для этого у объекта Дата есть набор встроенных методов-свойств. Они позволяют декомпозировать дату на составляющие части без необходимости ручного парсинга строки.
Доступ к компонентам осуществляется через точку после имени переменной. Например, МояДата.Год вернет числовое значение года. Это удобно для группировки данных в отчетах или для логических условий, зависящих от времени суток.
Основные свойства объекта Дата:
| Свойство | Тип возвращаемого значения | Описание |
|---|---|---|
Год |
Число | Возвращает год (например, 2026). |
Месяц |
Число | Возвращает номер месяца от 1 до 12. |
День |
Число | Возвращает день месяца от 1 до 31. |
ДеньНедели |
Перечисление | Возвращает день недели (Понедельник, Вторник...). |
Час, Минута, Секунда |
Число | Возвращают соответствующие компоненты времени. |
Особого внимания заслуживает свойство ДеньНедели. Оно возвращает не число, а значение из предопределенного перечисления. Это позволяет писать читаемый код условий, например: Если МояДата.ДеньНедели = ДеньНедели.Воскресенье Тогда....
Важно, что все эти свойства доступны только для чтения. Вы не можете изменить год даты, присвоив значение МояДата.Год = 2027. Для изменения даты необходимо создать новый объект даты на основе старых компонентов с новым значением.
Свойства объекта Дата (Год, Месяц, День) позволяют легко разбирать дату на части для аналитики, но являются доступными только для чтения.
Как преобразовать строку "01.01.2026" в дату 1С?
Для преобразования строки произвольного формата в дату используйте функцию Дата(). Она пытается распознать стандартные форматы. Если формат сложный, лучше использовать Парсить или явно задать формат через Формат в обратную сторону, но проще всего привести строку к формату ГГГГ-ММ-ДД и использовать литерал или конструктор.
В чем разница между Дата и Время в 1С?
В платформе 1С:Предприятие 8 нет отдельного типа "Время". Тип Дата является универсальным и хранит в себе как календарную дату, так и время суток с точностью до секунды. Если время не указано, оно считается равным 00:00:00.
Как получить количество дней между двумя датами?
Вычтите одну дату из другой (Дата2 - Дата1). Результатом будет число секунд. Чтобы получить дни, разделите полученное значение на 86400 (количество секунд в сутках). Функция Цел() поможет отбросить дробную часть, если нужна полных дней.
Почему моя дата сдвигается на один день при сохранении?
Это классическая проблема часовых поясов. Если клиент и сервер находятся в разных временных зонах, при записи в базу дата может конвертироваться в UTC. Проверяйте свойства ЧасовойПояс у пользователя и настройки сервера.
Можно ли хранить дату без времени?
Тип данных всегда хранит время. Чтобы эмулировать дату без времени, принято явно обнулять время, используя функцию НачалоДня(Дата). Это гарантирует, что при сравнении или группировке не возникнет ошибок из-за различия в часах и минутах.