Работа с датами в 1С 8.3: от поля формы до кода
Содержание
Дату в 1С ставят тремя разными способами, и путают их постоянно. В поле документа её вводят руками или через календарь. В отчёте дату задают как период — от и до. А в коде дату собирают функцией или литералом в одинарных кавычках. Ниже — все три сценария плюс то, что обычно и ломает: часовой пояс, пустая дата 01.01.0001 и дата запрета редактирования
, из-за которой документ не проводится.
Разберём ввод даты в карточке документа, настройку периода в отчётах, создание даты в модуле, работу со временем и типичные ошибки, которые дают «неправильный» год или смещение на несколько часов.
Ввод даты в поле: вручную и через календарь
Поле типа «Дата» в форме выглядит как обычное поле с кнопкой календаря справа. Формат отображения берётся из региональных настроек базы — обычно дд.мм.гггг.
Два способа заполнить поле:
- 🖱 Через календарь. Нажмите кнопку выбора справа от поля — откроется выпадающий календарь. Стрелками вверху переключите месяц и год, щёлкните нужное число. Календарь закроется, дата встанет в поле.
- ⌨️ С клавиатуры. Встаньте в поле и наберите число подряд:
07112026. Платформа сама расставит точки и покажет07.11.2026. Разделители вводить не обязательно.
В некоторых полях вместе с датой хранится время — тогда формат длиннее, дд.мм.гггг чч:мм:сс. Время дописывается после даты тем же набором цифр.
Если поле уже заполнено и нужно только сдвинуть дату на день-два, проще стереть и набрать заново, чем ловить мышью нужную клетку календаря.
Тот же календарь работает и в отборах списков. Когда вы фильтруете журнал документов по дате, в поле отбора открывается такой же выпадающий календарь, а для диапазона — выбор периода «с … по …». Отличия от поля документа нет: вводятся даты одинаково.
Главная ошибка ручного ввода — неполный год. Наберёте 0711 и уйдёте из поля — получите 07.11.0001 или текущий год, но без гарантии. Для документов это критично: документ с датой 07.11.0026 провалится в начало времён и пропадёт из любого стандартного периода отчётов. Всегда вводите год четырьмя цифрами.
У даты документа есть ещё и время, даже если в поле оно не видно. Платформа проставляет его автоматически в момент записи, и порядок документов внутри одного дня определяется именно им. Поэтому два документа с одной датой всё равно идут по очереди — по времени записи.
Как задать период в отчёте или обработке
В отчётах дата задаётся не одним значением, а интервалом «с … по …». Поле периода обычно стоит в шапке отчёта или в его настройках.
Порядок такой:
- Нажмите на поле периода (часто подписано
Период). - Откроется диалог выбора. Слева — готовые варианты: день, неделя, месяц, квартал, полугодие, год и смещения вроде «этот месяц», «предыдущий месяц».
- Для своих границ выберите Произвольный период и укажите даты начала и конца вручную — теми же способами, что и в обычном поле.
- Нажмите «Выбрать» — отчёт перестроится на новый интервал.
Разница между стандартным и произвольным периодом важна. Стандартный период (например, «этот месяц») — «живой»: откроете отчёт в следующем месяце — границы сдвинутся сами. Произвольный период жёстко фиксирует конкретные даты и не меняется.
Конец периода почти всегда включается целиком, до 23:59:59. Если задать по 31.10.2026, попадут и документы, записанные в этот день вечером. Отдельно «обрезать» время обычно не нужно — платформа делает это за вас.
В обработках и консолях запросов период часто разбит на два отдельных поля — «Дата начала» и «Дата окончания». Логика та же: нижняя граница — начало дня, верхняя — конец дня.
Выбранный период отчёт запоминает вместе с остальными настройками. Если вы часто смотрите один и тот же интервал, сохраните его как вариант отчёта — тогда период подставится сразу при открытии. Стандартный («этот месяц») в сохранённом варианте остаётся «живым» и пересчитывается, произвольный — фиксируется датами.
Когда в отчёте данные «обрезаются» на последнем дне, первым делом проверьте не фильтры, а именно границу периода: не задан ли конец интервала датой без времени, из-за чего вечерние документы выпали. В штатном выборе периода такого не бывает, но в самодельных обработках с двумя полями — запросто.
Как создать дату в коде: функция Дата() и литералы
В модулях дату собирают из частей или пишут литералом. Оба варианта равнозначны.
Функция Дата() принимает год, месяц, день и, если нужно, часы, минуты, секунды:
Д1 = Дата(2026, 11, 7); // 07.11.2026 00:00:00
Д2 = Дата(2026, 11, 7, 12, 30, 0); // 07.11.2026 12:30:00
Д3 = Дата("20261107123000"); // то же из строки ГГГГММДДЧЧММСС
Литерал даты пишется в одинарных кавычках в формате ГГГГММДДЧЧММСС:
Д4 = '20261107'; // 07.11.2026 00:00:00
Д5 = '20261107123000'; // 07.11.2026 12:30:00
Пустая (незаполненная) дата — это не Неопределено, а конкретное значение 01.01.0001:
ПустаяДата = Дата(1, 1, 1); // то же, что '00010101'
Если Объект.ДатаОтгрузки = Дата(1, 1, 1) Тогда
Сообщить("Дата отгрузки не заполнена");
КонецЕсли;
Диапазон, который умеет хранить платформа, — от 01.01.0001 до 31.12.9999. За эти границы дату не выйдет ни ввести, ни вычислить.
Отдельные части из даты достают функциями Год(), Месяц(), День(), Час(), Минута(), Секунда(), а также ДеньНедели() и ДеньГода():
Г = Год('20261107'); // 2026
М = Месяц('20261107'); // 11
ДН = ДеньНедели('20261107'); // 6 (суббота)
Для расчёта границ периодов в платформе есть готовый набор — он избавляет от ручной арифметики с месяцами:
НачалоДня(Дата)иКонецДня(Дата)—00:00:00и23:59:59этой даты;НачалоМесяца(Дата),КонецМесяца(Дата)— первое и последнее число месяца;НачалоКвартала,КонецКвартала,НачалоГода,КонецГода— по аналогии;ДобавитьМесяц(Дата, Число)— сдвиг на N месяцев с корректной обработкой разной длины месяцев.
НачМесяца = НачалоМесяца(ТекущаяДатаСеанса());
КонМесяца = КонецМесяца(ТекущаяДатаСеанса());
СледМесяц = ДобавитьМесяц(НачМесяца, 1);
Эти функции и закрывают самый частый запрос из кода — «собрать период для запроса или отчёта». Вместо того чтобы вычислять первое и последнее число месяца руками, берут готовую пару НачалоМесяца / КонецМесяца и передают её в параметры запроса. Границы при этом уже содержат нужное время: начало — 00:00:00, конец — 23:59:59, так что документы последнего дня не теряются.
Отдельно о ДобавитьМесяц(): функция корректно обрабатывает месяцы разной длины. Прибавите месяц к 31.01 — получите не 31.02, а последнее число февраля (28 или 29 в високосный год). Это и есть причина использовать её вместо прибавления «тридцати дней».
Для вывода на экран или в печать дату форматируют функцией Формат():
Формат('20261107', "ДФ=dd.MM.yyyy"); // 07.11.2026
Формат('20261107', "ДЛФ=D"); // 7 ноября 2026 г.
Формат('20261107123000', "ДЛФ=DT"); // 7 ноября 2026 г. 12:30:00
Параметр ДФ задаёт формат вручную по шаблону (dd — день, MM — месяц, yyyy — год), а ДЛФ подставляет стандартный локализованный вид: D — только дата, DT — дата со временем, T — только время. Формат() не меняет саму дату — он лишь превращает её в строку для вывода. Хранимое значение остаётся прежним.
Где 1С берёт текущую дату и при чём тут часовой пояс
Текущую дату в коде получают не так, как кажется на первый взгляд. В клиент-серверной базе есть две похожие функции, и путать их нельзя.
ТекущаяДата()возвращает дату и время компьютера, на котором выполняется код. На сервере это часы сервера. На клиенте управляемого приложения вызвать её нельзя — будет ошибка компиляции.ТекущаяДатаСеанса()возвращает дату с учётом часового пояса сеанса и работает и на клиенте, и на сервере. В прикладном коде по умолчанию используйте именноТекущаяДатаСеанса().
Даты в 1С хранятся без привязки к часовому поясу — это просто значение. Пояс важен в двух местах: когда платформа подставляет текущее время и когда данные сравниваются с внешними системами.
Для работы с поясами есть:
ЧасовойПоясСеанса()— пояс текущего сеанса;МестноеВремя(ДатаUTC, ЧасовойПояс)— перевод из универсального времени в местное;УниверсальноеВремя(МестнаяДата)— обратный перевод в UTC.
Классический симптом «сбитого пояса» — документ записан вечером, а в списке стоит дата следующего дня (или наоборот). Почти всегда причина в том, что часовой пояс информационной базы не совпадает с поясом сервера. Проверять и менять пояс базы должен администратор — через настройки информационной базы.
Если в отчёте время документов смещено ровно на несколько часов, это тот же случай: сравните пояс сервера 1С и пояс операционной системы, где он запущен.
Почему дату нельзя поставить: дата запрета редактирования
Иногда дату в документ ввести не дают: при записи выходит сообщение, что период закрыт. Это работает «Дата запрета изменения данных» — защита закрытых периодов от случайных правок.
Механизм настраивается в разделе Администрирование → Настройки пользователей и прав → Даты запрета изменения (в разных конфигурациях название раздела может немного отличаться). Там включают запрет и указывают дату: всё, что раньше неё, редактировать и проводить нельзя.
Запрет можно задать:
- 🏢 для всей базы одной датой;
- 👥 отдельно по организациям, разделам учёта или пользователям;
- 📅 как относительную дату — например, «конец прошлого месяца», тогда граница сама сдвигается каждый месяц.
Если нужно провести документ прошлым месяцем, а база не даёт, не ищите ошибку во вводе даты. Сначала проверьте дату запрета — скорее всего, период уже закрыт бухгалтером. Сдвигать границу должен тот, кто отвечает за закрытие периода.
Отдельно учтите: у документа могут быть собственные ограничения по дате из его логики (например, нельзя оформить операцию будущей датой). Это не дата запрета, а проверка самого документа — сообщение будет другим.
Частые ошибки при вводе и обработке дат
Самые частые проблемы с датами и что с ними делать:
Ещё одна тонкая ошибка — сравнение дат со временем. Если в поле хранится не только дата, но и время, то условие Дата = '20261107' вернёт Ложь для документа, записанного днём: у него время не нулевое. Для сравнения «по дню» приводите обе части к началу дня через НачалоДня().
Частые вопросы
Как быстро поставить сегодняшнюю дату в поле?
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() берёт время компьютера, где идёт код, и на клиенте управляемого приложения недоступна. ТекущаяДатаСеанса() учитывает часовой пояс сеанса и работает везде — её и используйте в прикладном коде.Почему у документа дата есть, а время ноль?
'20261107', время будет 00:00:00. При обычной записи платформа ставит реальное время. На порядок внутри дня влияет именно время записи.Как сравнить две даты без учёта времени?
НачалоДня(Дата1) = НачалоДня(Дата2). Тогда разное время внутри одного дня не помешает.Что такое пустая дата и как её проверить?
01.01.0001, то есть Дата(1,1,1). Проверяйте поле сравнением с этим значением, а не с Неопределено.Можно ли ввести дату раньше 1С-эпохи или в далёком будущем?
01.01.0001 до 31.12.9999. За эти границы значение не задать ни руками, ни в коде.