Как установить время документа при изменении даты у существующего документа в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разработчики при работе с платформой 1С:Предприятие 7.7 часто сталкиваются с задачей фиксации точного времени документа (например, установка времени на 18:00:00 для всех документов определенного вида). Однако при попытке применить метод УстановитьВремя() к уже записанному или проведенному документу платформа выдает ошибку.

Рассмотрим причинно-следственные связи этой проблемы, особенности поведения платформы 1С 7.7 и способы решения задачи как в форме самого документа, так и с помощью внешней обработки.

Почему возникает ошибка при вызове УстановитьВремя()?

Проанализируем работу штатных функций управления временем в 1С 7.7. Метод УстановитьВремя(Час, Минуты, Секунды) предназначен исключительно для объектов, которые еще не были записаны в информационную базу (когда условие Выбран() = 0 возвращает истину).

Если документ уже был записан (Выбран() = 1), попытка вызвать метод УстановитьВремя() приводит к ошибке «Недопустимая операция». Кроме того, если документ проведен (Проведен() = 1), платформа блокирует любые прямое изменение его позиции на временной оси без предварительной отмены проведения.

Способ 1. Сохранение заданного времени через предопределенную обработку ПриЗаписи()

Если требование заключается в том, чтобы документ сохранял ранее заданное время (например, 18:00:00) даже в том случае, когда пользователь интерактивно меняет его дату в открытой форме, используем комбинацию вызовов АвтоВремяОтключить() и УстановитьВремя().

Разберем код в модуле формы документа в предопределенной процедуре ПриЗаписи():


Процедура ПриЗаписи()
    // Отключаем автоматический расчет времени платформой
    АвтоВремяОтключить();
    
    // Метод УстановитьВремя вызываем только для нового объекта
    Если Выбран() = 0 Тогда
        УстановитьВремя(18, 0, 0);
    КонецЕсли;
КонецПроцедуры

Посмотрим, как работает этот механизм:

  1. При первом создании и записи документа метод УстановитьВремя(18, 0, 0) явно задает время 18:00:00.
  2. Если пользователь позже отменяет проведение документа, меняет реквизит ДатаДок в форме и снова нажимает кнопку записи, вызов АвтоВремяОтключить() запрещает платформе пересчитывать время (например, подставлять текущее время или время конца дня). В результате документ сохраняет свое первоначальное время 18:00:00 для новой даты.

Способ 2. Программное изменение времени существующего документа

Если необходимо программно сменить время или позицию у уже созданного документа (например, из журналов документов или с помощью внешней обработки), модификацию следует выполнять через отдельный объект СоздатьОбъект("Документ...").

Разберем алгоритм по шагам:

  1. Находим существующий документ в базе данных.
  2. Проверяем, проведен ли он. Если документ проведен, снимаем проведение методом СделатьНепроведенным().
  3. Задаем новую дату или меняем время с помощью методов АвтоВремяОтключить() и УстановитьВремя().
  4. Записываем документ и при необходимости проводим его повторно.

Рассмотрим пример программного кода:


Перем ИсходныйДок, Док;

ИсходныйДок = ТекущийДокумент(); // Получаем ссылку на документ
Док = СоздатьОбъект("Документ." + ИсходныйДок.Вид());

Если Док.НайтиДокумент(ИсходныйДок) = 1 Тогда
    // Если документ проведен, отменяем проведение
    Если Док.Проведен() = 1 Тогда
        Док.СделатьНепроведенным();
    КонецЕсли;
    
    // Отключаем автовремя и задаем нужную позицию
    Док.АвтоВремяОтключить();
    Док.УстановитьВремя(18, 0, 0);
    
    // Сохраняем и проводим
    Док.Записать();
    Док.Провести();
КонецЕсли;

Штатные методы платформы 1С 7.7 для управления автовременем

В зависимости от бизнес-логики вместо фиксированного времени можно применять стандартные режимы позиционирования документов в рамках дня:

Важно помнить: любое изменение времени проведения документа в оперативных конфигурациях 1С 7.7 может повлиять на Точку Актуальности (ТА) и последовательность проведения документов, поэтому после массовой смены дат или времени рекомендуется выполнять последовательное перепроведение документов.

← На главную