Работа с датами в 1С 8.3: от поля формы до кода

· 9 мин

Содержание

Дату в 1С ставят тремя разными способами, и путают их постоянно. В поле документа её вводят руками или через календарь. В отчёте дату задают как период — от и до. А в коде дату собирают функцией или литералом в одинарных кавычках. Ниже — все три сценария плюс то, что обычно и ломает: часовой пояс, пустая дата 01.01.0001 и дата запрета редактирования , из-за которой документ не проводится.

Разберём ввод даты в карточке документа, настройку периода в отчётах, создание даты в модуле, работу со временем и типичные ошибки, которые дают «неправильный» год или смещение на несколько часов.

Ввод даты в поле: вручную и через календарь

Поле типа «Дата» в форме выглядит как обычное поле с кнопкой календаря справа. Формат отображения берётся из региональных настроек базы — обычно дд.мм.гггг.

Два способа заполнить поле:

  • 🖱 Через календарь. Нажмите кнопку выбора справа от поля — откроется выпадающий календарь. Стрелками вверху переключите месяц и год, щёлкните нужное число. Календарь закроется, дата встанет в поле.
  • ⌨️ С клавиатуры. Встаньте в поле и наберите число подряд: 07112026. Платформа сама расставит точки и покажет 07.11.2026. Разделители вводить не обязательно.

В некоторых полях вместе с датой хранится время — тогда формат длиннее, дд.мм.гггг чч:мм:сс. Время дописывается после даты тем же набором цифр.

Если поле уже заполнено и нужно только сдвинуть дату на день-два, проще стереть и набрать заново, чем ловить мышью нужную клетку календаря.

Тот же календарь работает и в отборах списков. Когда вы фильтруете журнал документов по дате, в поле отбора открывается такой же выпадающий календарь, а для диапазона — выбор периода «с … по …». Отличия от поля документа нет: вводятся даты одинаково.

Главная ошибка ручного ввода — неполный год. Наберёте 0711 и уйдёте из поля — получите 07.11.0001 или текущий год, но без гарантии. Для документов это критично: документ с датой 07.11.0026 провалится в начало времён и пропадёт из любого стандартного периода отчётов. Всегда вводите год четырьмя цифрами.

У даты документа есть ещё и время, даже если в поле оно не видно. Платформа проставляет его автоматически в момент записи, и порядок документов внутри одного дня определяется именно им. Поэтому два документа с одной датой всё равно идут по очереди — по времени записи.

Как задать период в отчёте или обработке

В отчётах дата задаётся не одним значением, а интервалом «с … по …». Поле периода обычно стоит в шапке отчёта или в его настройках.

Порядок такой:

  1. Нажмите на поле периода (часто подписано Период).
  2. Откроется диалог выбора. Слева — готовые варианты: день, неделя, месяц, квартал, полугодие, год и смещения вроде «этот месяц», «предыдущий месяц».
  3. Для своих границ выберите Произвольный период и укажите даты начала и конца вручную — теми же способами, что и в обычном поле.
  4. Нажмите «Выбрать» — отчёт перестроится на новый интервал.

Разница между стандартным и произвольным периодом важна. Стандартный период (например, «этот месяц») — «живой»: откроете отчёт в следующем месяце — границы сдвинутся сами. Произвольный период жёстко фиксирует конкретные даты и не меняется.

Конец периода почти всегда включается целиком, до 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. За эти границы значение не задать ни руками, ни в коде.