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