1с срез последних не работает
При использовании периодических регистров сведений в 1с 8 есть возможность получить срез последних на какую либо дату. Он представляет из себя последние данные на указанную дату для уникальной комбинации измерений. Причем срез последних 1с можно взять как по одному измерению, так и по нескольким. По сути это данные регистра, актуальные на указанную дату.
Срез последних можно получить несколькими способами:
- При помощи метода СрезПоследних менеджера регистра сведений;
- При помощи запроса;
Получить срез последних на дату при помощи метода СрезПоследних
Рассмотрим на примере получение среза на дату по регистру ЦеныНоменклатуры, по конкретной заданной номенклатуре при помощи метода СрезПоследних.
- КонецПериода — дата на которую делается срез;
- Отбор — структура с отбором по измерениям регистра;
Метод возвращает таблицу значений, заполненную данными найденных строк регистра.
Пример. Пусть в переменной Номенклатура хранится позиция номенклатуры по которой необходимо получить данные, а в переменной Дата хранится дата на которую необходимо получить цены. Данный пример подходит для конфигурации Бухгалтерия (ред. 2.0 / 3.0).
Получить срез последних регистра сведений запросом
Рассмотрим пример среза последних по регистру сведений в запросе. Для примера возьмем регистр ЦеныНоменклатуры из конфигурации Бухгалтерия (ред. 2.0 / 3.0). В запросе будем использовать виртуальную таблицу СрезПоследних нужного регистра. В первый параметр таблицы передается дата, на которую необходим срез, во втором можно задать произвольное условие для полей регистра.
Срез последних на каждую дату в запросе 1с
Бывают ситуации, когда срез регистра сведений необходимо получить не на конкретную дату, а на несколько дат. Но в запросе, в виртуальную таблицу можно передать только одну дату. В следующем примере будет показано, как это сделать.
Пример 3. По номенклатуре, необходимо получить все реализации за период и определить какая цена была установлена на данную номенклатуру в момент продажи по типу цен из реализации.
Вкратце принцип действия данного механизма следующий:
- Выбираем все нужные нам документы, либо просто необходимые даты;
- Присоединяем к ним регистр по нужным измерениям;
- Также в связях указываем, что нам нужны данные регистра с периодом меньше либо равным дате документа (или просто необходимой даты);
- При помощи группировки находим максимальную из подходящих дат;
- Еще раз присоединяем регистр по всем нужным измерениям, но на этот раз по конкретной дате;
- Таким образом на каждую изначальную строку с датой мы получим срез последних регистра сведений.
Если хотите подробней узнать о периодических регистрах сведений зайдите на сайт 1С:ИТС
Есть Регистр сведений, подчиняется регистратору, периодичность в пределах дня. В Регистре есть записи:
Номер отеля - 103, Дата-01.10.13
Номер отеля - 103, Дата-25.11.13
При выполнении запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеНомеровСрезПоследних.НомерНомера,
| ДанныеНомеровСрезПоследних.СостояниеНомера
|ИЗ
| РегистрСведений.ДанныеНомеров.СрезПоследних(&ДатаСреза,) КАК ДанныеНомеровСрезПоследних";
Выдаёт все 2-записи!
Как сделать, чтобы выдавал только последнюю?
(1) DeniNikitin, Срез последних Вам выдаст все последние уникальные по набору ключей регистра записи. То есть у записей должны быть полностью совпадать все измерения. У Вас видимо значения каких-то измерений отличаются, поэтому и 2 записи.
(6) Uncore,
Ресурсов вообще нету! А Измерения - Номер,Клиент,СостояниеНомера, но в выборке клиент не нужен необходимо получить список номеров на дату где будет видно состояние номера и номер.
Запрос.Текст =
"ВЫБРАТЬ
| Номера.Ссылка КАК Номер
|ПОМЕСТИТЬ втНомера
|ИЗ
| Справочник.Номера КАК Номера
|ГДЕ Номера.ЭтоГруппа = ЛОЖЬ
|СГРУППИРОВАТЬ ПО
| Номера.Ссылка
|ИНДЕКСИРОВАТЬ ПО
| Номер
|;
|///////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втНомера.Номер КАК Номер,
| МАКСИМУМ(ДанныеНомера.Период) КАК Период,
| ДанныеНомера.СостояниеНомера КАК СостояниеНомера
|ИЗ втНомера КАК втНомера
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеНомеров КАК ДанныеНомера
| ПО втНомера.Номер = ДанныеНомера.НомерНомера
|СГРУППИРОВАТЬ ПО
| втНомера.Номер,
| ДанныеНомера.СостояниеНомера
|АВТОУПОРЯДОЧИВАНИЕ";
(7) DeniNikitin, Данный код Вам не поможет конечно. Тут проблема глубже - неверно построен регистр сведений. У него должно быть ключевое поле, явно напрашивается номер. Тогда у регистра будет 2 ресурса: состояние и клиент. После по срезу последних для номера Вы получите 1 строку о его состоянии.
В принципе и в текущем решении запрос можно построить, но регистр все же советую переделать.
Запрос будет примерно такой:
(10) DeniNikitin, ведущим может быть только измерение регистра. У Вас точно нет измерений? Можете скинуть скриншот с полями регистра?
(11) DeniNikitin, надо соединить со справочником, как-то так:
нафига группировать то?
Огромное спасибо запрос идеальный и выдаёт всё что нужно!
(9) Uncore,
Получилось, подскажи теперь как ещё сюда воткнуть номера, которых нет в регистре, а из справочника?
(16) DeniNikitin,
конечно нужно регистр переделать.
Даты - в ресурсы
Ответственного - в реквизиты
И порядок измерений сделать нормальным:
Организация
Клиент
НомерНомера (масло масляное)
Только сейчас обнаружил, что если в запросе будут не все измерения, то срез последних "превращается в тыкву". Например, измерения "поставщик", "номенклатура". Делаем запрос по одному измерению "номенклатура" и не получаем срез последних по этому измерению. Это действительно так? Или я что-то "неправильно готовлю" (версия платформы 8.3.18.1208)?
(5) Что именно? Вроде только что выяснили в (1), что срез именно таким образом недоделан. У вас есть какая-то другая информация? Какая?
(0) Если не выполнять правила, заложенные в систему, то не стоит удивляться, что результат неверный. Если сказано, что нужны ВСЕ измерения, то будь добр выполнять и не удивляйся, если забыл снять штанишку до того как писаешь.
(8) Вы неправы. Срез последних никоим образом не зависит от уникальности. Исходные данные для получения среза всегда не уникальны
(10) Разработчики решили, что вход с улицы должен всегда вести прямо на последний этаж. Почему бы в этом месте не поудивляться?
Хыхы, ну да, конечно, один из важных элементов платформы именно разработчики захотели сделать именно таким.
Мне это напоминает ситуацию, когда из института приходит мальчик-кодер, видит корпоративную систему издалека и тут же заявляет, что делали её идиоты и надо всё переделывать.
(11) когда-то в молодости я писал свои модели, но все кончилось тем, что занимаюсь 1С-ом
Правила устанавливают те, у кого решение взлетело и выдержало испытание временем
(17) Вы упорствуете в заблуждении. Уникальность и срез - это две НЕЗАВИСИМЫХ друг от друга фичи.
Исходные данные
01.01.2021 ООО Ромашка Свистелка 100 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 Свистелка 106 руб.
В этом месте, если вы сделаете запрос к срезуПОСЛЕДНИХ с одним измерением 1С выдаст
01.02.2021 Свистелка 105 руб.
01.03.2021 Свистелка 106 руб.
(18) И это нормальная логика. К примеру: Есть некий Вася, который работает на 2 рабочих местах.
01.03.2020 Кабинет1 Вася
Если вы сделаете срез последних по этому регистру с отбором по Васе, то у вас выйдет 2 строчки, проще говоря 1ска сделает срез по каждому измерению (последний раз когда вася в кабинет1 и кабинет2 работал). Даже если вы не выберите поле кабинета, то все равно в результате будет 2 строчки.
Еще раз отмечу, что СрезПоследних в 1с представляет из себя последние данные на указанную дату для УНИКАЛЬНОЙ комбинации измерений.
(18) А потом у тебя будут исходные данные:
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 ООО Одуванчик Свистелка 105 руб.
И срез последних по твоей свистелке что должен будет вернуть? цены через запятую?
Только сейчас обнаружил, что если в запросе будут не все измерения, то срез последних "превращается в тыкву". Например, измерения "поставщик", "номенклатура". Делаем запрос по одному измерению "номенклатура" и не получаем срез последних по этому измерению. Это действительно так? Или я что-то "неправильно готовлю" (версия платформы 8.3.18.1208)?
(5) Что именно? Вроде только что выяснили в (1), что срез именно таким образом недоделан. У вас есть какая-то другая информация? Какая?
(0) Если не выполнять правила, заложенные в систему, то не стоит удивляться, что результат неверный. Если сказано, что нужны ВСЕ измерения, то будь добр выполнять и не удивляйся, если забыл снять штанишку до того как писаешь.
(8) Вы неправы. Срез последних никоим образом не зависит от уникальности. Исходные данные для получения среза всегда не уникальны
(10) Разработчики решили, что вход с улицы должен всегда вести прямо на последний этаж. Почему бы в этом месте не поудивляться?
Хыхы, ну да, конечно, один из важных элементов платформы именно разработчики захотели сделать именно таким.
Мне это напоминает ситуацию, когда из института приходит мальчик-кодер, видит корпоративную систему издалека и тут же заявляет, что делали её идиоты и надо всё переделывать.
(11) когда-то в молодости я писал свои модели, но все кончилось тем, что занимаюсь 1С-ом
Правила устанавливают те, у кого решение взлетело и выдержало испытание временем
(17) Вы упорствуете в заблуждении. Уникальность и срез - это две НЕЗАВИСИМЫХ друг от друга фичи.
Исходные данные
01.01.2021 ООО Ромашка Свистелка 100 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 Свистелка 106 руб.
В этом месте, если вы сделаете запрос к срезуПОСЛЕДНИХ с одним измерением 1С выдаст
01.02.2021 Свистелка 105 руб.
01.03.2021 Свистелка 106 руб.
(18) И это нормальная логика. К примеру: Есть некий Вася, который работает на 2 рабочих местах.
01.03.2020 Кабинет1 Вася
Если вы сделаете срез последних по этому регистру с отбором по Васе, то у вас выйдет 2 строчки, проще говоря 1ска сделает срез по каждому измерению (последний раз когда вася в кабинет1 и кабинет2 работал). Даже если вы не выберите поле кабинета, то все равно в результате будет 2 строчки.
Еще раз отмечу, что СрезПоследних в 1с представляет из себя последние данные на указанную дату для УНИКАЛЬНОЙ комбинации измерений.
(18) А потом у тебя будут исходные данные:
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 ООО Одуванчик Свистелка 105 руб.
И срез последних по твоей свистелке что должен будет вернуть? цены через запятую?
Здравствуйте, можете мне объяснить что такое в регистре сведений виртуальные таблицы СрезПервых и СрезПоследних и чем они отличаются?
РегистрСведенийМенеджер.<Имя регистра сведений>.СрезПоследних (InformationRegisterManager.<Имя регистра сведений>.SliceLast) РегистрСведенийМенеджер. <Имя регистра сведений>(InformationRegisterManager.<Имя регистра сведений>) СрезПоследних (SliceLast) Синтаксис: СрезПоследних(, ) Параметры: Тип: Дата; МоментВремени; Граница. Определяет момент времени, заканчивая которым необходимо выбрать записи. Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра. Тип: Структура. Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры - задает отбираемое по данному измерению значение. Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение. Если параметр не указан, то отбор не используется. Возвращаемое значение: Тип: ТаблицаЗначений. Таблица значений, заполненная данными найденных записей регистра сведений. Описание: Получает наиболее поздние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Применим только для периодических регистров сведений. Пример:Имя>
РегистрСведенийМенеджер.<Имя регистра сведений>.СрезПервых (InformationRegisterManager.<Имя регистра сведений>.SliceFirst) РегистрСведенийМенеджер. <Имя регистра сведений>(InformationRegisterManager.<Имя регистра сведений>) СрезПервых (SliceFirst) Синтаксис: СрезПервых(, ) Параметры: Тип: Дата; МоментВремени; Граница. Определяет момент времени, начиная с которого необходимо выбрать записи. Если параметр не указан, то будут получены записи без ограничения по времени. Тип: Структура. Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры - задает отбираемое по данному измерению значение. Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение. Если параметр не указан, то отбор не используется. Возвращаемое значение: Тип: ТаблицаЗначений. Таблица значений, заполненная данными найденных записей регистра сведений. Описание: Получает наиболее ранние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Применим только для периодических регистров сведений. Пример:Имя>
срез последних - это ты берешь данные регистра последние до нужной тебе даты, а срез первых - первые записи регистра после нужной тебе даты. Срез первых достаточно редко используется.
Возьми к примеру список дел, запиши на листочек. 01.11.2016 Зарегистрировался на мисте 02.11.2016 Написал вопрос 03.11.2016 Получил ответ 04.11.2016 Купил батон 15.11.2016 Завоевать мир 20.11.2016 Отдыхать после завоевания мира 31.11.2016 Познакомится с санитаром Теперь зачеркни сверху все уже выполненные на сегодня дела (меньше даты 08.11.2016). Первое сверху не зачеркнутое дело, которое предстоит выполнить - это и есть срез первых (Завоевать мир). Последнее зачеркнутое, это дело, которое ты уже выполнил последним - это и есть срез последних (Купил батон). PS Надеюсь ничего не напутал, а то магнитная буря, снег, в голова попадает.
Читайте также: