Срез последних регистра сведений 1с

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

Срез последних можно получить несколькими способами:

  • При помощи метода СрезПоследних менеджера регистра сведений;
  • При помощи запроса;

Получить срез последних на дату при помощи метода СрезПоследних

Рассмотрим на примере получение среза на дату по регистру ЦеныНоменклатуры, по конкретной заданной номенклатуре при помощи метода СрезПоследних.

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

ТЗ = РегистрыСведений.ИмяРегистраСведений.СрезПоследних(<КонецПериода>, <Отбор>);
  • КонецПериода — дата на которую делается срез;
  • Отбор — структура с отбором по измерениям регистра;

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

Пример. Пусть в переменной Номенклатура хранится позиция номенклатуры по которой необходимо получить данные, а в переменной Дата хранится дата на которую необходимо получить цены. Данный пример подходит для конфигурации Бухгалтерия (ред. 2.0 / 3.0).

Отбор = Новый Структура("Номенклатура", Номенклатура);
ТаблицаЦен = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата, Отбор);

ШаблонСообщения = "Тип цен: %1 Цена: %2";
Для Каждого СтрокаТаблицы Из ТаблицаЦен Цикл

      ТекстСообщения = СтрШаблон(ШаблонСообщения, 
                                 СтрокаТаблицы.ТипЦен, 
                                 СтрокаТаблицы.Цена);
      Сообщить(ТекстСообщения);  
   
КонецЦикла;

Получить срез последних регистра сведений запросом

Рассмотрим пример среза последних по регистру сведений в запросе. Для примера возьмем регистр ЦеныНоменклатуры из конфигурации Бухгалтерия (ред. 2.0 / 3.0). В запросе будем использовать виртуальную таблицу СрезПоследних нужного регистра. В первый параметр таблицы передается дата, на которую необходим срез, во втором можно задать произвольное условие для полей регистра.

Пример 2:

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаСреза", КонецМесяца(ТекущаяДата()));

Запрос.Текст = 
"ВЫБРАТЬ
|    ЦеныНоменклатуры.Номенклатура,
|    ЦеныНоменклатуры.ТипЦен,
|    ЦеныНоменклатуры.Цена
|ИЗ
|РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза) КАК ЦеныНоменклатуры";

Результат = Запрос.Выполнить().Выгрузить();

Срез последних на каждую дату в запросе 1с

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

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

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Конец",  КонецПериода); 
Запрос.УстановитьПараметр("Начало", НачалоПериода); 
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Запрос.Текст = 
"ВЫБРАТЬ
|    РеализацияТоваровУслугТовары.Ссылка,
|    РеализацияТоваровУслугТовары.Ссылка.ТипЦен,
|    РеализацияТоваровУслугТовары.Номенклатура,
|    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
|ПОМЕСТИТЬ ПервичныеДанныеЦен
|ИЗ
|    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|        ПО РеализацияТоваровУслугТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
|	 И РеализацияТоваровУслугТовары.Ссылка.ТипЦен = ЦеныНоменклатуры.ТипЦен
|	 И РеализацияТоваровУслугТовары.Ссылка.Дата >= ЦеныНоменклатуры.Период
|ГДЕ
|    РеализацияТоваровУслугТовары.Номенклатура = &Номенклатура
|    И РеализацияТоваровУслугТовары.Ссылка.Проведен
|    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец
|
|СГРУППИРОВАТЬ ПО
|    РеализацияТоваровУслугТовары.Ссылка,
|    РеализацияТоваровУслугТовары.Номенклатура,
|    РеализацияТоваровУслугТовары.Ссылка.ТипЦен
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ПервичныеДанныеЦен.Ссылка,
|    ПервичныеДанныеЦен.ТипЦен,
|    ПервичныеДанныеЦен.Номенклатура,
|    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена
|ИЗ
|    ПервичныеДанныеЦен КАК ПервичныеДанныеЦен
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|        ПО ПервичныеДанныеЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
|	 И ПервичныеДанныеЦен.ТипЦен = ЦеныНоменклатуры.ТипЦен
|	 И ПервичныеДанныеЦен.Период = ЦеныНоменклатуры.Период";

Вкратце принцип действия данного механизма следующий:

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

Если хотите подробней узнать о периодических регистрах сведений зайдите на сайт 1С:ИТС

4 комментария

Добавить комментарий

Ваш адрес email не будет опубликован.