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

Новички часто сталкиваются с проблемой, когда сравнение дат дает неожиданный результат из-за наличия времени в значении. В 1С дата хранится как точное количество секунд, прошедших с начала эры платформы, и включает в себя не только календарное число, но и час, минуту, секунду. Игнорирование этой особенности приводит к логическим ошибкам в отчетах и выборках данных.

В этой статье мы детально разберем синтаксис описания констант, методы сдвига времени, функции получения границ периодов и специфику конвертации строковых представлений в типизированные значения. Понимание этих механизмов позволит писать надежный код и избегать типичных ошибок при проектировании подсистем учета.

Синтаксис описания констант даты

В языке запросов и встроенном языке 1С существует строгий формат описания констант даты. Для того чтобы система корректно интерпретировала литерал как дату, необходимо использовать специальные символы-разделители. Стандартный вид записи выглядит следующим образом: 'ГГГГ-ММ-ДД ЧЧ:ММ:СС'. Обратите внимание, что разделение даты и времени происходит пробелом, а не буквой «T», как в стандарте ISO 8601.

Если в записи присутствует только часть даты, например год и месяц, платформа автоматически дополняет отсутствующие компоненты минимальными значениями. Так, запись '202601' будет интерпретирована как 1 января 2026 года, 00 часов 00 минут 00 секунд. Это поведение критически важно учитывать при формировании условий отбора в запросах, где требуется захватить весь месяц целиком.

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

⚠️ Внимание: При копировании кода из внешних источников (веб-сайты, документация в формате Word) часто меняются кодировки кавычек. Система 1С распознает только стандартные одинарные кавычки '. Использование «елочек» или парных кавычек приведет к синтаксической ошибке компиляции.

💡

Используйте горячие клавиши Ctrl+Shift+D в редакторе кода 1С для быстрой вставки текущей даты в формате константы. Это экономит время и гарантирует правильный синтаксис.

Функции сдвига и получения границ периодов

Одной из самых востребованных групп функций в 1С являются инструменты для работы с периодами. Разработчикам постоянно требуется получить «НачалоДня», «КонецМесяца» или сдвинуть дату на определенный интервал. Функция НачалоДня(Дата) обнуляет время, возвращая 00:00:00 указанной даты, что идеально подходит для группировки данных по суткам.

Для получения последней секунды периода используется функция КонецПериода. Например, КонецМесяца(ТекущаяДата) вернет дату последнего дня месяца с временем 23:59:59. Это особенно важно при построении отчетов «на конец периода», где необходимо захватить все документы, проведенные вние секунды дня.

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

  • 📅 НачалоГода — возвращает 1 января указанного года, время 00:00:00.
  • СдвигДаты — изменяет дату на заданное количество интервалов (положительное или отрицательное число).
  • 🛑 КонецКвартала — возвращает последнюю секунду последнего дня квартала (31 марта, 30 июня и т.д.).
  • 🔄 ПериодДня — возвращает структуру с началом и концом указанного дня.
📊 Какая функция вызывает у вас больше всего вопросов?
НачалоДня
КонецМесяца
СдвигДаты
Работа с часовыми поясами

Конвертация типов и работа со строками

Частой задачей является преобразование строкового представления даты, полученного из внешнего файла или введенного пользователем, в тип Дата 1С. Для этого используется функция Дата или Попытка в сочетании с СтрокаВДата. Важно понимать, что порядок элементов в строке зависит от настроек региональных стандартов операционной системы клиента.

Если формат строки известен заранее (например, данные приходят из веб-сервиса в формате ДД.ММ.ГГГГ), надежнее использовать функцию Дата(Год, Месяц, День, Час, Минута, Секунда), предварительно разбив строку на части. Это обеспечивает кроссплатформенную независимость и исключает ошибки парсинга на компьютерах с разными локали.

Обратное преобразование — из даты в строку — выполняется функцией Формат. Она позволяет задать маску вывода, например, "ДФ=dd.MM.yyyy". Использование функции Строка без форматирования вернет дату в формате, принятом в текущей сессии, что может быть неприемлемо для выгрузки в фиксированные форматы обмена.

ИсходнаяСтрока ="25.12.2026";

// Надежный способ парсинга при известном формате ДД.ММ.ГГГГ

День = Число(Лев(ИсходнаяСтрока, 2));

Месяц = Число(Сред(ИсходнаяСтрока, 4, 2));

Год = Число(Прав(ИсходнаяСтрока, 4));

Результат = Дата(Год, Месяц, День);

⚠️ Внимание: Функция ДатаВСтроку устарела и не рекомендуется к использованию в новых разработках. Всегда применяйте универсальную функцию Формат с явным указанием маски, чтобы избежать проблем при миграции на новые версии платформы или при работе в веб-клиенте.

Сравнение дат и временные интервалы

При сравнении двух дат в 1С операторы =, <, > учитывают время с точностью до секунды. Это часто становится источником ошибок: дата «20.01.2026 10:00» не равна дате «20.01.2026», так как вторая неявно считается «20.01.2026 00:00». Для корректного сравнения только по календарному дню необходимо предварительно привести обе даты к началу дня.

В запросах часто возникает необходимость выбрать документы за период «с... по...». Если пользователь вводит конечную дату как «31.01.2026», а в базе документ проведен в 18:00 этого же дня, условие Дата <= КонецПериода сработает корректно только если в качестве границы использована функция КонецДня. Использование просто даты может отсечь вечерние документы.

Для проверки попадания даты в интервал удобно использовать структуру Интервал или операторы МЕЖДУ в запросах. Однако помните, что оператор МЕЖДУ включает граничные значения. Если вам нужно исключить конечную точку (полуоткрытый интервал), лучше использовать комбинацию >= Начало и < КонецСледующегоПериода.

Почему 31.12.2023 не равно 31.12.2023?

В памяти 1С первая дата может иметь время 00:00:00, а вторая 15:30:00. При прямом сравнении они не равны. Всегда используйте НачалоДня для сравнения дат без учета времени.

Работа с часами и календарями

Платформа 1С поддерживает работу с часовыми поясами, что актуально для распределенных информационных баз и обмена данными с другими системами. Тип ЧасовойПояс позволяет конвертировать локальное время в универсальное координированное время (UTC) и обратно. Это необходимо при синхронизации данных между филиалами, находящимися в разных регионах.

Функция ЧасовойПояс возвращает объект, описывающий смещение относительно UTC. При записи даты в регистры сведений или документы рекомендуется хранить время в локальном формате пользователя, но при передаче данных через HTTP-сервисы или JSON желательно приводить их к UTC, чтобы избежать путаницы на стороне принимающей системы.

Также существует понятие производственного календаря. Хотя в типовой платформе нет встроенного объекта «Календарь», многие конфигурации (например, ЗУП или ERP) имеют свои регистры сведений для хранения производственных графиков. При расчете сроков «в рабочих днях» необходимо использовать эти данные, а не просто сдвигать дату функцией СдвигДаты.

Функция / Метод Описание действия Возвращаемый тип
ТекущаяДата Возвращает текущую дату и время сервера Дата
ТекущаяДатаСеанса Возвращает дату и время клиента (важно для тонкого клиента) Дата
НачалоЧаса(Дата) Обнуляет минуты и секунды Дата
Год(Дата) Извлекает номер года из даты Число
Месяц(Дата) Извлекает номер месяца (1-12) Число
💡

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

Частые ошибки и отладка

Одной из самых коварных ошибок является «потеря» времени при передаче данных через COM-соединение или при выгрузке в некоторые форматы текстовых файлов. Некоторые внешние системы не поддерживают время и обрезают его до полуночи. Это приводит к тому, что документы, проведенные в течение дня, при загрузке обратно могут получить одинаковую временную метку, нарушая хронологию.

Еще одна проблема связана с високосными годами. При сдвиге даты на год вперед (например, с 29.02.2026 на 29.02.2026) платформа 1С автоматически корректирует дату на последний день месяца (28.02.2026), не вызывая ошибки. Однако логика бизнес-процесса может требовать иного поведения, например, переноса на 1 марта. Разработчик должен явно обрабатывать такие кейсы.

При отладке кода используйте окно «Отладка» и следите за представлением даты в панели переменных. Часто бывает полезно вывести дату в строку с полным форматом, включая секунды, чтобы убедиться в корректности вычислений. Не полагайтесь на визуальное отображение в полях формы, которое часто скрывает время.

⚠️ Внимание: Интерфейс и имена функций могут незначительно отличаться в зависимости от версии платформы 1С и режима совместимости конфигурации. Перед внедрением сложных алгоритмов работы с датами в промышленную эксплуатацию сверяйте поведение функций в вашей конкретной версии платформы в синтаксическом помощнике.

☑️ Проверка корректности работы с датами

Выполнено: 0 / 4

Вопросы и ответы (FAQ)

Как получить количество дней между двумя датами?

Для этого достаточно вычесть одну дату из другой. Результатом будет число дней. Например: КоличествоДней = Дата2 - Дата1;. Если даты содержат время, результат будет дробным числом. Для получения целых дней используйте функцию Цел или предварительно приведите даты к началу дня.

Почему функция Год возвращает неверное значение?

Функция Год всегда возвращает корректное числовое значение года. Ошибка может возникать, если в переменную передано не значение типа Дата, а строка или пустое значение. Убедитесь, что переменная инициализирована и имеет тип Дата перед вызовом функции.

Как определить, является ли год високосным?

В 1С нет прямой функции «ЭтоВисокосныйГод», но это легко вычислить. Проверьте дату 29 февраля соответствующего года: Попытка(Дата(Год, 2, 29)); Если ИсключениеТогда... КонецПопытки;. Либо используйте логику: год високосный, если делится на 4, но не делится на 100, за исключением годов, делящихся на 400.

В чем разница между НачалоДня и КонецДня?

НачалоДня устанавливает время 00:00:00, а КонецДня — 23:59:59. Это критично для диапазонов. Если вам нужно включить все документы за день, используйте интервал от НачалаДня(Сегодня) до КонецДня(Сегодня).

Как сохранить только дату без времени в регистре?

При записи в поле типа Дата время сохранится в любом случае. Чтобы игнорировать его при анализе, всегда используйте функцию НачалоДня при выборке или группировке данных. Хранить «чистую» дату технически невозможно, так как тип данных един для всех случаев.