В системе 1С: Предприятие работа с временными метками является фундаментальной задачей для любого пользователя, будь то бухгалтер, менеджер или разработчик. Способность корректно указать конкретную дату или временной интервал влияет на точность выборок, формирование отчетов и работу регламентных заданий. Ошибки в синтаксисе часто приводят к тому, что документы не попадают в обработку или отчеты показывают некорректные данные за период.
Синтаксис языка запросов и встроенного языка платформы имеет свои особенности, которые необходимо учитывать при вводе констант времени. Понимание того, как система интерпретирует строковые представления времени, позволяет избежать логических ошибок и повышает эффективность взаимодействия с базой данных. В этой статье мы детально разберем механизмы указания точных дат, использование операторов диапазонов и нюансы форматирования.
Базовый синтаксис указания даты в запросах
При написании запросов в конфигураторе или в обработках важно соблюдать строгий формат записи констант. Система ожидает, что дата будет заключена в кавычки и иметь определенную структуру. Если вы попытаетесь передать дату без кавычек или в неверном формате, интерпретатор выдаст ошибку синтаксиса еще до выполнения запроса.
Стандартный вид записи выглядит следующим образом: 'ГГГГ-ММ-ДД ЧЧ:ММ:СС'. Обратите внимание, что использование дефисов и двоеточий обязательно. Например, для указания начала рабочего дня 15 мая 2026 года необходимо использовать конструкцию '2026-05-15 09:00:00'. Пропуск времени приводит к тому, что система автоматически подставляет полночь (00:00:00), что может быть критично при фильтрации документов, созданных в течение дня.
Существует также сокращенный формат, когда указывается только дата без времени: '2026-05-15'. В этом случае тип значения остается датой, но время обнуляется. Это удобно использовать при отборе документов по дате документа, когда время создания не имеет значения. Однако для полей типа ДатаВремя, где важна точность до секунды, такой подход может привести к потере части данных, созданных после полуночи.
⚠️ Внимание: При копировании дат из Excel или других внешних источников часто меняется формат разделителей. Убедитесь, что в строке запроса используются именно дефисы для разделения частей даты, а не точки или слеши, иначе возникнет ошибка выполнения.
Используйте клавишу F1 в окне запроса конфигуратора для быстрой проверки синтаксиса введенной даты перед запуском обработки.
Использование операторов диапазонов и сравнения
Часто требуется выбрать документы не за одну конкретную дату, а за определенный период. Для этого в языке запросов 1С предусмотрены стандартные операторы сравнения. Правильное их использование позволяет формировать гибкие выборки без необходимости писать сложные условия.
Для задания интервала используются операторы >= (больше или равно) и <= (меньше или равно). Например, чтобы получить все документы за январь 2026 года, условие в секции ГДЕ будет выглядеть так:
ГДЕ Документ.Дата >= '2026-01-01 00:00:00'
И Документ.Дата <= '2026-01-31 23:59:59'
Однако такой подход имеет недостаток: если в базе появится документ с временем 23:59:59.500, он не попадет в выборку. Более профессиональным методом является использование оператора < для верхней границы периода. В этом случае мы указываем начало следующего периода:
ГДЕ Документ.Дата >= '2026-01-01'
И Документ.Дата < '2026-02-01'
Такой метод гарантирует, что будут захвачены абсолютно все документы января, независимо от миллисекунд в времени создания. Это особенно важно для регламентных отчетов, где потеря даже одной проводки недопустима. Кроме того, такой синтаксис работает быстрее на уровне оптимизации запросов СУБД.
Работа с параметрами в формах и обработках
В прикладных решениях пользователи редко вводят даты вручную в код. Чаще всего используются параметры форм, которые передаются в запрос. Механизм передачи параметров позволяет динамически менять период анализа без переписывания кода запроса.
При создании макета компоновки данных или формы отчета вы объявляете параметр, например, НачалоПериода. В тексте запроса этот параметр используется с символом двоеточия: :НачалоПериода. Система автоматически подставляет значение, введенное пользователем в поле ввода даты. Важно контролировать тип значения параметра, чтобы он соответствовал типу поля в базе данных.
Если в форму передается строка вместо даты, может произойти неявное преобразование типов, которое не всегда работает предсказуемо. Рекомендуется явно проверять заполненность параметров перед выполнением запроса. Если параметр не заполнен, логично подставлять стандартное значение, например, начало текущего месяца, чтобы отчет не выдавал ошибку или пустой результат.
Для удобства пользователей часто реализуют стандартные периоды: "Текущий месяц", "Прошлый квартал", "С начала года". Эти периоды рассчитываются программно на языке 1С и подставляются в параметры запроса. Это избавляет пользователя от необходимости каждый раз вводить даты вручную и снижает риск ошибки ввода.
Форматирование даты для вывода в печатные формы
Получив дату из базы данных, часто требуется вывести её в понятном для человека виде в печатную форму или интерфейс. Внутреннее хранение даты отличается от того, как её видит пользователь на экране. Для преобразования используется функция Формат().
Функция принимает два аргумента: само значение даты и строку формата. Строка формата описывает, какие части даты нужно показать и в каком виде. Например, чтобы вывести дату в виде "15 мая 2026 г.", используется следующий код:
ТекстДаты = Формат(ДатаДокумента, "ДФ='dd MMMM yyyy \"г.\"'");
Здесь ДФ указывает на использование формата даты, а внутри кавычек задаются шаблоны. dd означает день с ведущим нулем, MMMM — полное название месяца. Если сервер 1С настроен на английский язык, то вместо "мая" вы получите "May".
При формировании сложных отчетов, таких как Акт сверки или Накладная, часто требуется выводить только время или только дату. Для этого в строке формата можно указать нужные компоненты. Например, формат "ДФ='ЧЧ:ММ'" оставит только часы и минуты, что полезно для журналов регистрации событий.
Секреты локализации
Если отчет формируется на сервере, а пользователь работает с клиентом на другом языке, убедитесь, что параметр локали передан в функцию Формат() явно, иначе месяцы могут отобразиться на языке сервера.
Типичные ошибки и способы их устранения
Разработчики и пользователи часто сталкиваются с однотипными проблемами при работе с датами. Понимание природы этих ошибок помогает быстро находить решение. Самая распространенная проблема — это несоответствие часовых поясов, особенно в распределенных информационных базах.
Второй частой ошибкой является игнорирование времени при сравнении. Если вы ищете документ за сегодня, используя условие Дата = ТекущаяДата(), вы можете не найти документы, созданные завтра по времени сервера, но сегодня по времени пользователя. Всегда учитывайте разницу во времени между клиентом и сервером.
Третья проблема связана с неверным форматом в строковых константах. Ошибка "Неверный формат даты" возникает, если в строке встречаются лишние пробелы или неверные разделители. Использование встроенных функций конвертации помогает избежать этого.
| Тип ошибки | Причина возникновения | Способ решения |
|---|---|---|
| Пустая выборка | Неверная верхняя граница периода | Использовать оператор < для начала следующего периода |
| Ошибка синтаксиса | Отсутствие кавычек вокруг даты | Обернуть дату в одинарные кавычки 'ГГГГ-ММ-ДД' |
| Неверный месяц | Путаница в формате ММ и ДД | Проверить порядок элементов в строке формата ДФ |
| Потеря документов | Игнорирование миллисекунд | Учитывать время с точностью до секунды или использовать диапазоны |
⚠️ Внимание: При переходе на летнее или зимнее время в некоторых конфигурациях могут возникать сдвиги на один час. Проверяйте настройки часового пояса в свойствах сервера 1С, если замечаете систематическое смещение времени в отчетах.
Особенности работы с датой в распределенных базах
В конфигурациях с распределенной работой (РИБ) синхронизация времени становится критически важной. Каждый узел может иметь свое локальное время, но в центральной базе все события должны быть упорядочены корректно. При обмене данными дата документа может быть пересчитана в зависимости от настроек конвертации.
Если на периферийном узле время отстает от центрального на 2 часа, документ, созданный в 23:00 по местному времени, в центральной базе может получить дату следующего дня. Это приводит к тому, что при отборе документов "за сегодня" на центральном узле этот документ не попадет в выборку, хотя логически он относится к текущему операционному дню.
Для решения этой проблемы рекомендуется использовать дату регистрации документа в узле обмена или вводить специальный реквизит "Операционная дата", который пользователи заполняют вручную согласно графику работы, независимо от системного времени компьютера. Это обеспечивает консистентность данных при анализе деятельности компании в целом.
В распределенных базах всегда ориентируйтесь на дату регистрации в узле обмена или используйте единое операционное время, игнорируя локальные часы рабочих мест.
Часто задаваемые вопросы (FAQ)
Как получить текущую дату в запросе 1С?
В тексте запроса нельзя использовать функцию ТекущаяДата() напрямую внутри строки запроса как константу. Необходимо передать текущую дату как параметр запроса из кода 1С. В коде обработчика вы присваиваете параметру значение ТекущаяДата(), а в запросе используете имя параметра с двоеточием.
Почему дата в отчете отображается неверно (например, 31.12.1899)?
Такое значение обычно означает, что дата не заполнена (пустая ссылка). Если в базе поле даты пустое, при попытке форматирования или вывода оно может интерпретироваться как минимально возможная дата. Проверьте условие отбора, чтобы исключить пустые значения, или используйте функцию ЕСТЬNULL для подстановки значения по умолчанию.
Можно ли использовать русские названия месяцев в условии запроса?
Нет, в условии запроса в секции ГДЕ необходимо использовать числовой формат '2026-05-15'. Русские названия месяцев ("15 мая 2026") допустимы только в функции Формат() для вывода текста пользователю, но не для фильтрации данных в запросе к базе.
Как указать дату в прошлом или будущем относительно текущей?
Для этого используются функции работы с датой в коде перед запросом. Например, НачалоМесяца(ТекущаяДата()) или ДобавитьМесяц(ТекущаяДата(), -1). Полученное значение передается в параметр запроса. В самом тексте запроса арифметические операции с датами ограничены и зависят от используемой СУБД.
Что делать, если система не понимает формат даты при импорте?
При загрузке данных из внешних файлов (CSV, XML) часто возникает проблема формата. Убедитесь, что в настройках импорта указан правильный разделитель и порядок элементов (День-Месяц-Год или Год-Месяц-День). Если формат жестко зафиксирован в файле, может потребоваться предварительная обработка строки функциями замены перед преобразованием в тип Дата.