При работе в среде «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда дату и время необходимо сохранить в базу данных или отобразить пользователю без секунд. Например, при составлении расписания приема пациентов в медицинских учреждениях, планировании записи на услуги, резервировании помещений или формировании графиков движения транспорта секунды оказываются лишними и могут мешать корректному сопоставлению данных. Для контроля результатов таких сопоставлений и поиска расхождений после доработок кода проводится автоматическая сверка бухгалтерских и налоговых проводок между базами 1С.
В этой статье мы подробно разберем все возможные способы решения этой задачи: от стандартных функций встроенного языка 1С до настройки интерфейса форм и отчетов в Системе компоновки данных (СКД).
Самым простым, быстрым и правильным с точки зрения стандартов разработки 1С методом является использование встроенной функции НачалоМинуты(). Эта функция принимает на вход исходную дату и возвращает новую дату, в которой секунды принудительно устанавливаются в значение 00.
Рассмотрим пример кода:
ИсходнаяДата = ТекущаяДата(); // Например, 15.10.2023 13:00:25
ДатаБезСекунд = НачалоМинуты(ИсходнаяДата); // Результат: 15.10.2023 13:00:00
Этот метод работает на всех уровнях платформы (клиент, сервер) и является наиболее понятным для тех, кто будет читать ваш код в будущем. Функция просто отсекает секундную составляющую, сдвигая время к началу текущей минуты.
Проанализируем альтернативный изящный способ, который основан на том, что в платформе «1С:Предприятие» тип данных Дата представляет собой число секунд, прошедших с начала нашей эры. Это позволяет выполнять с датами простые арифметические операции.
Если из исходной даты вычесть количество секунд, содержащихся в ней, то на выходе мы получим ровно ту же дату и время, но с обнуленными секундами. Для получения количества секунд воспользуемся функцией Секунда().
Посмотрим на пример реализации:
ИсходнаяДата = ТекущаяДата(); // Например, 15.10.2023 13:00:45
ДатаБезСекунд = ИсходнаяДата - Секунда(ИсходнаяДата); // Результат: 15.10.2023 13:00:00
Этот способ работает очень быстро, так как не требует вызова сложных механизмов работы с календарем, а обходится простой математикой. Однако, по сравнению с первыми способом, он менее очевиден при чтении кода другими разработчиками.
Выясним, как решить задачу, если нам по какой-то причине требуется жестко контролировать каждую составляющую даты. Мы можем разобрать исходную дату на год, месяц, день, часы и минуты, а затем собрать новое значение с помощью конструктора Дата(), опустив параметр секунд (или передав туда 0).
Оформим это решение в виде повторно используемой функции:
Функция ПолучитьДатаБезСекунд(ТвояДата) Экспорт
Возврат Дата(Год(ТвояДата), Месяц(ТвояДата), День(ТвояДата), Час(ТвояДата), Минута(ТвояДата));
КонецФункции
Важный нюанс: когда мы не передаем последний параметр (секунды) в функцию Дата(), платформа автоматически инициализирует секунды нулевым значением. Этот способ громоздкий, но он наглядно показывает, как можно управлять каждым компонентом даты по отдельности.
Очень часто задача обнуления секунд возникает не в коде модулей, а непосредственно при выборке данных из базы (например, при группировке записей по минутам). В языке запросов 1С функция НачалоМинуты() отсутствует, но у нас есть ее мощный аналог — функция НАЧАЛОПЕРИОДА.
Разберем пример запроса, который выбирает документы и сразу же обнуляет секунды в их датах:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПриемНаРаботу.Дата, МИНУТА) КАК ДатаБезСекунд,
ПриемНаРаботу.Ссылка КАК ДокументСсылка
ИЗ
Документ.ПриемНаРаботу КАК ПриемНаРаботу
Использование НАЧАЛОПЕРИОДА с параметром МИНУТА гарантирует, что СУБД вернет обработанные даты с секундами 00, что позволит избежать лишней постобработки в коде на сервере приложений.
Рассмотрим ситуацию, когда простое усечение секунд (сдвиг назад) нам не подходит. Допустим, время 13:00:59 логичнее округлить до 13:01:00, а не до 13:00:00. В стандартной библиотеке 1С нет функции округления дат, но мы можем легко реализовать ее самостоятельно.
Для округления по правилам математики (все, что 30 секунд и более — округляем в большую сторону, менее 30 секунд — в меньшую) достаточно прибавить к исходной дате 30 секунд, а затем применить стандартную функцию НачалоМинуты():
// Пример 1: 13:00:29 + 30 секунд = 13:00:59 -> НачалоМинуты дает 13:00:00
// Пример 2: 13:00:30 + 30 секунд = 13:01:00 -> НачалоМинуты дает 13:01:00
ОкругленнаяДата = НачалоМинуты(ИсходнаяДата + 30);
Этот простой и элегантный прием часто применяется при расчете фактически отработанного времени сотрудников или в интеграционных механизмах. В рамках таких механизмов может быть настроена автоматизация регулярного обмена данными между базами 1С по расписанию без внесения изменений в конфигурации.
Если ваша цель заключается только в том, чтобы пользователь не видел секунд на экране и не мог их ввести, изменять сами данные в базе необязательно. Достаточно правильно настроить элементы отображения.
Откройте свойства поля ввода даты на форме. Найдите параметры Формат и Формат редактирования. Укажите в них следующую маску:
ДФ='dd.MM.yyyy HH:mm'
При такой настройке секунды просто не будут отображаться на экране, а при редактировании пользователь сможет вводить только часы и минуты. При сохранении формы платформа сама запишет дату с нулевыми секундами.
Если вы выводите отчет и хотите убрать секунды из колонок с датами, откройте схему компоновки данных. Выберите нужное поле, перейдите в свойства оформления и в параметре Формат задайте аналогичную строку:
ДФ='dd.MM.yyyy HH:mm'
Это позволит базе данных не тратить ресурсы на преобразование дат на уровне SQL-запроса, а передаст эту задачу легкой клиентской части для форматирования текста.
Мы рассмотрели различные подходы к работе с секундами в датах 1С. Для быстрого обнуления секунд в коде всегда используйте функцию НачалоМинуты(). Если работаете с запросами — применяйте НАЧАЛОПЕРИОДА(..., МИНУТА). Для решения задач визуального представления пользуйтесь форматными строками интерфейса, чтобы не засорять программный код лишними вычислениями.