Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Волшебство программирования на 1С:Предприятие 7.7 Выпуск 9


Информационный Канал Subscribe.Ru

Волшебство программирования на 1С:Предприятие 7.7

Вступительное слово Волшебника

Приветствую подписчиков после долгих праздников. Надеюсь вы хорошо отдохнули и теперь можно приступить к самообразованию. Сегодня мы рассмотрим одну из самых важных тем - регистры. По моему скромному мнению, знать их должен каждый. Регистры - это одно из изобретений фирмы 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>...)
Пример: Регистр.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)

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. Метод РассчитатьРегистрыПо (<ГраницаРасчета>,<ГрафаОтбора>)
Рассчитать все регистры с установленным флагом временного расчета на конец события.
(на конец даты или на момент после проведения документа)

 

Запрос к регистру
В запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам обязательно указывается Период.

ТекстЗапроса = "
|Период С ДатаНач По ДатаКон;
|Товар = Регистр.Доходы.Товар;
|Клиент = Регистр.Доходы.Клиент;
|Доход = Регистр.Доходы.Доход;
|Условие (Товар = ТекТовар);
|Группировка Клиент;
|Функция ПриходПоКлиенту = Приход(Доход);
|";


Заключительное слово Волшебника

Официальный сайт рассылки: Информационные системы www.mista.ru
Архив рассылки находится по адресу: http://subscribe.ru/archive/comp.soft.prog.magic1c

В прошлых выпусках мы рассмотрели:

  1. Конфигурация "Мини-склад" (простейший складской учет)
  2. Конфигурация "Денежки" (учет семейных доходов и расходов)
  3. Конфигурация "Работенка" (поиск вакансий работодателей и резюме соискателей)
  4. Игра "Реверси" (классическая игра с элементами искусственного интеллекта)
  5. Конфигурация "Мини-библиотека" (учет книг и читателей)
  6. Программирование справочников
  7. Конфигурация "Почтальон Печкин" (почта + чат в среде 1С:Предприятие)
  8. Программирование документов

С уважением,
Волшебник Станислав

stasmit@mail.ru



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное