Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и бухгалтеры, и разработчики. Казалось бы, что может быть проще, чем ввести текущую дату в документ? Но на практике даже здесь есть подводные камни: от неверного формата до ошибок при программной записи. Эта статья поможет разобраться, как правильно фиксировать даты в разных ситуациях — от ручного заполнения полей до написания кода на встроенном языке.
Мы рассмотрим не только базовые способы (вроде прямого ввода через календарь), но и нюансы, которые часто упускают. Например, почему при экспорте данных дата может "съехать" на день назад, как избежать ошибок при работе с временными зонами, и какие форматы поддерживает платформа 1С 8.3. Особое внимание уделим типичным ошибкам, которые приводят к сбоям в отчётах или некорректной работе документов.
Если вы бухгалтер, который хочет быстрее заполнять первичку, или разработчик, пишущий обработки для работы с датами — здесь найдёте ответы на свои вопросы. А для тех, кто только начинает осваивать 1С, мы подготовили пошаговые инструкции с картинками (в текстовом формате) и примерами кода.
1. Ручной ввод даты: базовые приёмы
Самый простой способ записать дату в 1С — ввести её вручную в соответствующее поле документа или справочника. Платформа предоставляет несколько удобных инструментов для этого:
- 📅 Календарь: появляется при клике на поле даты (или по кнопке
F4). Позволяет выбрать дату визуально, избегая ошибок при ручном наборе. - ⌨️ Быстрый ввод: поддерживаются форматы
ДД.ММ.ГГГГ,ДД-ММ-ГГили дажеДДММГГ(без разделителей). Система автоматически преобразует их в стандартный вид. - 🔄 Текущая дата: сочетание
Ctrl+;(точка с запятой) мгновенно вставляет сегодняшнюю дату в поле. - 📂 Копирование из других полей: можно перетащить дату мышью из одного документа в другой (если это разрешено настройками).
При ручном вводе важно помнить о формате даты, который зависит от региональных настроек 1С. Например, в российской локализации по умолчанию используется ДД.ММ.ГГГГ, а в европейской — ММ/ДД/ГГГГ. Если ввести дату в неверном формате (например, 01.12.2023 вместо 12.01.2023), система может интерпретировать её неправильно или выдаст ошибку.
Если при вводе даты 1С подчёркивает поле красным, попробуйте ввести её в другом формате или проверьте региональные настройки в Сервис → Параметры → Язык и стандарты.
Ещё один нюанс — автозаполнение дат в документах. Многие формы (например, Поступление товаров или Реализация) автоматически подставляют текущую дату при создании нового документа. Однако это поведение можно изменить:
- Откройте настройки конкретного документа через
Ещё → Изменить форму. - Найдите поле даты и проверьте свойство
Заполнение(обычно стоитАвто). - При необходимости отключите автозаполнение или настройте его по своим правилам.
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С. Платформа хранит её как количество дней, прошедших с 1 января 1899 года (это "нулевая точка" для дат в 1С). Например, дата 01.01.2000 во внутреннем формате — это число 36526. Это важно понимать при отладке кода или работе с прямыми запросами к базе.
При обмене данными между системами (например, при интеграции с 1С-Битрикс или Excel) формат даты может стать источником ошибок. Например, Excel тоже считает даты с 1900 года, но его "нулевая точка" отличается от 1С на 2 дня. Поэтому при импорте данных из XLS даты могут сдвигаться.
3. Программная запись даты: основные методы
Для разработчиков и продвинутых пользователей, пишущих обработки или отчёты, важно уметь работать с датами через встроенный язык 1С. Вот ключевые способы записи даты в коде:
3.1. Функция Дата()
Самый простой способ создать дату — использовать конструктор Дата(Год, Месяц, День). Пример:
ТекущаяДата = Дата(2023, 7, 15); // Создаёт дату 15.07.2023
Завтра = Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата()) + 1);
Обратите внимание: если указать несуществующую дату (например, Дата(2023, 2, 30)), 1С автоматически скорректирует её на последний валидный день месяца (в данном случае — 28.02.2023).
3.2. Строка в дату: СтрокаВДату()
Если дата приходит в виде строки (например, из файла или веб-запроса), её нужно преобразовать в тип Дата. Для этого используется функция СтрокаВДату():
ДатаИзФайла = СтрокаВДату("15.07.2023", "ДФ=dd.MM.yyyy");
ДатаИзSQL = СтрокаВДату("2023-07-15", "ДФ=yyyy-MM-dd");
Второй параметр (ДФ) указывает формат даты. Если его не указать, 1С будет использовать текущие региональные настройки, что может привести к ошибкам. Например, строка "01/02/2023" в американском формате станет 1 февраля, а в европейском — 2 января.
Правильный ли формат строки (ДД.ММ.ГГГГ или другой)?
Указан ли явный формат в функции СтрокаВДату()?
Нет ли лишних символов (пробелов, кавычек)?
Совпадает ли разделитель (точка, тире, слэш) с ожидаемым?
-->
3.3. Текущая дата и время: ТекущаяДата() и ТекущееВремя()
Для получения текущей даты и времени используются функции:
Сегодня = ТекущаяДата(); // Возвращает дату без времени (00:00:00)
Сейчас = ТекущаяДатаСеанса(); // Дата и время на момент начала сеанса
ТочноеВремя = ТекущаяУниверсальнаяДатаВМиллисекундах(); // Для высокоточных расчётов
Важно: ТекущаяДата() и ТекущаяДатаСеанса() могут возвращать разные значения, если сеанс длится несколько дней (например, при длительных операциях). Для большинства задач достаточно ТекущаяДата().
4. Типичные ошибки при работе с датами
Даже опытные пользователи 1С иногда сталкиваются с проблемами при записи дат. Вот наиболее распространённые ошибки и способы их избежать:
- ❌ Неверный формат при вводе: например,
15-07-2023вместо15.07.2023. Решение — использовать календарь (F4) или проверять региональные настройки. - ❌ Пустая дата: если поле даты остаётся незаполненным, некоторые отчёты могут игнорировать документ. Решение — установить значение по умолчанию (например,
Дата(1,1,1)для "неопределённой" даты). - ❌ Смещение даты при экспорте/импорте: например, при обмене с Excel даты сдвигаются на 2 дня. Решение — использовать явное преобразование формата.
- ❌ Ошибки в временных зонах: если сервер и клиент 1С находятся в разных часовых поясах, дата может "плавать". Решение — настраивать синхронизацию времени на сервере.
- ❌ Неучёт високосных годов: функции вроде
ДобавитьМесяц()могут вести себя неожиданно. Например,ДобавитьМесяц(Дата(2023,1,31), 1)вернёт28.02.2023, а не31.03.2023.
Почему дата в отчёте отличается от даты в документе?
Это может происходить по нескольким причинам:
1. Временная зона сервера: если сервер 1С находится в другом часовом поясе, дата в отчётах может сдвигаться на ± несколько часов.
2. Настройки округления: в некоторых отчётах даты округлены до начала/конца дня (например, 00:00:00 вместо точного времени).
3. Кэширование данных: если отчёт построен по кэшированным данным, он может не учитывать последние изменения.
4. Фильтры отчёта: проверьте, не установлен ли в фильтрах сдвиг даты (например, "за предыдущий день").
Одна из самых коварных ошибок — невидимые символы в строке даты. Например, при импорте из CSV в строке может остаться неразрывный пробел или символ табуляции, из-за чего СтрокаВДату() вернёт ошибку. Решение — предварительно "чистить" строку:
СтрокаДата = СтрЗаменить(СтрокаДата, Символы.НПП, ""); // Удаляем неразрывный пробел
СтрокаДата = СтрЗаменить(СтрокаДата, Символы.Таб, ""); // Удаляем табуляцию
Всегда проверяйте результат преобразования строки в дату! Даже если ошибок нет, дата может быть неверной (например, 32.01.2023 станет 01.02.2023 без предупреждения).
5. Работа с датами в запросах
При написании запросов на встроенном языке 1С даты требуют особого внимания. Вот ключевые моменты:
5.1. Сравнение дат
В запросах даты сравниваются с учётом времени. Например, условие ДатаДокумента = &ТекущаяДата может не сработать, если в ДатаДокумента есть время (например, 15.07.2023 14:30:00). Чтобы сравнить только дату, используйте:
ГДЕ НачалоДня(ДатаДокумента) = НачалоДня(&ТекущаяДата)
5.2. Функции для работы с датами в запросах
В языке запросов 1С доступны специальные функции:
- 📅
НачалоДня(),КонецДня()— обрезают время до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С (например, 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. Интеграция и обмен датами с другими системами
При обмене данными между 1С и другими системами (например, Excel, SQL-базы, веб-сервисы) даты требуют особого внимания. Основные проблемы и решения:
8.1. Обмен с Excel
Excel хранит даты как количество дней с 1 января 1900 года (в 1С — с 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 и 1С в разных зонах, время может сдвигаться.
- 🗓️ Несовместимых форматов: например, SQL Server не понимает формат
ДД.ММ.ГГГГ. - 🔄 NULL-значений: пустые даты в 1С могут становиться
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, а Oracle — DD-MON-YYYY.
FAQ: Частые вопросы по работе с датами в 1С
Как в 1С ввести дату быстрее всего?
Самые быстрые способы:
- Нажмите
F4в поле даты — откроется календарь, где можно выбрать дату мышью. - Используйте горячие клавиши:
Ctrl+;— вставить текущую дату.Alt+↓— открыть выпадающий список последних введённых дат.
- Введите дату в формате
ДДММГГ(например,150723для 15 июля 2023 года) — система автоматически преобразует её в15.07.2023.
Для часто используемых дат (например, "первое число месяца" или "последний день квартала") можно создать обработку с кнопками быстрого ввода.
Почему при экспорте в Excel даты становятся числами (например, 45123)?
Это происходит потому, что Excel хранит даты как количество дней с 1 января 1900 года. Чтобы исправить:
- В Excel выделите колонку с датами.
- Нажмите правой кнопкой →
Формат ячеек→ выберите форматДата. - Если даты сдвинуты на 2 дня, используйте формулу
=ДАТА(1900;1;1)+A1-2(гдеA1— ячейка с числом).