Нередко при сопровождении баз данных на платформе 1С:Предприятие 7.7 возникает ситуация, когда требуется изменить движения регистров по большому массиву исторических документов. При этом штатное перепроведение документов за прошлые периоды может выполняться крайне медленно — от нескольких часов до нескольких суток. Разберем архитектурные особенности оперативного учета 1С 7.7, выясним, почему прямая корректировка движений штатно не предусмотрена, и рассмотрим практические пути решения этой задачи.
В платформе 1С 7.7 механизмы бухгалтерского учета и регистров оперативного учета (остатков и оборотов) кардинально различаются:
Операция. Проводки можно скорректировать программно или вручную как самостоятельный набор записей, не вызывая повторное выполнение программного кода проведения документа.ОбработкаПроведения каждого конкретного документа.Таким образом, штатного механизма точечного изменения записей регистров без вызова процедуры проведения документа в 1С 7.7 не существует.
Проанализируем основные причины, из-за которых массовое проведение документов за прошлые периоды работает медленно:
ОбработкаПроведения типовых конфигураций (например, в торговых и производственных решениях) выполняются ресурсоемкие алгоритмы: расчет списания партий по методам FIFO/LIFO, непрерывный контроль остатков, расчет курсовых разниц и распределение взаиморасчетов.Если требуется скорректировать данные именно в первичных документах, рассмотрим способы кардинального ускорения штатного перепроведения:
ОбработкаПроведения можно предусмотреть специальный флаг (например, через глобальную переменную или параметр обработки), временно отключающий избыточные проверки и партионные пересчеты, если цель перепроведения — всего лишь обновить отдельные ресурсы или реквизиты движений.Посмотрим на пример пакетной обработки документов в транзакции:
Выборка = СоздатьОбъект("Документ.РасходнаяНакладная");
Выборка.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Счетчик = 0;
НачатьТранзакцию();
Пока Выборка.ПолучитьДокумент() = 1 Цикл
Если Выборка.Проведен() = 1 Тогда
Выборка.Провести();
Счетчик = Счетчик + 1;
Если Счетчик % 100 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Вместо перепроведения сотен исторических документов закрытого периода правильнее использовать методологический подход компенсирующих записей:
КорректировкаРегистров), в модуле которого программист может сформировать любые движения по любым регистрам конфигурации.Существуют внешние компоненты (в частности, 1cpp), позволяющие работать с таблицами базы данных через прямые SQL-запросы в обход объектной модели платформы. Однако прямое вмешательство в структуры 1С 7.7 несет в себе критические риски, о которых важно помнить:
RA), а агрегированные остатки — в таблицах итогов (с префиксом RG).Таким образом, для безопасной и корректной работы с регистрами оперативного учета в 1С 7.7 рекомендуется либо оптимизировать штатное проведение документов, либо использовать документированные компенсирующие проводки в текущем периоде.