Волшебство
программирования на 1С:Предприятие 7.7 и 8.0
Выпуск
9 / 15.05.2002
Вступительное слово Волшебника
Приветствую
подписчиков после долгих праздников. Надеюсь вы хорошо отдохнули и теперь
можно приступить к самообразованию. Сегодня мы рассмотрим одну из самых
важных тем - регистры. По моему скромному мнению, знать их должен каждый.
Регистры - это одно из изобретений фирмы 1С, которое сильно продлевает
жизнь программистов. :)
Внимание, начинающие программисты! На сайте http://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>...)
Пример:
Регистр.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)
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. Метод
УстановитьФильтр
Синтаксис:
УстановитьФильтр(<Измерение1>,<Измерение2>...,<Рекв1>,<Рекв2>)
Пример:
//выбрать все движения по данному складу за
период
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьДвижения(ДатаНач,
ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1
Цикл
...
КонецЦикла;
//выбрать все товары на
данном
складе
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьИтоги();
Пока
РегТовары.ПолучитьИтог()=1 Цикл
...
КонецЦикла;
2. Метод
УстановитьЗначениеФильтра
Синтаксис:
УстановитьЗначениеФильтра(<Идентиф>,<Значен>,<Вариант>)
Пример:
//выбрать все движения по
данному складу за период
РегТовары.УстановитьЗначениеФильтра("Склад",
ТекСклад);
//далее идет выборка движений или итогов
...
3. Метод
ВыбратьДвиженияДокумента (<Документ>)
4. Метод
ВыбратьДвиженияСОстатками
(<ДатаКонца>,<ГрафаОтбора>)
Применяется только для регистра
остатков.
Временный
расчет регистров
Временный расчет
регистров требуется, если нужно выбрать итоги или движения на определенную
дату. По умолчанию итоги регистров выдаются на Точку
актуальности.
РегТовары =
СоздатьОбъект("Регистр.Товары");
РегДоходы =
СоздатьОбъект("Регистр.Доходы");
//установка
флага временного расчета для
регистров
РегТовары.ВременныйРасчет(1);
РегДоходы.ВременныйРасчет(1);
1. Метод
РассчитатьРегистрыНа(<ГраницаРасчета>,<ГрафаОтбора>)
Рассчитать
все регистры с установленным флагом временного расчета на начало события.
(на начало даты или на момент до проведения документа)
2. Метод
РассчитатьРегистрыПо
(<ГраницаРасчета>,<ГрафаОтбора>)
Рассчитать все регистры с
установленным флагом временного расчета на конец события.
(на конец
даты или на момент после проведения документа)
Запрос к
регистру
В
запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В
запросах к оборотным регистрам обязательно указывается Период.
ТекстЗапроса =
"
|Период С ДатаНач По ДатаКон;
|Товар =
Регистр.Доходы.Товар;
|Клиент = Регистр.Доходы.Клиент;
|Доход =
Регистр.Доходы.Доход;
|Условие (Товар = ТекТовар);
|Группировка
Клиент;
|Функция ПриходПоКлиенту = Приход(Доход);
|";
Заключительное слово Волшебника
Официальный сайт
рассылки: Информационные системы http://www.mista.ru/
Архив рассылки находится по
адресу: http://www.mista.ru/subscribe
В прошлых выпусках мы
рассмотрели:
- Конфигурация
"Мини-склад" (простейший складской учет)
- Конфигурация
"Денежки" (учет семейных доходов и расходов)
- Конфигурация
"Работенка" (поиск вакансий работодателей и резюме соискателей)
- Игра "Реверси"
(классическая игра с элементами искусственного интеллекта)
- Конфигурация
"Мини-библиотека" (учет книг и читателей)
- Программирование
справочников
- Конфигурация
"Почтальон Печкин" (почта + чат в среде 1С:Предприятие)
- Программирование
документов
С
уважением,
Волшебник Станислав
stasmit@mail.ru
<< Предыдущий
выпуск | Список
выпусков |
Следующий выпуск >>