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