Разработка и Конфигурация · 8 мин
Как проверить дату в 1С: заполненность, корректность и период
Как проверить дату в 1С на заполненность, корректность и период. Функции ЗначениеЗаполнено, проверка в запросах, типичные ошибки и примеры кода на встроенном языке.
Проверка даты — одна из самых частых задач при разработке и доработке конфигураций 1С. Незаполненная дата документа ломает проведение, неверный период искажает отчёты, а сравнение даты с пустым значением в запросе даёт неожиданные результаты. При этом у разработчиков есть несколько инструментов: функция ЗначениеЗаполнено, сравнение с пустой датой, проверки в запросах и типовые механизмы контроля периодов.
Важно понимать, что «проверить дату» в 1С может означать разное: убедиться, что реквизит заполнен; проверить, что дата попадает в допустимый период; сверить дату документа с датой запрета редактирования; или просто посмотреть значение даты в конкретном документе через режим предприятия. Каждая задача решается своим способом.
Материал ориентирован на пользователей и разработчиков, работающих с конфигурациями на платформе 1С:Предприятие 8.3. Примеры кода приведены на встроенном языке и подходят как для управляемых, так и для обычных форм.
Способы проверки даты на заполненность в коде
Пустая дата в 1С — это значение 01.01.0001 00:00:00, а не NULL и не пустая строка. Поэтому проверка вида «Дата = ""» никогда не сработает, а сравнение с NULL корректно только в запросах к полям, которые могут принимать NULL (например, при левом соединении таблиц).
Самый надёжный способ проверить заполненность даты в коде — функция ЗначениеЗаполнено. Она возвращает Ложь для пустой даты, Неопределено и пустых ссылок, поэтому подходит для универсальных проверок реквизитов.
Если НЕ ЗначениеЗаполнено(Объект.ДатаОплаты) Тогда
Сообщить("Не заполнена дата оплаты!");
КонецЕсли;
Альтернативный вариант — явное сравнение с пустой датой через строковый литерал '00010101'. Этот способ чуть быстрее и часто встречается в типовом коде:
Если Объект.ДатаОплаты = '00010101' Тогда
// дата не заполнена
КонецЕсли;
Проверка даты в запросе
В запросах логика отличается: поле даты может быть незаполненным (пустая дата) или NULL, если оно пришло из соединения таблиц. Проверять нужно оба случая, иначе отбор «съест» часть строк или, наоборот, пропустит лишние.
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Для отбора по периоду удобнее всего оператор МЕЖДУ: границы включаются в результат. Если конец периода задан датой без времени (например, 31.03.2026 00:00:00), документы за последний день с временем больше 00:00:00 в выборку не попадут. Чтобы избежать этого, используйте функцию КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) или передавайте конец дня через КонецДня() при установке параметра.
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));Для фильтрации пустых дат в запросе используйте сравнение с параметром или литералом даты:
ГДЕ
Реализация.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)
Проверка даты на попадание в период
Типовая задача — убедиться, что введённая пользователем дата находится в допустимых рамках: не в будущем, не раньше начала учёта, внутри отчётного периода. Решается обычным сравнением, так как даты в 1С корректно сравниваются операторами «больше» и «меньше».
Если Объект.Дата > ТекущаяДатаСеанса() Тогда
Сообщить("Дата документа не может быть в будущем");
Отказ = Истина;
КонецЕсли;
Обратите внимание: для серверных проверок используйте ТекущаяДатаСеанса(), а не ТекущаяДата(). В клиент-серверном режиме ТекущаяДата() на клиенте возвращает время компьютера пользователя, которое может отличаться от серверного, и проверка сработает неверно.
Как посмотреть и проверить дату в режиме 1С:Предприятие
Если вы не разработчик, а пользователь, проверка даты обычно сводится к визуальному контролю. Откройте документ и посмотрите поле «Дата» в шапке — по умолчанию оно стоит рядом с номером. Если дата не видна, проверьте настройки формы через меню «Ещё — Изменить форму».
Для массовой проверки дат удобен список документов: включите отбор по периоду через кнопку настройки списка или используйте стандартную панель периода. Если документы «пропали» из списка, первым делом проверьте, не стоит ли отбор по дате, который отсекает нужные записи.
В типовых конфигурациях также действует дата запрета изменения данных (раздел «Администрирование — Поддержка и обслуживание» в ряде конфигураций). Если документ нельзя сохранить или провести с сообщением о запрете, проверьте, не попадает ли его дата в закрытый период.
- 1Откройте документ и проверьте поле даты в шапке
- 2Убедитесь, что документ попадает в нужный период через отбор списка
- 3Проверьте, проведён ли документ: непроведённый не формирует движений
- 4При ошибке о закрытом периоде уточните дату запрета редактирования у администратора
Проверка даты при проведении и в обработчиках
Разработчику чаще всего нужно проверять дату в обработчиках ПередЗаписью, ПриЗаписи или ОбработкаПроведения. Проверку заполненности реквизитов даты лучше размещать в ОбработкаПроверкиЗаполнения — тогда платформа сама покажет сообщение и привяжет его к полю формы.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЗначениеЗаполнено(ДатаОтгрузки)
И ДатаОтгрузки < Дата Тогда
ОбщегоНазначения.СообщитьПользователю(
"Дата отгрузки раньше даты документа", , , , Отказ);
КонецЕсли;
КонецПроцедуры;
Также платформа автоматически контролирует уникальность и смену даты при записи: если документ проводится задним числом, движения пересчитываются. Помните, что изменение даты проведённого документа на более раннюю может нарушить последовательность проведения и итоги регистров.
Частые ошибки и ограничения
Ещё одна распространённая ситуация — дата хранится как строка (например, при загрузке из Excel или обмена). Перед сравнением её нужно преобразовать, иначе сравнение строк «01.02.2026» и «15.01.2026» даст неверный результат по алфавиту. Для преобразования используйте собственный разбор строки или функции работы с датами, так как штатного СтрокаВДату() во встроенном языке нет.
Учитывайте также часовые пояса: в распределённых базах и при обмене дата-время может сдвигаться. Если документы «переезжают» на соседний день после обмена, проверьте настройки часового пояса информационной базы и сеанса.
Как проверить результат
Пустая дата отклоняется сообщением, заполненная проходит
Проверка пропускает '00010101' или блокирует корректные даты
В выборку попадают все документы последнего дня периода
Документы за конечную дату отсутствуют
Результат одинаков на клиенте и сервере
Поведение зависит от компьютера пользователя
FAQ
Чему равна пустая дата в 1С?
Пустая дата — это значение 01.01.0001 00:00:00. В коде её проверяют сравнением с '00010101' или функцией ЗначениеЗаполнено(), в запросах — через ДАТАВРЕМЯ(1, 1, 1).
Как проверить, что дата не в будущем?
Сравните значение с ТекущаяДатаСеанса(): Если Дата > ТекущаяДатаСеанса() Тогда ... — и откажите в записи. Не используйте для этого ТекущаяДату() на клиенте в клиент-серверном режиме.
Почему документ не попадает в отчёт за период?
Чаще всего конец периода задан началом дня без времени. Используйте КонецДня() при передаче параметра или КОНЕЦПЕРИОДА() в запросе. Также проверьте, проведён ли документ — непроведённые не формируют данные отчётов.
Как проверить дату, если она загружена как строка?
Строку нужно сначала преобразовать в дату собственной функцией разбора (выделить день, месяц, год и собрать через Дата()). Прямое сравнение строк даёт лексикографический, а не хронологический порядок.
Что делать, если 1С не даёт провести документ прошлым периодом?
Проверьте дату запрета изменения данных в настройках администрирования. Если период закрыт, согласуйте изменение с ответственным за учёт: сдвиг даты запрета влияет на уже сданную отчётность.
Чем отличается NULL от пустой даты в запросе?
Пустая дата — конкретное значение 01.01.0001. NULL появляется при соединении таблиц, когда соответствия нет. Проверка «Дата = ДАТАВРЕМЯ(1,1,1)» не отберёт NULL-строки — для них нужно условие ЕСТЬ NULL.
Что важно запомнить
Пустая дата в 1С — это 01.01.0001, проверяется через ЗначениеЗаполнено() или '00010101'. В запросах отбирайте период через МЕЖДУ с КонецДня() и учитывайте NULL. Для серверных проверок используйте ТекущаяДатаСеанса(), а перед изменением дат прошлых периодов делайте резервную копию.