Работа с временными метками в платформе 1С:Предприятие 8 является одной из самых частых задач, с которой сталкиваются разработчики и аналитики. Потребность "перевести дату" может скрывать за собой совершенно разные технические действия: от простого изменения формата отображения до сложной десериализации данных из внешних систем. Непонимание природы типа данных может привести к критическим ошибкам в отчетах и расчетах.
В данной статье мы разберем основные сценарии преобразования временных значений. Вы узнаете, как работать с типом Дата в коде, как корректно переводить строковые представления времени и как выполнять конвертацию при интеграции. Особое внимание уделим нюансам, которые часто упускают новички, например, разнице между "Периодом" и конкретной "Датой".
Часто под фразой "как перевести дату" пользователи подразумевают необходимость получить конкретный момент времени из диапазона. Например, при формировании регламентированных отчетов система запрашивает период, а для выборки данных из регистра сведений требуется точная дата начала или конца. Платформа предоставляет мощные инструменты для таких преобразований напрямую через контекстное меню или программно.
Преобразование Периода в конкретную Дату
Самый распространенный запрос arises при работе с отчетами и обработками. Оператор выбирает в интерфейсе период "С... По...", но алгоритму нужна конкретная временная метка для открытия среза регистров. Чтобы перевести выбранный интервал в конкретные значения, используйте метод НачалоПериода() или КонецПериода().
Эти функции позволяют получить строго определенную дату начала дня, месяца или года. Это критически важно для корректной работы запросов, так как тип Период сам по себе не может быть передан в качестве параметра в многие методы выборки данных. Результатом функции всегда будет тип Дата.
- 📅 Используйте
НачалоДня(Дата)для получения даты 00:00:00 выбранного дня. - 📅 Применяйте
КонецМесяца(Дата), если нужно захватить весь временной интервал месяца включительно. - 📅 Функция
НачалоГода(Дата)вернет 1 января соответствующего года в 00:00:00.
⚠️ Внимание: При передаче даты конца периода в запросы часто возникает ошибка "данных нет". Это происходит потому, что конец периода включает время (например, 23:59:59), а в регистрах записей может не быть данных на эту секунду. Лучше использовать
КонецДня()или сдвигать дату на +1 день и использовать условие "Меньше".
Рассмотрим пример кода, где переменная ПериодОтчета преобразуется в конкретные даты для выборки:
ДатаНачала = НачалоДня(ПериодОтчета.ДатаНачала);
ДатаКонца = КонецДня(ПериодОтчета.ДатаКонца);
// Теперь эти переменные можно использовать в запросе
Конвертация строки в тип Дата
При загрузке данных из текстовых файлов, CSV или при парсинге ответов от веб-сервисов вы часто получаете дату в виде строки. Присвоить такую строку переменной типа Дата напрямую нельзя — платформа выдаст ошибку преобразования типов. Необходимо использовать функцию Дата() или метод Парсить для строковых представлений.
Функция Дата(Год, Месяц, День, Час, Минута, Секунда) является наиболее надежным способом создания даты из разрозненных числовых значений или очищенной строки. Она гарантирует, что результат будет валидным объектом платформы, независимым от региональных настроек операционной системы пользователя.
Если же у вас есть строка вида "25.12.2023 14:30:00", можно попробовать использовать конструктор через строку, но это менее предпочтительно из-за зависимости от настроек локали. Безопаснее разобрать строку на части или использовать универсальные методы сериализации, если данные приходят в формате JSON или XML.
Всегда проверяйте строку на наличие лишних пробелов или символов перед конвертацией. Используйте функцию СтрЗаменить() для удаления нежелательных символов перед передачей в конструктор даты.
Важно помнить про часовые пояса. Если строка пришла из внешнего сервиса (например, маркетплейса), она может быть в формате UTC. При конвертации такой строки в локальную дату 1С может автоматически скорректировать время, что приведет к смещению на несколько часов. Это может исказить данные в отчетах по минутам.
Работа с датами в запросах и SQL
При написании запросов внутри 1С синтаксис отличается от стандартного SQL. Однако, если вы выгружаете данные напрямую в СУБД (MS SQL, PostgreSQL) или пишете внешние обработки, вам придется сталкиваться с особенностями хранения дат. В языке запросов 1С дата записывается в фигурных скобках.
Для передачи параметров в запрос используется конструкция &Параметр. Платформа сама выполняет преобразование типов, если переменная в коде имеет тип Дата. Проблемы возникают, когда нужно сформировать динамический текст запроса или выполнить прямой SQL-запрос через ADODB.
| Среда выполнения | Формат записи даты | Пример значения |
|---|---|---|
| Язык запросов 1С | &{Дата} | &МояДата |
| MS SQL Server | 'YYYY-MM-DD HH:MM:SS' | '2023-10-05 12:00:00' |
| PostgreSQL | 'YYYY-MM-DD HH:MM:SS' | '2023-10-05 12:00:00' |
| Текст запроса (динамический) | 'ДД.ММ.ГГГГ' | '05.10.2023' |
При формировании текста запроса вручную (что не рекомендуется, но иногда необходимо) дату нужно оборачивать в одинарные кавычки. Обратите внимание, что порядок дня и месяца зависит от настроек сервера БД, поэтому формат YYYY-MM-DD является наиболее универсальным и безопасным.
☑️ Проверка даты перед запросом
Сериализация и десериализация (JSON, XML, XDTO)
Современная разработка в 1С невозможна без обмена данными через HTTP-сервисы. При отправке данных во внешние системы дату необходимо "перевести" в строковый формат JSON или XML. Для этого используется механизм сериализации объектов XDTO или встроенные методы работы с JSON.
При конвертации объекта 1С в JSON дата автоматически преобразуется в строку формата ISO 8601 (например, 2023-10-05T12:00:00). Обратный процесс — чтение JSON — также выполняется автоматически, если структура данных описана корректно. Однако, при ручном парсинге строки JSON могут возникнуть сложности.
Если вы работаете с XDTO-пакетами, тип даты там строго типизирован. Ошибка возникнет, если вы попытаетесь присвоить в поле типа xdt:DateTime строку или число. Необходимо явно создать объект даты 1С и присвоить его свойству XDTO-объекта перед записью в поток.
⚠️ Внимание: При работе с веб-сервисами помните о разнице времени между сервером 1С и клиентом браузера или внешним сервисом. Все даты в SOAP/REST обычно передаются в UTC. Не забудьте привести их к локальному времени, если это требуется бизнес-логикой.
Визуальное форматирование даты для вывода
Часто задача "перевести дату" означает просто изменить то, как она выглядит для пользователя в печатной форме или на экране. Для этого используется функция Формат(). Она позволяет гибко настраивать отображение без изменения самого значения в памяти.
С помощью строки формата вы можете указать, нужно ли показывать время, как разделять элементы даты и даже выводить дату прописью. Это особенно актуально для печатных форм договоров и счетов, где дата часто пишется словами.
СтрокаДаты = Формат(ТекущаяДата(), "ДФ='dd MMMM yyyy г.'");
// Результат: "05 октября 2023 г."
Использование стандартных форматов, таких как ЛД (Дата) или ЛЧ (Число), зависит от настроек пользователя. Чтобы гарантировать одинаковый вид отчета у всех сотрудников, всегда явно указывайте строку формата в функции, а не полагайтесь на настройки региона.
Список популярных форматов
ДФ='dd.MM.yyyy' — краткий формат|ДФ='d MMMM yyyy' — дата с месяцем прописью|ДФ='HH:mm' — только время|ДФ='ISO' — международный стандарт
Типичные ошибки при работе со временем
Одной из самых частых проблем является потеря времени при сравнении дат. Если вы сравниваете дату документа (где есть время) с датой из регистра (где время может быть обрезано до начала дня), условие равенства может не сработать. Всегда используйте функции округления времени перед сравнением.
Еще одна ошибка — неверная интерпретация "конца периода". В 1С конец дня — это не 23:59:59, а специфическое значение, которое при вычитании может давать неочевидные результаты. Для расчетов длительности интервалов лучше использовать разность дат в днях, а не вычитать значения напрямую.
- 🚫 Не сравнивайте даты с временем и без времени на равенство.
- 🚫 Избегайте хранения дат в строковых полях базы данных.
- 🚫 Не игнорируйте предупреждения конфигуратора о несовместимости типов.
Правильное понимание того, как перевести дату в нужный формат или тип, экономит часы отладки. Используйте типизированные переменные, проверяйте часовые пояса при интеграции и всегда тестируйте пограничные значения (начало и конец года, високосные годы).
Главное правило: храним дату в типе Дата, отображаем через Формат(), а для расчетов используем функции Начало/Конец периода.
Как перевести дату из формата США (MM.DD.YYYY) в 1С?
Для этого нужно сначала разобрать строку на составляющие (месяц, день, год) с помощью функции СтрРазделить, а затем собрать новую дату функцией Дата(Год, Месяц, День). Прямое преобразование строки американского формата функцией Дата() может не сработать из-за ожиданий русского формата.
Почему при выгрузке в Excel дата превращается в число?
Excel хранит даты как количество дней, прошедших с 1900 года. При выгрузке через COM-объект или табличный документ убедитесь, что формат ячейки установлен как "Дата", а не "Общий". В 1С можно использовать метод Формат() перед записью в ячейку.
Как получить текущую дату без времени в запросе?
Используйте функцию НАЧАЛОДНЯ(ТЕКУЩАЯДАТА()) прямо в тексте запроса. Это обеспечит получение даты начала текущего дня (00:00:00), что удобно для группировок и отборов по суткам.
Можно ли хранить дату в виде строки в регистре сведений?
Технически можно, но это нарушение архитектуры 1С. Это лишит вас возможности использовать стандартные механизмы периодических регистров, срезов и эффективных отборов по диапазонам дат. Всегда используйте тип Дата.