====== Регистр накопления ====== ===== Общее описание ===== Задача регистра накопления максимально быстро вернуть остатки или обороты за указанный период. Регистр накопления должен обязательно иметь, ресурс и регистратор – документ который будет являться основанием для записей регистра. Структура хранения остатков следующая: итоги регистров накопления остатков хранят рассчитанные остатки отдельно, на каждый месяц. Итоги регистров оборотов хранят обороты за предыдущий месяц на первое число каждого месяца. В отдельной таблице хранятся актуальные(текущие) остатки по каждому регистру накопления. Следовательно: самым быстрым является получение текущих остатков. ===== Получение остатков на определенную дату ===== Система берет остатки на начало ближайшего месяца, и исходя из движений за период от нужной даты до рассчитанной вычисляет правильное значение. Например если нам нужны остатки товара на 10.03 система возьмет готовые итоги на 01.03 и прибавит к ним движения которые были за период с 01.03 по 10.03. Таким образом вычислив правильные остатки на 10.03 с минимальным количеством действий. При записи документа задним числом системе придется пересчитать итоги, с даты документа, по текущую дату рассчитанных итогов. Поэтому массовое перепроведение документов задним числом, может оказать сильное влияние производительность системы. Причем, чем "старше" будут документы, тем выше будет нагрузка на систему. В связи с тем, что при записи данных в регистр, система пишет одновременно в три таблицы: таблицу регистра, таблицу итогов регистра, и таблицу текущих итогов по регистру. Запись в три таблицы происходит немного дольше, чем просто запись в таблицу регистра. Если происходит массовое перепроведение документов, или какое то большое добавление записей в регистр, имеет смысл отключить итоги на время записи, потом включить и пересчитать итоги по регистрам которые были отключены. ===== Запись в регистр накопления ===== Запись в регистры накопления, происходит с помощью набора записей с установленным отбором по регистратору. Нужно отметить, что регистр накопления всегда подчинен регистратору, то есть свободной записи в регистр накопления быть не может, регистратор обязан быть(правда он может физически отсутствовать в базе, но ссылка на него все равно должна быть). Здесь приводится код записи в регистр. Запись может происходить как в обработке проведения документа, так и в любом другом месте, главное условие: наличие ссылки над записанный документ регистратор. Следующий код добавляет записи в регистр накопления: - Обработка проведения Движения.ОстаткиНаСкладах.Записывать = Истина; Движения.Продажи.Записывать = Истина; Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ОстаткиНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаТовары.Количество; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Склад = Склад; Движение.Продавец = Продавец; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаБезСкидки = ТекСтрокаТовары.Сумма; Движение.Сумма = ТекСтрокаТовары.Итого; Движение.ДисконтнаяКарта = ДисконтнаяКарта; КонецЦикла; - Откуда угодно НаборВРегистр = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(); НаборВРегистр.Отбор.Регистратор.Значение = НовыйДок; НаборВРегистр.Загрузить(ДвиженияВДокумент.Скопировать(,"Период,Регистратор,Активность,ВидДвижения,Склад,Номенклатура,Качество,Количество")); НаборВРегистр.Записать();