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