В процессе эксплуатации конфигураций на платформе 1С часто возникают ситуации, когда требуется изменить границу последовательности документов, не запуская при этом длительный процесс перепроведения всей базы. Рассмотрим, как решить эту задачу, избегая распространенных ошибок, связанных с повреждением данных.
Граница последовательности в системе 1С представляет собой логический момент времени, определяющий актуальность учета. Она фиксируется в специальных таблицах базы данных. Попытки установить её «напрямую» или некорректное удаление документов, которые ранее были записаны в последовательность, приводят к тому, что система содержит «битые» ссылки. В таких случаях механизм контроля последовательности может работать нестабильно, а штатные средства тестирования и исправления не всегда обнаруживают проблему.
Для корректной работы с границей мы рекомендуем использовать объект Последовательность. Самый безопасный путь — это использование метода УстановитьГраницу() в рамках транзакции, сопровождаемое очисткой записей, которые содержат «битые» регистраторы.
Рассмотрим пример кода, который можно использовать для установки границы и очистки некорректных записей:
// Пример установки границы и очистки хвостов
Процедура УстановитьГраницуПоследовательности(ДатаДокумента, Организация)
МоментВремениДокумента = Новый МоментВремени(ДатаДокумента.Дата, ДатаДокумента);
Отбор = Новый Структура("Организация", Организация);
НачатьТранзакцию();
Попытка
// Установка границы для указанного отбора
Последовательности.СписаниеТМЦ.УстановитьГраницу(МоментВремениДокумента, Отбор);
// Очистка записей с битыми регистраторами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Последовательность.Регистратор
|ИЗ Последовательность.СписаниеТМЦ КАК Последовательность
|ГДЕ Последовательность.Период < &Дата
|И Последовательность.Организация = &Организация";
Запрос.УстановитьПараметр("Дата", МоментВремениДокумента.Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
НаборЗаписей = Последовательности.СписаниеТМЦ.СоздатьНаборЗаписей();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В некоторых случаях, особенно в типовых конфигурациях вроде «Бухгалтерии предприятия», требуется учитывать не только границу, но и состояние проведения документов. Для этого целесообразно использовать методы общего модуля РаботаСПоследовательностями. Если вы столкнулись с ошибкой при вызове процедур блокировки, убедитесь, что вы работаете в рамках транзакции и корректно передаете параметры организации.
Важно помнить, что граница может зависеть от даты начала ведения учета, которая хранится в регистре сведений УчетнаяПолитика. Если после свертки базы данных или переноса остатков из старых версий (например, 7.7) учетные данные остались «в прошлом», система будет требовать перепроведения документов за неоправданно долгий период.
Хотя удаление записей через SQL или сторонние утилиты (типа Tool_1CD) кажется быстрым решением, мы настоятельно не рекомендуем это делать по следующим причинам:
Если вы обнаружили, что в последовательности много записей, где регистратор равен NULL или ссылается на удаленный объект:
УчетнаяПолитика — часто «лишние» требования по перепроведению вызваны старыми записями о дате начала ведения учета.НаборЗаписей.Прочитать() с отбором по регистратору, а затем НаборЗаписей.Очистить() — это штатный и безопасный способ «почистить» последовательность программно.Таким образом, для программной установки границы последовательности используйте сочетание метода УстановитьГраницу() и штатную очистку записей через объекты НаборЗаписей. Это позволит сохранить целостность данных и избежать необходимости в «хирургическом» вмешательстве в структуру базы данных.