Как выбрать периодические реквизиты за период

Для работы с периодическими реквизитами справочников и периодическими константами в системе «1С:Предприятие» версии 7.7 используется специальный агрегатный тип данных — "Периодический". Объекты данного типа предназначены для возможности записи, редактирования и удаления значений периодических реквизитов справочников и периодических констант непосредственно из программного модуля, без необходимости прибегать к интерактивным операциям.

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

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

При создании объекта данного типа функции СоздатьОбъект() в качестве параметра передаётся ключевое слово «Периодический» (англоязычный синоним — «Periodic»):

ВремРеквизиты = СоздатьОбъект("Периодический");

или

TempProp = CreateObject("Periodic");

Атрибуты объекта «Периодический»

Доступ к значению выбранного периодического реквизита справочника или константы предоставляет атрибут Значение объекта "Периодический". Англоязычный синоним имени атрибута — Value.

Доступ к дате значения выбранного периодического реквизита справочника или константы предоставляет атрибут ДатаЗнач объекта "Периодический". Англоязычный синоним имени атрибута — DateVal.

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

Вал = СоздатьОбъект("Справочник.Валюты");

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

ПерВал.ОбратныйПорядок(1);
ПерВал.ВыбратьЗначения();
Пока ПерВал.ПолучитьЗначение() = 1 Цикл
   Курс = ПерВал.Значение;
   ДатаКурса = ПерВал.ДатаЗнач;
КонецЦикла;

Как видно из вышеприведённого примера, методика работы с периодическими реквизитами и константами проста:

  1. С помощью функции СоздатьОбъект() создаём объект типа "Периодический".
  2. С помощью метода ИспользоватьОбъект() (см. описание метода ниже) связываем созданный объект "Периодический" с конкретным периодическим реквизитом или константой.
  3. Используя атрибуты и методы объекта "Периодический", начинаем работать с выбранным периодическим реквизитом или константой.

Методы объекта «Периодический»

Связать созданный объект типа "Периодический" с конкретным реквизитом или константой позволяет метод ИспользоватьОбъект(). Англоязычный синоним имени метода — UseObject().

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

ИспользоватьОбъект(<ИмяРеквизита>, <Объект>)

где

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

Если параметр <ИмяРеквизита> не задан (пустая строка), а параметр <Объект> задаёт элемент справочника, то выборка будет осуществляться по всем периодическим реквизитам для данного элемента справочника.

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

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

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

где

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

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

Тов = СоздатьОбъект("Справочник.Номенклатура");

Тов.НайтиПоКоду(51);
Если Тов.Выбран() = 1 Тогда
   ВыбТМЦ = Тов.ТекущийЭлемент();
Иначе
   Предупреждение("Не найден товар!");
   Возврат;
КонецЕсли;
ПерТМЦ = СоздатьОбъект("Периодический");
ПерТМЦ.ИспользоватьОбъект("ТМЦ", ВыбТМЦ);
ПерТМЦ.НазначитьТип("Справочник.Товары");

Получить значение реквизита или константы, актуальное на заданную дату позволяет метод ЗначениеНаДату(). Англоязычный синоним имени метода — ValueOnDate().

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

ЗначениеНаДату(<Дата>)

где <Дата> — выражение типа "Дата", задающее дату, на которую необходимо получить значение реквизита или константы.

Примечание: При использовании данного метода текущая позиция выборки, ранее открытая методом ВыбратьЗначение(), не сдвигается и не сбрасывается.

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

К = ПерВал.ЗначениеНаДату(ДатаП);

Найти периодическое значение на заданную дату позволяет метод НайтиЗначение() (англоязычный синоним — FindValue()). Метод возвращает 1, если вызов закончился успешно, или 0, если нет. Режим поиска в случае, если на заданную дату не существует значения периодического реквизита, задаётся параметром <Режим>. Само же полученное при этом значение следует считывать из атрибута Значение объекта "Периодический" (то есть данный метод выполняет позиционирование, как и методы выборки).

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

НайтиЗначение(<Дата>, <Режим>)

где

  • <Дата> — выражение, задающее значение даты, на которую требуется найти значение периодического реквизита справочника или периодической константы;
  • <Режим> — числовое выражение, значение которого задаёт режим поиска, если на заданную дату не существует значения периодического реквизита. Если −1 (минус единица) — возвращается значение на предыдущую дату, если 0 — возвращается код завершения неуспешной операции, если 1 — возвращается значение на последующую дату.

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

Если ПерВал.НайтиЗначение(ДатаП, -1 ) = 1 Тогда
   К = ПерВал.Значение;
Иначе
   Предупреждение("Значение не найдено!", 3);
   Возврат;
КонецЕсли;

Открыть выборку периодических значений за указанный период позволяет метод ВыбратьЗначения() (англоязычный синоним — SelectItems()). Выборка будет происходить при помощи метода ПолучитьЗначение() среди периодических значений текущего объекта применения, заданного методом ИспользоватьОбъект(). Возвращаемым значением метода ВыбратьЗначения() является число: 1 — если вызов метода закончился успешно, 0 — если нет.

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

ВыбратьЗначения(<ДатаНачала>, <ДатаКонца>)

где

  • <ДатаНачала> — необязательный параметр. Выражение типа "Дата", задающее дату начала периода выборки периодических значений. Если параметр не задан, то выборка начинается с самой ранней имеющейся даты;
  • <ДатаКонца> — необязательный параметр. Выражение типа "Дата", задающее дату конца периода выборки периодических значений. Если параметр не задан, то выборка заканчивается самой последней имеющейся датой.

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

Вал = СоздатьОбъект("Справочник.Валюты");

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

ПерВал.ОбратныйПорядок(1);
ПерВал.ВыбратьЗначения();
Пока ПерВал.ПолучитьЗначение() = 1 Цикл
   Курс = ПерВал.Значение;
   ДатаКурса = ПерВал.ДатаЗнач;
КонецЦикла;

Установить порядок выборки значений, открытой методом ВыбратьЗначения(), позволяет метод ОбратныйПорядок() (англоязычный синоним — BackwardOrder()), вызов которого должен происходить до вызова метода ВыбратьЗначения(). Возвращаемым значением метода является число: 1 — если вызов метода закончился успешно, или 0 — если нет. Пример использования метода приведён выше.

Синтаксис:

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

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

Открыть выборку периодических значений, установленных указанным документом, позволяет метод ВыбратьПоДокументу() (англоязычный синоним — SelectByDoc()). Выборка будет происходить при помощи метода ПолучитьЗначение() по всем справочникам и реквизитам. То есть при использовании данного метода игнорируется установка объекта применения, задаваемая методом ИспользоватьОбъект(). Возвращаемым значением метода ВыбратьПоДокументу() является число: 1 — если вызов метода закончился успешно, 0 — если нет.

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

ВыбратьПоДокументу(<Документ>)

где <Документ> — выражение со значением типа "Документ", указывающее, по какому документу будет производиться выборка.

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

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

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

У метода ПолучитьЗначение() нет параметров, а возвращаемым значением является число: 1 — если элемент выбран успешно, 0 — если элемент не выбран (достигнут конец выборки).

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

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

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

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

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

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

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

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

Получить наименование текущего реквизита справочника позволяет метод ТекущийРеквизит() (англоязычный синоним — CurrentAttribute()). Метод не имеет параметров и возвращает строковое значение — наименование текущего реквизита справочника.

Данный метод используется после получения очередного значения из выборки и особенно полезен при выборке по документу или по всем реквизитам. Если выборка производится по документу, то в возвращаемом значении сначала записано наименование справочника, а затем через точку наименования реквизита.

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

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

Получить номер строки документа, изменившей периодическое значение реквизита справочника, позволяет метод НомерСтроки() (англоязычный синоним — LineNum()). Он не имеет параметров и используется после получения очередного значения из выборки. Особенно полезен при выборке по документу или по всем реквизитам.

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

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

Выполнить запись периодического значения на заданную дату позволяет метод Записать() (англоязычный синоним — Write()). Если на заданную дату уже существует запись, то она модифицируется. Возвращаемым значением метода будет число: 1 — если вызов метода закончился успешно, 0 — если нет.

До вызова данного метода следует само значение записать в атрибут Значение, а дату этого значения записать в атрибут ДатаЗнач.

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

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

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

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

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

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

  • Работа с константами
  • Работа с датами
  • Работа с журналами документов
  • Работа со справочниками в 1С
  • Работа с формами
  • Работы с табличными формами

Содержание:

1.       Отображение периодической информации

2.       Наборы реквизитов

3.       Периодические регистры сведений 1С

4.       Выводы об инструментах 1С  

1.      Отображение периодической информации

Приветствую, коллеги! Сегодня говорим о периодических реквизитах. Что это такое? Когда они нужны? Когда они не нужны? В чем смысл наборов периодических реквизитов? Какие еще периодические инструменты есть в 1С? Ответы на эти вопросы Вы узнаете их моей статьи.

Периодическими реквизитами называют реквизиты 1С, значения которых изменяются со временем; причем все эти измененные значения сохраняются и могут быть прочитаны в исторической перспективе.

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

Ярко выраженной «периодичностью» обладают реквизиты, в которых хранятся, например, курсы валют, цены товаров и услуг, ФИО кладовщиков или руководителей подразделений, ставки налогов и взносов и т.п.

А вот пример реквизита, который похож на периодический, но таковым не является. В рамках переговоров с покупателем вы обсуждаете цену товара. Сначала ему отправили коммерческое предложение; затем покупатель попросил скидку, показывая предложения конкурентов; потом попросил включить в цену стоимость доставки – и так несколько раундов переговоров, в которых значение цены якобы изменяется. Но на самом деле значение цены здесь одно – то, на котором остановились и включили в договор – то которое будет использоваться в бизнес-процессах в организации: расчете взаимной задолженности, определении доходности, налогообложении и т.д. Все остальные «промежуточные цены» являются лишь «пожеланиями» и в указанных бизнес-процессах использоваться не будут. Эти промежуточные цены могут фиксироваться в документах 1С 8 «Сделка» для анализа эффективности воронки продаж, но их смысловые значения не привязаны к дате – они привязаны к совокупности коммерческих условий работы на данном этапе переговоров.  

2.      Наборы реквизитов

Помимо периодичности отдельных реквизитов, можно говорить о периодичности их наборов. Пусть вы проектируете годовой бюджет ФОТ. В нем вы фиксируете суммы ФОТ в разрезе подразделений, должностей и даже ФИО (учитываете персональную ценность сотрудников). Бюджет утвердили; затем через месяц скорректировали – изменили суммы для утвержденных подразделений/должностей/ФИО; затем через полгода заменили одного сотрудника на другого и опять скорректировали бюджет – изменили ФИО и сумму (другая ценность сотрудника). В результате получили меняющееся во времени не одного значение реквизита, а целой совокупности связанных реквизитов. Это будет «набор периодических реквизитов» – в каждый момент времени он имеет свое смысловое значение – будет использоваться для план-фактного анализа в первом, втором квартале и так далее.

А вот пример изменяющегося набора реквизитов, который периодическим не является. Программа 1С позволяет вести версионирование объектов. Вы сохранили прайс-лист (в разрезе номенклатура/цена), а потом оказалось, что его кто-то не санкционированно изменил. Чтобы найти автора, понять содержание корректировок и откатить их назад как раз и используется механизм версионирования. Разумеется, зафиксированные корректировки имеют отметку времени; но основную смысловую нагрузку имеет сам факт корректировки, а не его расположение на временной шкале. Таким образом, версионируемые объекты (наборы реквизитов) не являются периодическими.

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

3.      Периодические регистры сведений 1С

С сутью периодических реквизитов разобрались. Теперь немного об их «кухне».

Собственно, термин «периодический реквизит» появился в далекой 1С 7.7. В этой системе, чтобы реквизит стал периодическим, достаточно было «включить» свойство «Периодический» этого реквизита. После чего можно было задать и прочитать значение реквизита на определенную дату, а также просмотреть его историю в специальной форме.

В 1С версии 8 механизма «периодический реквизит» нет, его заменили «периодические регистры сведений» 1С. Возможности этих регистров шире и удобнее. Они реализуют «периодичность» как для отдельного реквизита, так и для наборов реквизитов.  

4.      Выводы об инструментах 1С

Итак, подытожим:

· Если в бизнес-процессах в организации смысловые значения реквизитов строго связаны с моментом времени их проведения, то мы имеем дело с «периодическими реквизитами».

· Периодическими могут быть как отдельные реквизиты, так и их связанные наборы.

· Для работы с периодическими реквизитами система 1С версии 8 использует механизмы периодических регистров сведений 1С.

· Если же значения реквизитов хоть и располагаются на временной шкале, но их смысловое значения со временем строго не связано, то это не периодические реквизиты; для работы с ними следует использовать другие (не периодические регистры сведений) инструменты 1С, такие, например, как последовательность однотипных документов, версионирование объектов.

Специалист компании «Кодерлайн»

Игорь Борисенко

Периодические регистры сведений

Многие программисты, знакомые с версией 7.7 и желающие освоить версию 8, спрашивают, куда делись периодические реквизиты справочников и периодические константы. А если их нет, то какой механизм их заменяет? В 1С:Предприятии 8 для хранения истории изменения значений предназначены периодические регистры сведений.

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

Для периодического реквизита при создании указывается свойство «Периодичность» из следующих возможных значений:

  • в пределах секунды,
  • в пределах дня,
  • в пределах месяца,
  • в пределах квартала,
  • в пределах года,
  • по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).

Обратите внимание, что тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и т.д.). Более того, в регистре сведений можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения».

Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день. Структура регистра представлена ниже:

Подробная информация о структуре регистра сведений КурсыВалют приведена в следующей таблице:

Измерения: Валюты тип «СправочникСсылка.Валюты», ведущее, запрет незаполненных значений
Ресурсы: тип «число», длина 15, точность 4, неотрицательное
тип «число», длина 10, точность 0, неотрицательное
Периодичность В пределах дня
Режим записи Независимый

Данные в этот регистр сведений можно вводить вручную с помощью формы списка.

ВНИМАНИЕ. В регистр сведений с определенной периодичностью, не равной «По позиции регистратору», нельзя ввести две записи с одинаковым набором измерений и периодом, т.е. нельзя ввести два курса одной валюты в один день. Если периодичность записи регистра имеет значение «По позиции регистратора», то ключ уникальности записи также содержит и ссылку на документ-регистратор, т.е. в таком регистре не может существовать две записи с одинаковым набором измерений, периодом и регистратором. Это неотъемлемое свойство регистра сведений, отличающее его от остальных регистров.

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

Обращение к периодическим сведениям с помощью методов

Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» периодического регистра сведений понимаются первые или последние значения ресурсов по указанным измерениям. При этом применяются следующие методы:

Возвращает в виде структуры значения ресурсов одной записи регистра, соответствующей указанным значениям всех (!) измерений регистра и периоду.

ПолучитьПоследнее (<Конец периода>, <Отбор>)

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

ПолучитьПервое (<Начало периода>, <Отбор>)

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

СрезПоследних (<Конец периода>, <Отбор>)

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

СрезПервых (<Начало периода>, <Отбор>)

При вызове методов ПолучитьПервое, ПолучитьПоследнее, СрезПервых и СрезПоследних первый параметр может иметь тип «дата», МоментВремени или Граница, но его можно вообще не указывать, тогда будут найдены значения ресурсов из самой первой или последней записи регистра соответственно.

Продемонстрируем использование этих методов на примерах:

Пример 1. Получение курса валюты точно на заданную дату (если записи именно на эту дату нет, то в элементах структуры будут пустые значения).

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

Пример 3. Получение актуальных курсов всех валют на заданную дату (отбор не указан, т.е. мы хотим получить сведения по всем значениям измерений).

Пример 4. Получение актуальных оптовых цен на товары (указан отбор по измерению «ТипЦен»)

Обращение к периодическим сведениям с помощью запросов

Для получения данной информации служит виртуальная таблица среза последних/первых записей регистра сведений. По структуре она полностью идентична основной таблице регистра сведений и содержит следующие поля:

Метод Описание
Поле Описание
<Имя измерения> Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений.
<Имя реквизита> Набор полей, содержащий значения реквизитов регистра.
<Имя ресурса> Набор полей, который содержит значения ресурсов регистра.
Активность Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени.
МоментВремени Содержит момент времени записи регистра.
НомерСтроки Содержит номер строки, определяемый как порядковый номер записи в наборе записей.
Период Содержит период, к которому относится запись регистра.
Регистратор Содержит ссылку на документ-регистратор движения.

При обращении к виртуальным таблицам СрезПервых и СрезПоследних можно указать следующие параметры:

Параметр Описание
Дата Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние/ранние записи.
Условие Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние/ранние. Условие будет применяться к исходным записям, а не к уже отобранным.

Приведем примеры обращения к записям регистра сведений с помощью запросов:

Пример 1. Выбрать все записи регистра сведений

Пример 2. Получить актуальный курс одной валюты на заданную дату

Пример 3. Выбрать актуальные курсы всех валют на заданную дату

Пример 4. Получить актуальный прайс-лист на заданную дату (указан определенный тип цен, например, «Розничная»)

Срез последних

Для периодических регистров сведений доступны две виртуальные таблицы: СрезПервых и СрезПоследних Рассмотрим работу с этими виртуальными таблицами с использованием языка запросов 1С. Гораздо чаще применяется СрезПоследних, поэтому с него и начнем.

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


В регистре имеются следующие записи

Период Товар Поставщик Сумма
01.01.2017 Карандаш ООО «Леспром» 10
25.01.2017 Карандаш ООО «Леспром» 15
01.01.2017 Карандаш ПАО «Канцтовары» 27
01.02.2017 Карандаш ПАО «Канцтовары» 31
03.01.2017 Ручка ПАО «Канцтовары» 137
01.02.2017 Ручка ПАО «Канцтовары» 145

Для начала получим срез последних без использования параметров выполнив вот такой запрос

Так как параметры не указаны срез выполняется на текущую дату – 01.02.2017. В результате получаем вот такую таблицу

Период Товар Поставщик Сумма
25.01.2017 Карандаш ООО «Леспром» 15
01.02.2017 Карандаш ПАО «Канцтовары» 31
01.02.2017 Ручка ПАО «Канцтовары» 145

Здесь мы видим, что комбинация измерений Товар + Поставщик уникальна, т.е. для каждой комбинации измерений регистра была взята запись с максимальной датой, и дата записи меньше или равна текущей дате.
Допустим нам надо сделать то же самое но записи мы хотим получить с датой меньшей или равной 15.01.2017. Для этого необходимо в запросе изменить строку с таблицей среза последних следующим образом

Перед выполнением запроса в него конечно же надо передать параметр &ДатаСреза. Теперь результат запроса будет выглядеть так

Период Товар Поставщик Сумма
01.01.2017 Карандаш ООО «Леспром» 10
01.01.2017 Карандаш ПАО «Канцтовары» 27
03.01.2017 Ручка ПАО «Канцтовары» 137

И наконец представим, что нам надо получить срез последних на ту же дату с условием, что товар у нас Карандаш, а поставщик Канцтовары. Для этого укажем в запросе второй параметр

В итоге получим только одну запись

Период Товар Поставщик Сумма
01.01.2017 Карандаш ПАО «Канцтовары» 27

Чтобы не запутаться во всех этих скобочках и запятых, лучше воспользоваться конструктором запросов. Покажу на примере последнего запроса.
После выбора в конструкторе запроса таблицы со срезом последних необходимо нажать на кнопку Параметры виртуальной таблицы и в открывшемся окне прописать

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

Особенность получения среза последних записей в регистре сведений

В тестовой конфигурации у нас есть периодический регистр сведений «ЦеныНоменклатуры» со следующими исходными данными:

Изображение

На рисунке представлена также структура метаданных регистра. Как мы видим, регистр содержит измерение «Товар» с типом ссылки на справочник «Товары», а также числовой ресурс «Цена» и реквизит «СтараяЦена».

Допустим, в отчете нам нужно получить срез последних записей для товаров и их цен с условием, что старая цена меньше или равно 50.

Два варианта запроса

Сразу скажу, что рассматривать будем правильный и не правильный варианты.Начнем с последнего. Эту ошибку часто делают начинающие программисты. И так, для отчета был написан следующий запрос:

Обратите внимание на условие в секции «ГДЕ». В этом и заключается главная ошибка! Этот запрос не вернет ни одной записи, и вот почему: при использовании виртуальных таблиц, в нашем случае «СрезПоследних», сначала выполняется выборка данных из базы по условиям, описанным в виртуальной таблице, а затем выполняются действия, описанные в тексте запроса (группировки, условия в секции «ГДЕ», сортировка и т.д.).

Поэтому в нашем примере запрос и не возвращает результат. Сначала он получает срез последних, а уже после устанавливает условие на реквизит «СтараяЦена». Вот так это выглядит на схеме:

Изображение

Чтобы правильно решить задачу, условие на реквизит «СтараяЦена» нужно перенести в условия виртуальной таблицы. Вот так будет выглядеть правильный текст запроса:

Теперь запрос получит правильные данные, поскольку срез последних цен будет получать уже с учетом условия по реквизиту «СтараяЦена».

Изображение

Результаты

Следует понимать, что описанное выше относится ко всем случаям использования виртуальных таблиц в запросах (для регистров накопления, регистров бухгалтерии, задач и т.д.).

Отсюда также вытекает главное правило по использованию виртуальных таблиц: «используя виртуальную таблицу обязательно устанавливайте параметры отбора непосредственно в виртуальной таблице, иначе запрос будет получать излишние данные, на которые уже потом будут устанавливаться отборы».

Как в запросе выбрать из периодического регистра сведений за период..

Я
   realevgenius

31.01.17 — 22:59

Всем — привет!

Начинающий, сильно не ругайте.

Задачка, например, есть несколько документов Покупка, с табличными частями.

Надо проставить цены из регистра сведений. Но дата среза должна равняться дате очередного документа.

Типа такого текста запроса — не работает, значение null.

ВЫБРАТЬ

    ПоступлениеТоваровУслугТовары.Ссылка,

    ПоступлениеТоваровУслугТовары.Номенклатура,

    ПоступлениеТоваровУслугТовары.Цена,

    ПоступлениеТоваровУслугТовары.Количество,

    ПоступлениеТоваровУслугТовары.Сумма,

    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаУстановлена

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних

        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

            И ПоступлениеТоваровУслугТовары.Ссылка.ДатаВходящегоДокумента = ЦеныНоменклатурыСрезПоследних.Период

ГДЕ

    ПоступлениеТоваровУслугТовары.Ссылка.Дата >= &Дата1

    И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата2

Помогите, люди добрые?! Спасибо!

  

Партнерская программа EFSOL Oblako

   mkalimulin

1 — 31.01.17 — 23:04

Это называется «срез последних на каждую дату в запросе».

Можно посмотреть тут:

Книга знаний: Срез последних на каждую дату в запросе

и в гугле.

Пользуйтесь конструктором JUG. Там есть библиотека шаблонов (и этот случай тоже).

http://catalog.mista.ru/public/569569/

   realevgenius

2 — 31.01.17 — 23:07

Спасибо!

Полез читать!

Пробовал гуглить, но, видимо сформулировал неправильно

   Fram

3 — 31.01.17 — 23:09

(1) необязательно.

(0) соединяй с основной таблицей регистра а не виртуальной с условием ДатаДока >= ПериодРегистра. потом Максимум по Периоду Регистра

   Fram

4 — 31.01.17 — 23:10

Потом по этому периоду опять соединяешь с регистром и получаешь цены

   realevgenius

5 — 31.01.17 — 23:17

(4) Честно, не осилил… Что и как соединять… Опыта нет…(((

   Fram

6 — 31.01.17 — 23:18

(5) а как  ты (0) наваял?

   realevgenius

7 — 31.01.17 — 23:23

(6) Ну вот, что-то с чем-то слепил… )) Я делал подобное, но приходилось в одном запросе выборку сделать, потом в выборке получать цену из другого запроса, подставляя дату… Чушь, в общем…. Попытался соединить…

   Fram

8 — 31.01.17 — 23:26

(7) извини, но тогда это получается «не по Сеньке шапка». не способен ты еше писать такие запросы.

попроси у шефа задание попроще.

   realevgenius

9 — 31.01.17 — 23:27

(8) Ну, вот, стараюсь понять, вникнуть… Тебе хорошо, ты уже при рождении писал запросы любые… ))

   realevgenius

10 — 31.01.17 — 23:32

Почитал статьи… Профи пишет как это делается, не вдаваясь в подробности, видимо для других профи. Ценность статьи с точки зрения обучения = «0», ибо начинающий не поймет, а для профи оно не надо, им итак все известно… )))

   Fram

11 — 31.01.17 — 23:32

(9) алгоритм я описал:

— соединяешь документ с регистром (не срез последних!) по ДатаВходДока >= ПериодРегистра

— вычисляешь максимальную (последнюю дату) для каждого набора данных

— результат соединяешь опять с регистром и получаешь цены

дальше сам

   realevgenius

12 — 31.01.17 — 23:39

(11) ВЫБРАТЬ

    ВложенныйЗапрос.Ссылка,

    ВложенныйЗапрос.Номенклатура,

    ЦеныНоменклатуры.Цена

ИЗ

    (ВЫБРАТЬ

        ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,

        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,

        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период

    ИЗ

        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

            ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура

                И ПоступлениеТоваровУслугТовары.Ссылка.ДатаВходящегоДокумента >= ЦеныНоменклатуры.Период

    ГДЕ

        ПоступлениеТоваровУслугТовары.Ссылка.Дата >= &Дата1

        И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата2

    
    СГРУППИРОВАТЬ ПО

        ПоступлениеТоваровУслугТовары.Ссылка,

        ПоступлениеТоваровУслугТовары.Номенклатура) КАК ВложенныйЗапрос

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

        ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура

            И ВложенныйЗапрос.Период = ЦеныНоменклатуры.Период

   Fram

13 — 31.01.17 — 23:41

(12) можешь когда захочешь ))

половину вознаграждения мне

   realevgenius

14 — 31.01.17 — 23:42

(13) Ок! «0» / 2 = «0» )))

Но могу сказать  — Спасибо большое! )))

   Fram

15 — 31.01.17 — 23:43

(12) Тип цены наверно еще должен быть. И единицу измерения цены учесть не забудь

   realevgenius

16 — 31.01.17 — 23:44

Статья на Мисте — ни о чем…

Вот больмене https://helpf.pro/faq/view/964.html

Ну и Fram  — спасибо!

   realevgenius

17 — 31.01.17 — 23:45

(15) Да, это понятно… Там много чего…

Прицепить не мог саабразить как

   Fram

18 — 31.01.17 — 23:46

(16) Срез на кажлый день это бред неприменимый в реальной жизни. за 20 лет в 1С ни разу не понадобилось

   realevgenius

19 — 31.01.17 — 23:49

(18) Ну например, задача — проверять входящие цены, сравнивая с установленными… Не зашкаливают ли… Проверять в каждом документе, на дату не документа, а поставщика… Давай сотовый, могу денег закинуть за подсказку, кстаьт..

   Fram

20 — 31.01.17 — 23:51

(19) я не про твою задачу, я про буквальный срез на каждый день

  

realevgenius

21 — 31.01.17 — 23:53

(20) Ну у мя тоже была мысля сделать вложенный запрос, с каждодневным срезом… ))))Но, глупость, канешн

Периодические Реквизиты

Для анализа динамики изменений значений показателей на основе Регистров Сведений создаются дополнительные SQL представления.

Создание списка Периодических Реквизитов

Состав SQL представлений Периодических ревизитов задается на вкладке «Фильтры«.

В список выбора включаются Периодические регистры сведений. Выбор из списка включает объект в окно Редактора фильтра:

Теперь следует назначить Периодический Реквизит, для значений которого требуется анализ динамики изменений .

Для получения списка возможных для использования Периодических Реквизитов следует выполнить отметку наименования в окне Редактора фильтра. Отметка наименования приводит к появлению в строке состояния списка возможных реквизитов.

В примере на рисунке для РегистрыСведений.КурсыВалют предлагается единственное значение — «Валюта»..

Для завершения настройки Периодического Реквизита следует отредактировать строку в Редакторе фильтра:

  • В строке состояния отмечается название реквизита (на рисунке — «Валюта») и копируется в буфер обмена (Ctrl+C).
  • Через пробел (пробелы) следует добавить название реквизита в строку Редактора фильтров (CTRL+V).
  • Нажать кнопку Применить.

Аналогичным образом в список включаются другие Периодические Реквизиты:

Примечание:

Представленная последовательность создания списка Периодических Реквизитов возможна только после выполнения Расчета. «ATK BIView» не имеет сведений о конфигурации 1С если Расчет еще ни разу не выполнялся.

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

Интервал времени действия значения реквизита

SQL представления Периодических Реквизитов получают имена с суффиксом _Периоды:

SQL представления Периодических Реквизитов создаются на основе Регистров Сведений путем добавления дополнительного поля «ОкончаниеПериода» для назначенного Периодического Реквизита.

Для последнего интервала это поле получает «бесконечное значение» — 4099-12-31 00:00:00.000

Таким образом создается возможность выборки значений реквизита из непрерывного списка смежных закрытых интервалов.

SQL представления Периодических Реквизитов создаются при выполнении Расчета в режиме «2 — SQL — представления».

При выполнении Расчета в режиме «3 — Создание Модели Данных» SQL представления Периодических Реквизитов НЕ включаются автоматически в Модель Данных. Для включения в Модель Данных разработчик может использовать либо комплексные SQL представления, либо тексты этих представлений из скрипт-файла ScriptLev2.txt.

Форма запроса ключа регистрации

Понравилась статья? Поделить с друзьями:
  • Как выбрать элементы справочника по реквизиту
  • Как выглядит бизнес класс в самолете эмирейтс
  • Как выглядит личный кабинет втб бизнес онлайн
  • Как выглядят банковские реквизиты организации
  • Как выглядят реквизиты счета физического лица