Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются пользователи и разработчики. Казалось бы, что может быть проще, чем указать текущую дату в документе? Но на практике возникают нюансы: от автоматического проставления «сегодняшнего» числа до программной установки ретроспективных дат в массовых операциях. Ошибки при работе с датами ведут к искажению отчетности, проблемам с закрытием периодов и даже блокировкам базы.
В этой статье мы разберем все возможные способы задания даты в 1С — от элементарных до продвинутых. Вы узнаете, как вручную корректировать даты в документах, использовать встроенные функции языка 1С для автоматического заполнения, а также научитесь работать с датами через обработки и внешние отчеты. Особое внимание уделим типичным ошибкам, которые допускают даже опытные пользователи, и покажем, как их избежать.
Материал будет полезен бухгалтерам, кадровикам, кладовщикам и разработчикам — всем, кто так или иначе взаимодействует с датами в 1С. Мы не будем ограничиваться теорией: каждый способ проиллюстрирован реальными примерами кода и скриншотами интерфейса, которые вы сможете сразу применить в своей базе.
1. Ручной ввод даты в документах 1С
Самый очевидный способ — ввести дату вручную в поле документа. Однако даже здесь есть подводные камни, о которых многие не знают. Рассмотрим процесс на примере типового документа «Поступление товаров» в конфигурации 1С:Управление торговлей 11.
Чтобы задать дату документа:
- 📅 Откройте нужный документ (например, через меню
Покупки → Поступление товаров). - 🖱️ Кликните по полю
Дата— оно обычно расположено в шапке документа рядом с номером. - 📝 Введите дату в формате
ДД.ММ.ГГГГили выберите из календаря, который появляется при нажатии на иконку 🗓️. - ✅ Нажмите
ЗаписатьилиПровести, чтобы сохранить изменения.
Важно понимать, что дата документа влияет не только на его положение в журнале, но и на:
- 📊 Период отчетности — документ попадет в отчеты за тот месяц/квартал, который указан в дате.
- 💰 Курсы валют — если в документе есть валюта, система автоматически подтянет курс ЦБ на указанную дату.
- 📦 Остатки товаров — дата определяет, в какой момент времени будут изменены складские остатки.
⚠️ Внимание: Если вы указываете дату в прошлом (ретроспективно), убедитесь, что период не закрыт в учетной политике. В противном случае документ не проведется, а система выдаст ошибку «Период закрыт для редактирования».
2. Автоматическое заполнение даты при создании документа
По умолчанию 1С проставляет текущую дату при создании нового документа. Однако это поведение можно настроить под специфические задачи. Например, если вы ежедневно создаете одни и те же документы (акты выполненных работ, счета), удобно, чтобы дата автоматически устанавливалась на завтра или на конец месяца.
Для настройки автоматического заполнения даты:
- Перейдите в
Администрирование → Настройки программы → Настройки параметров учета. - Найдите раздел
Документыи параметрДата нового документа. - Выберите один из вариантов:
- 📅
Текущая дата(по умолчанию) - 🔄
Дата последнего документа + 1 день - 📆
Последний день текущего месяца
- 📅
Для разработчиков: если нужно более гибкое управление, можно использовать обработчик события ПриСозданииНаСервере в модуле документа. Пример кода для установки даты на следующий рабочий день:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущаяДата = ТекущаяДата();
Если ДеньНедели(ТекущаяДата) = 5 Тогда // если пятница
Объект.Дата = НачалоСледующегоДня(ТекущаяДата, 3); // понедельник
Иначе
Объект.Дата = НачалоСледующегоДня(ТекущаяДата, 1);
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: При массовом создании документов (например, через обработку) автоматическое заполнение даты может привести к дублированию номеров. В этом случае рекомендуется использовать обработку с уникальными номерами.
☑️ Проверка перед массовым созданием документов
3. Программное задание даты через встроенный язык 1С
Для автоматизации рутинных операций часто требуется программно устанавливать даты в документах, справочниках или регистрах. В языке 1С для этого есть несколько ключевых функций:
| Функция | Описание | Пример использования |
|---|---|---|
ТекущаяДата() |
Возвращает текущую дату сервера 1С | |
НачалоДня(Дата) |
Обнуляет время (устанавливает 00:00:00) | |
КонецДня(Дата) |
Устанавливает время 23:59:59 | |
ДобавитьМесяц(Дата, Количество) |
Добавляет указанное количество месяцев | |
Пример практического применения: предположим, вам нужно создать документ «Заказ покупателя» с датой на 5 дней вперед от текущей:
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ДобавитьДень(ТекущаяДата(), 5);
НовыйЗаказ.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Розница");
НовыйЗаказ.Записать();
Для работы с ретроспективными датами (например, при загрузке исторических данных) удобно использовать функцию Дата(Год, Месяц, День):
ДатаСтартаПроекта = Дата(2023, 1, 15); // 15 января 2023 года
ПоследнийДеньМесяца = КонецМесяца(Дата(2023, 2, 1));
Это вернет 28.02.2023 для февраля (с учетом високосных лет!).-->
4. Массовое изменение дат через обработки
Ситуации, когда требуется поменять даты в десятках или сотнях документов, не редкость. Например, при переносе данных из одной базы в другую или при корректировке исторических данных. Для этого удобно использовать внешние обработки.
Рассмотрим пошаговую инструкцию для типовой обработки «Групповое изменение реквизитов» (доступна в большинстве конфигураций):
- Откройте обработку через меню
Файл → Открыть…и выберите файлGroupProcessing.epf(обычно лежит в каталоге шаблонов). - В разделе
Объектывыберите тип документов, даты в которых нужно изменить (например,Реализация товаров). - В разделе
Реквизитыотметьте галочкой полеДата. - Укажите правило изменения:
- 📅
Установить значение— фиксированная дата для всех документов. - ➕
Изменить на +N дней— сдвиг даты вперед/назад. - 🔄
Заменить часть даты— например, поменять год с 2023 на 2026.
- 📅
- Нажмите
Выполнитьи подтвердите изменения. - Создайте резервную копию базы.
- Проверьте, не закрыт ли изменяемый период.
- Убедитесь, что новые даты не конфликтуют с бизнес-логикой (например, дата отгрузки не может быть раньше даты заказа).
Для сложных сценариев (например, изменение дат только для документов определенного контрагента) потребуется написать собственную обработку. Пример кода для сдвига дат на 1 день вперед для всех неоплаченных счетов:
Выборка = Документы.СчетНаОплатуПокупателю.Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.Оплачен Тогда
Выборка.Дата = ДобавитьДень(Выборка.Дата, 1);
Выборка.Записать();
КонецЕсли;
КонецЦикла;
⚠️ Внимание: Массовое изменение дат может нарушить последовательность документов и привести к ошибкам проведения. Перед выполнением обязательно:
Что делать, если после массового изменения дат документы не проводятся?
Если после изменения дат документы перестали проводиться, проверьте:
- Последовательность документов — дата текущего документа не может быть раньше даты документа, на который он ссылается (например, счет не может быть позже реализации).
- Закрытие периода — возможно, новый период закрыт в учетной политике.
- Уникальность номеров — при сдвиге дат могли появиться дубли номера документа в одном периоде.
- Права доступа — у пользователя могут не хватить прав на редактирование документов за ретроспективные периоды.
Для восстановления работоспособности попробуйте:
- Отменить проведение конфликтующих документов и провести их заново в правильной последовательности.
- Использовать обработку
«Восстановление последовательности документов»(есть в стандартных поставках 1С). - Временно открыть период в учетной политике (если проблема в закрытии).
5. Работа с датами в отчетах и запросах
В отчетах 1С даты используются для фильтрации данных по периодам. Неумение правильно задавать даты в отчетах приводит к искажению результатов — например, в оборотно-сальдовой ведомости могут не отобразиться остатки на нужную дату.
Рассмотрим основные приемы работы с датами в конструкторе запросов и СКД (система компоновки данных):
1. Задание периода в отчете:
- 📅 В большинстве стандартных отчетов (например,
Оборотно-сальдовая ведомость) период задается в параметрах отчета. Используйте поляНачало периодаиОкончание периода. - 🔍 Для точной даты (например, остатки на 31.12.2023) укажите одинаковые значения в обоих полях.
- 📊 В отчетах с группировкой по периодам (месяц, квартал) даты автоматически округляются до начала/конца периода.
2. Использование дат в запросах:
При написании запросов к базе даты указываются в формате ДАТАВРЕМЯ(ГГГГ, ММ, ДД, ЧЧ, МИ, СС). Примеры:
// Остатки на конкретную дату
ВЫБРАТЬ
Товар,
КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, )
// Документы за период
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваров КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
3. Динамические даты в СКД:
В система компоновки данных можно использовать параметры с типами значений «Дата». Например, чтобы сделать отчет с динамической датой «на конец предыдущего месяца», создайте параметр с выражением:
НачалоДня(НачалоМесяца(ТекущаяДата()) - 1)
⚠️ Внимание: При работе с датами в запросах учитывайте временную зону сервера 1С. Если ваша база работает в облаке, время на сервере может отличаться от локального. Для корректной работы используйте функциюТекущаяДата()вместоТекущаяУниверсальнаяДатаВМиллисекундах().
Дата МЕЖДУ НачалоДня(&ДатаНачала) И КонецДня(&ДатаОкончания)-->
6. Особенности работы с датами в разных конфигурациях 1С
Хотя принципы работы с датами в 1С универсальны, каждая конфигурация имеет свои нюансы. Рассмотрим наиболее распространенные:
| Конфигурация | Особенности работы с датами | Типичные ошибки |
|---|---|---|
| 1С:Бухгалтерия 8 |
|
|
| 1С:Зарплата и Управление Персоналом |
|
|
| 1С:Управление Торговлей 11 |
|
|
В конфигурации 1С:ERP работа с датами усложняется из-за интеграции с производственным календарем. Здесь даты используются для:
- 📅 Планирования заказов и производственных заданий.
- 🏭 Расчета сроков выполнения этапов.
- 🚚 Логистических маршрутов (даты отгрузки и доставки).
Пример: если в 1С:ERP вы указываете дату начала производства, система автоматически рассчитает дату окончания с учетом:
- 🕒 Нормы времени на операции.
- 📆 Производственного календаря (выходные и праздники).
- 🔄 Загрузки оборудования.
⚠️ Внимание: В конфигурациях с управлением проектами (например, 1С:Документооборот или 1С:ERP) даты задач синхронизируются с Microsoft Project или другими системами. Изменение дат в 1С может не отразиться во внешних системах, если не настроена двусторонняя синхронизация.
7. Типичные ошибки при работе с датами и как их избежать
Даже опытные пользователи 1С допускают ошибки при работе с датами. Вот наиболее распространенные из них и способы их предотвращения:
1. Несовпадение дат в связанных документах
Например, дата платежного поручения раньше даты счета, на который оно проводится. Это приводит к ошибкам проведения и искажению отчетности.
Как избежать:
- 🔗 Используйте механизм
«Контроль последовательности»в настройках документов. - 📋 Проверяйте цепочку документов перед проведением (заказ → реализация → оплата).
2. Работа с датами в разных часовых поясах
Если сервер 1С находится в одном часовом поясе, а пользователи — в другом, могут возникать расхождения в отчетах (например, документ отобразится не в том дне).
Как избежать:
- ⚙️ Настройте на сервере 1С правильный часовой пояс (в файле конфигурации или через администрирование сервера).
- 🌍 Используйте функцию
ТекущаяДата()вместоТекущаяУниверсальнаяДатаВМиллисекундах().
3. Изменение дат в закрытых периодах
Попытка изменить дату документа на период, закрытый в учетной политике, приводит к ошибке «Период закрыт для редактирования».
Как избежать:
- 🔓 Временно откройте период в настройках учетной политики (если у вас есть права).
- 📅 Используйте даты, попадающие в открытые периоды.
- 📤 Для ретроспективных изменений создайте корректировочные документы вместо редактирования старых.
4. Ошибки при массовом изменении дат
При групповом изменении дат через обработки часто забывают про:
- 🔢 Уникальность номеров документов в новом периоде.
- 🔗 Последовательность документов (например, счет не может быть позже реализации).
- 💰 Курсы валют — если дата изменилась, курс может стать неактуальным.
5. Неправильный формат даты при импорте/экспорте
При обмене данными с другими системами (например, через Excel или XML) даты могут интерпретироваться некорректно из-за различий в форматах.
Как избежать:
- 📑 Указывайте формат даты явно в настройках обмена (например,
ДД.ММ.ГГГГ). - 🔧 Используйте функции преобразования, например:
ДатаИзСтроки("2023-12-31", "ГГГГ-ММ-ДД")
- Открыты ли периоды для новых дат.
- Сохранена ли резервная копия базы.
- Не конфликтуют ли новые даты с бизнес-логикой (например, дата отгрузки не может быть раньше даты заказа).
8. Продвинутые приемы: работа с датами в коде
Для разработчиков и опытных пользователей, которые пишут собственные обработки или дорабатывают конфигурации, пригодятся продвинутые приемы работы с датами.
1. Работа с рабочими и выходными днями
Чтобы определить, является ли дата рабочим днем, используйте производственный календарь:
Функция ЭтоРабочийДень(Дата)
Календарь = Календари.ПроизводственныйКалендарь();
Возврат НЕ Календарь.ЭтоВыходнойДень(Дата);
КонецФункции
2. Расчет разницы между датами
Для вычисления количества дней, месяцев или лет между двумя датами:
Дата1 = Дата(2023, 1, 15);
Дата2 = Дата(2023, 2, 20);
РазницаВДнях = Дата2 - Дата1; // вернет 36
// Разница в месяцах (с учетом годов)
РазницаВМесяцах = (Год(Дата2) - Год(Дата1)) * 12 + (Месяц(Дата2) - Месяц(Дата1));
3. Генерация последовательности дат
Если нужно сгенерировать массив дат (например, для графика платежей):
МассивДаты = Новый Массив;
ТекущаяДата = Дата(2023, 1, 1);
Для Сч = 1 По 12 Цикл
МассивДаты.Добавить(ТекущаяДата);
ТекущаяДата = КонецМесяца(ДобавитьМесяц(ТекущаяДата, 1));
КонецЦикла;
4. Работа с временными метками
В некоторых задачах (например, при интеграции с внешними системами) требуется работать с временными метками в формате Unix Time:
// Преобразование даты 1С в Unix Time
Функция ДатаВUnixTime(Дата1С)
Возврат Цел((Дата1С - Дата(1970, 1, 1)) * 86400);
КонецФункции
// Обратное преобразование
Функция UnixTimeВДата(UnixTime)
Возврат Дата(1970, 1, 1) + UnixTime / 86400;
КонецФункции
5. Использование дат в HTTP-запросах
При интеграции с API часто требуется передавать даты в формате ISO 8601:
Функция ДатаВISOFormat(Дата1С)
Возврат Формат(Дата1С, "ДФ=yyyy-MM-ddTHH:mm:ss");
КонецФункции
⚠️ Внимание: При работе с датами в коде учитывайте, что функцииДобавитьМесяц()иДобавитьГод()корректно обрабатывают переходы через границы месяцев и високосные годы. Например,ДобавитьМесяц(Дата(2023, 1, 31), 1)вернет28.02.2023, а не31.02.2023.
Как ускорить работу с датами в больших выборках?
При обработке больших массивов данных (например, миллионов строк в регистрах накопления) операции с датами могут замедлять выполнение кода. Чтобы оптимизировать работу:
- Избегайте вычислений в циклах — если вам нужно добавить 1 день к каждой дате в выборке, сделайте это одним запросом, а не в цикле по строкам.
- Используйте индексы — если часто фильтруете данные по датам, убедитесь, что в конфигурации созданы индексы по полям с датами.
- Кэшируйте результаты — если один и тот же расчет с датами повторяется многократно, сохраните результат в переменную.
- Используйте временные таблицы — для сложных отчетов с группировкой по датам создавайте временные таблицы с предварительно рассчитанными данными.
Пример оптимизированного запроса для выборки документов за период:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
Документ.Дата КАК Дата
ИЗ
Документ.РеализацияТоваров КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
УПОРЯДОЧИТЬ ПО
Документ.Дата
ИНДЕКСИРОВАТЬ ПО
Документ.Дата
FAQ: Частые вопросы по работе с датами в 1С
Как задать дату в 1С на конкретное время (не только день)?
В 1С дата и время хранятся в одном поле типа Дата. Чтобы задать конкретное время, используйте функцию ДатаВремя(ГГГГ, ММ, ДД, ЧЧ, МИ, СС). Пример:
ТочнаяДата = ДатаВремя(2023, 12, 31, 23, 59, 59); //