Регистры
Регистры - это таблицы для накопления оперативных данных и получения сводной информации.
Данные в регистры добавляются только при проведении документов. Сведения из регистров используются для формирования отчетов. Классическая схема использования регистров в 1С:Предприятие выглядит следующим образом:
Документы => Регистры => Отчеты
Измерения и ресурсы
Основная проблема при проектировании регистров - это определение его структуры. Структура регистра должна быть такова, чтобы извлекать из него нужную информацию без утомительной обработки.
Измерения регистра - это то, в каких разрезах требуется хранение информации.
Ресурсы регистра - это количественные или суммовые данные, которые хранятся в регистре.
Предположим, что регистр «Остатки товаров» должен содержать сведения о количестве и стоимости каждого товара на каждом складе. В идеологии системы 1С:Предприятие регистр такого вида представляет собой прямоугольную систему координат на одной оси которой находятся склады, на другой — товары, а на пересечении конкретного склада и конкретного товара находятся цифры количества товара и стоимости товара.
Регистр: Остатки товаров
Измерения: Товар, Склад
Ресурсы: Кол-во, Стоимость
С помощью методов встроенного языка мы можем легко получить ответы на вопросы:
-
остаток конкретного товара на конкретном складе
-
остаток конкретного товара на всех складах
-
стоимость всех товаров на конкретном складе
Движения в регистрах
В табличном виде регистр ОстаткиТоваров представляется следующим образом:
Товар
|
Склад
|
Кол-во
|
Стоимость
|
|
приход
|
Товар4
|
Склад1
|
15
|
200
|
расход
|
Товар4
|
Склад1
|
10
|
100
|
приход
|
Товар4
|
Склад1
|
5
|
50
|
...
|
...
|
...
|
...
|
...
|
Одна строка из этой таблицы называется "движение". Движения в регистрах создаются только при проведении документов. В регистре, кроме измерений и ресурсов, можно задать реквизиты. Реквизиты - это дополнительные сведения, сопровождающие движение. Методами встроенного языка можно отбирать движения с заданным значением реквизита.
Виды регистров
В системе 1С:Предприятие возможно использование регистров двух типов: регистры остатков и регистры оборотов. Разница между ними понятна из их названия и заключается в характере хранимой информации: в регистрах остатков всегда хранится информация о конечном состоянии средств, а в регистрах оборотов, образно выражаясь, — как это состояние было достигнуто.
Если из регистра нужно быстро получать остаток чего-либо на текущий момент, тогда нужно сделать регистр остатков. Если из регистра нужно быстро получать приход или расход чего-либо за период, тогда нужно сделать оборотный регистр.
Регистры остатков
Рассмотрим в качестве примера отслеживание взаиморасчетов с покупателями товаров, которые производит или продает предприятие.
Для того чтобы оперативно получать информацию о взаимной задолженности предприятия и покупателя, потребуется регистр «Взаиморасчеты», в котором для каждого покупателя будет храниться сумма задолженности. При совершении хозяйственной операции состояние регистра будет соответствующим образом изменяться, каждый раз отражая текущее состояние взаиморасчетов. Регистр «Взаиморасчеты» — это регистр остатков.
Регистры оборотов
Однако, легко получить информацию об объеме закупок, совершенных данным покупателем за какой-либо период времени, из регистра «Взаиморасчеты» нельзя. Можно проанализировать все движения, имеющие отношение к данному покупателю, и вычислить общую сумму закупок. Но, когда необходимо получать эти сведения оперативно (например, по условиям договора при достижении определенного объема закупок покупателю должна предоставляться скидка), такой способ, конечно же, не подходит.
В этом случае решением проблемы может быть использование регистра оборотов. В таком регистре — назовем его «Объем закупок» — в разрезе покупателей будет храниться информация об объеме закупок (об обороте покупателя). При создании регистра оборотов можно указывать, с какой периодичностью будет накапливаться информация: день, неделя, месяц и так далее.
Теперь, при совершении хозяйственных операций, необходимо будет изменять не только состояние регистра «Взаиморасчеты», но и регистр «Объем закупок». В этот регистр при совершении клиентом каждой покупки будет заноситься информация о сумме покупки. В результате в регистре «Объем закупок» будет постоянно накапливаться информация об общем объеме закупок клиента.
Основы программирования
Регистры, используемые в примерах:
|
|
Оборотный регистр Доходы Измерения: Клиент, Товар Ресурсы: Доход Реквизиты: нет Периодичность: День |
Регистр остатков Товары Измерения: Товар, Склад Ресурсы: Количество, Стоимость Реквизиты: нет |
Хранит доходы от продаж за день в разрезе клиентов и товаров. | Хранит остатки товаров на каждом складе в количественном и суммовом выражении. |
Запись движений в регистр остатковр.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)
(только при проведении документа)
Методы ДвижениеПриходВыполнить и ДвижениеРасходВыполнить
Пример:
Регистр.Доходы.Клиент = Покупатель; Регистр.Доходы.Товар = КупленныйТовар; Регистр.Доходы.Доход = СуммаПокупки; Регистр.Доходы.ДвижениеПриходВыполнить();
Запись движений в оборотный регистр
(только при проведении документа)
- Метод Движение
Пример:Регистр.Товары.Движение (ПоступившийТовар, ТекСклад, КолвоПоНакладной, СуммаПоНакладной)
- Метод ДвижениеВыполнить
Пример:
Регистр.Товары.Товар = ПоступившийТовар; Регистр.Товары.Склад = ТекСклад; Регистр.Товары.Количество = КолвоПоНакладной; Регистр.Товары.Стоимость = СуммаПоНакладной; Регистр.Товары.ДвижениеВыполнить();
Примечание: Если сумма или количество в движении будет отрицательным, то это движение будет расходом, иначе приходом.
Обращение к итогам регистра
1-й способ.
РегТовары = СоздатьОбъект("Регистр.Товары"); РегТовары.ВыбратьИтоги(); Пока РегТовары.ПолучитьИтог()=1 Цикл ......Сообщить("Товар " + Строка(РегТовары.Товар) + ...................... " на складе " + Строка(РегТовары.Склад) + ...................... " кол-во: " + Строка(РегТовары.Количество) + ...................... " стоимость: " + Строка(РегТовары.Стоимость) + КонецЦикла;
2-й способ. Выгрузка итогов в таблицу значений
РегДоходы = СоздатьОбъект("Регистр.Доходы"); ТабЗнач = СоздатьОбъект("ТаблицаЗначений"); РегДоходы.ВыгрузитьИтоги(ТабЗнач); ТабЗнач.ВыбратьСтроки(); Пока ТабЗнач.ПолучитьСтроку()=1 Цикл ......Сообщить("Товар " + Строка(ТабЗнач.Товар) + ...................... " на складе " + Строка(ТабЗнач.Склад) + ...................... " кол-во: " + Строка(ТабЗнач.Количество) + ...................... " стоимость: " + Строка(ТабЗнач.Стоимость) + КонецЦикла;
Обращение к итогам оборотного регистра
РегДоходы = СоздатьОбъект("Регистр.Доходы"); //установить период выборки "30 ноября 2001 года" РегДоходы.ИспользоватьПериод(2001,11,30);
1. Метод Итог
Пример:
//получить доход за день по данному клиенту и данному товару Доход = РегДоходы.Итог(ТекКлиент, ТекТовар, "Доход");
2. Метод Итоги
Пример:
//получить доход за день по данному клиенту и данному товару РегДоходы.Итоги(ТекКлиент, ТекТовар); Доход = РегДоходы.Доход;
3. Метод СводныйИтог
Могут быть указаны не все измерения. Фиксируются только указанные измерения.
Пример:
//получить сводные итоги за день ДоходПоКлиенту = РегДоходы.СводныйИтог(ТекКлиент,,"Доход"); ДоходПоТовару = РегДоходы.СводныйИтог(,ТекТовар,"Доход");
4. Метод СводныеИтоги
Могут быть указаны не все измерения. Фиксируются только указанные измерения.
Пример:
//получить сводные итоги за день по клиенту РегДоходы.СводныеИтоги(ТекКлиент,); //указано только одно измерение ДоходПоКлиенту = РегДоходы.Доход; //получить сводные итоги за день по товару РегДоходы.СводныеИтоги(,ТекТовар); //указано только одно измерение ДоходПоТовару = РегДоходы.Доход;
Обращение к итогам регистра остатков
РегТовары = СоздатьОбъект("Регистр.Товары");
1. Метод Остаток
Пример:
//получить остаток данного товара на данном складе Колво = РегТовары.Остаток (ТекТовар, ТекСклад, "Количество"); //получить стоимость данного товара на данном складе Стоимость = РегТовары.Остаток (ТекТовар, ТекСклад, "Стоимость");
2. Метод Остатки
Пример:
//получить остаток данного товара на данном складе по кол-ву и по сумме РегТовары.Остатки (ТекТовар, ТекСклад); Колво = РегТовары.Количество; Стоимость = РегТовары.Стоимость;
3. Метод СводныйОстаток
Могут быть указаны не все измерения. Фиксируются только указанные измерения.
Пример:
//получить остаток данного товара на всех складах КолвоТовара = РегТовары.СводныйОстаток (ТекТовар,,"Количество"); СтоимостьТовара = РегТовары.СводныйОстаток (ТекТовар,,"Стоимость"); //получить стоимость всех товаров на данном складе СтоимостьПоСкладу = РегТовары.СводныйОстаток (,ТекСклад,"Стоимость");
4. Метод СводныеОстатки
Пример:
//получить сводные остатки по товару РегТовары.СводныеОстатки(ТекТовар,); //указано только одно измерение КолвоТовара = РегТовары.Количество; СтоимостьТовара = РегТовары.Стоимость; //получить стоимость всех товаров на данном складе РегТовары.СводныеИтоги(,ТекСклад); //указано только одно измерение СтоимостьПоСкладу = РегТовары.Стоимость;
Обращение к движениям регистра
РегТовары = СоздатьОбъект("Регистр.Товары"); РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон); Пока РегТовары.ПолучитьДвижение()=1 Цикл ........Сообщить("Дата движения " + Строка(РегТовары.ТекущийДокумент.ДатаДок)); ........Сообщить("Клиент: " + РегТовары.Клиент); ........Сообщить("Товар: " + РегТовары.Товар); ........Сообщить("Сумма: " + РегТовары.Доход); КонецЦикла;-
Фильтрация движений и итогов
РегТовары = СоздатьОбъект("Регистр.Товары");
1. Метод УстановитьФильтр
Пример:
//выбрать все движения по данному складу за период РегТовары.УстановитьФильтр(,ТекСклад); РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон); Пока РегТовары.ПолучитьДвижение()=1 Цикл ... КонецЦикла; //выбрать все товары на данном складе РегТовары.УстановитьФильтр(,ТекСклад); РегТовары.ВыбратьИтоги(); Пока РегТовары.ПолучитьИтог()=1 Цикл ... КонецЦикла;
2. Метод УстановитьЗначениеФильтра
Пример:
//выбрать все движения по данному складу за период РегТовары.УстановитьЗначениеФильтра("Склад", ТекСклад); //далее идет выборка движений или итогов
3. Метод ВыбратьДвиженияДокумента
4. Метод ВыбратьДвиженияСОстатками
Применяется только для регистра остатков.
Временный расчет регистров
Временный расчет регистров требуется, если нужно выбрать итоги или движения на определенную дату. По умолчанию итоги регистров выдаются на Точку актуальности.
РегТовары = СоздатьОбъект("Регистр.Товары"); РегДоходы = СоздатьОбъект("Регистр.Доходы"); //установка флага временного расчета для регистров РегТовары.ВременныйРасчет(1); РегДоходы.ВременныйРасчет(1);
1. Метод РассчитатьРегистрыНа
Рассчитать все регистры с установленным флагом временного расчета на начало события.
(на начало даты или на момент до проведения документа)
2. Метод РассчитатьРегистрыПо
Рассчитать все регистры с установленным флагом временного расчета на конец события.
(на конец даты или на момент после проведения документа)
Запрос к регистру
В запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам обязательно указывается Период.
ТекстЗапроса = " |Период С ДатаНач По ДатаКон; |Товар = Регистр.Доходы.Товар; |Клиент = Регистр.Доходы.Клиент; |Доход = Регистр.Доходы.Доход; |Условие (Товар = ТекТовар); |Группировка Клиент; |Функция ПриходПоКлиенту = Приход(Доход); |";
Комментарии