Разработчики при работе с платформой 1С:Предприятие 7.7 часто сталкиваются с задачей фиксации точного времени документа (например, установка времени на 18:00:00 для всех документов определенного вида). Однако при попытке применить метод УстановитьВремя() к уже записанному или проведенному документу платформа выдает ошибку.
Рассмотрим причинно-следственные связи этой проблемы, особенности поведения платформы 1С 7.7 и способы решения задачи как в форме самого документа, так и с помощью внешней обработки.
Проанализируем работу штатных функций управления временем в 1С 7.7. Метод УстановитьВремя(Час, Минуты, Секунды) предназначен исключительно для объектов, которые еще не были записаны в информационную базу (когда условие Выбран() = 0 возвращает истину).
Если документ уже был записан (Выбран() = 1), попытка вызвать метод УстановитьВремя() приводит к ошибке «Недопустимая операция». Кроме того, если документ проведен (Проведен() = 1), платформа блокирует любые прямое изменение его позиции на временной оси без предварительной отмены проведения.
Если требование заключается в том, чтобы документ сохранял ранее заданное время (например, 18:00:00) даже в том случае, когда пользователь интерактивно меняет его дату в открытой форме, используем комбинацию вызовов АвтоВремяОтключить() и УстановитьВремя().
Разберем код в модуле формы документа в предопределенной процедуре ПриЗаписи():
Процедура ПриЗаписи()
// Отключаем автоматический расчет времени платформой
АвтоВремяОтключить();
// Метод УстановитьВремя вызываем только для нового объекта
Если Выбран() = 0 Тогда
УстановитьВремя(18, 0, 0);
КонецЕсли;
КонецПроцедуры
Посмотрим, как работает этот механизм:
УстановитьВремя(18, 0, 0) явно задает время 18:00:00.ДатаДок в форме и снова нажимает кнопку записи, вызов АвтоВремяОтключить() запрещает платформе пересчитывать время (например, подставлять текущее время или время конца дня). В результате документ сохраняет свое первоначальное время 18:00:00 для новой даты.Если необходимо программно сменить время или позицию у уже созданного документа (например, из журналов документов или с помощью внешней обработки), модификацию следует выполнять через отдельный объект СоздатьОбъект("Документ...").
Разберем алгоритм по шагам:
СделатьНепроведенным().АвтоВремяОтключить() и УстановитьВремя().Рассмотрим пример программного кода:
Перем ИсходныйДок, Док;
ИсходныйДок = ТекущийДокумент(); // Получаем ссылку на документ
Док = СоздатьОбъект("Документ." + ИсходныйДок.Вид());
Если Док.НайтиДокумент(ИсходныйДок) = 1 Тогда
// Если документ проведен, отменяем проведение
Если Док.Проведен() = 1 Тогда
Док.СделатьНепроведенным();
КонецЕсли;
// Отключаем автовремя и задаем нужную позицию
Док.АвтоВремяОтключить();
Док.УстановитьВремя(18, 0, 0);
// Сохраняем и проводим
Док.Записать();
Док.Провести();
КонецЕсли;
В зависимости от бизнес-логики вместо фиксированного времени можно применять стандартные режимы позиционирования документов в рамках дня:
АвтоВремяНачалоДня() — при записи устанавливает время документа на начало суток (00:00:00).АвтоВремяКонецДня() — позиционирует документ в самый конец указанной даты (23:59:59).АвтоВремяТекущее() — подставляет текущее системное время компьютера на момент вызова записи.Важно помнить: любое изменение времени проведения документа в оперативных конфигурациях 1С 7.7 может повлиять на Точку Актуальности (ТА) и последовательность проведения документов, поэтому после массовой смены дат или времени рекомендуется выполнять последовательное перепроведение документов.