Немного теории
Механизм итогов в «1С:Предприятии» появился достаточно давно и уже много лет является «головной болью» администраторов систем 1С. Перед тем как разбирать какие-то конкретные технические проблемы, связанные с егоработой, нужно немного погрузиться в назначение и детали реализации данного функционала.
Итак, для чего же вообще придумали «Итоги» в 1С? Представьте себе, что ваша учетная система решает одну лишь простую задачу – учет количества товара на складе. «Пришло 10 штук «товара1», ушло 5, в остатке …?» Остаток будет равен «приход – уход», что логично. А теперь представим, что данный товар приходит каждый день, и не единожды. Тогда как посчитать остаток? Достаточно просто – из всех приходов вычесть все расходы. Атеперь представьте, что система существует несколько лет. Соответственно операция получения остатков замедлится на столько, сколько дней будет существовать система. Через некоторое время учет в данной системе станет просто невозможен.
Как была решена данная проблема? Вариантов существует множество. Но все они сводятся примерно к одному – нужна отдельная табличка, в которую будут записываться не движение товара, а именно его остатки на складе. Собственно, эту таблицу и называют «итогами» в 1С. Если посмотреть «структуру хранения БД», к примеру, с помощью специальной обработки [1], то по таблицам регистров накопления можно заметить картину, аналогичную представленной на рис. 1
В данном вопросе подход 1С и подходы «западных» систем несколько отличаются. Пожалуй, в корне отличия лежит тот факт, что сам учет в компаниях на Западе более структурирован, работа «задним числом» не принята. Унас же это считается нормальной практикой, поэтому информационная система должна на нее ориентироваться. В западных системах существует понятие «текущие итоги», по которым всегда можно, не задумываясь, получить актуальный остаток на текущий момент времени. В 1С все намного сложнее. Поскольку остатки могут быть изменены «задним числом», то вариант получения остатков только по итоговой таблице уже не подойдет. Можно было бы, конечно, пользователя, который изменил документ задним числом, заставить ждать, пока система пересчитает все итоги с момента изменения и получит новые актуальные значения текущих остатков (лично я бы поддержал этот вариант), но в реальной жизни он, к сожалению, неработоспособен. Потому как на время такого пересчета пришлось бы блокировать всю работу в информационной системе, что не добавило бы ей популярности среди конечных пользователей и в принципе исключило бы возможность работы с 1С даже в компаниях среднего бизнеса.
В 1С итоги хранятся помесячно. Кроме того, существует такое понятие, как «граница рассчитанных итогов». В случае если пользователь изменил данные на месяц раньше текущего, граница рассчитанных итогов сдвигается наначало предыдущего месяца. Получение остатков происходит следующим образом:
- считываются из итоговой таблицы актуальные остатки из таблицы итогов с периодом до границы рассчитанных итогов по данной таблице и наиболее близкие к периоду, на который надо получить остатки;
- по таблице движений получаются все движения начиная от даты итогов до даты, на которую надо получить остаток;
- значения по итоговой таблице и таблице движений суммируются, и пользователю системы предоставляется итоговый результат.
Вот в этом случае и возникает множество проблем, которые приходится решать, начиная от медленной работы системы и заканчивая полной ее неработоспособностью.