В процессе работы с партионным учетом в системах 1С специалисты часто сталкиваются с ситуацией, когда граница последовательности (точка актуальности) самопроизвольно «откатывается» на более раннюю дату. Это происходит даже в тех случаях, когда документы за этот период никто не перепроводил вручную. Разберем детально, почему это случается и как стабилизировать работу системы.
Для начала проанализируем, как можно программно мониторить состояние границ. Многие разработчики используют прямой запрос к виртуальной таблице границ последовательности. Рассмотрим пример запроса, который позволяет увидеть текущие отметки времени для последовательности ПартионныйУчет:
ВЫБРАТЬ * ИЗ
(
ВЫБРАТЬ
ПартионныйУчетГраницы.МоментВремени КАК МоментВремени
ИЗ
Последовательность.ПартионныйУчет.Границы КАК ПартионныйУчетГраницы
) ВложенныйЗапрос
УПОРЯДОЧИТЬ ПО МоментВремени ВОЗР
Важно помнить, что в 1С:Предприятии 8 границы последовательностей могут храниться в разрезе измерений, например, по организациям или складам. Если запрос возвращает одну запись, значит, либо в последовательности нет измерений, либо данные по ним не инициализированы. Если записей много, необходимо анализировать каждую комбинацию аналитики отдельно.
Одной из главных причин неожиданного смещения границы является свойство метаданных «Управление последовательностью». Если в конфигураторе для конкретной последовательности установлено значение «Автоматически», платформа берет на себя контроль за актуальностью данных.
В этом режиме любая запись документа, входящего в состав последовательности (даже если это простое сохранение без проведения или отмена проведения), заставляет систему проверить дату документа. Если дата изменяемого документа оказывается раньше текущей границы, платформа автоматически перемещает границу назад на момент времени этого документа. Это гарантирует, что при последующем восстановлении последовательности система не пропустит изменения, потенциально влияющие на расчет итогов.
Часто граница «улетает» назад после загрузки данных из других систем. Даже если при записи объекта используется программный флаг ОбменДанными.Загрузка = Истина, это не всегда защищает границу последовательности от сдвига. Разберем, почему это происходит:
ПриЗаписи или ПередЗаписью, которые могут принудительно вызывать методы УстановитьГраницу() или сбрасывать состояние актуальности, игнорируя режим загрузки.Существует распространенное заблуждение, что граница последовательности может стоять только на проведенном документе. На самом деле платформа допускает нахождение границы на непроведенном документе. Это случается, если документ был записан в периоде, предшествующем границе, или если проведение документа было отменено. Система фиксирует «точку разрыва» именно на этом объекте, так как именно с него данные в регистрах перестают соответствовать хронологической последовательности записей.
Для того чтобы исключить неконтролируемые скачки даты актуальности, рекомендуем выполнить следующие действия:
Если автоматика платформы работает слишком агрессивно для ваших бизнес-процессов, можно изменить режим управления последовательностью на «Вручную» в конфигураторе. В этом случае граница будет двигаться только при явном вызове метода УстановитьГраницу() в коде или через стандартную обработку «Проведение документов».
Если в таблице границ возникли дубли или некорректные записи (например, после некорректной очистки базы на уровне SQL), необходимо выполнить полное перепроведение или программную установку границы. Рассмотрим пример программной установки границы для всей последовательности:
Граница = Новый Граница(МоментВремениДокумента, ВидГраницы.Включая);
Последовательности.ПартионныйУчет.УстановитьГраницу(Граница);
Обратите внимание, что если у последовательности есть измерения, метод УстановитьГраницу должен принимать структуру с указанием конкретной аналитики (например, Организации).
Проанализируем модули документов и подписки на события. Ищите вызовы методов Последовательности.ИмяПоследовательности.УстановитьГраницу(). Часто в кастомных решениях разработчики добавляют логику, которая принудительно сдвигает ТА при записи определенных типов документов, чтобы гарантировать корректность отчетов.
При мониторинге и установке границ важно оперировать объектом МоментВремени (композиция даты и ссылки), а не просто датой. В системе может быть несколько документов в одной секунде. Порядок внутри секунды определяется ссылкой, и граница может «застрять» на одном из документов внутри этой секунды, что визуально кажется остановкой на одной и той же дате.
Важный совет: Если ваша цель — только мониторинг, используйте метод Последовательности[ИмяПоследовательности].ПолучитьГраницу() вместо прямых запросов к таблицам БД. Это позволит получать данные, которые видит менеджер последовательностей в текущем сеансе с учетом всех кэшей платформы.