Получить последнюю запись из регистра накопления 1с
При использовании периодических регистров сведений в 1с 8 есть возможность получить срез последних на какую либо дату. Он представляет из себя последние данные на указанную дату для уникальной комбинации измерений. Причем срез последних 1с можно взять как по одному измерению, так и по нескольким. По сути это данные регистра, актуальные на указанную дату.
Срез последних можно получить несколькими способами:
- При помощи метода СрезПоследних менеджера регистра сведений;
- При помощи запроса;
Получить срез последних на дату при помощи метода СрезПоследних
Рассмотрим на примере получение среза на дату по регистру ЦеныНоменклатуры, по конкретной заданной номенклатуре при помощи метода СрезПоследних.
- КонецПериода — дата на которую делается срез;
- Отбор — структура с отбором по измерениям регистра;
Метод возвращает таблицу значений, заполненную данными найденных строк регистра.
Пример. Пусть в переменной Номенклатура хранится позиция номенклатуры по которой необходимо получить данные, а в переменной Дата хранится дата на которую необходимо получить цены. Данный пример подходит для конфигурации Бухгалтерия (ред. 2.0 / 3.0).
Получить срез последних регистра сведений запросом
Рассмотрим пример среза последних по регистру сведений в запросе. Для примера возьмем регистр ЦеныНоменклатуры из конфигурации Бухгалтерия (ред. 2.0 / 3.0). В запросе будем использовать виртуальную таблицу СрезПоследних нужного регистра. В первый параметр таблицы передается дата, на которую необходим срез, во втором можно задать произвольное условие для полей регистра.
Срез последних на каждую дату в запросе 1с
Бывают ситуации, когда срез регистра сведений необходимо получить не на конкретную дату, а на несколько дат. Но в запросе, в виртуальную таблицу можно передать только одну дату. В следующем примере будет показано, как это сделать.
Пример 3. По номенклатуре, необходимо получить все реализации за период и определить какая цена была установлена на данную номенклатуру в момент продажи по типу цен из реализации.
Вкратце принцип действия данного механизма следующий:
- Выбираем все нужные нам документы, либо просто необходимые даты;
- Присоединяем к ним регистр по нужным измерениям;
- Также в связях указываем, что нам нужны данные регистра с периодом меньше либо равным дате документа (или просто необходимой даты);
- При помощи группировки находим максимальную из подходящих дат;
- Еще раз присоединяем регистр по всем нужным измерениям, но на этот раз по конкретной дате;
- Таким образом на каждую изначальную строку с датой мы получим срез последних регистра сведений.
Если хотите подробней узнать о периодических регистрах сведений зайдите на сайт 1С:ИТС
Добрый день. Есть регистр накопления взаиморасчеты вид остатки.
Мне нужно получить из регистра записи последнюю запись документа, который сделал приход.
Определить документы, которые делают приход не проблема, это сделал.
Получается я передаю в запрос список договоров и мне нужно вернуть следующий вид результата:
Договор | Регистратор
Договор 1 ПКО
Договор 2 Поступление на РС
проблема в том, что по договору 1 в приходе не только ПКО, а мне нужно вывести именно последний док.
а как из того списка выбрать 1 док я не знаю.
Использовать ПЕРВЫЕ 1 не подходит т.к если его использовать, то остальные договора не выведется.
Получение одной последней записи регистра сведений через СрезПоследних, период - секунда
Здравствуйте. Скажите пжт, у меня регистр сведений с периодичностью - в пределах секунды. В.
Заполнение документа данными из регистра накопления. Создание отчета по данным регистра накопления.
Изучаю 1с по методичкам не могу решить два задания Объясните что да как делается +100 в карму
Измерения регистра накопления
Здравствуйте. Подскажите пожалуйста по работе регистра накопления. Регистр Накопления.
Простой запрос регистра накопления
Всем доброе время суток. Сижу уже второй день над проблемой. Есть простой запрос из регистра.
Pasych, а если этот запрос загнать во вложенный, без суммы оборота, там сделать группировку по договору с выбором максимального периода. И далее вложенный связать ещё раз с таблицей оборотов регистра накопления по периоду и договору контрагента, вытягивая сумму оборота.
Dethmontt, ага, только не через вложенный, а временную таблицу:) вот кстати, что быстрее будет?
На больших объемах Временная, а на SQL скорее всего всегда будет быстрее временная
Dethmontt, помнится, когда готовилась к спецу, натыкалась на то, что при создании ВТ обязательно индексирование по полям, по которым будет происходить дальнейшее соединение, типа оптимизирует запрос.
GreenkO, но на создание индекса тоже тратиться время, с этим тоже нужно аккуратнее.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ВЫБРАТЬ
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
* * МАКСИМ
ВЫБРАТЬ
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
* * МАКСИМУМ(ВзаиморасчетыСКонтрагентамиОбороты.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксимальныйПериод
ИЗ
* * РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , Регистратор, ДоговорКонтрагента = &ДоговорКонтрагента) КАК ВзаиморасчетыСКонтрагентамиОбороты
СГРУППИРОВАТЬ ПО
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
* * ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
* * ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовОборот ,
* * ВзаиморасчетыСКонтрагентамиОбороты.СуммаУпрОборот
ИЗ
* * ВТ_МаксимальныйПериод КАК ВТ_МаксимальныйПериод
* * * * ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , Регистратор, ДоговорКонтрагента = &ДоговорКонтрагента) КАК ВзаиморасчетыСКонтрагентамиОбороты
* * * * ПО ВТ_МаксимальныйПериод.Период = ВзаиморасчетыСКонтрагентамиОбороты.Период
* * * * * * И ВТ_МаксимальныйПериод.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента
да, данный способ работает. Но если допустим есть ситуация, что
2 документа ПКО пришли в одно и тоже время 31.03.2014 23:59:59 и в таком запросе при уже соединение с временной таблицей (в которой будет уже содержаться 1 документ ПКО самый последний), то в результате соединения будет уже два документа последних.
Добрый день. Есть регистр накопления взаиморасчеты вид остатки.
Мне нужно получить из регистра записи последнюю запись документа, который сделал приход.
Определить документы, которые делают приход не проблема, это сделал.
Получается я передаю в запрос список договоров и мне нужно вернуть следующий вид результата:
Договор | Регистратор
Договор 1 ПКО
Договор 2 Поступление на РС
проблема в том, что по договору 1 в приходе не только ПКО, а мне нужно вывести именно последний док.
а как из того списка выбрать 1 док я не знаю.
Использовать ПЕРВЫЕ 1 не подходит т.к если его использовать, то остальные договора не выведется.
Получение одной последней записи регистра сведений через СрезПоследних, период - секунда
Здравствуйте. Скажите пжт, у меня регистр сведений с периодичностью - в пределах секунды. В.
Заполнение документа данными из регистра накопления. Создание отчета по данным регистра накопления.
Изучаю 1с по методичкам не могу решить два задания Объясните что да как делается +100 в карму
Измерения регистра накопления
Здравствуйте. Подскажите пожалуйста по работе регистра накопления. Регистр Накопления.
Простой запрос регистра накопления
Всем доброе время суток. Сижу уже второй день над проблемой. Есть простой запрос из регистра.
ВЫБРАТЬ РАЗЛИЧНЫЕ
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
* * МАКСИМУМ(ВзаиморасчетыСКонтрагентамиОбороты.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксимальныйПериод
ИЗ
* * РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , Регистратор, ДоговорКонтрагента = &ДоговорКонтрагента) КАК ВзаиморасчетыСКонтрагентамиОбороты
СГРУППИРОВАТЬ ПО
* * ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента
Временная таблица все правильно возвращает и без РАЗЛИЧНЫЕ если использовать.
Получается при соединение ВТ и регистра будут совпадения как по времени так и по договору (ну по договору это понятно так и надо). А по времени еще может быть у данного договора 3 документа вот + 3 новых не последних документа и прибавляются. Надо как-то это отсечь, не выходит
Поступление на расчетный счет СДМФ-000001 от 31.03.2014.
Вот если сделать в ВТ не по периоду максимум (а точнее почему-то надо брать в данном случае если через регистратор, минимум) находить, а по регистратору, то так срабатывает и в результате выходит 1 документ, но будет ли это правильным решением?
Pasych, есть немного замудренный вариант с добавлением второй ВТ. Т.е.
1. Создаем временную таблицу по регистру оборотов, вытягиваем Договор и Период, группируем по Договору, выбирая Максимум(Период)
2. Создаем 2ую временную таблицу, где предыдущую связываем с регистром оборотов по Договору и Периоду, выбираем Договор и Регистратор, группируем по Договору с максимумом Регистратор.Ссылка.
3. 2ую ВТ связываем с оборотами и вытягиваем наконец сумму.
Так выберется максимум и по дате, и по ссылке. Если просто по ссылке - тогда не факт, что по движениям период у тек. документа будет максимальным, чисто по периоду - не исключает другие документы.
Pasych, есть немного замудренный вариант с добавлением второй ВТ. Т.е.
1. Создаем временную таблицу по регистру оборотов, вытягиваем Договор и Период, группируем по Договору, выбирая Максимум(Период)
2. Создаем 2ую временную таблицу, где предыдущую связываем с регистром оборотов по Договору и Периоду, выбираем Договор и Регистратор, группируем по Договору с максимумом Регистратор.Ссылка.
3. 2ую ВТ связываем с оборотами и вытягиваем наконец сумму.
Так выберется максимум и по дате, и по ссылке. Если просто по ссылке - тогда не факт, что по движениям период у тек. документа будет максимальным, чисто по периоду - не исключает другие документы.
попробывал сделать все в одной ВТ. Вообщем группирую по договору, а выбираю маскимум по регистратору и периоду, в результате получает нужный документ, после связи с регистром, где достаю сумму получается на выходе один документ, который нужно.
Такой подход на сколько правильный?
Pasych, насколько я понимаю, у вас здесь идет отбор максимума только по ссылке, потому как максимум по периоду и максимум по регистратору могут не относиться к одной и той же записи регистра. Попробуйте в том вашем документе, который нужный и последний по договору изменить дату(минус месяц, к примеру), перепровести и выполнить запрос.
Pasych, насколько я понимаю, у вас здесь идет отбор максимума только по ссылке, потому как максимум по периоду и максимум по регистратору могут не относиться к одной и той же записи регистра. Попробуйте в том вашем документе, который нужный и последний по договору изменить дату(минус месяц, к примеру), перепровести и выполнить запрос.
если так сделать, то ВТ возвращает нужный документ, но при связи с регистром, запрос вернет уже запись, которая была раньше последней, а сейчас перепроведена.
да, через две ВТ работает. Жаль, что через 1 нельзя
можете еще помочь с переделкой данной части запроса? Получается у меня есть регистр накопления Взаиморасчеты периодичность неделя.
на данный момент такой вот результат запроса
вот мне на каждую неделю нужно узнавать сумма посленего платежа, пока у меня записывается сумма именно последней недели.
Вот мы с вами последний документ получили, а можно ли получить последний документ на каждой недели?
Pasych, должны быть суммы на каждую неделю или только, когда были продажи?
(если на каждую, то документы и суммы могут повторяться)
Добавлено через 32 минуты
а пока вы размышляете над моим вопросом, я предложу решение
Итак, если мы будем пытаться тянуть недели, выставив периодичность "Неделя" у регистра накопления, то получим некий набор дат, по которым были обороты. Если нам нужны все недели за период, то я предлагаю использовать дополнительный заполненный регистр(сведений) с датами. Думаю, практически в любой конфе есть Производственный календарь или что-то типа того.
1. Решение будет опять же сводиться к 2 ВТ, только в самой первой добавим наш РС по датам. Свяжем с регистром оборотов по условию, чтобы период записи регистра оборотов входил в рамки Начала-Окончания недели Производственного календаря. Группируем по Неделе и по Договору с выбором Максимума(Периода).
2. Далее предыдущую ВТ связываем с регистром оборотов по периоду и договору с выбором Договору, Регистратора. Группируем по Неделе, Договору с выбором максимума по Регистратору.
3. 2ую ВТ связываем с регистром оборотом по регистратору и договору. Тянем Сумму. Выводим Неделю, Договор, Сумму. и ещё что надо.
Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
Код 1C v 8.х
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
Код 1C v 8.х
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Читайте также: