В процессе работы с конфигурацией «Торговля и Склад 7.7» (ТиС) часто возникает необходимость дополнить стандартную печатную форму (например, товарный чек) временем совершения операции. В отличие от платформы 8.х, где тип данных Дата автоматически включает в себя время, в версии 7.7 работа со временем имеет свои программные особенности. В этой статье мы подробно разберем, как получить время записи документа или системное время печати и правильно вывести его в шаблон.
Прежде чем приступать к написанию кода, проанализируем ситуацию: какое именно время нам необходимо отобразить? Существует два принципиально разных подхода:
Рассмотрим по шагам реализацию каждого варианта.
Если нам нужно вывести время, с которым документ «лежит» в базе данных, мы воспользуемся методом ПолучитьВремя(). Важно помнить, что этот метод работает с объектом типа «Документ». Если вы вызываете печать из модуля формы документа, система уже понимает контекст, но для надежности (особенно во внешних печатных формах) лучше инициализировать объект явно.
Разберем пример кода, который можно разместить в процедуре Печать():
Перем Час, Мин, Сек;
// Создаем объект для обращения к данным текущего документа
Вспом = СоздатьОбъект("Документ.ЧекККМ");
Если Вспом.НайтиДокумент(ТекущийДокумент) = 1 Тогда
// Извлекаем часы, минуты и секунды в отдельные переменные
Вспом.ПолучитьВремя(Час, Мин, Сек);
// Формируем красивую строку вида ЧЧ:ММ:СС
ПечВремя = Формат(Час, "Ч(0)2") + ":" + Формат(Мин, "Ч(0)2") + ":" + Формат(Сек, "Ч(0)2");
КонецЕсли;
В данном коде мы используем функцию Формат() с параметром "Ч(0)2". Это критически важный момент: если час или минута меньше 10, система добавит лидирующий ноль (например, «09:05:01» вместо «9:5:1»), что соответствует стандартам оформления документов.
Полезный совет: В платформе 7.7 существует упрощенный синтаксис. Если вызвать метод ПолучитьВремя() без параметров как функцию, он вернет строку в формате по умолчанию. Посмотрим на пример:
ПечВремя = Вспом.ПолучитьВремя();
// Вернет строку вида "14:30:15"
Если задача стоит вывести время реального момента печати чека (например, для контроля работы кассира), целесообразно использовать функцию ТекущееВремя(). Она обращается к системным часам компьютера пользователя.
Проанализируем особенности этой функции. Если вызвать её без аргументов, она сразу возвращает готовую строку формата "ЧЧ:ММ:СС". Это самый простой и быстрый способ.
// В модуле документа или обработки печати
ПечВремя = ТекущееВремя();
Эту переменную ПечВремя достаточно вставить в ячейку таблицы (шаблона печати). Если же вам нужно программно манипулировать составляющими времени, функцию можно вызвать с параметрами:
Перем ч, м, с;
ТекущееВремя(ч, м, с);
Если ч < 10 Тогда
Сообщить("Доброе утро! Сейчас только " + ч + " часов.");
КонецЕсли;
Выясним причину возможных расхождений во времени. В 1С 7.7 время берется с локальной машины пользователя. Если на разных компьютерах в локальной сети системное время не синхронизировано, документы могут записываться с «разбросом». Для торговых точек это критично.
Также стоит учитывать работу с фискальными регистраторами (кассовыми аппаратами). Рассмотрим ситуацию: 1С передает команду на печать, но у кассового аппарата есть свои внутренние часы. Часто время в программе 1С и время на фискальном чеке различаются на несколько минут. Если для вашей организации важна юридическая точность, рекомендуется использовать внешние компоненты, которые позволяют программно считать время именно из памяти ККМ перед формированием товарного чека в 1С.
Важно понимать, что в 1С 7.7 время — это не только информационное поле, но и инструмент позиционирования. Если вы решите программно изменить время документа с помощью метода УстановитьВремя(), чтобы оно совпадало с временем печати, это может привести к необходимости перепроведения последующих документов. Это связано с механизмом последовательностей и партионного учета. Поэтому рекомендуется выводить время печати просто как текст, не меняя время самого объекта Документ, если в этом нет производственной необходимости.
После того как мы получили значение в переменную ПечВремя, выполним следующие шаги для вывода в шаблон:
ЧекККМ.ПечВремя.ПечВремя определена как Перем или является реквизитом, доступным в контексте печати.Если вы хотите избежать написания кода в модуле, в некоторых случаях (если документ уже записан) можно прямо в ячейке таблицы (тип «Выражение») написать:
ТекущийДокумент.ПолучитьВремя()
Однако помните, что для нового (еще не записанного) документа этот метод может вернуть пустое значение или "00:00:00". В таких случаях всегда используйте ТекущееВремя().
Таким образом, мы рассмотрели все основные способы работы со временем в 1С 7.7. Выбор метода зависит от ваших бизнес-требований: нужно ли вам фиксировать историю изменения документа или просто отобразить текущий момент времени на бумаге.