Приветствую подписчиков после долгих праздников. Надеюсь вы хорошо отдохнули и теперь можно приступить к самообразованию. Сегодня мы рассмотрим одну из самых важных тем - регистры. По моему скромному мнению, знать их должен каждый. Регистры - это одно из изобретений фирмы 1С, которое сильно продлевает жизнь программистов. :)
Внимание,
начинающие программисты! На сайте www.mista.ru
есть Учебник по 1С, который в доступной форме объясняет базовые приемы программирования
со справочниками, документами, отчетами и другими объектами 1С:Предприятие.
Все главы проиллюстрированы простыми и наглядными примерами, что позволит вам
быстро и хорошо освоить среду 1С. Прочитайте этот учебник как можно скорее!
РЕГИСТРЫ
Народная
примета: если программист в девять утра уже на работе, значит, он еще на работе.
ЗАЧЕМ
НУЖНЫ РЕГИСТРЫ?
Регистры
- это таблицы для накопления оперативных данных и получения сводной информации.
Данные в
регистры добавляются только при проведении документов. Сведения из регистров
используются для формирования отчетов. Классическая схема использования регистров
в 1С:Предприятие выглядит следующим образом:
Документы
=> Регистры => Отчеты
ИЗМЕРЕНИЯ
И РЕСУРСЫ РЕГИСТРОВ
Основная
проблема при проектировании регистров - это определение его структуры. Структура
регистра должна быть такова, чтобы извлекать из него нужную информацию без утомительной
обработки.
Измерения
регистра - это то, в каких разрезах требуется хранение информации.
Ресурсы регистра - это количественные или суммовые данные, которые хранятся
в регистре.
Предположим,
что регистр «Остатки товаров» должен содержать сведения о количестве и стоимости
каждого товара на каждом складе. В идеологии системы 1С:Предприятие регистр
такого вида представляет собой прямоугольную систему координат на одной оси
которой находятся склады, на другой — товары, а на пересечении конкретного склада
и конкретного товара находятся цифры количества товара и стоимости товара.
Регистр:
Остатки товаров
Измерения: Товар, Склад
Ресурсы: Кол-во, Стоимость
С помощью
методов встроенного языка мы можем легко получить ответы на вопросы:
остаток
конкретного товара на конкретном складе
остаток
конкретного товара на всех складах
стоимость
всех товаров на конкретном складе
ДВИЖЕНИЯ
В РЕГИСТРАХ
В табличном
виде регистр ОстаткиТоваров представляется следующим образом:
Товар
Склад
Кол-во
Стоимость
приход
Товар4
Склад1
15
200
расход
Товар4
Склад1
10
100
приход
Товар4
Склад1
5
50
...
...
...
...
...
Одна
строка из этой таблицы называется "движение". Движения в регистрах
создаются только при проведении документов. В регистре, кроме измерений и
ресурсов, можно задать реквизиты. Реквизиты - это дополнительные сведения,
сопровождающие движение. Методами встроенного языка можно отбирать движения
с заданным значением реквизита.
ВИДЫ
РЕГИСТРОВ
В системе
1С:Предприятие возможно использование регистров двух типов: регистры остатков
и регистры оборотов. Разница между ними понятна из их названия и заключается
в характере хранимой информации: в регистрах остатков всегда хранится информация
о конечном состоянии средств, а в регистрах оборотов, образно выражаясь, —
как это состояние было достигнуто.
Если из
регистра нужно быстро получать остаток чего-либо на текущий момент, тогда
нужно сделать регистр остатков. Если из регистра нужно быстро получать приход
или расход чего-либо за период, тогда нужно сделать оборотный регистр.
РЕГИСТРЫ
ОСТАТКОВ
Рассмотрим
в качестве примера отслеживание взаиморасчетов с покупателями товаров, которые
производит или продает предприятие.
Для того
чтобы оперативно получать информацию о взаимной задолженности предприятия и
покупателя, потребуется регистр «Взаиморасчеты», в котором для каждого покупателя
будет храниться сумма задолженности. При совершении хозяйственной операции состояние
регистра будет соответствующим образом изменяться, каждый раз отражая текущее
состояние взаиморасчетов. Регистр «Взаиморасчеты» — это регистр остатков.
ОБОРОТНЫЕ
РЕГИСТРЫ
Однако,
легко получить информацию об объеме закупок, совершенных данным покупателем
за какой-либо период времени, из регистра «Взаиморасчеты» нельзя. Можно проанализировать
все движения, имеющие отношение к данному покупателю, и вычислить общую сумму
закупок. Но, когда необходимо получать эти сведения оперативно (например, по
условиям договора при достижении определенного объема закупок покупателю должна
предоставляться скидка), такой способ, конечно же, не подходит.
В этом случае
решением проблемы может быть использование регистра оборотов. В таком
регистре — назовем его «Объем закупок» — в разрезе покупателей будет храниться
информация об объеме закупок (об обороте покупателя). При создании регистра
оборотов можно указывать, с какой периодичностью будет накапливаться информация:
день, неделя, месяц и так далее.
Теперь,
при совершении хозяйственных операций, необходимо будет изменять не только состояние
регистра «Взаиморасчеты», но и регистр «Объем закупок». В этот регистр при совершении
клиентом каждой покупки будет заноситься информация о сумме покупки. В результате
в регистре «Объем закупок» будет постоянно накапливаться информация об общем
объеме закупок клиента.
Основы
программирования
Регистры,
используемые в примерах:
Оборотный регистр
Доходы
Хранит доходы от продаж за день в разрезе клиентов и товаров.
Измерения: Клиент, Товар Ресурсы: Доход Реквизиты: нет Периодичность: День
Регистр остатков
Товары
Хранит остатки товаров на каждом складе в количественном и суммовом выражении.
Измерения: Товар, Склад Ресурсы: Количество, Стоимость Реквизиты: нет
Запись
движений в оборотный регистр (только
при проведении документа)
1. Метод ДвижениеПриход
Синтаксис: ДвижениеПриход(<Измерение1>,<Измерение2>...,<Ресурс1>,<Ресурc2>...)
Пример: Регистр.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)
РегДоходы
= СоздатьОбъект("Регистр.Доходы");
//установить
период выборки "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. Метод УстановитьФильтр
Синтаксис: УстановитьФильтр(<Измерение1>,<Измерение2>...,<Рекв1>,<Рекв2>)
Пример:
//выбрать
все движения по данному складу за период
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
...
КонецЦикла;
//выбрать все товары на данном складе
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьИтоги();
Пока РегТовары.ПолучитьИтог()=1 Цикл
...
КонецЦикла;
2. Метод УстановитьЗначениеФильтра Синтаксис: УстановитьЗначениеФильтра(<Идентиф>,<Значен>,<Вариант>)
Пример:
//выбрать
все движения по данному складу за период
РегТовары.УстановитьЗначениеФильтра("Склад", ТекСклад);
//далее идет выборка движений или итогов
...
3. Метод ВыбратьДвиженияДокумента
(<Документ>)
4. Метод ВыбратьДвиженияСОстатками (<ДатаКонца>,<ГрафаОтбора>)
Применяется только для регистра
остатков.
Временный
расчет регистров
Временный расчет регистров
требуется, если нужно выбрать итоги или движения на определенную дату. По умолчанию
итоги регистров выдаются на Точку актуальности.
//установка
флага временного расчета для регистров
РегТовары.ВременныйРасчет(1);
РегДоходы.ВременныйРасчет(1);
1. Метод РассчитатьРегистрыНа(<ГраницаРасчета>,<ГрафаОтбора>)
Рассчитать все регистры с установленным флагом временного расчета на начало
события.
(на начало даты или на момент до проведения документа)
2. Метод РассчитатьРегистрыПо (<ГраницаРасчета>,<ГрафаОтбора>)
Рассчитать все регистры с установленным флагом временного расчета на конец события.
(на конец даты или на момент после проведения документа)
Запрос
к регистру
В запросах к регистрам
применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам
обязательно указывается Период.