Вставка и обработка дат в 1С: для пользователя и разработчика

· 9 мин

Содержание

Дату в 1С вводят в поле руками с клавиатуры в формате ДД.ММ.ГГГГ или выбирают в календаре по кнопке справа от поля. Чтобы подставить сегодняшнее число, в календаре есть ссылка «Сегодня», а новым документам дата берётся из рабочей даты. В коде дату даёт функция ТекущаяДатаСеанса(), в запросах — параметр и функции периода.

Если коротко: способ зависит от того, кто и где работает с датой — бухгалтер в поле документа, в периоде отчёта или разработчик во встроенном языке и запросе. Ниже разобраны все эти случаи: ручной ввод, автоподстановка, табличные части, функции платформы, границы периода, отчёты и юридическая сторона даты документа.

Что вам нужно сделать с датой?

Ручной ввод даты в поле документа

Поле даты в интерфейсе «Такси» выглядит как обычное поле с маленьким значком календаря справа. Есть два способа ввода.

🔹 С клавиатуры. Встаньте в поле и наберите цифры. Разделители ставить не обязательно: 15012024 превратится в 15.01.2024. Можно вводить и с точками — 15.01.2024. Год лучше писать полностью, четырьмя цифрами.

🔹 Через календарь. Нажмите значок календаря — откроется месяц с сеткой чисел. Стрелками листаются месяцы и годы, а внизу есть ссылка «Сегодня», которая сразу ставит текущую дату.

Если поле хранит не только дату, но и время (например, дата и время документа), после числа через пробел вводится время — 15.01.2024 14:30:00. У большинства документов время нужно только для правильного порядка проведения в один день, поэтому его обычно не трогают.

Когда ввели двузначный год, платформа достраивает век сама. Чтобы не гадать, какое столетие она подставит, пишите год целиком — ошибок с «20» и «19» не будет.

Текущая и рабочая дата: как не вводить число каждый раз

Когда вы создаёте новый документ, поле даты заполняется автоматически — туда подставляется рабочая дата. Это удобный способ один раз задать «сегодня» и не печатать число в каждом документе.

Рабочая дата настраивается в персональных настройках. В «1С:Бухгалтерии 3.0» путь такой: Главное → Персональные настройки, строка «Рабочая дата». Доступны два варианта:

  • Текущая дата компьютера — документы создаются сегодняшним числом;
  • Конкретная дата — все новые документы получают указанное число. Так работают, когда вводят большой массив документов прошлым периодом.

Если вы включили конкретную рабочую дату, не забудьте вернуть «текущую дату компьютера», когда закончите ввод за прошлый период — иначе свежие документы продолжат создаваться задним числом.

В уже созданном документе быстро поставить сегодняшнее число помогает календарь: значок → ссылка «Сегодня». Отдельной горячей клавиши «вставить текущую дату» в поле нет, поэтому рабочая дата и календарь — основные инструменты.

Даты в строках табличных частей

В табличных частях документов дата вводится так же, как в шапке: клик в ячейку, ввод цифр или календарь. Отличие в деталях работы со списком строк.

  1. При копировании строки (F9 или команда копирования в командной панели таблицы) дата копируется вместе с остальными значениями — это экономит время, когда у строк одна дата.
  2. Если в строках хранятся сроки (дата оплаты, дата отгрузки, дата события), заполняйте их датой фактического срока, а не датой документа.
  3. Сортировка списка по колонке с датой работает как обычная сортировка — щелчок по заголовку колонки.

Дата строки и дата документа — разные реквизиты. Отчёты и движения регистров чаще опираются на дату документа в шапке, а дата в строке используется только там, где это предусмотрено конфигурацией (например, график платежей).

Функции дат во встроенном языке

Разработчику дата нужна в коде модулей. Базовый инструмент — получение текущего момента и приведение его к нужной границе.

// Текущая дата и время сеанса (работает и на клиенте, и на сервере):
МоментВремени = ТекущаяДатаСеанса();

// Только дата, без времени (00:00:00):
Сегодня = НачалоДня(ТекущаяДатаСеанса());

Функция ТекущаяДата() возвращает дату компьютера сервера и доступна только на сервере и во внешнем соединении. В клиентском коде её вызывать нельзя — используйте ТекущаяДатаСеанса().

Дата литералом. Конкретную дату в коде задают строкой в кавычках формата 'ГГГГММДД' или 'ГГГГММДДЧЧММСС':

ДатаНачала   = '20240115';        // 15.01.2024 00:00:00
СМоментом    = '20240115143000';  // 15.01.2024 14:30:00

Границы периодов. Платформа даёт готовые функции, чтобы не считать первое и последнее число вручную:

ПервоеЧисло  = НачалоМесяца(ТекущаяДатаСеанса());   // 1-е число, 00:00:00
Последнее    = КонецМесяца(ТекущаяДатаСеанса());    // последнее число, 23:59:59
СледМесяц    = ДобавитьМесяц(ТекущаяДатаСеанса(), 1);
НачалоГодаД  = НачалоГода(ТекущаяДатаСеанса());

Аналогично работают НачалоДня, КонецДня, НачалоКвартала, КонецКвартала, НачалоГода, КонецГода, НачалоНедели, КонецНедели. Функции с «Конец…» возвращают время 23:59:59 — это пригодится ниже.

У ДобавитьМесяц есть нюанс с концом месяца: к 31.01 прибавить один месяц нельзя буквально — 31 февраля не существует. Платформа в таком случае вернёт последний день результирующего месяца, то есть 28.02 или 29.02. Это удобно для расчёта сроков «через месяц», но помните об этом, когда считаете графики платежей.

Ещё одна тонкость — часовой пояс. ТекущаяДатаСеанса() возвращает дату с учётом часового пояса сеанса, а не абсолютного времени сервера. Для распределённых баз с пользователями в разных поясах это важно: у двух сотрудников «сегодня» может отличаться на дату.

Пустая дата. Незаполненная дата в 1С — это '00010101' (01.01.0001). Проверяют её не сравнением со строкой, а функцией:

Если НЕ ЗначениеЗаполнено(Документ.Дата) Тогда
    Сообщить("Укажите дату документа");
КонецЕсли;

Разница дат. Вычитание двух дат даёт число — количество секунд между ними. В дни переводят делением:

Секунды = ДатаОкончания - ДатаНачала; // разница в секундах
Дней    = Цел(Секунды / 86400);       // 86400 секунд в сутках

Вывод в нужном формате. Для показа даты пользователю применяют Формат:

Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy");       // 15.01.2024
Формат(ТекущаяДатаСеанса(), "ДФ='dd.MM.yyyy HH:mm'"); // 15.01.2024 14:30
Формат(ТекущаяДатаСеанса(), "ДЛФ=D");                // локальная короткая дата

Даты в запросах: периоды и границы

В языке запросов даты задаются параметрами и собственным набором функций. Литерал даты в запросе пишется через ДАТАВРЕМЯ:

ВЫБРАТЬ
    Продажи.Контрагент,
    Продажи.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(
        НАЧАЛОПЕРИОДА(&ДатаОтчёта, МЕСЯЦ),
        КОНЕЦПЕРИОДА(&ДатаОтчёта, МЕСЯЦ)) КАК Продажи

Полезные функции запроса по датам:

ФункцияЧто делает
ДАТАВРЕМЯ(2024, 1, 15)задаёт дату прямо в запросе
НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ)первое число месяца, 00:00:00
КОНЕЦПЕРИОДА(Дата, ДЕНЬ)конец дня, 23:59:59
ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, 1)прибавляет интервал
РАЗНОСТЬДАТ(Д1, Д2, ДЕНЬ)разница в указанных единицах
ГОД(Дата), МЕСЯЦ(Дата)выделяет часть даты

Эти же функции помогают группировать результат по периодам. Чтобы собрать суммы по месяцам, в выборке и группировке применяют НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ) — все документы одного месяца свернутся в одну строку с датой первого числа. Так строят помесячную динамику без лишних вычислений на стороне кода.

Для разбора даты по частям есть ДЕНЬНЕДЕЛИ(Дата) (1 — понедельник, 7 — воскресенье), КВАРТАЛ(Дата), ЧАС(Дата). Они пригождаются, когда нужно отобрать, например, только документы, оформленные в выходные.

Главная засада — верхняя граница периода. Если отбирать документы условием Дата МЕЖДУ &Начало И &Конец, а в &Конец передать '20240131', то это 31.01.2024 00:00:00. Все документы, созданные 31 января после полуночи, в выборку не попадут.

Чтобы не потерять записи за последний день, доводите верхнюю границу до конца суток: КОНЕЦПЕРИОДА(&Конец, ДЕНЬ) в запросе или КонецДня(ДатаКонец) во встроенном языке.

Как задать период в отчётах

В стандартных отчётах («Оборотно-сальдовая ведомость», «Анализ счёта» и других) дата задаётся в поле «Период» в шапке отчёта. Нажмите на него — откроется выбор интервала.

  • Стандартные периоды — «Этот месяц», «Этот квартал», «Этот год», «Прошлый месяц» и т. п. Привязаны к рабочей дате, поэтому меняются вместе с ней.
  • Произвольный период — задаёте начальную и конечную даты вручную через тот же календарь.

Границы в стандартных отчётах платформа обрабатывает сама: конечная дата включается полностью, до конца дня. Поэтому в отчётах думать про 23:59:59, как в запросах, не нужно.

💡 Если в отчёт не попали документы последнего дня периода — почти всегда дело не в дате отчёта, а в дате самого документа или в том, что он не проведён. Проверьте дату и статус проведения документа.

Дата документа и закрытый период: юридическая сторона

Дата — обязательный реквизит первичного документа (ст. 9 Федерального закона № 402-ФЗ). Она должна соответствовать дате факта хозяйственной жизни, а не дате, когда документ занесли в базу.

От даты документа зависит многое:

  • 📅 налоговый и отчётный период — в какой декларации и отчёте отразится операция;
  • 💱 курс валюты — для валютных документов берётся курс на дату;
  • 📊 учётная политика — применяется та, что действовала на дату операции.

Чтобы случайно не изменить данные закрытого периода, в 1С есть дата запрета изменения. Настраивается в разделе Администрирование → Настройки пользователей и прав → Даты запрета изменения. После установки запрета провести или отредактировать документ с датой раньше запретной система не даст.

Менять дату проведённого документа задним числом в уже закрытом периоде нельзя произвольно. Если в прошлом периоде нашлась ошибка, её исправляют по правилам ПБУ 22/2010 и ст. 54 НК РФ — через корректировку или специальные документы исправления, а не правкой даты.

Перед вводом документа прошлым периодом
Выполнено: 0 / 4

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

Собрал то, на чём чаще всего спотыкаются — и в интерфейсе, и в коде.

🔸 Потеря последнего дня в отборе. Верхнюю границу периода не довели до конца суток. Лечится функцией КОНЕЦПЕРИОДА(..., ДЕНЬ) или КонецДня().

🔸 Пустую дату сравнивают со строкой. Правильная проверка — ЗначениеЗаполнено(Дата), а не сравнение с "00.00.0000".

🔸 ТекущаяДата() в клиентском коде. На клиенте функция недоступна — будет ошибка. Нужна ТекущаяДатаСеанса().

🔸 Рабочая дата застряла в прошлом. Задали конкретную рабочую дату для ввода за прошлый период и забыли вернуть текущую. Новые документы молча создаются задним числом.

🔸 Двузначный год. Ввели 24 вместо 2024 и получили не тот век. Пишите год полностью.

🔸 Путают дату документа и время. В один день порядок документов определяется временем. Если два документа с одной датой проводятся «не в том порядке», проверьте время в их дате.

Частые вопросы

Почему в поле даты появляется 01.01.0001?
Это служебное обозначение пустой (незаполненной) даты в 1С. Значит, значение не задано. В коде такую дату проверяют функцией ЗначениеЗаполнено(), а в поле просто введите нужное число.
Как в запросе отобрать документы за один день и не потерять вечерние?
Нижнюю границу берите НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), верхнюю — КОНЕЦПЕРИОДА(&Дата, ДЕНЬ). Вторая функция вернёт время 23:59:59, и документы, созданные вечером, попадут в выборку.
Чем `ТекущаяДата()` отличается от `ТекущаяДатаСеанса()`?
ТекущаяДата() возвращает дату компьютера сервера и работает только на сервере. ТекущаяДатаСеанса() возвращает дату сеанса и доступна и на клиенте, и на сервере. В прикладном коде используйте вторую.
Можно ли изменить дату проведённого документа задним числом?
Технически — да, если период не закрыт датой запрета изменения. Но если период уже сдан, менять дату нельзя: ошибку прошлого периода исправляют по ПБУ 22/2010 и ст. 54 НК РФ, а не правкой даты.
Как ввести дату только с клавиатуры, без мыши?
Встаньте в поле и наберите цифры подряд — 15012024. Платформа сама расставит точки и превратит ввод в 15.01.2024. Разделители печатать не обязательно.

Источники

  • «Федеральный закон от 06.12.2011 № 402-ФЗ ‘О бухгалтерском учёте’, ст. 9»
  • «ПБУ 22/2010 ‘Исправление ошибок в бухгалтерском учёте и отчётности’»
  • «Налоговый кодекс РФ, ст. 54»