Ввод времени в 1С: поля, код, табель и форматы
Содержание
Чтобы ввести время в поле даты, печатайте его сразу после даты через пробел: 07.11.2026 14:30:00. Если часы и минуты не сохраняются и поле упорно показывает только дату — значит, у реквизита настроено хранение одной лишь даты, и никакое время туда не попадёт, пока это не исправят в конфигураторе.
Время в 1С:Предприятии 8.3 — это не отдельный тип данных. Оно живёт внутри типа Дата: любая дата хранится как число секунд, и часы, минуты, секунды — его неотделимая часть. Поэтому вопрос «как ввести время» почти всегда сводится к двум вещам: разрешено ли время в конкретном поле и как оно отображается. Приёмы одинаковы для Бухгалтерии, ЗУП и УТ — это поведение платформы, а не отдельной конфигурации.
Ниже — ручной ввод в формах, настройка формата, работа со временем в коде и запросах, заполнение табеля и разбор типичных сбоев.
Ручной ввод времени в документах и формах
В интерфейсе «Такси» поле даты выглядит как строка с кнопкой календаря. Календарь задаёт только дату — время через него не ввести. Чтобы указать часы и минуты:
- Щёлкните в поле и наберите дату вручную:
07.11.2026. - Поставьте пробел и допечатайте время:
14:30:00. - Нажмите
Enterили перейдите в следующее поле — платформа разберёт строку целиком.
Если после пробела время не вводится и поле обрезает ввод до точки — реквизит хранит только дату. Это настройка разработчика, пользователь её не обойдёт.
Короткая подсказка: во многих документах (реализация, поступление, платёжка) видимое поле «Дата» хранит и время, просто формат прячет часы. Время там нужно для очерёдности проведения — о нём ниже.
Разделитель времени — двоеточие, разделитель даты — точка (для русской локали). Секунды можно опускать: 14:30 система дополнит до 14:30:00. А вот указать только время, без даты, в поле типа «Дата и время» нельзя — платформе нужна полная дата.
Ещё две мелочи, которые ускоряют ввод. Первая: если набрать в поле только день и месяц без года, платформа подставит текущий год. Вторая: пустое поле даты хранит не «ничего», а специальную пустую дату — при выводе она обычно показывается как прочерк или не отображается вовсе, и время у неё тоже пустое.
Почему время не отображается: настройка формата
Чаще всего время введено и хранится корректно, но его не видно — поле настроено на показ одной даты. За отображение отвечает формат реквизита, его задаёт разработчик в конфигураторе, а не пользователь.
Формат пишется форматной строкой. Два параметра, которые отвечают за время:
| Форматная строка | Что покажет |
|---|---|
ДЛФ=Д | только дата: 07.11.2026 |
ДЛФ=ДВ | дата и время: 07.11.2026 14:30:00 |
ДЛФ=В | только время: 14:30:00 |
ДФ=HH:mm | своё: часы и минуты, 24 часа |
ДФ='dd.MM.yyyy HH:mm' | своё: дата и время без секунд |
ДЛФ (длинный формат даты) берёт шаблон из региональных настроек, ДФ (формат даты) задаёт его вручную. HH — часы в 24-часовом формате, mm — минуты, ss — секунды.
Поменять формат можно в трёх местах:
- У реквизита формы — свойство «Формат» в палитре свойств поля. Влияет на одну форму.
- У реквизита объекта — свойство «Формат» в дереве конфигурации. Влияет на все формы, где поле выводится по умолчанию.
- В региональных настройках информационной базы — раздел
Администрирование → Региональные настройки(точное название пункта зависит от конфигурации). Меняет формат дат по всей базе.
Правка формата в типовой конфигурации — это изменение конфигурации. Если база на поддержке, снимайте замок аккуратно или делайте правку через расширение, чтобы не слететь с автообновления.
Как собрать и рассчитать время в коде
В языке 1С время — это часть значения Дата. Отдельного «ввода времени» в коде нет: вы либо получаете текущий момент, либо собираете дату с нужным временем, либо раскладываете её на части.
// Текущий момент с учётом часового пояса сеанса — так правильнее
Сейчас = ТекущаяДатаСеанса();
// Собрать конкретный момент: год, месяц, день, час, минута, секунда
Момент = Дата(2026, 11, 7, 14, 30, 0);
// Разложить момент на составляющие
Ч = Час(Момент); // 14
М = Минута(Момент); // 30
С = Секунда(Момент); // 0
// Прибавить час: дата — это секунды, час = 3600 секунд
ЧасомПозже = Момент + 3600;
// Начало и конец текущего часа
НачалоТекущегоЧаса = НачалоЧаса(ТекущаяДатаСеанса());
КонецТекущегоЧаса = КонецЧаса(ТекущаяДатаСеанса());
Ключевой приём, который экономит часы отладки: не используйте ТекущаяДата() на сервере там, где важен реальный местный момент. ТекущаяДата() возвращает время операционной системы сервера, без поправки на часовой пояс сеанса. ТекущаяДатаСеанса() учитывает пояс пользователя — именно её и стоит брать по умолчанию.
Чтобы заменить время у готовой даты, не трогая дату, удобно оттолкнуться от начала дня и прибавить секунды:
// Поставить 09:15:00 на ту же дату
НоваяДата = НачалоДня(ИсходнаяДата) + 9*3600 + 15*60;
Арифметика проста: час — 3600 секунд, минута — 60 секунд. 9*3600 + 15*60 = 32400 + 900 = 33300 секунд от полуночи, то есть 09:15:00.
Чтобы вывести только время в строку (в сообщение, печатную форму, лог), пригодится функция Формат:
// Только время, без даты
ВремяСтрокой = Формат(Момент, "ДЛФ=В"); // "14:30:00"
// Своим шаблоном, часы и минуты
ЧасыМинуты = Формат(Момент, "ДФ=HH:mm"); // "14:30"
Обратная задача — получить момент из строки, которую ввёл пользователь или прислал обмен, — решается не склейкой, а разбором подготовленной строки ГГГГММДДччммсс. Для фиксированных дат удобнее собирать их конструктором Дата(...), как выше: так меньше шансов ошибиться с форматом.
Время проведения документов и очерёдность
У документов время внутри поля «Дата» решает порядок их проведения в пределах одной секунды. Если два документа проведены одним числом и временем, платформа расставляет их по внутренней очерёдности, и это влияет на остатки и последовательность расчётов.
Поэтому иногда время правят намеренно — чтобы приход встал раньше расхода. Делать это нужно осознанно: сдвинули время документа — перепроведите цепочку, иначе остатки на момент расчёта разъедутся.
Не меняйте время задним числом в закрытом периоде без согласования. Сдвиг очерёдности в закрытом месяце ломает уже сформированную отчётность.
Ввод времени в табеле учёта рабочего времени
Здесь «время» — это не часы на циферблате, а отработанные часы за день. В ЗУП 3.1 рабочее время сотрудника обычно берётся из его графика работы, а табель лишь показывает и при необходимости корректирует эти данные.
Два пути ввода:
- Через график. Сотруднику назначен график (пятидневка, сменный, суммированный учёт). Часы за каждый день система считает по графику автоматически — вручную их вводить не нужно.
- Через документ «Табель». Когда факт отличается от графика (переработка, недоработка, явка в выходной), создают документ «Табель» в разделе
Зарплата. В нём по дням проставляют буквенный код (явка, ночные, выходной) и количество часов.
Количество часов вводится числом в ячейку дня: например, 8 или 7.5 для неполного дня. Ночные, сверхурочные и работу в выходной отмечают отдельными кодами — их потом подхватят документы начисления.
Важный нюанс для суммированного учёта: там норма считается не по дням, а за учётный период (месяц, квартал, год). Вводить время за каждый день всё равно нужно, а переработку и недоработку программа определит по итогу периода относительно нормы по графику. Поэтому в таких схемах корректность графика и производственного календаря важнее ручных правок в табеле.
Если в табеле часы «не те» — почти всегда дело в графике сотрудника, а не в самом табеле. Сначала проверьте назначенный график и его производственный календарь, потом правьте табель.
Частые ошибки при вводе времени
Большинство проблем со временем — это не сбой программы, а несоответствие настроек ожиданиям. Разберём по симптомам.
ДЛФ=ДВ или свой ДФ с HH:mm.ТекущаяДата() вместо ТекущаяДатаСеанса(), либо не настроен часовой пояс сеанса в параметрах информационной базы.HH (24 часа), а не hh (12 часов).Отдельно про копирование из Excel: если вставить в поле даты значение вида 07.11.2026 14:30, где Excel подставил свой разделитель или нестандартный пробел, платформа может не разобрать строку. Введите время заново руками или проверьте разделители.
Работа со временем в запросах и отчётах
В языке запросов время извлекают и группируют теми же понятиями — час, минута, секунда. Это нужно, когда отчёт должен показать распределение документов по времени суток или отобрать записи за конкретный час.
ВЫБРАТЬ
Док.Ссылка,
ЧАС(Док.Дата) КАК Час,
МИНУТА(Док.Дата) КАК Минута
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода
УПОРЯДОЧИТЬ ПО
Док.Дата
Полезные функции для времени в запросах:
ЧАС(Дата),МИНУТА(Дата),СЕКУНДА(Дата)— выделить составляющую.НАЧАЛОПЕРИОДА(Дата, ЧАС)иКОНЕЦПЕРИОДА(Дата, ЧАС)— свернуть к границам часа для группировки.ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, 30)— сдвинуть момент на N секунд.РАЗНОСТЬДАТ(Дата1, Дата2, СЕКУНДА)— длительность между моментами в секундах.
В системе компоновки данных (СКД) те же возможности доступны через поле даты: можно добавить вычисляемое поле Час(Дата) и строить по нему группировку, не трогая запрос.
Для отчёта «сколько документов за каждый час» группируйте по НАЧАЛОПЕРИОДА(Дата, ЧАС) — так все записи одного часа соберутся в одну строку независимо от минут.
Автоматизация: массовый ввод времени
Когда время нужно проставить сразу у десятков документов, ручной ввод не вариант. Есть два рабочих способа.
Внешняя обработка. Самый гибкий путь: обработка проходит по выборке документов и задаёт время по вашему правилу. Так удобно, например, расставить разное время секунда в секунду, чтобы зафиксировать очерёдность.
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Сдвиг = 0;
Пока Выборка.Следующий() Цикл
ОбъектДок = Выборка.ПолучитьОбъект();
// Поставить 09:00:00 плюс по секунде на каждый документ дня
ОбъектДок.Дата = НачалоДня(ОбъектДок.Дата) + 9*3600 + Сдвиг;
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
Сдвиг = Сдвиг + 1;
КонецЦикла;
Такой код меняет проведённые документы и перепроводит их. Запускайте только на копии базы, а на рабочей — в заранее согласованное время и с резервной копией: массовое перепроведение затрагивает остатки и последовательности.
Стандартная обработка «Групповое изменение реквизитов». Она есть в разделе Администрирование типовых конфигураций и умеет менять значения реквизитов у отобранных объектов. Подходит, когда нужно единым махом установить одно значение. Для тонкой логики (разное время у каждого документа) всё же нужна внешняя обработка.
Частые вопросы
Можно ли ввести только время, без даты?
Почему в одном документе время видно, а в другом нет?
ДЛФ=ДВ показывает время, ДЛФ=Д прячет).Как платформа понимает, какой документ раньше, если дата и время совпали?
В каких единицах 1С хранит дату и время?
+3600 сдвигает на час, +60 — на минуту.Что выбрать в коде — `ТекущаяДата()` или `ТекущаяДатаСеанса()`?
ТекущаяДатаСеанса(): она учитывает часовой пояс сеанса. ТекущаяДата() берёт время сервера без поправки на пояс — его используют реже и осознанно.