Опубликовано: 18.07.2022

Работа с регистрами оперативного учёта

Регистры — это специфический инструмент системы «1С:Предприятие», средство накопления сводной информации. Регистры являются внутренним инструментом конфигурации, к которым нет непосредственного доступа через интерфейс пользователя. Информация о результатах хозяйственных операций, которая появляется при оформлении документов, накапливается в регистрах при «проведении» документов, а отображение информации, содержащейся в регистрах, осуществляется при помощи формирования отчётов.

Рассмотрим основные моменты работы с данным инструментом:

Общие сведения о регистрах

Типы регистров

В системе «1С:Предприятие» возможно использование регистров двух типов: регистры остатков и регистры оборотов, различающиеся полнотой учёта и скоростью доступа к информации. Регистры остатков (быстрые регистры) хранят информацию о состоянии средств на момент времени и используются в основном для определения остатков товаров или сумм задолженностей. Регистры же оборотов (регистры с полной аналитикой) хранят информацию об изменении средств за период и используются преимущественно для определения объёмов закупок или продаж и сумм себестоимости товара.

Структура регистров

Самое главное при создании регистров — это определение их структуры. Структура регистра должна быть такова, чтобы извлекать из него требуемую информацию практически сразу, без утомительной обработки. Основные компоненты структуры регистров — это измерения и ресурсы.

Ресурсами регистра могут являться любые категории учёта, которые могут быть представлены в числовом виде, такие как: «количество товара», «долг клиента», «сумма наличных» и т.п.

Измерения же регистра — это то, в каких разрезах требуется хранение информации (например, в разрезе номенклатуры, складов, сотрудников, контрагентов и т.д.). В простейшем случае измерения регистра визуально можно представить себе как оси координат, на пересечении которых регистр хранит конкретные значения ресурсов.

Структура регистра

Кроме измерений и ресурсов, для регистра можно также задать реквизиты, предназначенные для хранения дополнительных сведений, сопровождающих движения и выполняющих роль комментариев. В последующем методами встроенного язык можно будет отбирать движения с заданным значением реквизита.

Особенности работы с регистрами

В отличие от документов и справочников, которые представлены конкретными объектами в информационной базе, регистр является механизмом для работы с итогами. Вследствие этого атрибуты регистра не являются свойствами некоторого объекта, а используются лишь как служебные переменные для манипуляции измерениями, ресурсами и реквизитами регистра при помощи соответствующих методов. Для каждого метода определяется, каким образом он использует атрибуты регистров. Следует обратить внимание, что ресурсы регистров принимают различное смысловое значение в зависимости от конкретной операции, выполняемой с регистром. Например, при записи движения регистра при помощи методов: ДвижениеПриходВыполнить(), ДвижениеРасходВыполнить() и т.п. в ресурс регистра следует записывать приращение, которое будет изменять содержимое регистра, а при считывании итогов регистра (Остатки(), ОстаткиПолучить() и т.п.) ресурсы регистра содержат остаток (итоговые значения) содержимого регистров.

Под термином «остаток» ресурса для регистра остатков следует понимать числовое значение, которое имеет ресурс на какой-то момент времени. Именно здесь и проявляется понятие точки актуальности (далее ТА). ТА — это тот момент времени (дата и время), на который все необоротные регистры содержат текущие значения своих ресурсов. Другими словами, если просто запросить у регистра остатков значение какого-либо ресурса, то он выдаст его именно на момент ТА. Если необходимо узнать значение ресурса на какой-либо прошедший момент времени, то надо, либо сдвинуть в прошлое ТА (для этого используется интерактивная операция «Управления итогами»), либо при помощи средств встроенного языка следует запустить «временный расчёт» регистра. При «временном расчёте» регистра остатков можно задать момент времени, на который необходимо получить значение ресурса. В этом случае значение ресурса рассчитывается, что требует несколько большего времени процессора, чем если получать ресурс на ТА. Однако «временный расчёт» рассчитывается не с начала всех времён, а от начала месяца. Регистры остатков хранят промежуточные значения ресурсов на начало каждого месяца (именно с этим связана процедура «переход на новый период»). Таким образом, если при «временном расчёте» указать момент времени в начале месяца, то, в общем случае, расчёт будет выполнен быстрее, чем если указать конец месяца.

Кроме хранения остатка или оборота ресурсов, регистры хранят все «приращения» (приход со знаком «+», расход со знаком «-»), произведённые документами (это обозначается термином «движения регистра»). Причём, эти «приращения» регистров хранятся со ссылками на те документы, которые их вызвали. Поэтому, во встроенном языке системы «1С:Предприятие» есть методы, чтобы получить из регистра все его движения (с привязкой к документам), указав интервал времени, за который они нужны.

Документы, как объекты прикладной задачи, тесно связаны с регистрами. Именно документы, и только они могут изменять значения ресурсов в регистрах (этот алгоритм прописывается в предопределённой процедуре ОбработкаПроведения() для каждого вида документа). Никаким другим способом, кроме как через проведение документов на содержимое регистров повлиять нельзя. Например, нельзя создать отчёт, который бы изменял значения, хранящиеся в регистрах. Движения (приращения) регистров выполняются в момент «проведения» документа. С другой стороны, документы не порождают в регистрах необратимых действий. Что это значит? Если ранее проведённый документ удалить или сделать его непроведённым, то удалятся и все движения регистров, порождённые им. Если отредактировать (изменить) ранее проведённый документ, то после перепроведения документа все движения регистров, порождённые ранее, удалятся и заменятся новыми.

Примечание: Формирование движений документов по регистрам доступно только в Модуле документа в системной предопределённой процедуре ОбработкаПроведения().

Контекст работы с регистрами

В синтаксисе языка применение атрибутов и вызов методов регистров может выполняться двумя способами. Во-первых, средства языка предоставляют возможность непосредственного доступа к атрибутам и методам регистров, объявленных в Конфигураторе в любом программном модуле (все объявленные в Конфигураторе регистры принадлежат глобальному контексту конфигурации). Во всех текстах программных модулей доступ к атрибутам, вызовы методов регистров можно записывать просто через точку после полного имени регистра:

Флаг = Регистр.ОстаткиТовара.Приход;

Во-вторых, во всех программных модулях доступ к атрибутам и методам регистров может выполняться при помощи переменной со ссылкой на объект типа "Регистр". Объект создаётся функцией СоздатьОбъект(), а ссылка на объект присваивается переменной. Чтобы вызвать атрибут или метод объекта, имя этого атрибута или метода (с указанием необходимых параметров) пишется через точку после имени переменной.

При создании объекта типа "Регистр", в качестве названия регистра обязательно должно выступать полное имя конкретного регистра, как оно объявлено в Конфигураторе. Вид регистра записывается через точку после ключевого слова «Регистр» (англ. синоним — «Register»):

Рег = СоздатьОбъект("Регистр.ОстаткиТовара");

Атрибуты регистров

Выяснить, является ли текущее движение регистра остатков приходом, позволяет атрибут Приход (англоязычный синоним — Income). Атрибут принимает числовое значение 1, если текущее движение регистра является приходом, или 0, если нет. Данный атрибут доступен только для чтения и используется только при обращении к существующим записям движений регистров. Для оборотных регистров атрибут смысла не имеет.

Пример использования:

Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
   Рег1.УстановитьФильтр(Клиент);
   Рег1.ВыбратьДвижения(ДатаНачало, );
   Пока Рег1.ПолучитьДвижение()>0 Цикл
      Если Число(Рег1.Клиент.Код) <> Число(Запрос.Клиент.Код) Тогда
         Продолжить;
      КонецЕсли;
      Док = Рег1.ТекущийДокумент();
      Дв_Баз_Сум = Рег1.СуммаБазовая;
      Дв_Вал_Сум = Рег1.СуммаВалютная;
      Если Рег1.Приход = 1 Тогда
         Таб.ВывестиСекцию("Приход");
      Иначе
         Таб.ВывестиСекцию("Расход");
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Выяснить, является ли текущее движение регистра остатков расходом, позволяет атрибут Расход (англоязычный синоним — Outcome). Атрибут принимает числовое значение 1, если текущее движение регистра является расходом, или 0, если нет. Данный атрибут доступен только для чтения и используется только при обращении к существующим записям движений регистров. Для оборотных регистров атрибут смысла не имеет.

Пример использования:

Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
   Рег1.УстановитьФильтр(Клиент);
   Рег1.ВыбратьДвижения(ДатаНачало, );
   Пока Рег1.ПолучитьДвижение()>0 Цикл
      Если Число(Рег1.Клиент.Код) <> Число(Запрос.Клиент.Код) Тогда
         Продолжить;
      КонецЕсли;
      Док = Рег1.ТекущийДокумент();
      Дв_Баз_Сум = Рег1.СуммаБазовая;
      Дв_Вал_Сум = Рег1.СуммаВалютная;
      Если Рег1.Расход = 1 Тогда
         Таб.ВывестиСекцию("Расход");
      Иначе
         Таб.ВывестиСекцию("Приход");
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Задать значение выбранному измерению регистра позволяет атрибут <ИмяИзмерения>. В тексте программного модуля в качестве имени атрибута используется название конкретного измерения регистра, как оно названо в Конфигураторе.

Пример использования:

Процедура ОбработкаПроведения()
   // В регистре "ТовЗап" измерениями являются "Склад" и "Товар"
   // ресурсами являются "Количество" и "Стоимость"
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Задать значение выбранному ресурсу регистра позволяет атрибут <ИмяРесурса>. В тексте программного модуля в качестве имени атрибута используется название конкретного ресурса регистра, как он назван в Конфигураторе.

Пример использования:

Процедура ОбработкаПроведения()
   // В регистре "ТовЗап" измерениями являются "Склад" и "Товар"
   // ресурсами являются "Количество" и "Стоимость"
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Задать значение выбранному реквизиту регистра позволяет атрибут <ИмяРеквизита>. В тексте программного модуля в качестве имени атрибута используется название конкретного реквизита регистра, как он назван в Конфигураторе.

Пример использования:

Процедура ОбработкаПроведения()
   // В регистре "ТовЗап" измерениями являются "Склад" и "Товар"
   // ресурсами являются "Количество" и "Стоимость"
   // реквизитом является "ВнутрПеремещение"
   Регистр.ТовЗап.Склад = Склад;
   Если Вид() = "Перемещение" Тогда
      Регистр.ТовЗап.ВнутрПеремещение = 1;
   Иначе
      Регистр.ТовЗап.ВнутрПерсмещение = 0;
   КонецЕсли;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Методы регистров остатков

Получить остаток указанного ресурса регистра позволяет метод Остаток() (англоязычный синоним — Rest()). Данный метод используется только для регистров остатков.

Синтаксис метода:

Остаток(<Измерение1>, <Измерение2>..., <ИмяРесурса>)

где

  • <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра;
  • <ИмяРесурса> — строковое выражение, содержащее название требуемого ресурса регистра, как оно задано в Конфигураторе.

Пример использования:

Процедура ПолучитьОстаток(Товар, Склад, Ост, Стоим)
   Ост = Регистр.УчетТовара.Остаток(Товар, Склад, "ОстаткиТовара");
   Стоим = Регистр.УчетТовара.Остаток(Товар, Склад, "СтоимостьТовара");
КонецПроцедуры

Получить сводный остаток указанного ресурса регистра по нескольким измерениям позволяет метод СводныйОстаток() (англоязычный синоним — ConsolidatedRest()). Данный метод работает аналогично методу Остаток(), однако здесь можно задавать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения. Метод используется только для регистров остатков.

Синтаксис метода:

СводныйОстаток(<Измерение1>, <Измерение2>..., <ИмяРесурса>)

где

  • <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра. Можно указывать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения;
  • <ИмяРесурса> — строковое выражение, содержащее название требуемого ресурса регистра, как оно задано в Конфигураторе.

Пример использования:

Процедура ПолучитьСводныйОстаток(Товар, Ост)
   // Для регистра с измерениями "Товар", "Склад", "МОЛ" ресурс "ОстатокТовара" будет
   // получен только по одному товару, но по всем складам и всем МОЛам
   Ост = Регистр.УчетТовара.СводныйОстаток(Товар, , , "ОстаткиТовара");
КонецПроцедуры

Извлечь по переданным в качестве параметров измерениям все ресурсы по регистру позволяет метод Остатки() (англоязычный синоним — Rests()). Полученные ресурсы затем можно считывать из атрибутов регистра. Метод используется только для регистров остатков.

Синтаксис метода:

Остатки(<Измерение1>, <Измерение2>...)

где <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра.

Пример использования:

Процедура ПолучитьОстатки(Товар, Склад, ОстатокТовара, Стоимость)
   Регистр.УчетТовара.Остатки(Товар, Склад);
   ОстатокТовара = Регистр.УчетТовара.ОстаткиТовара;
   Стоимость = Регистр.УчетТовара.СтоимостьТовара;
КонецПроцедуры

Извлечь по переданным в качестве параметров измерениям все ресурсы по регистру позволяет метод СводныеОстатки() (англоязычный синоним — ConsolidatedRests()). Метод работает аналогично методу Остатки(), однако здесь можно задавать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения. Полученные ресурсы затем можно считывать из атрибутов регистра. Метод используется только для регистров остатков.

Синтаксис метода:

СводныеОстатки(<Измерение1>, <Измерение2>...)

где <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра. Можно задавать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения.

Пример использования:

Процедура ПолучитьСводныеОстатки(Товар, ОстатокТовара, Стоимость)
   // Для регистра с измерениями "Товар", "Склад", "МОЛ" ресурсы будут
   // получены только по одному товару, но по всем складам и всем МОЛам
   Регистр.УчетТовара.СводныеОстатки(Товар, , );
   ОстатокТовара = Регистр.УчетТовара.ОстаткиТовара;
   Стоимость = Регистр.УчетТовара.СтоимостьТовара;
КонецПроцедуры

Извлечь все ресурсы регистра по измерениям, содержащимся в атрибутах, позволяет метод ОстаткиПолучить() (англоязычный синоним — GetRests()). Полученные ресурсы затем можно считывать из атрибутов регистра. Параметры у метода отсутствуют. Данный метод используется только для регистров остатков.

Пример использования:

Регистр.Взаиморасчеты.Клиент = Конт.Клиент;
Регистр.Взаиморасчеты.ОстаткиПолучить();
Сообщить("Долг клиента по взаиморасчетам = " + СокрЛ(Регистр.Взаиморасчеты.СуммаВалютная));

Открыть выборку всех движении регистра в указанном интервале дат позволяет метод ВыбратьДвиженияСОстатками() (англоязычный синоним — SelectActsWithRests()). До вызова данной процедуры может быть установлен фильтр (методом УстановитьФильтр()), ограничивающий выборку значений из регистра. Если конец выборки не указан или равен 0, то концом временного интервала выбора движений регистра считается ТА.

Данный метод отличается от метода ВыбратьДвижения() тем, что после получения очередного движения метод Остаток() будет выдавать актуальные значения остатков для этого регистра. Но для этого перед вызовом метода ВыбратьДвиженияСОстатками() регистру должен быть установлен признак временного расчёта (см. описание метода ВременныйРасчет()) и должен быть выполнен временный расчёт (см. описание методов РассчитатьРегистрыНа() и РассчитатьРегистрыПо()) — его дата и будет являться начальной датой выбираемых движений регистра. Данная возможность не может быть использована совместно с дальнейшими «временными» расчётами.

Метод ВыбратьДвиженияСОстатками() используется только для регистров остатков. Собственно выбор первого и последующих движений регистра осуществляется методом ПолучитьДвижение().

Синтаксис метода:

ВыбратьДвиженияСОстатками(<КонецВыборки>, <ГрафаОтбора>)

где

  • <КонецВыборки> — выражение типа "Дата", документ или позиция документа задающее конец временного интервала выбора движений регистра;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) — не использовать графу отбора.

Пример использования:

Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
   Прих = 0;
   Расх = 0;
   Если Рег.Приход = 1 Тогда
      Прих = Рег.Долг;
   Иначе
      Расх = Рег.Долг;
   КонецЕсли;
   ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
   Док = Рег.ТекущийДокумент();
   Таб.ВывестиСекцию("Документ");
КонецЦикла;

Методы оборотных регистров

Установить период выборки итогов оборотного регистра позволяет метод ИспользоватьПериод() (англоязычный синоним — UseРеriod()). Данный метод используется до вызова методов оборотных регистров. Дальнейшая выборка итогов будет происходить по указанному периоду. Если при работе с оборотным регистром этот метод опущен, то по умолчанию используется текущий период, в котором находится ТА.

Метод имеет несколько синтаксисов вызова. Выбор конкретного синтаксиса данного метода зависит от заданного в Конфигураторе интервала оборотного регистра:

// Синтаксис 1 (интервалы День и Неделя):
ИспользоватьПериод(<Дата>)

// Синтаксис 2 (интервал День):
ИспользоватьПериод(<Год>, <Месяц>, <День>)

// Синтаксис 3 (интервал Неделя):
ИспользоватьПериод(<Год>, <НомерНедели>)

// Синтаксис 4 (интервал Декада):
ИспользоватьПериод(<Год>, <Месяц>, <НомерДекады>)

// Синтаксис 5 (интервал Месяц):
ИспользоватьПериод(<Год>, <Месяц>)

// Синтаксис 6 (интервал Квартал):
ИспользоватьПериод(<Год>, <НомерКвартала>)

// Синтаксис 7 (интервал Год):
ИспользоватьПериод(<Год>)

где

  • <Дата> — выражение типа "Дата";
  • <Год> — числовое выражение, содержащее номер года;
  • <Месяц> — числовое выражение, содержащее номер месяца;
  • <День> — числовое выражение, содержащее номер дня месяца;
  • <НомерНедели> — числовое выражение, содержащее номер недели года;
  • <НомерДекады> — числовое выражение, содержащее номер декады месяца;
  • <НомерКвартала> — числовое выражение, содержащее номер квартала.

Пример записи метода:

Регистр.ОборотыТоваров.ИспользоватьПериод(1996);

Получить итог по ранее установленному периоду указанного ресурса оборотного регистра позволяет метод Итог() (англоязычный синоним — Total()). Данный метод используется только для оборотных регистров.

Синтаксис метода:

Итог(<Измерение1>, <Измерение2>..., <ИмяРесурса>)

где

  • <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра;
  • <ИмяРесурса> — строковое выражение, содержащее название требуемого ресурса регистра, как он назван в Конфигураторе.

Пример использования:

Функция ПолучитьИтог(Товар, Склад, Год)
   Регистр.ОборотыТоваров.ИспользоватьПериод(Год);
   Возврат Регистр.ОборотыТоваров.Итог(Товар, Склад, "ОборотТовара");
КонецФункции

Извлечь итоги по всем ресурсам по ранее установленному периоду оборотного регистра позволяет метод Итоги() (англоязычный синоним — Totals()). Полученные итоги ресурсов затем можно считывать из атрибутов регистра. Данный метод может использоваться только для оборотного регистра.

Синтаксис метода:

Итоги(<Измерение1>, <Измерение2>...)

где <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра.

Пример использования:

Регистр.ОборотыТоваров.ИспользоватьПериод(Год);
Регистр.ОборотыТоваров.Итоги(Товар, Склад);
ОбТов = Регистр.ОборотыТоваров.ОборотТовара;

Получить сводный итог указанного ресурса оборотного регистра позволяет метод СводныйИтог() (англоязычный синоним — ConsolidatedTotal()). Данный метод работает аналогично методу Итог(), однако здесь можно задавать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения. Данный метод используется только для оборотных регистров.

Синтаксис метода:

СводныйИтог(<Измерение1>, <Измерение2>..., <ИмяРесурса>)

где

  • <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра. Можно задавать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения;
  • <ИмяРесурса> — строковое выражение, содержащее название требуемого ресурса регистра, как он назван в Конфигураторе.

Пример использования:

Функция ПолучитьСводныйИтог(Товар, Год)
   Регистр.ОборотыТоваров.ИспользоватьПериод(Год);
   Возврат Регистр.ОборотыТоваров.СводныйИтог(Товар, , "ОборотТовара");
КонецФункции

Извлечь по переданным в качестве параметров измерениям сводные итоги всех ресурсов оборотного регистра позволяет метод СводныеИтоги() (англоязычный синоним — ConsolidatedTotals()). Метод работает аналогично методу Итоги(), однако здесь можно задать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения. Полученные ресурсы затем можно считывать из атрибутов регистра. Метод используется только для оборотных регистров.

Синтаксис метода:

СводныеИтоги(<Измерение1>, <Измерение2>...)

где <Измерение1>, <Измерение2>, … — выражения, содержащие значения измерений регистра. Можно задать не все значения измерений, а только некоторые, но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения.

Пример использования:

Регистр.ОборотыТоваров.ИспользоватьПериод(Год);
Регистр.ОборотыТоваров.СводниеИтоги(Товар, );
ПолныйОбТов = Регистр.ОборотыТоваров.ОборотТовара;

Извлечь все итоги ресурсов оборотного регистра по измерениям, содержащимся в атрибутах, позволяет метод ИтогиПолучить() (англоязычный синоним — GetTotals()). Полученные ресурсы затем можно считывать из атрибутов регистра. Параметры у метода отсутствуют. Метод используется только для оборотных регистров.

Пример использования:

Регистр.ОборотыТоваров.Товар = Конт.Товар;
Регистр.ОборотыТоваров.Склад = Конт.Склад;
Регистр.ОборотыТоваров.ИтогиПолучить();
Сообщить("Оборот товара = " + Регистр.ОборотыТоваров.ОборотТовара);

Общие методы регистров

Методы для получения общей информации о регистрах

Определить название вида регистра, как оно задано в Конфигураторе, позволяет метод Вид() (англоязычный синоним — Kind()). Параметры у метода отсутствуют. Возвращаемым значением метода является строковое значение, содержащее название вида регистра.

Пример использования:

Состояние(Рег1.Вид());

Получить пользовательское представление вида регистра, как оно задано в Конфигураторе, позволяет метод ПредставлениеВида() (англоязычный синоним — KindPresent()). Параметры у метода отсутствуют. Возвращаемым значением метода является строковое значение, содержащее пользовательское представление вида регистра (синоним регистра или, если он пустой, то идентификатор).

Пример использования:

Состояние(Рег1.ПредставлениеВида());

Методы для работы с атрибутами регистров

Назначить тип для реквизита, которому в Конфигураторе назначен тип "Неопределенный", позволяет метод НазначитьТип() (англоязычный синоним — SetType()).

Синтаксис метода:

НазначитьТип(<ИмяРеквизита>, <ИмяТипа>, <Длина>, <Точность>)

где

  • <ИмяРеквизита> — строковое выражение, содержащее название реквизита регистра неопределённого типа, как он назван в Конфигураторе;
  • <ИмяТипа> — строковое выражение, содержащее название типа данных (или вид субконто), который назначается реквизиту регистра, например, "Строка", "Число", "Справочник.Товары", "Документ.РасходнаяНакладная" и т.п.;
  • <Длина> — числовое выражение, определяющее длину поля представления данных. Параметр является необязательным и имеет смысл только при задании числового или строкового типа;
  • <Точность> — числовое выражение, определяющее число знаков числа после десятичной точки. Параметр является необязательным и имеет смысл только при задании числового типа.

Пример использования:

Регистр.УчетТМЦ.НазначитьТип("ТМЦ", "Справочник.Товары");

Установить значение атрибута по идентификатору позволяет метод УстановитьАтрибут() (англоязычный синоним — SetAttrib()).

Синтаксис метода:

УстановитьАтрибут(<ИмяРеквизита>, <3начение>)

где

  • <ИмяРеквизита> — строковое выражение, содержащее имя атрибута, как он назван в Конфигураторе;
  • <3начение> — выражение, содержащее устанавливаемое значение атрибута.

Пример использования:

Рег.УстановитьАтрибут("Сумма", СуммаТов);

Получить значение атрибута по идентификатору позволяет метод ПолучитьАтрибут() (англоязычный синоним — GetAttrib()). Возвращаемым значением метода является значение атрибута.

Синтаксис метода:

ПолучитьАтрибут(<ИмяРеквизита>)

где <ИмяРеквизита> — строковое выражение, содержащее имя атрибута, как он назван в Конфигураторе.

Пример использования:

Рег.ПолучитьАтрибут("Сумма");

Методы для просмотра движений и итогов регистра в цикле

Установить порядок выборки движений регистра позволяет метод ОбратныйПорядок() (англоязычный синоним — BackwardOrder()). Данный метод обычно используется до вызова методов ВыбратьДвижения(), ВыбратьДвиженияСОстатками() и т.п., которые фактически открывают выборку. Дальнейшая выборка при помощи метода ПолучитьДвижение() будет происходить в заданном порядке выборки. Возвращаемым значением метода является текущее значение режима порядка выборки документов (на момент до исполнения метода). Кстати, в тексте программного модуля возможно использование данного метода как процедуры или как функции.

Примечание: По умолчанию, выборка движения документов выполняется в порядке возрастания даты и времени записи документов. Поэтому реально имеет смысл применять данный метод только в том случае, если надо получить обратный порядок выборки.

Синтаксис метода:

ОбратныйПорядок(<Режим>)

где <Режим> — числовое выражение, определяющее режим выборки. Возможные значения: 1 – выбирать движения документов в обратном порядке даты и времени; 0 – выбирать движения документов в порядке возрастания даты и времени.

Пример использования:

Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
   Рег1.УстановитьФильтр(Клиент);
   // Открываем выборку
   Рег1.ОбратныйПорядок(1);
   Рег1.ВыбратьДвижения(ДатаНачало, );
   // Цикл выбора движений по регистру
   Пока Рег1.ПолучитьДвижение() > 0 Цикл
      Если Строка(Рег1.Клиент.Код) <> Строка(Запрос.Клиент.Код) Тогда
         Продолжить;
      КонецЕсли;
      Док = Рег1.ТекущийДокумент();
      Дв_Баз_Сум = Рег1.СуммаБазовая;
      Дв_Вал_Сум = Рег1.СуммаВалютная;
      Если Рег1.Расход = 1 Тогда
         Таб.ВывестиСекцию("Расход2");
      Иначе
         Таб.ВывестиСекцию("Приход2");
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Открыть выборку всех движений регистра в указанном интервале дат позволяет метод ВыбратьДвижения() (англоязычный синоним — SelectActs()). До вызова данной процедуры может быть установлен фильтр (см. описание метода УстановитьФильтр()), ограничивающий выборку значений из регистра. Собственно выбор первого и последующих движений регистра осуществляется методом ПолучитьДвижение().

Синтаксис метода:

ВыбратьДвижения(<НачалоВыборки>, <КонецВыборки>, <ГрафаОтбора>)

где

  • <НачалоВыборки> — выражение типа "Дата", документ или позиция документа, задающее начало временного интервала выбора движений регистра;
  • <КонецВыборки> — выражение типа "Дата", документ или позиция документа, задающее конец временного интервала выбора движений регистра. Параметр является необязательным. Если конец выборки не указан или равен 0, то концом временного интервала выбора движений регистра считается ТА;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) – не использовать графу отбора.

Пример использования:

Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
   Рег1.УстановитьФильтр(Клиент);
   Рег1.ВыбратьДвижения(ДатаНачало, );
   Пока Рег1.ПолучитьДвижение() > 0 Цикл
      Док = Рег1.ТекущийДокумент();
      Дв_Баз_Сум = Рег1.СуммаБазовая;
      Дв_Вал_Сум = Рег1.СуммаВалютная;
      Если Рег1.Расход = 1 Тогда
         Таб.ВывестиСекцию("Расход2");
      Иначе
         Таб.ВывестиСекцию("Приход2");
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Открыть выборку всех движений регистра по указанному документу позволяет метод ВыбратьДвиженияДокумента() (англоязычный синоним — SelectDocActs()). Возвращаемым значением метода является число 1, если действие выполнено и в выборке есть хотя бы один элемент, или 0, если действие не выполнено или в выборке нет ни одного элемента. Собственно выбор первого и последующих движений регистра осуществляется методом ПолучитьДвижение().

Синтаксис метода:

ВыбратьДвиженияДокумента(<Документ>)

где <Документ> — значение типа "Документ".

Пример использования:

Процедура Взаиморасчеты(ВыбКлиент, ДатаНачало, ДатаКонец)
   // Создание Таблицы для выходного отчета
   Заг = "Неизвестно.";
   Таб = СоздатьОбъект("Таблица");
   Клн = СоздатьОбъект("Справочник.Клиенты");
   Клн.ИспользоватьДату(ДатаКонец);
   Док = СоздатьОбъект("Документ");
   Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
   Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
   Рег.ВременныйРасчет();
   РассчитатьРегистрыНа(ДатаКонец);
   Если ВыбКлиент.Выбран() = 0 Тогда
      // Без условий
      Заг = "По всем клиентам.";
   ИначеЕсли ВыбКлиент.ЭтоГруппа() = 1 Тогда
      Клн.ВключатьПодчиненные(ВыбКлиент);
      Клн.ИспользоватьРодителя(ВыбКлиент);
      Заг = "По клиентам группы " + ВыбКлиент.Наименование;
   Иначе
      Предупреждение("Выберите группу клиентов!");
      Возврат;
   КонецЕсли;
   Таб.ВывестиСекцию("Отчет");
   Клн.ВыбратьЭлементы();
   Пока Клн.ПолучитьЭлемент() > 0 Цикл
      Если Клн.ЭтоГруппа() = 1 Тогда
         Таб.ВывестиСекцию("Группа");
      Иначе
         Рег.Клиент = Клн.ТекущийЭлемент();
         Рег.ОстаткиПолучить();
         Баз_сум = Рег.СуммаБазовая;
         Вал_сум = Рег.СуммаВалютная;
         Таб.ВывестиСекцию("Клиент");
         // цикл по всем документам
         Док.ВыбратьДокументы(ДатаНачало, ДатаКонец);
         Пока Док.ПолучитьДокумент() > 0 Цикл
            // отфильтруем документы
            Если (Док.Вид() = "Перемещение") ИЛИ (Док.Вид() = "Счет") ИЛИ
             (Док.Вид() = "Списание") ИЛИ
             (Док.Вид() = "РучноеИзмОстатка") Тогда
               // Эти Документы не изменяют Взаиморасчеты
               Продолжить;
            КонецЕсли;
            // выберем все движения регистра по документу
            Рег1.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
            Пока Рег1.ПолучитьДвижение() > 0 Цикл
               Если Строка(Рег1.Клиент.Код) <> Строка(Клн.Код) Тогда
                  // не тот клиент
                  Продолжить;
               КонецЕсли;
               Дв_Баз_Сум = Рег1.СуммаБазовая;
               Дв_Вал_Сум = Рег1.СуммаВалютная;
               Если Рег1.Приход = 1 Тогда
                  Таб.ВывестиСекцию("Приход");
               Иначе
                  Таб.ВывестиСекцию("Расход");
               КонецЕсли;
            КонецЦикла;
         КонецЦикла;
      КонецЕсли;
   КонецЦикла;
   // Вызов выходного отчета в окно просмотра и редактирования
   Таб.ТолькоПросмотр(1);
   Таб.Опции(0, 0, 4, 0);
   Таб.Показать("Взаиморасчеты с клиентами", "");
   ВыбКлиент = 0;
КонецПроцедуры

Выбрать следующее движение регистра в последовательности выборки, предварительно открытой методами ВыбратьДвижения(), ВыбратьДвиженияДокумента() или ВыбратьДвиженияСОстатками(), позволяет метод ПолучитьДвижение() (англоязычный синоним — GetDocAct()). После выполнения данного метода все атрибуты регистра: измерения, ресурсы, Приход и Расход содержат значения текущей записи движения регистра. Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если следующее движение регистра выбрано успешно, или 0, если движение регистра не найдено (достигнут конец выборки).

Пример использования:

Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
   Рег1.УстановитьФильтр(Клиент);
   // Открываем выборку
   Рег1.ОбратныйПорядок(1);
   Рег1.ВыбратьДвижения(ДатаНачало, );
   // Цикл выбора движений по регистру
   Пока Рег1.ПолучитьДвижение() > 0 Цикл
      Если Строка(Рег1.Клиент.Код) <> Строка(Запрос.Клиент.Код) Тогда
         Продолжить;
      КонецЕсли;
      Док = Рег1.ТекущийДокумент();
      Дв_Баз_Сум = Рег1.СуммаБазовая;
      Дв_Вал_Сум = Рег1.СуммаВалютная;
      Если Рег1.Расход = 1 Тогда
         Таб.ВывестиСекцию("Расход2");
      Иначе
         Таб.ВывестиСекцию("Приход2");
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Открыть выборку текущих или временных остатков по регистру по всем записанным значениям измерений позволяет метод ВыбратьИтоги() (англоязычный синоним — SelectTotals()). При этом будет использоваться фильтр, если он установлен методом УстановитьФильтр(). Собственно выбор первого и последующих остатков регистра осуществляется методом ПолучитьИтог(). Параметры у метода отсутствуют.

Пример использования:

Процедура ВыбратьКредит()
   Список = СоздатьОбъект("СписокЗначений");
   Рег = СоздатьОбъект("Регистр.ТоварныйКредит");
   Рег.УстановитьФильтр(Клиент, );
   Рег.ВыбратьИтоги();
   Ном = 0;
   Пока Рег.ПолучитьИтог() = 1 Цикл
      Док = Рег.ТекущийДокумент();
      Список.ДобавитьЗначение(Док, "" + Док + " — Остаток = " + Рег.Долг);
      Если Ном = 0 Тогда
         ВыбДок = Док;
      КонецЕсли;
      Ном = Ном + 1;
   КонецЦикла;
   Если Ном > 0 Тогда
      Если Список.ВыбратьЗначение(ВыбДок, "Выберите кредит") = 1 Тогда
         ДокКредита = ВыбДок;
      КонецЕсли;
   КонецЕсли;
   Возврат;
КонецПроцедуры

Выбрать очередной остаток по регистру в последовательности выборки, открытой перед этим при помощи метода ВыбратьИтоги(), позволяет метод ПолучитьИтог() (англоязычный синоним — GetTotal()). После выполнения данного метода все атрибуты регистра: измерения, ресурсы, Приход и Расход содержат значения очередной записи остатков регистра. Возвращаемым значением метода является число 1, если очередной остаток по регистру выбран успешно, или 0, если очередной остаток по регистру не найден (достигнут конец выборки). Параметры у метода отсутствуют.

Пример использования:

Процедура ВыбратьКредит()
   Список = СоздатьОбъект("СписокЗначений");
   Рег = СоздатьОбъект("Регистр.ТоварныйКредит");
   Рег.УстановитьФильтр(Клиент, );
   Рег.ВыбратьИтоги();
   Ном = 0;
   Пока Рег.ПолучитьИтог() = 1 Цикл
      Док = Рег.ТекущийДокумент();
      Список.ДобавитьЗначение(Док, "" + Док + " — Остаток = " + Рег.Долг);
      Если Ном = 0 Тогда
         ВыбДок = Док;
      КонецЕсли;
      Ном = Ном + 1;
   КонецЦикла;
   Если Ном > 0 Тогда
      Если Список.ВыбратьЗначение(ВыбДок, "Выберите кредит") = 1 Тогда
         ДокКредита = ВыбДок;
      КонецЕсли;
   КонецЕсли;
   Возврат;
КонецПроцедуры

Получить значение документа, который задал движение регистра, позволяет метод ТекущийДокумент() (англоязычный синоним — CurrentDocument()). Метод используется после получения очередного движения регистра методами ПолучитьДвижение() или ПолучитьИтог(). Параметры у метода отсутствуют. Метод может использоваться только для переменных созданных функцией СоздатьОбъект().

Пример использования:

Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент);
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
   Прих = 0;
   Расх = 0;
   Если Рег.Приход = 1 Тогда
      Прих = Рег.Долг;
   Иначе
      Расх = Рег.Долг;
   КонецЕсли;
   ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
   Док = Рег.ТекущийДокумент();
   НомСтр = Рег.НомерСтроки();
   Таб.ВывестиСекцию("Документ");
КонецЦикла;

Получить значение номера строки документа, которая задала движение регистра (в случае, когда в Модуле документа перед движением регистра использовали метод ПривязыватьСтроку()), позволяет метод НомерСтроки() (англоязычный синоним — LineNum()). Метод используется после получения очередного движения регистра методами ПолучитьДвижение() или ПолучитьИтог(). Параметры у метода отсутствуют. Данный метод может использоваться только для переменных созданных функцией СоздатьОбъект().

Пример использования:

Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент);
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
   Прих = 0;
   Расх = 0;
   Если Рег.Приход = 1 Тогда
      Прих = Рег.Долг;
   Иначе
      Расх = Рег.Долг;
   КонецЕсли;
   ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
   Док = Рег.ТекущийДокумент();
   НомСтр = Рег.НомерСтроки();
   Таб.ВывестиСекцию("Документ");
КонецЦикла;

Методы для перехода к итогам временного расчёта

Установить флаг участия регистра во временном расчёте позволяет метод ВременныйРасчет() (англоязычный синоним — TempCalc()). После такой установки можно выполнять процедуры РассчитатьРегистрыНа() и РассчитатьРегистрыПо(), тогда у данного регистра методы обращения к остаткам будут выдавать рассчитанные значения остатков на заданный момент времени. Возвращаемым значением метода является текущее числовое значение флага участия регистра во временном расчёте.

Примечание: В один момент времени только по одному объекту регистров каждого вида могут участвовать во временном расчёте.

Синтаксис метода:

ВременныйРасчет(<Флаг>)

где <Флаг> — числовое выражение. Возможные значения: 1 — установить флаг участия регистра во временном расчёте; 0 — сбросить флаг участия регистра во временном расчёте. Значение по умолчанию — 1.

Пример использования:

// если итоги не актуальны, то стоимости берем из временного расчета
// регистра УчетРеализации
Рег = СоздатьОбъект("Регистр.УчетРеализации");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Методы для установки фильтров

Назначить фильтр для оптимизации действий с регистром (временные расчёты, выбор движений и итогов) позволяет метод УстановитьФильтр() (англоязычный синоним — SetFilter()). В качестве фильтра задаются конкретные значения измерений и реквизитов регистра. Могут быть заданы не все значения, а только несколько, но обязательно в правильной последовательности, соответствующей структуре выбранного регистра, как она задана в Конфигураторе. Измерения и реквизиты могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные значения.

Синтаксис метода:

УстановитьФильтр(<Измер1>, <Измер2>..., <Рекв1>, <Рекв2>...)

где

  • <Измер1>, <Измер2>, … — выражения со значениями измерений регистра. Могут быть заданы не все значения, а только несколько, но обязательно в правильной последовательности, соответствующей структуре выбранного регистра, как она задана в Конфигураторе. Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные значения;
  • <Рекв1>, <Рекв2>, … — необязательные параметры — выражения со значениями реквизитов регистра. Заданные значения реквизитов будут влиять только на отбор движений регистра.

Таким образом, для регистра с измерениями "Товар", "Склад", "МОЛ" нижеприведённая запись означает, что расчёты будут проводиться только по одному товару (Тов1), но по всем складам и МОЛам:

Рег.УстановитьФильтр(Тов1, , );

Ещё пример:

Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
   Прих = 0;
   Расх = 0;
   Если Рег.Приход = 1 Тогда
      Прих = Рег.Долг;
   Иначе
      Расх = Рег.Долг;
   КонецЕсли;
   ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
   Док = Рег.ТекущийДокумент();
   Таб.ВывестиСекцию("Документ");
КонецЦикла;

Назначить фильтр для оптимизации расчётов позволяет метод УстановитьЗначениеФильтра() (англоязычный синоним — SetFilterValue()). В качестве фильтра для измерения или реквизита регистра может задаваться либо конкретное значение, либо список значений, либо группа справочника.

Синтаксис метода:

УстановитьЗначениеФильтра(<ИзмерИлиРеквизит>, <3начен>, <Вариант>)

где

  • <ИзмерИлиРеквизит> — идентификатор измерения или реквизита;
  • <3начен> — значение или список значений;
  • <Вариант> — необязательный параметр – число. Возможные значения: 0 — не фильтровать; 1 — фильтровать по значению; 2 — искать вхождение. Значение по умолчанию — 1.

Примечание: При значении 2 в третьем параметре:

  • если во втором параметре указана группа справочника, то осуществляется проверка вхождения в группу;
  • если во втором параметре указан простой элемент справочника или другой тип значения, то осуществляется просто фильтрация по значению;
  • для списка значений осуществляется проверка вхождения в список;
  • если во втором параметре указано пустое значение или пустой список значений, то условие не проверяется.

Таким образом, для регистра с измерениями "Товар", "Склад", "МОЛ" нижеприведённая запись означает, что расчёты будут проводиться по товарам из группы ВыбГруппаТоваров:

Рег.УстановитьЗначениеФильтра("Товар", ВыбГруппаТоваров, 2);

Методы для выгрузки итогов регистра в таблицу значений

Выгрузить все итоги регистра с текущим фильтром в таблицу значений позволяет метод ВыгрузитьИтоги() (англоязычный синоним — RetrieveTotals()).

Синтаксис метода:

ВыгрузитьИтоги(<ТаблЗнач>, <ВключатьИзмерФильтра>, <Очищать>)

где

  • <Та6лЗнач> — имя переменной со ссылкой на объект типа "ТаблицаЗначений", куда система выгрузит все итоги регистра;
  • <ВключатьИзмерФильтра> — выражение, задающее режим использования фильтра. Параметр является необязательным. Возможные значения: 1 – в получаемую таблицу включаются измерения, закреплённые фильтром; 0 – не включаются (значение по умолчанию);
  • <Очищать> — число 1, если перед выгрузкой таблица значений очищается, или 0, если не очищается. Параметр является необязательным. Значение по умолчанию – 1.

Пример использования:

Функция ВыбратьКредит(ВыбКлиент)
   Список = СоздатьОбъект("ТаблицаЗначений");
   Рег = СоздатьОбъект("Регистр.ТоварныйКредит");
   Рег.УстановитьФильтр(ВыбКлиент, );
   Рег.ВыгрузитьИтоги(Список, 1);
   Возврат Список;
КонецФункции

Методы контекста модуля документа

Внимание! Описываемые в данном разделе методы доступны только в контексте Модуля документа в системной предопределённой процедуре ОбработкаПроведения(). Эти методы можно применять только к регистрам, непосредственно доступным в контексте Модуля документа и нельзя применять к объектам, созданным с помощью функции СоздатьОбъект().

Указать, что при выполнении всех последующих движений регистров, движения будут записываться с номером указанной строки позволяет метод ПривязыватьСтроку() (англоязычный синоним — LinkLine()). Метод может быть использован как системная процедура: тогда он будет устанавливать номер строки для всех регистров, по которым выполняются движения, или как метод конкретного регистра: тогда он будет устанавливать номер строки только для данного регистра.

Синтаксис метода:

ПривязыватьСтроку(<НомерСтроки>)

где <НомерСтроки> — выражение, содержащее номер строки документа.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Выполнить запись прихода в регистр остатков для текущего документа позволяет метод ДвижениеПриход() (англоязычный синоним — ActIncome()). Измерения регистра, по которым записывается приход передаются параметрами <Измерение1>, <Измерение2>, … Величина приращений приходуемых ресурсов регистра передаются параметрами <Ресурс1>, <Ресурс2>, …

Синтаксис метода:

ДвижениеПриход(<Измерен1>, <Измерен2> ..., <Ресурс1>, <Ресурс1> ...)

где

  • <Измерение1>, <Измерение2>, … — выражения со значениями измерений регистра;
  • <Ресурс1>, <Ресурс2>, … — выражения со значениями ресурсов регистра.

Пример использования:

Процедура ОбработкаПроведения()
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.ПривязыватьСтроку(НомерСтроки);
      Регистр.ТовЗап.ДвижениеПриход(Склад, Товар, Количество, Стоимость);
   КонецЦикла;
КонецПроцедуры

Выполнить запись расхода в регистр остатков для текущего документа позволяет метод ДвижениеРасход() (англоязычный синоним — ActOutcome()). Измерения регистра, по которым записывается расход передаются параметрами <Измерение1>, <Измерение2>, … Величина приращений расходуемых ресурсов регистра передаются параметрами <Ресурс1>, <Ресурс2>, …

Синтаксис метода:

ДвижениеРасход(<Измерен1>, <Измерен2> ..., <Ресурс1>, <Ресурс1> ...)

где

  • <Измерение1>, <Измерение2>, … — выражения со значениями измерений регистра;
  • <Ресурс1>, <Ресурс2>, … — выражения со значениями ресурсов регистра.

Пример использования:

Процедура ОбработкаПроведения()
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.ДвижениеРасход(Склад, Товар, Количество, Стоимость);
   КонецЦикла;
КонецПроцедуры

Выполнить запись прихода в регистр остатков для текущего документа позволяет метод ДвижениеПриходВыполнить() (англоязычный синоним — DoActIncome()). Значения измерений регистра, по которым записывается приход, а также величины приращений приходуемых ресурсов регистра определяются текущими значениями атрибутов регистра. Параметры у метода отсутствуют.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеПриходВыполнить();
   КонецЦикла;
КонецПроцедуры

Выполнить запись расхода в регистр остатков для текущего документа позволяет метод ДвижениеРасходВыполнить() (англоязычный синоним — DoActOutcome()). Значения измерений регистра, по которым записывается расход, а также величины приращений расходуемых ресурсов регистра определяются текущими значениями атрибутов регистра. Параметры у метода отсутствуют.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Количество = Количество;
      Регистр.ТовЗап.Стоимость = Стоимость;
      Регистр.ТовЗап.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры

Выполнить запись движения в оборотный регистр для текущего документа позволяет метод Движение() (англоязычный синоним — Act()). Измерения регистра, по которым записывается движение передаются в параметрах <Измерение1>, <Измерение2>, … Величины приращений ресурсов регистра передаются параметрами <Ресурс1>, <Ресурс2>, …

Синтаксис метода:

Движение(<Измерен1>, <Измерен2> ..., <Ресурс1>, <Ресурс1> ...)

где

  • <Измерение1>, <Измерение2>, … — выражения со значениями измерений регистра;
  • <Ресурс1>, <Ресурс2>, … — выражения со значениями ресурсов регистра.

Пример использования:

Процедура ОбработкаПроведения()
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ОборотыТоваров.Движение(Товар, Склад, ОборотТовара);
   КонецЦикла;
КонецПроцедуры

Выполнить запись движения в оборотный регистр для текущего документа позволяет метод ДвижениеВыполнить() (англоязычный синоним — DoAct()). Значения измерений регистра, по которым записывается движение, а также величины приращений ресурсов регистра определяются текущими значениями атрибутов регистра. Параметры у метода отсутствуют.

Пример использования:

Процедура ОбработкаПроведения()
   Регистр.ТовЗап.Склад = Склад;
   ВыбратьСтроки();
   Пока ПолучитьСтроку() > 0 Цикл
      Регистр.ТовЗап.Товар = Товар;
      Регистр.ТовЗап.Оборот = Оборот;
      Регистр.ТовЗап.ДвижениеВыполнить();
   КонецЦикла;
КонецПроцедуры

Системные процедуры работы с регистрами

Описанные ниже процедуры являются глобальными, так как они доступны в любом программном модуле и воздействуют на все регистры, объявленные в Конфигураторе, у которых установлен флаг участия во временном расчёте. Применение данных процедур в тексте программного модуля непосредственное, то есть просто имя процедуры с параметрами (без предварительной ссылки на объект).

Рассчитать все регистры, у которых установлен флаг участия во временном расчёте, на момент начала события позволяет процедура РассчитатьРегистрыНа() (англоязычный синоним — CalcRegsOnBeg()). Если при вызове метода в параметре передана дата, то временный расчёт регистров производится на начало указанной даты. Если при вызове метода в параметре передан документ, то временный расчёт регистров производится на момент до проведения данного документа.

Синтаксис процедуры:

РассчитатьРегистрыНа(<ГраницаРасчета>, <ГрафаОтбора>)

где

  • <ГраницаРасчета> — выражение со значением типа "Дата", документ или позиция документа;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) — не использовать графу отбора.

Пример использования:

// если итоги не актуальны, то стоимости берем
// из временного расчета регистра УчетРеализации
Рег = СоздатьОбъект("Регистр.УчетРеализации");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Рассчитать все регистры, у которых установлен флаг участия во временном расчёте, на момент окончания события позволяет процедура РассчитатьРегистрыПо() (англоязычный синоним — CalcRegsOnEnd()). Если при вызове метода в параметре передана дата, то временный расчёт регистров производится на конец указанной даты. Если при вызове метода в параметре передан документ, то временный расчёт регистров производится на момент после проведения данного документа.

Синтаксис процедуры:

РассчитатьРегистрыПо(<ГраницаРасчета>, <ГрафаОтбора>)

где

  • <ГраницаРасчета> — выражение со значением типа "Дата", документ или позиция документа;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) — не использовать графу отбора.

Пример использования:

// если итоги не актуальны, то стоимости берем
// из временного расчета регистра УчетРеализации
Рег = СоздатьОбъект("Регистр.УчетРеализации");
Рег.ВременныйРасчет();
РассчитатьРегистрыПо(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Вспомогательный объект типа "Регистры"

В системе «1С:Предприятие» есть возможность создавать вспомогательные объекты типа "Регистры". Использование этих объектов даёт возможность преодолеть ограничение на выполнение временного расчёта в один момент времени только по одному регистру каждого вида. Система позволяет выполнять параллельно временные расчёты одних и тех же регистров, но для разных объектов "Регистры". Дело в том, что регистры одного объекта воспринимаются системой независимо от регистров другого объекта.

Во всех программных модулях доступ к атрибутам и методам объекта типа "Регистры" может выполняться при помощи переменной со ссылкой на объект, который создаётся функцией СоздатьОбъект(). Чтобы вызвать атрибут или метод объекта, имя этого атрибута или метода (с указанием необходимых параметров) пишется через точку после имени переменной.

При создании объекта типа "Регистры" используется ключевое слово «Регистры» (англоязычный синоним — «Registers»):

СпецРег = СоздатьОбъект("Регистры");

Атрибуты объекта "Регистры"

Атрибут <ИдентификаторРегистра> предоставляет доступ к регистру конфигурации конкретного вида. В тексте программного модуля используется название конкретного регистра, как он назван в Конфигураторе.

Пример использования:

СпецРег = СоздатьОбъект("Регистры");
СпецРег.УчетТоваров.СводныйОстаток(ВыбТовар, ВыбСклад, "Количество");

Методы объекта "Регистры"

Получить значение регистра по идентификатору, как он задан в метаданных, позволяет метод ПолучитьАтрибут() (англоязычный синоним — GetAttrib()). Возвращаемым значением метода является значение указанного регистра.

Синтаксис метода:

ПолучитьАтрибут(<ИмяАтрибута>)

где <ИмяАтрибута> — строковое выражение, содержащее идентификатор регистра конфигурации.

Пример использования:

СпецРег = СоздатьОбъект("Регистры");
Рег = СпецРег.ПолучитьАтрибут("ОстаткиТоваров");

Рассчитать для объекта типа "Регистры" все регистры, у которых установлен флаг участия во временном расчёте, на момент начала события позволяет метод РассчитатьРегистрыНа() (англоязычный синоним — CalcRegsOnBeg()). Если при вызове метода в параметре передана дата, то временный расчёт регистров производится на начало указанной даты. Если при вызове метода в параметре передан документ, то временный расчёт регистров производится на момент до проведения данного документа.

Синтаксис метода:

РассчитатьРегистрыНа(<ГраницаРасчета>, <ГрафаОтбора>)

где

  • <ГраницаРасчета> — выражение со значением типа "Дата", документ или позиция документа;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) — не использовать графу отбора.

Пример использования:

// если итоги не актуальны, то стоимости берем
// из временного расчета регистра УчетРеализации
СпецРег = СоздатьОбъект("Регистры");
Рег = СпеРег.УчетРеализации;
Рег.ВременныйРасчет();
СпецРег.РассчитатьРегистрыНа(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Рассчитать для объекта типа "Регистры" все регистры, у которых установлен флаг участия во временном расчёте, на момент окончания события позволяет метод РассчитатьРегистрыПо() (англоязычный синоним — CalcRegsOnEnd()). Если при вызове метода в параметре передана дата, то временный расчёт регистров производится на конец указанной даты. Если при вызове метода в параметре передан документ, то временный расчёт регистров производится на момент после проведения данного документа.

Синтаксис метода:

РассчитатьРегистрыПо(<ГраницаРасчета>, <ГрафаОтбора>)

где

  • <ГраницаРасчета> — выражение со значением типа "Дата", документ или позиция документа;
  • <ГрафаОтбора> — необязательный параметр. Строковое выражение, содержащее идентификатор графы отбора, как он задан в Конфигураторе. Данный параметр устанавливает режим использования определённой графы отбора. Значениями могут быть также:
    • "*" — автоматический выбор графы отбора (значение по умолчанию);
    • "" (пустая строка) — не использовать графу отбора.

Пример использования:

// если итоги не актуальны, то стоимости берем
// из временного расчета регистра УчетРеализации
СпецРег = СоздатьОбъект("Регистры");
Рег = СпеРег.УчетРеализации;
Рег.ВременныйРасчет();
СпецРег.РассчитатьРегистрыПо(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Установить для объекта типа "Регистры" флаг актуальности временного расчёта позволяет метод Актуальность() (англоязычный синоним — Actual()). Если флаг установлен, то все последующие движения регистров будут изменять итоги временного расчёта, а значит, итоги регистров временного расчёта будут все время (при проведении документа) находиться в актуальном состоянии. Возвращаемым значением метода является текущее состояние флага актуальности временного расчёта.

Примечание: Данный метод можно использовать только в модуле проведения документа.

Синтаксис метода:

Актуальность(<Флаг>)

где <Флаг> — числовое выражение. Возможные значения: 1 — временный расчёт поддерживать в актуальном состоянии; 0 — не поддерживать актуальность временного расчёта. Параметр является необязательным. Если параметр опущен, значение флага не меняется.

Пример использования:

// если итоги не актуальны, то стоимости берем
// из временного расчета регистра УчетРеализации
СпецРег = СоздатьОбъект("Регистры");
СпецРег.Актуальность(1);
Рег = СпеРег.УчетРеализации;
Рег.ВременныйРасчет();
СпецРег.РассчитатьРегистрыНа(ТекущийДокумент());
Рег.Товар = Товар;
Рег.Клиент = Клиент;
Рег.ОстаткиПолучить();
ТекОстаток = Рег.ОстатокТовара;
ТекСтоимость = Рег.Стоимость;
ТекПродСтоимость = Рег.ПродСтоимость;

Другие статьи по схожей тематике