Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и бухгалтеры, и разработчики. Казалось бы, что может быть проще, чем ввести текущую дату в документ? Но на практике даже здесь есть подводные камни: от неверного формата до ошибок при программной записи. Эта статья поможет разобраться, как правильно фиксировать даты в разных ситуациях — от ручного заполнения полей до написания кода на встроенном языке.

Мы рассмотрим не только базовые способы (вроде прямого ввода через календарь), но и нюансы, которые часто упускают. Например, почему при экспорте данных дата может "съехать" на день назад, как избежать ошибок при работе с временными зонами, и какие форматы поддерживает платформа 1С 8.3. Особое внимание уделим типичным ошибкам, которые приводят к сбоям в отчётах или некорректной работе документов.

Если вы бухгалтер, который хочет быстрее заполнять первичку, или разработчик, пишущий обработки для работы с датами — здесь найдёте ответы на свои вопросы. А для тех, кто только начинает осваивать , мы подготовили пошаговые инструкции с картинками (в текстовом формате) и примерами кода.

1. Ручной ввод даты: базовые приёмы

Самый простой способ записать дату в — ввести её вручную в соответствующее поле документа или справочника. Платформа предоставляет несколько удобных инструментов для этого:

  • 📅 Календарь: появляется при клике на поле даты (или по кнопке F4). Позволяет выбрать дату визуально, избегая ошибок при ручном наборе.
  • ⌨️ Быстрый ввод: поддерживаются форматы ДД.ММ.ГГГГ, ДД-ММ-ГГ или даже ДДММГГ (без разделителей). Система автоматически преобразует их в стандартный вид.
  • 🔄 Текущая дата: сочетание Ctrl+; (точка с запятой) мгновенно вставляет сегодняшнюю дату в поле.
  • 📂 Копирование из других полей: можно перетащить дату мышью из одного документа в другой (если это разрешено настройками).

При ручном вводе важно помнить о формате даты, который зависит от региональных настроек . Например, в российской локализации по умолчанию используется ДД.ММ.ГГГГ, а в европейской — ММ/ДД/ГГГГ. Если ввести дату в неверном формате (например, 01.12.2023 вместо 12.01.2023), система может интерпретировать её неправильно или выдаст ошибку.

💡

Если при вводе даты подчёркивает поле красным, попробуйте ввести её в другом формате или проверьте региональные настройки в Сервис → Параметры → Язык и стандарты.

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

  1. Откройте настройки конкретного документа через Ещё → Изменить форму.
  2. Найдите поле даты и проверьте свойство Заполнение (обычно стоит Авто).
  3. При необходимости отключите автозаполнение или настройте его по своим правилам.

2. Форматы даты в 1С: что нужно знать

Платформа 1С:Предприятие работает с датами в внутреннем формате, но отображает их в зависимости от настроек. Это может приводить к путанице, особенно при обмене данными или интеграции с другими системами. Разберём основные форматы:

Формат Пример Где используется Особенности
ДД.ММ.ГГГГ 15.07.2023 Ручной ввод, отображение в интерфейсе Стандарт для российской локализации. Разделитель — точка.
ГГГГММДД 20230715 Экспорт/импорт данных, файлы обмена Без разделителей, год идёт первым. Используется в XML, DBF.
ММ/ДД/ГГГГ 07/15/2023 Американская локализация Может вызвать путаницу при ручном вводе в русской версии.
ДД ММММ ГГГГ 15 июля 2023 Печатные формы, отчёты Текстовый формат, не подходит для вычислений.
YYYY-MM-DD 2023-07-15 SQL-запросы, веб-сервисы Стандарт ISO 8601, используется в HTTP-запросах.

Особое внимание стоит уделить внутреннему представлению даты в . Платформа хранит её как количество дней, прошедших с 1 января 1899 года (это "нулевая точка" для дат в ). Например, дата 01.01.2000 во внутреннем формате — это число 36526. Это важно понимать при отладке кода или работе с прямыми запросами к базе.

При обмене данными между системами (например, при интеграции с 1С-Битрикс или Excel) формат даты может стать источником ошибок. Например, Excel тоже считает даты с 1900 года, но его "нулевая точка" отличается от на 2 дня. Поэтому при импорте данных из XLS даты могут сдвигаться.

📊 Какой формат даты вы используете чаще всего?
ДД.ММ.ГГГГ (русский)
ГГГГММДД (для обмена)
YYYY-MM-DD (для SQL)
Другой

3. Программная запись даты: основные методы

Для разработчиков и продвинутых пользователей, пишущих обработки или отчёты, важно уметь работать с датами через встроенный язык . Вот ключевые способы записи даты в коде:

3.1. Функция Дата()

Самый простой способ создать дату — использовать конструктор Дата(Год, Месяц, День). Пример:

ТекущаяДата = Дата(2023, 7, 15); // Создаёт дату 15.07.2023

Завтра = Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата()) + 1);

Обратите внимание: если указать несуществующую дату (например, Дата(2023, 2, 30)), автоматически скорректирует её на последний валидный день месяца (в данном случае — 28.02.2023).

3.2. Строка в дату: СтрокаВДату()

Если дата приходит в виде строки (например, из файла или веб-запроса), её нужно преобразовать в тип Дата. Для этого используется функция СтрокаВДату():

ДатаИзФайла = СтрокаВДату("15.07.2023", "ДФ=dd.MM.yyyy");

ДатаИзSQL = СтрокаВДату("2023-07-15", "ДФ=yyyy-MM-dd");

Второй параметр (ДФ) указывает формат даты. Если его не указать, будет использовать текущие региональные настройки, что может привести к ошибкам. Например, строка "01/02/2023" в американском формате станет 1 февраля, а в европейском — 2 января.

Правильный ли формат строки (ДД.ММ.ГГГГ или другой)?

Указан ли явный формат в функции СтрокаВДату()?

Нет ли лишних символов (пробелов, кавычек)?

Совпадает ли разделитель (точка, тире, слэш) с ожидаемым?

-->

3.3. Текущая дата и время: ТекущаяДата() и ТекущееВремя()

Для получения текущей даты и времени используются функции:

Сегодня = ТекущаяДата(); // Возвращает дату без времени (00:00:00)

Сейчас = ТекущаяДатаСеанса(); // Дата и время на момент начала сеанса

ТочноеВремя = ТекущаяУниверсальнаяДатаВМиллисекундах(); // Для высокоточных расчётов

Важно: ТекущаяДата() и ТекущаяДатаСеанса() могут возвращать разные значения, если сеанс длится несколько дней (например, при длительных операциях). Для большинства задач достаточно ТекущаяДата().

4. Типичные ошибки при работе с датами

Даже опытные пользователи иногда сталкиваются с проблемами при записи дат. Вот наиболее распространённые ошибки и способы их избежать:

  • Неверный формат при вводе: например, 15-07-2023 вместо 15.07.2023. Решение — использовать календарь (F4) или проверять региональные настройки.
  • Пустая дата: если поле даты остаётся незаполненным, некоторые отчёты могут игнорировать документ. Решение — установить значение по умолчанию (например, Дата(1,1,1) для "неопределённой" даты).
  • Смещение даты при экспорте/импорте: например, при обмене с Excel даты сдвигаются на 2 дня. Решение — использовать явное преобразование формата.
  • Ошибки в временных зонах: если сервер и клиент находятся в разных часовых поясах, дата может "плавать". Решение — настраивать синхронизацию времени на сервере.
  • Неучёт високосных годов: функции вроде ДобавитьМесяц() могут вести себя неожиданно. Например, ДобавитьМесяц(Дата(2023,1,31), 1) вернёт 28.02.2023, а не 31.03.2023.
Почему дата в отчёте отличается от даты в документе?

Это может происходить по нескольким причинам:

1. Временная зона сервера: если сервер находится в другом часовом поясе, дата в отчётах может сдвигаться на ± несколько часов.

2. Настройки округления: в некоторых отчётах даты округлены до начала/конца дня (например, 00:00:00 вместо точного времени).

3. Кэширование данных: если отчёт построен по кэшированным данным, он может не учитывать последние изменения.

4. Фильтры отчёта: проверьте, не установлен ли в фильтрах сдвиг даты (например, "за предыдущий день").

Одна из самых коварных ошибок — невидимые символы в строке даты. Например, при импорте из CSV в строке может остаться неразрывный пробел или символ табуляции, из-за чего СтрокаВДату() вернёт ошибку. Решение — предварительно "чистить" строку:

СтрокаДата = СтрЗаменить(СтрокаДата, Символы.НПП, ""); // Удаляем неразрывный пробел

СтрокаДата = СтрЗаменить(СтрокаДата, Символы.Таб, ""); // Удаляем табуляцию

💡

Всегда проверяйте результат преобразования строки в дату! Даже если ошибок нет, дата может быть неверной (например, 32.01.2023 станет 01.02.2023 без предупреждения).

5. Работа с датами в запросах

При написании запросов на встроенном языке даты требуют особого внимания. Вот ключевые моменты:

5.1. Сравнение дат

В запросах даты сравниваются с учётом времени. Например, условие ДатаДокумента = &ТекущаяДата может не сработать, если в ДатаДокумента есть время (например, 15.07.2023 14:30:00). Чтобы сравнить только дату, используйте:

ГДЕ НачалоДня(ДатаДокумента) = НачалоДня(&ТекущаяДата)

5.2. Функции для работы с датами в запросах

В языке запросов доступны специальные функции:

  • 📅 НачалоДня(), КонецДня() — обрезают время до 00:00:00 или 23:59:59.
  • ДобавитьКДате() — добавляет дни, месяцы или годы (например, ДобавитьКДате(ДатаДокумента, ДЕНЬ, 7)).
  • 🗓️ День(), Месяц(), Год() — извлекают компоненты даты.
  • 🔄 РазностьДат() — вычисляет разницу между датами в днях.

Пример запроса, который находит документы за последний месяц:

ВЫБРАТЬ

Документ.Ссылка КАК Ссылка,

Документ.Дата КАК ДатаДокумента

ИЗ

Документ.ПоступлениеТоваров КАК Документ

ГДЕ

Документ.Дата МЕЖДУ НачалоДня(ДобавитьКДате(ТекущаяДата(), МЕСЯЦ, -1))

И КонецДня(ТекущаяДата())

5.3. Параметры даты в запросах

Если дата передаётся в запрос как параметр, её нужно правильно типизировать. Например:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Документ.Ссылка

|ИЗ

| Документ.РеализацияТоваров КАК Документ

|ГДЕ

| Документ.Дата = &Дата";

Запрос.УстановитьПараметр("Дата", Дата(2023, 7, 15)); // Передаём как тип Дата, а не строку!

Результат = Запрос.Выполнить();

💡

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

6. Автоматизация работы с датами: практические примеры

Для ускорения рутинных операций можно автоматизировать работу с датами. Вот несколько полезных примеров:

6.1. Автоматическое заполнение даты в документах

Если вам часто приходится создавать документы с датой "завтра" или "понедельник следующей недели", можно написать обработку:

Процедура ЗаполнитьДатаЗавтра(Документ)

Документ.Дата = НачалоДня(ТекущаяДата()) + 86400; // +1 день в секундах

КонецПроцедуры

Процедура ЗаполнитьДатаПонедельник(Документ)

ТекущаяДата = ТекущаяДата();

ДеньНедели = ДеньНедели(ТекущаяДата);

ДнейДоПонедельника = (8 - ДеньНедели) % 7;

Документ.Дата = НачалоДня(ТекущаяДата) + ДнейДоПонедельника * 86400;

КонецПроцедуры

6.2. Проверка корректности даты

Чтобы избежать ошибок при вводе даты из внешних источников, можно использовать функцию проверки:

Функция ДатаКорректна(Значение) Экспорт

Если ТипЗнч(Значение) <> Тип("Строка") Тогда

Возврат Ложь;

КонецЕсли;

Попытка

ДатаИзСтроки = СтрокаВДату(Значение, "ДФ=dd.MM.yyyy");

Возврат Истина;

Исключение

Возврат Ложь;

КонецПопытки;

КонецФункции

6.3. Работа с диапазонами дат

Для анализа данных за период удобно использовать обработку с динамическим формированием диапазона:

Процедура УстановитьПериод(Начало, Конец, Период)

ТекущаяДата = ТекущаяДата();

Если Период = "Неделя" Тогда

Начало = НачалоНедели(ТекущаяДата);

Конец = КонецНедели(ТекущаяДата);

ИначеЕсли Период = "Месяц" Тогда

Начало = НачалоМесяца(ТекущаяДата);

Конец = КонецМесяца(ТекущаяДата);

ИначеЕсли Период = "Квартал" Тогда

Начало = НачалоКвартала(ТекущаяДата);

Конец = КонецКвартала(ТекущаяДата);

КонецЕсли;

КонецПроцедуры

💡

При работе с диапазонами дат всегда используйте НачалоДня() и КонецДня(), чтобы избежать проблем с временем (например, документ от 15.07.2023 23:59 не попадёт в выборку по дате 15.07.2023 без учёта времени).

7. Особенности работы с датами в типовых конфигурациях

В типовых конфигурациях (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11) есть свои нюансы работы с датами. Рассмотрим самые важные:

7.1. Даты в бухгалтерских документах

В 1С:Бухгалтерии дата документа влияет на:

  • 📊 Период отражения в отчётности (например, в балансе или декларации по НДС).
  • 💰 Курсы валют: если дата документа отличается от даты курса, может возникнуть ошибка валютообмена.
  • 📑 Нумерацию документов: в некоторых конфигурациях номер сбрасывается при смене года.

Важно: в бухгалтерских документах дата не может быть будущей (например, нельзя провести документ на 30.07.2023, если сегодня 15.07.2023). Это ограничение заложено в типовой функционал для предотвращения ошибок учёта.

7.2. Даты в торговле и складском учёте

В 1С:Управление торговлей дата документа влияет на:

  • 📦 Остатки товаров: документ с более ранней датой может "перекрыть" поздний, если не соблюден хронологический порядок.
  • 🚚 Логистику: дата отгрузки должна быть не раньше даты заказа.
  • 💳 Ценообразование: действующие цены определяются на дату документа.

Особое внимание стоит уделить регламентным операциям (например, закрытию месяца). Если дата закрытия месяца указана неверно, это может привести к:

  • ❌ Несформированным проводкам.
  • ❌ Ошибкам в расчёте себестоимости.
  • ❌ Некорректным данным в отчётах (например, в Оборотно-сальдовой ведомости).
Что делать, если дата в документе "зависла"?

Если при проведении документа дата не меняется или ведёт себя странно (например, всегда проставляется 01.01.0001), проверьте:

1. Права пользователя: возможно, у текущего пользователя нет прав на изменение даты.

2. Настройки документа: в некоторых конфигурациях дата блокируется после проведения.

3. Триггеры и обработчики: возможно, дата программно перезаписывается в модуле документа.

4. Целостность базы: повреждения данных могут приводить к сбоям в работе с датами.

8. Интеграция и обмен датами с другими системами

При обмене данными между и другими системами (например, Excel, SQL-базы, веб-сервисы) даты требуют особого внимания. Основные проблемы и решения:

8.1. Обмен с Excel

Excel хранит даты как количество дней с 1 января 1900 года — с 1899 года). При импорте/экспорте используйте явное преобразование:

// Экспорт даты из 1С в Excel (формат dd.MM.yyyy)

ДатаДляExcel = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy");

// Импорт даты из Excel в 1С

ДатаИзExcel = СтрокаВДату(ЗначениеИзExcel, "ДФ=dd.MM.yyyy");

8.2. Обмен с SQL-базами

В SQL даты обычно передаются в формате YYYY-MM-DD или YYYY-MM-DD HH:MI:SS. Пример запроса:

ВЫБРАТЬ

Документ.Ссылка КАК Ссылка,

Формат(Документ.Дата, "ДФ=yyyy-MM-dd") КАК ДатаSQL

ИЗ

Документ.ПоступлениеТоваров КАК Документ

При обмене через ADO или ODBC даты автоматически преобразуются, но иногда возникают ошибки из-за:

  • 🕒 Часовых поясов: если сервер SQL и в разных зонах, время может сдвигаться.
  • 🗓️ Несовместимых форматов: например, SQL Server не понимает формат ДД.ММ.ГГГГ.
  • 🔄 NULL-значений: пустые даты в могут становиться NULL в SQL и наоборот.

8.3. Обмен через веб-сервисы (REST, SOAP)

При работе с API даты обычно передаются в формате ISO 8601 (YYYY-MM-DDTHH:MI:SS). Пример обработки ответа:

ДатаИзJSON = СтрокаВДату("2023-07-15T14:30:00", "ДФ=yyyy-MM-ddTHH:mi:ss");

Важно: некоторые API передают даты в формате Unix timestamp (количество секунд с 1970 года). Для преобразования:

Функция TimestampВДату(Timestamp)

Возврат Дата(1970, 1, 1) + Timestamp;

КонецФункции

💡

При интеграции с внешними системами всегда проверяйте, какой формат даты ожидает принимающая сторона. Например, 1С-Битрикс может требовать формат d.m.Y, а OracleDD-MON-YYYY.

FAQ: Частые вопросы по работе с датами в 1С

Как в 1С ввести дату быстрее всего?

Самые быстрые способы:

  1. Нажмите F4 в поле даты — откроется календарь, где можно выбрать дату мышью.
  2. Используйте горячие клавиши:
    • Ctrl+; — вставить текущую дату.
    • Alt+↓ — открыть выпадающий список последних введённых дат.
  3. Введите дату в формате ДДММГГ (например, 150723 для 15 июля 2023 года) — система автоматически преобразует её в 15.07.2023.

Для часто используемых дат (например, "первое число месяца" или "последний день квартала") можно создать обработку с кнопками быстрого ввода.

Почему при экспорте в Excel даты становятся числами (например, 45123)?

Это происходит потому, что Excel хранит даты как количество дней с 1 января 1900 года. Чтобы исправить:

  1. В Excel выделите колонку с датами.
  2. Нажмите правой кнопкой → Формат ячеек → выберите формат Дата.
  3. Если даты сдвинуты на 2 дня, используйте формулу =ДАТА(1900;1;1)+A1-2 (где A1 — ячейка с числом).