d9e5a92d

РЕГИСТРЫ

Регистры - это таблицы для накопления оперативных данных и получения сводной информации.

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

    Рассчитать все регистры с установленным флагом временного расчета на конец события.

    (на конец даты или на момент после проведения документа)



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

    ТекстЗапроса =

    |Период С ДатаНач По ДатаКон;

    |Товар = Регистр.Доходы.Товар;

    |Клиент = Регистр.Доходы.Клиент;

    |Доход = Регистр.Доходы.Доход;

    |Условие (Товар = ТекТовар);

    |Группировка Клиент;

    |Функция ПриходПоКлиенту = Приход(Доход);

    |;

    Содержание раздела