Back to top

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

Опубликовано e-1c@mail.ru - чт, 01/18/2018 - 09:57

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

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

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

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

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

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

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

  • КонецПериода — дата на которую делается срез;
  • Отбор — структура с отбором по измерениям регистра;

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

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

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

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

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

Пример 2:

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

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

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

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

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

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

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