Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и бухгалтеры, и программисты. Казалось бы, что может быть проще, чем указать сегодняшний день? Но на практике даже эта операция таит подводные камни: от неверного формата до ошибок при программной установке. Неправильно заданная дата может привести к сбоям в отчетах, некорректному расчету налогов или проблемам с документооборотом.
В этой статье мы разберем все возможные способы установки текущей даты — от базовых действий в пользовательском режиме до сложных сценариев на встроенном языке. Вы узнаете, как избежать типичных ошибок, какие функции использовать для разных версий платформы, и почему иногда дату в 1С нельзя задать напрямую через интерфейс без прав администратора. Материал будет полезен как новичкам, так и опытным разработчикам, которые хотят оптимизировать работу с временными метками.
Особое внимание уделим трём ключевым аспектам:
- 🔹 Ручная установка — когда достаточно клика мышкой, но есть ограничения по правам.
- 🔹 Программные методы — как задать дату через код, включая нюансы для управляемых форм.
- 🔹 Автоматизация — почему иногда лучше не вводить дату вручную, а брать её из системы.
Прежде чем перейти к инструкциям, важно понять: в 1С дата — это не просто число, а объект со своими свойствами. Она может храниться в разных форматах, зависеть от настроек региональных стандартов и даже влиять на логику работы конфигурации. Например, в 1С:Бухгалтерия от текущей даты зависят проводки, а в 1С:Зарплата — расчет больничных. Поэтому ошибка даже на один день может исказить всю аналитику.
1. Ручная установка текущей даты через интерфейс 1С
Самый простой способ — задать дату вручную в открытом документе или справочнике. Для этого не нужны права администратора, но требуется доступ на редактирование конкретного объекта. Рассмотрим пошагово, как это сделать в типовой конфигурации.
Откройте любой документ (например, Поступление товаров или Реализация). В шапке документа вы увидите поле Дата. По умолчанию там может стоять сегодняшняя дата, но её легко изменить:
- Кликните по полю
Даталевой кнопкой мыши. - В появившемся календаре выберите нужный день или введите дату вручную в формате
ДД.ММ.ГГГГ. - Нажмите
Enterили кликните вне поля для сохранения.
Если календарь не открывается, проверьте:
- 🔸 Настроен ли в системе региональный стандарт (формат даты может отличаться для России, Казахстана или Беларуси).
- 🔸 Нет ли ограничений на редактирование даты в ролях пользователя (например, менеджер не может изменить дату в закрытом периоде).
- 🔸 Не заблокировано ли поле
Датав настройках формы (актуально для управляемых форм).
Поле "Дата" доступно для редактирования|
Формат даты соответствует региональным настройкам|
Пользователь имеет права на изменение даты в этом документе|
Документ не проведён (иначе дату изменить нельзя)-->
Обратите внимание: в некоторых конфигурациях (например, 1С:Управление торговлей) дата документа может автоматически подставляться из сеанса пользователя. Чтобы это отключить, нужно править настройки конфигурации — но это уже задача для программиста.
⚠️ Внимание: В документах с проводками (например, Платежное поручение) изменение даты после проведения может привести к расхождению итогов. Всегда перепроводите документ после редактирования даты!
2. Автоматическая подстановка текущей даты при создании документа
Чтобы не вводить дату вручную каждый раз, в 1С можно настроить автоматическую подстановку текущей даты при создании нового документа. Это экономит время и снижает риск ошибок. Рассмотрим, как это работает в разных версиях платформы.
В обычных формах (устаревший интерфейс) автоматическая дата настраивается через модуль документа. Достаточно добавить одну строку кода в процедуру ПриСозданииНаСервере:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Дата = ТекущаяДата();
КонецПроцедуры
В управляемых формах (современный интерфейс) логика немного иная. Здесь дату можно задать либо через модуль объекта, либо через модуль формы. Пример для модуля объекта:
Процедура ОбработкаЗаполнения(Отказ)
Объект.Дата = ТекущаяДата();
КонецПроцедуры
Если автоматическая дата не подставляется, проверьте:
- 📅 Настроен ли параметр сеанса
ТекущаяДата(иногда он переопределяется в коде). - 🔧 Нет ли в конфигурации обработчиков событий, которые сбрасывают дату.
- 🛠️ Не отключена ли опция
Автонумерацияв настройках документа (иногда это влияет и на дату).
Если дата подставляется неверно (например, на день раньше), проверьте настройки времени на сервере 1С. Расхождение даже в 1 час может сбивать дату при переходе на зимнее/летнее время.
| Способ подстановки | Где настраивается | Применимость | Ограничения |
|---|---|---|---|
| Через модуль документа | ПриСозданииНаСервере |
Обычные формы | Не работает в управляемых формах |
| Через модуль объекта | ОбработкаЗаполнения |
Управляемые формы | Требует прав на редактирование конфигурации |
| Параметр сеанса | Настройки пользователя | Все формы | Может конфликтовать с другими обработчиками |
| Глобальная переменная | Модуль приложения | Все документы | Изменяется для всех пользователей |
3. Программное задание даты через встроенный язык
Для гибкой работы с датами в 1С используется встроенный язык программирования. Он позволяет не только устанавливать текущую дату, но и манипулировать ею: прибавлять дни, вычитать месяцы, сравнивать периоды. Разберём основные функции и приёмы.
Базовая функция для получения текущей даты — ТекущаяДата(). Она возвращает дату сервера 1С (не локального компьютера!) в формате Дата. Примеры использования:
// Установить текущую дату в документ
Документ.Дата = ТекущаяДата();
// Получить дату без времени (только день)
ДатаБезВремени = НачалоДня(ТекущаяДата());
// Прибавить 5 дней к текущей дате
ДатаЧерез5Дней = ТекущаяДата() + 5;
Если нужно задать конкретную дату (не текущую), используйте конструктор Дата(Год, Месяц, День):
НоваяДата = Дата(2023, 12, 31); // 31 декабря 2023 года
Для работы с периодами удобно использовать функции НачалоМесяца(), КонецКвартала() и другие:
ПервыйДеньМесяца = НачалоМесяца(ТекущаяДата());
ПоследнийДеньГода = КонецГода(ТекущаяДата());
⚠️ Внимание: ФункцияТекущаяДата()возвращает дату сервера 1С, а не клиентского компьютера! Если у вас распределённая база, это может приводить к расхождениям. Чтобы получить локальную дату пользователя, используйтеТекущаяДатаНаКлиенте()(только в управляемых формах).
Для сравнения дат используйте операторы =, <, >, но помните: 1С сравнивает даты с учётом времени! Чтобы сравнить только дни, приведите даты к началу суток:
Если НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДата()) Тогда
Сообщить("Документ создан сегодня!");
КонецЕсли;
4. Особенности работы с датами в управляемых формах
Управляемые формы, появившиеся в 1С:Предприятие 8.2, кардинально изменили подход к работе с интерфейсом. Здесь даты обрабатываются иначе, чем в обычных формах, и требуют отдельного внимания. Разберём ключевые нюансы.
В управляемых формах дата может быть привязана к:
- 📌 Реквизиту объекта (например,
Документ.Дата). - 📌 Параметру формы (временная переменная).
- 📌 Элементу формы (поле ввода на экране).
Чтобы программно изменить дату в управляемой форме, используйте методы УстановитьЗначение() или обращайтесь напрямую к реквизиту:
// Способ 1: через реквизит
Объект.Дата = ТекущаяДата();
// Способ 2: через элемент формы (если нужно обновить отображение)
ЭлементыФормы.Дата.Значение = ТекущаяДата();
Важный момент: в управляемых формах изменение даты на клиенте не всегда синхронизируется с сервером. Если вы меняете дату в обработчике НаСервере, используйте директиву &НаСервере:
&НаСервере
Процедура УстановитьТекущуюДату()
Объект.Дата = ТекущаяДата();
КонецПроцедуры
Почему дата в управляемой форме может "сбрасываться"?
Это происходит из-за механизма автоматического заполнения в 1С. Если в модуле объекта есть процедура ОбработкаЗаполнения, которая переопределяет дату, ваши изменения могут потеряться. Чтобы этого избежать, либо правьте логику заполнения, либо используйте флаг Модифицированность для отслеживания ручных изменений.
Ещё одна типичная проблема — неверный формат даты при выводе в табличные части или отчёты. Это связано с настройками языка и региональных стандартов в пользовательском профиле. Чтобы привести дату к нужному формату, используйте функцию Формат():
ТекстоваяДата = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); // 31.12.2023
5. Работа с датами в запросах и отчётах
При формировании отчётов или выполнении запросов даты играют критическую роль. Ошибка в условии по дате может привести к пропуску данных или, наоборот, включению лишних записей. Разберём, как правильно работать с датами в Языке запросов 1С.
Базовый синтаксис для фильтрации по дате:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК Документ
ГДЕ
Документ.Дата = &ТекущаяДата
Обратите внимание на параметр &ТекущаяДата. Его нужно передавать из кода:
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить();
Для выборки по диапазону дат используйте операторы МЕЖДУ или сравнения:
ГДЕ
Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
// Или так:
ГДЕ
Документ.Дата >= &ДатаНачала
И Документ.Дата <= &ДатаОкончания
Частая ошибка — забывать про время в датах. Если в базе хранится дата с временем (например, 31.12.2023 23:59:59), а вы сравниваете с датой без времени (31.12.2023 00:00:00), документ может не попасть в выборку. Чтобы этого избежать, используйте функции НачалоДня() и КонецДня():
ГДЕ
Документ.Дата >= НачалоДня(&ТекущаяДата)
И Документ.Дата <= КонецДня(&ТекущаяДата)
В запросах всегда явно указывайте формат сравнения дат. Если дата хранится с временем, используйте НачалоДня()/КонецДня(), иначе рискуете потерять данные.
Для группировки по периодам (месяц, квартал, год) используйте функции НАЧАЛОПЕРИОДА():
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ) КАК Месяц,
СУММА(Документ.Сумма) КАК ИтогоЗаМесяц
ИЗ
Документ.РеализацияТоваров КАК Документ
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ)
6. Типичные ошибки и как их избежать
Даже опытные пользователи 1С иногда сталкиваются с проблемами при работе с датами. Разберём самые распространённые ошибки и способы их решения.
Ошибка 1: Дата не сохраняется в документе
- 🔴 Причина: Поле
Датапомечено какНе редактироватьв настройках формы. - 🟢 Решение: Проверьте свойства реквизита в конфигураторе или права пользователя.
Ошибка 2: Дата сбрасывается на 01.01.0001
- 🔴 Причина: В коде используется неинициализированная переменная типа
Дата. - 🟢 Решение: Всегда инициализируйте даты, например:
МояДата = Дата(1,1,1);
Ошибка 3: Расхождение дат между клиентом и сервером
- 🔴 Причина: Используется
ТекущаяДата()на клиенте, а не на сервере. - 🟢 Решение: Для критичных операций берите дату с сервера или синхронизируйте время.
Ошибка 4: Неверный формат даты при экспорте/импорте
- 🔴 Причина: Региональные настройки отличаются от ожидаемого формата.
- 🟢 Решение: Явно указывайте формат при преобразовании:
Формат(Дата, "ДФ=dd.MM.yyyy").
Ошибка 5: Ошибка "Неверное значение даты"
- 🔴 Причина: Попытка задать несуществующую дату (например, 31 февраля).
- 🟢 Решение: Проверяйте даты на корректность с помощью
ДатаВерна().
⚠️ Внимание: В 1С:Предприятие 8.3.20+ появились новые функции для работы с датами в UTC. Если ваша база работает с международными контрагентами, учитывайте это при настройке обменов!
7. Автоматизация и интеграция: даты в обменах и API
В современных системах 1С часто интегрируется с внешними сервисами: банками, маркетплейсами, CRM. При обменах данных корректная передача дат критически важна. Разберём, как избежать проблем в типичных сценариях.
При обмене через XML/JSON даты обычно передаются в строковом формате. Чтобы избежать ошибок:
- 📤 При отправке: Преобразуйте дату в универсальный формат (например, ISO 8601):
Формат(Дата, "ДФ=yyyy-MM-dd"). - 📥 При получении: Парсите строку с явным указанием формата:
Дата(Строка; "yyyy-MM-dd").
Пример кода для обмена с REST API:
// Отправка даты в API
ТекстДата = Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddTHH:mm:ss");
Запрос = Новый HTTPЗапрос("https://api.example.com/data");
Запрос.УстановитьТекст("""{"date": """+ ТекстДата +"""}""");
// Получение даты из ответа
Ответ = Запрос.Выполнить().ПолучитьТекст();
ДатаИзAPI = Дата(JSON.Прочитать(Ответ).date, "yyyy-MM-ddTHH:mm:ss");
В обменах с 1С:EDT или другими конфигурациями даты синхронизируются автоматически, но могут возникать конфликты из-за:
- 🔄 Разных часовых поясов (например, головной офис в Москве, филиал во Владивостоке).
- 📅 Разных календарей (григорианский vs юлианский в некоторых странах).
- 🔒 Ограничений на редактирование ретроспективных данных.
Чтобы минимизировать риски:
- Настройте синхронизацию времени на всех серверах 1С.
- Используйте универсальные форматы дат в обменах.
- Проверяйте логи обменов на предмет ошибок преобразования дат.
При настройке обменов с банками (например, выписки) всегда уточняйте, в каком формате они ожидают дату. Некоторые банки требуют формат DDMMYY без разделителей, что нетипично для 1С.
8. Продвинутые приёмы: работа с датами в расширениях и внешних обработках
Если вам нужно гибко управлять датами без изменения типовой конфигурации, на помощь приходят расширения и внешние обработки. Они позволяют добавлять новую логику, не нарушая поддержку от 1С.
Пример: создадим обработку, которая устанавливает текущую дату в выбранных документах:
Процедура УстановитьТекущуюДатуВДокументах(МассивСсылок)
Для Каждого Ссылка Из МассивСсылок Цикл
Документ = Ссылка.ПолучитьОбъект();
Документ.Дата = ТекущаяДата();
Документ.Записать();
КонецЦикла;
КонецПроцедуры
В расширениях конфигурации можно переопределять стандартные обработчики дат. Например, чтобы всегда подставлять дату из другого документа:
&После("ОбработкаЗаполнения")
Процедура ПослеОбработкиЗаполнения(Отказ)
Если Объект.ЭтоНовый() Тогда
Объект.Дата = ПолучаемДатаИзСвязанногоДокумента(Объект.СсылкаНаОснование);
КонецЕсли;
КонецПроцедуры
Для сложных расчётов (например, рабочие дни без выходных) используйте календари:
// Получить следующий рабочий день
СледующийДень = ТекущаяДата() + 1;
Пока НЕ Календарь.ЭтоРабочийДень(СледующийДень) Цикл
СледующийДень = СледующийДень + 1;
КонецЦикла;
Если вам нужно хранить историю изменений дат, создайте регистр сведений с измерением Документ и ресурсом ДатаИзменения. Пример записи:
Регистр.ИсторияДат.Записать(
Документ.Ссылка,
ТекущаяДата(),
ПредыдущаяДата
);
⚠️ Внимание: При работе с расширениями учитывайте, что они могут конфликтовать с обновлениями типовой конфигурации. Всегда тестируйте новую логику на копии базы!
Расширения — самый безопасный способ кастомизации 1С, так как они не затрагивают исходный код конфигурации. Однако их возможности ограничены: вы не можете добавлять новые объекты метаданных, только расширять существующие.
FAQ: Частые вопросы по работе с датами в 1С
Как задать дату на неделю вперёд от текущей?
Используйте арифметику дат: НоваяДата = ТекущаяДата() + 7;. Если нужно пропустить выходные, используйте календарь рабочих дней.
Почему при изменении даты документ не проводится?
Скорее всего, у вас установлен флаг Оперативное проведение, и дата выходит за пределы разрешённого периода. Проверьте настройки учётной политики.
Можно ли в 1С задать дату в формате "31 декабря 2023 года"?
Да, для вывода на печать используйте функцию Формат():
ТекстоваяДата = Формат(ТекущаяДата(), "ДФ='d MMMM yyyy 'г.'");
Но для хранения в базе лучше использовать стандартный формат ДД.ММ.ГГГГ.
Как синхронизировать даты между 1С и Excel?
При экспорте в Excel используйте формат ДД.ММ.ГГГГ без времени. При импорте проверяйте, что Excel не преобразовал даты в текст (например, 31.12.2023 вместо 45265).
Что делать, если дата в отчёте отображается как ######?
Это означает, что ячейка в Excel слишком узкая для отображения даты. Расширьте столбец или измените формат ячейки на Дата.