Основные объекты: Регистры накопления. Часть 2. Создание регистра остатков
Великий комбинатор тупо посмотрел
на трофеи и остатки своего богатства...
(И. Ильф, Е. Петров. Золотой теленок)
Классический пример расчета остатков – определение количества товаров на складе. Для того, чтобы облегчить контроль за состоянием нашего склада создадим регистр остатков “ТоварыНаСкладе” (регистр остатков формируется, во многом, аналогично регистру сведений, который был описан нами ранее):
На закладке “Данные” определим одно измерение “Наименование товара” (тип “СправочникСсылка.Номенклатура”) и два ресурса: “Количество” (тип “Число”, 10, 0) и “Сумма” (тип “Число”, 10, 2):
Настроим форму списка регистра накопления на закладке “Формы”:
Также настраиваем форму набора записей, которая создается путем добавления к форме списка:
Снова выполним модификацию документа “Приходная”. Необходимо разрешить ему выполнять движение регистра остатков “ТоварыНаСкладе”.
Откроем свойства документа “Приходная” на закладке “Движения”:
В верхней части данного окна пометим флажок “Регистры накопления – ТоварыНаСкладе”. После этого в нижней части окна появится наименование нашего регистра остатков “ТоварыНаСкладе”:
Далее нажмем на кнопку “Конструктор движений”:
После этого будет запущен Конструктор движений, который позволит без особых проблем переопределить обработку проведения документа “Приходная” с учетом регистра остатков “ТоварыНаСкладе”:
Добавим регистр остатков “Товары на складе” в перечень регистров:
Добавляем для регистра остатков “ТоварыНаСкладе” табличную часть “Товары”:
Заполняем соответствия параметров с помощью кнопки “Заполнить выражения”:
К сожалению, одно поле – “НаименованиеТовара” – осталось незаполненным. Заполняем его двойным щелчком на строке ТекСтрокаТовары.Номенклатура в разделе “Реквизиты документа”:
Наконец, определяем тип движения регистра (Приход или Расход). Поскольку мы формируем движения документа “Приходная”, который описывает поступление товаров на склад (приход), то в данном случае мы указываем тип движения “Приход” (количество товаров из документов “Приходная” будет прибавляться к текущему значению остатков):
Теперь исходные данные Конструктора движения регистров настроены, и можно нажимать кнопку OK:
Мы видим, что в созданную ранее процедуру ОбработкаПроведения в модуле объекта документа “Приходная” конструктор добавил следующие строки кода:
Для Каждого ТекСтрокаТовары Из Товары Цикл
Упражнения: 1. Проанализируйте код, добавленный Конструктором движений документа “Приходная” в процедуру ОбработкаПроведения.
2. Настройте движения регистра остатков “ТоварыНаСкладе” в документе “Расходная” (не забудьте разрешить проведение движений документа “Расходная” и обратите внимание, что в этом случае необходимо установить тип движения регистра Расход).
Проверим действие созданного нами механизма в пользовательском режиме 1С.
Откроем форму списка документов “Приходная” и перепроведем следующий документ (нажав на кнопку OK):
Теперь откроем в пользовательском режиме регистр накопления “ТоварыНаСкладе”:
В нашем случае остатки на начало периода были нулевыми, поэтому нетрудно видеть, что данный регистр остатков сработал верно.
Далее введите новую расходную накладную о продаже слонов в зоопарк г. Арбатова:
Снова откроем регистр накопления “ТоварыНаСкладе” и увидим, что в форме списка появились отрицательные строки (со знаком “минус”), соответствующие расходу товара:
Впоследствии данные этой таблицы могут быть просуммированы, и по каждому измерению могут быть получены итоги об остатках ресурсов.
В пользовательском режиме можно также установить необходимый интервал дат (Действия – Установить интервал дат... или путем нажатия на кнопку ):
Можно также сделать отбор товаров с помощью кнопки настройки фильтра :
Попробуем, наконец, с помощью регистра остатков рассчитать непосредственно остатки по конкретным товарам. Для этого используем метод Остатки объекта “РегистрНакопленияМенеджер” (об использовании этого метода можно более подробно узнать в Синтакс-Помощнике).
Поместим на форму списка регистра остатков “Товары на складе” поле ввода “Товар” (данные “Отбор.НаименованиеТовара.Значение”; тип значения “СправочникСсылка.Номенклатура”) и кнопку “ОстатокПоНоменклатуре”, которая при нажатии выполняет процедуру “ОстатокПоНоменклатуреНажатие”:
Текст кода самой процедуры “ОстатокПоНоменклатуреНажатие” может быть следующим:
Процедура ОстатокПоНоменклатуреНажатие(Кнопка)
Процедура “ОстатокПоНоменклатуреНажатие” несомненно является упрощенной и выполняет печать данных о количестве товара на складе, указанного в поле ввода “Товар”.
Проверяем работу процедуры в пользовательском режиме 1С:
Упражнения: 1. Проанализируйте код процедуры “ОстатокПоНоменклатуреНажатие”.
2. Преобразуйте эту процедуру так, чтобы в методе Остатки не использовалась структура Фильтр:
ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладе.Остатки(Дата,,,);
В этом случае в таблицу значений “ТаблицаОстатков” будут отобраны данные по всем товарам, упомянутым в регистре остатков “Товары на складе”.