Механизм последовательностей в 1С — это критически важный инструмент для обеспечения правильности учета, особенно в таких конфигурациях, как «1С:Розница» или «1С:Бухгалтерия». Когда последовательность «слетает», это означает, что данные в отчетах (например, по остаткам или себестоимости) могут стать недостоверными. Разберем подробно, как работает этот механизм изнутри и как вычислить «нарушителя», из-за которого граница откатилась назад.
Для начала важно прояснить терминологию. Под «нарушителем» часто понимают документ, на котором остановилась граница. Однако это не совсем верно. Документ, на котором стоит граница, — это последний «правильный» документ. Настоящим «нарушителем» является тот документ, действия с которым (изменение, перепроведение задним числом, отмена проведения) заставили систему автоматически сдвинуть границу назад.
Рассмотрим основные причины нарушения:
Чтобы эффективно искать ошибки, проанализируем, где система хранит данные. В платформе 1С для каждой последовательности создаются две неявные таблицы:
Номенклатура или Организация), то для каждого значения измерения хранится своя отдельная граница.Последовательность.ИмяПоследовательности, мы обращаемся именно к этой таблице.Проанализируем ситуацию пользователя из сообщения 5: он не нашел в запросе «состояние проведения». Это логично, так как таблица регистрации хранит только ссылку на документ и период. Чтобы увидеть состояние проведения, нам нужно соединить таблицу последовательности с основной таблицей документов.
Если нам нужно быстро посмотреть текущее состояние последовательности через консоль запросов, мы можем составить запрос к таблице регистрации. Посмотрим на пример логики, предложенной в сообщении 2, и доработаем её для практического применения:
ВЫБРАТЬ
Регистрация.Период КАК Период,
Регистрация.Регистратор КАК Документ,
Регистрация.Регистратор.Проведен КАК Проведен
ИЗ
Последовательность.Продажи КАК Регистрация
ГДЕ
Регистрация.Период >= &ДатаНачала
УПОРЯДОЧИТЬ ПО
Период,
Документ
В данном запросе мы анализируем последовательность Продажи. Обратите внимание на соединение с реквизитом Проведен. Если мы видим в списке проведенный документ, который находится по времени ПОСЛЕ актуальной границы, значит, он — первый кандидат на перепроведение при восстановлении.
Для точного определения момента, на котором «споткнулась» система, лучше использовать встроенные методы платформы. Метод ПолучитьГраницу() возвращает МоментВремени, до которого всё рассчитано верно.
Разберем пример кода для получения границы в разрезе измерений (например, для конфигурации «Розница 2.2», где используется измерение Номенклатура):
// Создадим отбор по конкретной номенклатуре
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ВыбранныйТовар);
// Получаем границу для этого товара
Граница = Последовательности.Номенклатура.ПолучитьГраницу(Отбор);
Сообщить("Граница последовательности установлена на: " + Граница.Дата + " (" + Граница.Ссылка + ")");
После того как мы получили МоментВремени, мы точно знаем, что следующий за ним документ в хронологическом порядке и является тем самым местом, с которого нужно начинать восстановление.
Поскольку сама таблица последовательности не сохраняет историю того, кто именно изменил старый документ, нам поможет Журнал регистрации. Это единственный способ выяснить, какой пользователь «сдвинул» границу.
Выполним следующие шаги:
Данные.Изменение и Документ.Проведение.Если мы находим документ от прошлого месяца, который был записан или проведен сегодня в 10:00 утра — поздравляем, вы нашли «нарушителя» и виновного пользователя.
В конфигурации «Розница 2.2» последовательности часто работают в разрезе Номенклатуры. Это сделано для оптимизации: если вы изменили документ по «Молоку», системе не нужно пересчитывать последовательность по «Хлебу».
Выясним причину, почему в таких базах последовательность может «зацикливаться» или не восстанавливаться. Это часто происходит из-за взаимозависимых документов. Рассмотрим ситуацию: проведение Документа А программно модифицирует Документ Б, который по времени стоит раньше Документа А. Это вызывает немедленный откат границы назад к Документу Б. В результате получается бесконечный цикл, и последовательность никогда не будет считаться восстановленной до конца.
Если вы столкнулись с тем, что граница постоянно слетает, рекомендуем выполнить следующие действия:
МоментВремени(), а не просто дату. Это позволит избежать ошибок, если несколько документов созданы в одну и ту же секунду.ОбработкаПроведения. Если там есть вызовы функций, которые меняют другие документы (например, корректируют движения прошлых периодов), это и есть корень проблемы с последовательностью.Таким образом, определение нарушителя последовательности — это комплексный процесс, включающий анализ таблиц БД, программную проверку границ и мониторинг действий пользователей через системные логи. Понимая структуру хранения Границ и Регистрации, вы сможете быстро локализовать проблему и вернуть учет в актуальное состояние.