Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и обычные пользователи, и разработчики. Неправильно указанная дата может привести к ошибкам в отчётах, сбоям в документах или даже нарушению бизнес-процессов. В этой статье разберём все возможные способы формирования даты: от простого ручного ввода в интерфейсе до сложных программных конструкций на встроенном языке.
Вы узнаете, как вводить даты вручную без ошибок, использовать стандартные функции 1С для работы с временными метками, а также научитесь программно создавать, изменять и форматировать даты с учётом особенностей платформы. Особое внимание уделим типичным ошибкам, которые допускают новички, и способам их избежать.
Ручной ввод даты в интерфейсе 1С
Самый простой способ задать дату — ввести её вручную в соответствующем поле документа, справочника или отчёта. В 1С:Предприятие 8 поля для ввода даты обычно отмечены календарём 📅 и поддерживают несколько форматов:
- 📅 Краткий формат —
ДД.ММ.ГГГГ(например,15.05.2026). Самый распространённый вариант, который используется по умолчанию. - 📅 Расширенный формат —
ДД ММММ ГГГГ(например,15 мая 2026 г.). Часто применяется в печатных формах. - 📅 Формат с временем —
ДД.ММ.ГГГГ ЧЧ:ММ:СС(например,15.05.2026 14:30:00). Используется, когда важно указать не только дату, но и точное время.
Чтобы избежать ошибок при ручном вводе, следуйте простым правилам:
- ✅ Используйте точку (
.) в качестве разделителя. Запятая или пробел могут не сработать. - ✅ Для быстрого ввода текущей даты нажмите
Ctrl + ;(точка с запятой). - ✅ Если нужно ввести дату "на завтра" или "вчера", используйте кнопки
+1ди-1дрядом с полем (если они есть).
Если поле не принимает введённую дату, проверьте настройки региональных стандартов в Администрирование → Настройки программы → Региональные настройки. Иногда проблема кроется в неверном формате даты по умолчанию.
Обратите внимание: в некоторых конфигурациях (например, 1С:Бухгалтерия) даты в документах не могут быть будущими или превышать текущий отчётный период. Если вы пытаетесь ввести дату из будущего, система может выдать ошибку или автоматически подставить текущую дату.
Использование календаря для выбора даты
В большинстве форм 1С рядом с полем даты есть кнопка с изображением календаря 📅. Нажатие на неё открывает визуальный календарь, где можно выбрать нужную дату мышью. Это удобно, когда требуется указать дату из прошлого или будущего без ручного ввода.
Календарь поддерживает несколько полезных функций:
- 🔹 Переход по месяцам/годам — используйте стрелки ← и → вверху календаря.
- 🔹 Выбор текущей даты — кнопка
Сегодняв нижней части. - 🔹 Очистка поля — кнопка
×(крестик) сбрасывает значение на пустое.
Если календарь не открывается по клику, проверьте:
- Не заблокировано ли поле для редактирования (серый цвет фона).
- Не отключён ли JavaScript в браузере (актуально для веб-клиента 1С).
- Не используется ли нестандартная конфигурация с изменённым интерфейсом.
Программное формирование даты на встроенном языке
Для разработчиков и опытных пользователей, работающих с встроенным языком 1С, доступно несколько способов создания и манипуляции датами. Основные функции и операторы:
| Функция/Оператор | Описание | Пример |
|---|---|---|
ТекущаяДата() |
Возвращает текущую дату и время | |
Дата(Год, Месяц, День) |
Создаёт дату из числовых значений | |
НачалоДня(Дата) |
Обнуляет время (устанавливает 00:00:00) | |
КонецДня(Дата) |
Устанавливает время в 23:59:59 | |
+, - |
Сложение/вычитание дней | |
При работе с датами в коде важно помнить о типах данных. В 1С дата хранится как число секунд с 1 января 1899 года, но при выводе автоматически преобразуется в читаемый формат. Например:
Сообщить(ТекущаяДата()); // Выведет: 15.05.2026 14:30:00
Сообщить(ТекущаяДата() + 1); // Выведет дату через 1 секунду
Что будет, если сложить дату и число?
В 1С дата хранится как количество секунд, поэтому сложение с числом прибавляет именно секунды. Например, Дата(2026,1,1) + 86400 вернёт 02.01.2026 (86400 секунд = 1 день).
Важно: при программном формировании дат в отчётах или документах всегда проверяйте результат функцией ТипЗнч(), чтобы избежать ошибок с неверными типами данных.
Форматирование даты для вывода и печатных форм
Часто требуется представить дату в нестандартном формате — например, для печатных форм документов или отчётов. В 1С для этого используется функция Формат() с различными шаблонами.
Основные шаблоны форматирования:
- 📌
"ДЛФ=DT"— полный формат с временем (15 мая 2026 г. 14:30:00). - 📌
"ДФ=dd.MM.yyyy"— краткий числовой формат (15.05.2026). - 📌
"ДЛФ=D"— дата без времени (15 мая 2026 г.). - 📌
"ДФ='День: 'dd, 'Месяц: 'MM, 'Год: 'yyyy"— кастомный формат (День: 15, Месяц: 05, Год: 2026).
Примеры использования:
// Форматирование для вывода в сообщении
Сообщить(Формат(ТекущаяДата(), "ДЛФ=DT"));
// Форматирование для печатной формы
ПечатнаяФорма.Параметры.ДатаДокумента = Формат(Документ.Дата, "ДФ='«'dd'» 'MMMM yyyy' г.'");
Если требуется вывести дату на другом языке (например, на английском), используйте параметр Язык:
Сообщить(Формат(ТекущаяДата(), "ДЛФ=D", , "en_US")); // Выведет: May 15, 2026
☑️ Проверка форматирования даты
Работа с диапазонами дат и периодами
В 1С часто требуется работать не с отдельной датой, а с периодом — например, для формирования отчётов за месяц или квартал. Для этого используются функции НачалоМесяца(), КонецМесяца(), НачалоКвартала() и другие.
Примеры:
// Текущий месяц
Начало = НачалоМесяца(ТекущаяДата());
Конец = КонецМесяца(ТекущаяДата());
// Предыдущий квартал
НачалоКвартала = НачалоКвартала(ТекущаяДата()) - 86400 * 90; // Примерно 90 дней назад
КонецКвартала = КонецКвартала(НачалоКвартала);
// Неделя
НачалоНедели = НачалоНедели(ТекущаяДата());
КонецНедели = КонецНедели(ТекущаяДата());
Для проверки принадлежности даты к периоду используйте логические операторы:
Если ДатаДокумента >= НачалоМесяца(ТекущаяДата()) И ДатаДокумента <= КонецМесяца(ТекущаяДата()) Тогда
Сообщить("Документ относится к текущему месяцу");
КонецЕсли;
При работе с кварталами учитывайте, что в бухгалтерских конфигурациях начало финансового года может не совпадать с календарным. Всегда уточняйте настройки учётной политики.
Если вам нужно получить все даты из диапазона (например, для цикла), используйте конструкцию:
ДатаНачала = НачалоМесяца(ТекущаяДата());
ДатаОкончания = КонецМесяца(ТекущаяДата());
Пока ДатаНачала <= ДатаОкончания Цикл
Сообщить(Формат(ДатаНачала, "ДФ=dd.MM.yyyy"));
ДатаНачала = ДатаНачала + 86400; // +1 день
КонецЦикла;
Типичные ошибки при работе с датами и как их избежать
Даже опытные пользователи и разработчики иногда допускают ошибки при работе с датами в 1С. Рассмотрим самые распространённые из них:
- Несовпадение форматов — попытка сравнить дату в формате
ДД.ММ.ГГГГсо строкой"15-05-2026". Всегда приводите данные к одному типу с помощьюДата(). - Игнорирование временной зоны — в распределённых системах даты могут отличаться на сервере и клиенте. Используйте
ТекущаяДатаСервера()для критичных операций. - Ошибки при арифметике — сложение дней как чисел без учёта високосных годов. Например,
Дата(2026, 2, 28) + 1вернёт29.02.2026, а в невисокосном году —01.03.2023. - Пустые даты — сравнение с
Nullили неинициализированной датой. Всегда проверяйте наЗначениеЗаполнено().
Пример обработки пустой даты:
Если НЕ ЗначениеЗаполнено(Документ.Дата) Тогда
ДатаДокумента = ТекущаяДата();
Иначе
ДатаДокумента = Документ.Дата;
КонецЕсли;
Для отладки кода с датами используйте функцию Сообщить() с выводом типа значения: Сообщить(ТипЗнч(ДатаДокумента));. Это поможет обнаружить строки вместо дат.
Ещё одна частая проблема — неверное округление времени. Например, если вам нужно получить дату без времени, используйте НачалоДня(), а не просто обнуляйте часы вручную:
// Неверно (может дать ошибку):
ДатаБезВремени = Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата()));
// Правильно:
ДатаБезВремени = НачалоДня(ТекущаяДата());
Работа с датами в запросах 1С
В языке запросов 1С даты указываются в специальном формате: 'ГГГГ-ММ-ДД' или 'ГГГГ-ММ-ДДЧЧ:ММ:СС'. Примеры:
ВЫБРАТЬ
ДатаДокумента КАК Дата
ИЗ
Документ.ЗаказПокупателя
ГДЕ
ДатаДокумента >= '2026-01-01'
И ДатаДокумента <= '2026-01-31'
Для динамического формирования дат в запросах используйте параметры:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДатаДокумента КАК Дата
|ИЗ
| Документ.ЗаказПокупателя
|ГДЕ
| ДатаДокумента >= &НачалоПериода
| И ДатаДокумента <= &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Результат = Запрос.Выполнить();
Если в запросе нужно сравнить дату без учёта времени, используйте функции НАЧАЛОПЕРИОДА():
ВЫБРАТЬ
ДатаДокумента КАК Дата
ИЗ
Документ.ЗаказПокупателя
ГДЕ
НАЧАЛОПЕРИОДА(ДатаДокумента, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
Как ускорить запросы с датами?
Для больших баз данных используйте индексы по полям с датами. Также избегайте функций над полями в условиях (например, ГОД(ДатаДокумента) = 2026), лучше переписывайте как ДатаДокумента >= '2026-01-01'.
Особенности работы с датами в разных конфигурациях 1С
В зависимости от конфигурации (1С:Бухгалтерия, 1С:Зарплата и Управление Персоналом, 1С:Управление Торговлей и др.) могут отличаться:
- 🔧 Форматы дат по умолчанию — в бухгалтерских конфигурациях часто используется формат с указанием времени, а в кадровых — только дата.
- 🔧 Ограничения на ввод дат — например, в 1С:Бухгалтерия нельзя ввести документ с датой из будущего.
- 🔧 Периоды закрытия — в некоторых конфигурациях даты документов не могут попадать в закрытые периоды.
- 🔧 Локализация — в международных версиях 1С формат даты может зависеть от региональных настроек.
Пример ограничения в 1С:Бухгалтерия 8.3:
⚠️ Внимание: Если в настройках учётной политики установлен флаг "Запретить проведение документов с датой из будущего", то при попытке ввести дату позже текущей система выдаст ошибку: "Дата документа не может быть больше текущей даты!". Чтобы обойти это ограничение, требуются права администратора.
В 1С:Зарплата и Управление Персоналом даты часто используются для расчёта стажа, отпусков и больничных. Здесь важно учитывать:
- 📅 Даты приёма и увольнения сотрудников.
- 📅 Периоды отпусков и командировок.
- 📅 Даты начисления зарплаты и выплаты авансов.
Для работы с кадровыми датами полезно использовать функции:
// Расчёт стажа на определенную дату
Стаж = РазностьДат(ТекущаяДата(), Сотрудник.ДатаПриема);
// Проверка, попадает ли дата в период отпуска
Если Дата НаходитсяМежду(Отпуск.ДатаНачала, Отпуск.ДатаОкончания) Тогда
Сообщить("Сотрудник в отпуске!");
КонецЕсли;
В кадровых конфигурациях даты часто привязаны к графику работы. Всегда сверяйте расчёты с табелем учёта рабочего времени.
FAQ: Ответы на частые вопросы о датах в 1С
Как в 1С ввести дату рождения сотрудника, если год неизвестен?
Если год рождения неизвестен, его можно заменить условным значением (например, 0001), но лучше использовать специальное поле типа "Дата" с пометкой "Приблизительно". В некоторых конфигурациях (например, 1С:Зарплата) есть отдельное поле "ДатаРожденияНеизвестна" (флаг).
Пример:
Сотрудник.ДатаРождения = Дата(0001, 1, 1); // Условная дата
Сотрудник.ДатаРожденияНеизвестна = Истина;
Почему при копировании документа дата сбивается на 1 день?
Это типичная проблема, связанная с временными зонами или неверным округлением времени. При копировании дата может интерпретироваться как ДД.ММ.ГГГГ 00:00:00, а при сохранении — округляться до начала/конца дня. Чтобы избежать сбоя, используйте:
НовыйДокумент.Дата = НачалоДня(ИсходныйДокумент.Дата);
Как в запросе выбрать документы за последний месяц?
Используйте функции НАЧАЛОПЕРИОДА() и ДОБАВИТЬМЕСЯЦ():
ВЫБРАТЬ
ДатаДокумента КАК Дата
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
ДатаДокумента >= НАЧАЛОПЕРИОДА(ДОБАВИТЬМЕСЯЦ(&ТекущаяДата, -1), МЕСЯЦ)
И ДатаДокумента < НАЧАЛОПЕРИОДА(&ТекущаяДата, МЕСЯЦ)
Где &ТекущаяДата — параметр с текущей датой.
Можно ли в 1С хранить дату без года (только день и месяц)?
Прямо хранить дату без года в стандартных полях типа "Дата" нельзя, так как внутренне она представлена числом секунд с 1899 года. Альтернативные варианты:
- Использовать строковое поле и хранить дату в формате
"ДД.ММ". - Создать составное поле: отдельно
День(число) иМесяц(перечисление). - Хранить полную дату, но при выводе обрезать год с помощью
Формат().
Как проверить, является ли дата выходным днём?
Для проверки используйте функцию ДеньНедели():
Если ДеньНедели(ТекущаяДата()) = 6 ИЛИ ДеньНедели(ТекущаяДата()) = 7 Тогда
Сообщить("Сегодня выходной!");
КонецЕсли;
Для учёта праздничных дней потребуется справочник с датами праздников и дополнительная проверка:
Если НЕ ПраздничныеДни.НайтиПоРеквизиту("Дата", ТекущаяДата()).Пустая() Тогда
Сообщить("Сегодня праздник!");
КонецЕсли;