Особливість отримання зрізу останніх записів у регістрі відомостей. Особливість отримання зрізу останніх записів у регістрі відомостей Як працює зріз останніх 1с

: Зріз Першихі Зріз ОстанніхРозглянемо роботу із цими віртуальними таблицями з допомогою 1С. Набагато частіше застосовується Зріз Останніхтому з нього і почнемо.

Зріз останніх дозволяє отримати останній запис регістра відомостей на вказану дату у розрізі вимірювань. Для таблиці зрізу останніх є можливість у дужках вказати два параметри через кому. У першому параметрі передається дата яку робиться зріз (якщо параметр не вказано зріз робиться на поточну дату). Другий параметр є умовою мовою запитів 1С і дозволяє встановлювати різні відбори. Як правило, у цих відборах використовуються вимірювання. Все це звучить досить туманно, тому без прикладу не обійтися.
Тож нехай у нас є періодичний регістр відомостей Цінав якому зберігаються ціни на розрізі товарів та постачальників. Періодичність регістру – день.

У регістрі є такі записи

Для початку отримаємо зріз останніх без використання параметрів виконавши такий запит

ВИБРАТИ Ціна Зріз Останніх. Період ЯК Період, Ціна Зріз Останніх. Товар ЯК Товар, Ціна Зріз Останніх. Постачальник ЯК Постачальник, Ціна Зріз Останніх.

Оскільки параметри не вказані, зріз виконується на поточну дату - 01.02.2017. В результаті отримуємо таку таблицю

Тут бачимо, що комбінація вимірів Товар + Постачальник унікальна, тобто. для кожної комбінації вимірювань регістру було взято запис з максимальною датою, і дата запису менше або дорівнює поточній даті.

Допустимо нам треба зробити те саме але записи ми хочемо отримати з датою меншою або рівною 15.01.2017. Для цього необхідно в запиті змінити рядок із таблицею зрізу останніх таким чином

З РеєстрВідомостей.Ціна.Зріз Останніх(&ДатаСреза,) ЯК ЦінаЗріз Останні

Перед виконанням запиту в нього звичайно треба передати параметр &ДатаЗрізу. Тепер результат запиту виглядатиме так

І нарешті уявімо, що нам треба отримати зріз останніх на ту саму дату з умовою, що товар у нас Олівець, а постачальник Канцтовари. Для цього вкажемо у запиті другий параметр

З РеєстрВідомостей.

У результаті отримаємо лише один запис

Щоб не заплутатися у всіх цих дужках і комах, краще скористатися конструктором запитів. Покажу на прикладі останнього запиту.

Після вибору конструктора запиту таблиці зі зрізом останніх необхідно натиснути кнопку Параметри віртуальної таблиціі у вікні прописати

Неважко здогадатися, що для зрізу перших принцип дії такий самий за винятком того, що вибирається перший запис після дати зрізу.

У тестовій конфігурації ми маємо періодичний регістр відомостей "Ціни Номенклатури" з наступними вихідними даними:

На малюнку представлена ​​також структура метаданих регістру. Як ми бачимо, регістр містить вимір "Товар" з типом посилання на довідник "Товари", а також числовий ресурс "Ціна" та реквізит "СтараЦіна".

Припустимо, у звіті нам потрібно отримати зріз останніх записів для товарів та їх цін із умовою, що стара ціна менша чи дорівнює 50.

Два варіанти запиту

Відразу скажу, що розглядатимемо правильний і не правильний варіанти. Почнемо з останнього. Цю помилку часто роблять програмісти-початківці. І так, для звіту було написано наступний запит:

Запит = Новий Запит; Запит. Текст = " ВИБРАТИ | | | | | З | РеєстрВідомостей. ЦіниНоменклатури. Зріз Останніх ЯК ЦіниНоменклатуриЗріз Останніх|ДЕ | ЦіниНоменклатуриЗріз Останніх. Стара ціна< = 50 " ;

Зверніть увагу на умову у секції "ДЕ". У цьому полягає головна помилка! Цей запит не поверне жодного запису, і ось чому: при використанні віртуальних таблиць, у нашому випадку "Зріз Останніх", спочатку виконується вибірка даних з бази за умовами, описаними у віртуальній таблиці, а потім виконуються дії, описані в тексті запиту (групування, умови у секції "ДЕ", сортування тощо).

Тож у нашому прикладі запит і не повертає результату. Спочатку він отримує зріз останніх, а вже після встановлює умову на реквізит "СтараЦіна". Ось так це виглядає на схемі:

Щоб правильно вирішити завдання, умову на реквізит "СтараЦіна" потрібно перенести до умов віртуальної таблиці. Ось так виглядатиме правильний текст запиту:

Запит = Новий Запит; Запит. Текст = " ВИБРАТИ ЦіниНоменклатуриЗріз Останніх. Період, ЦіниНоменклатуриЗріз Останніх. Товар, ЦіниНоменклатуриЗріз Останніх. Ціна, ЦіниНоменклатуриЗріз Останніх. Стара ціна З РеєстрВідомостей. ЦіниНоменклатури. Зріз Останніх(, СтараЦіна< = 50 ) ЯК ЦіниНоменклатуриЗріз Останніх"

Тепер запит отримає правильні дані, оскільки зріз останніх цін отримуватиме вже з урахуванням умови щодо реквізиту "СтараЦіна".

Результати

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

Звідси також випливає головне правило щодо використання віртуальних таблиць: "використовуючи віртуальну таблицю обов'язково встановлюйте параметри відбору безпосередньо у віртуальній таблиці, інакше запит отримуватиме зайві дані, куди вже потім встановлюватимуться відбори".

/
Реалізація обробки даних

Дозвіл підсумків для періодичних регістрів відомостей

Область застосування: керований додаток, мобільний додаток, звичайний додаток.

1.1. Для періодичних регістрів відомостей рекомендується вирішити підсумки, якщо виконані такі умови:

  • у регістрі очікується великий обсяг даних (наприклад, виправдано для регістру з цінами номенклатури; але немає сенсу для регістру з курсами валют);
  • у конфігурації передбачені частотні запити до зрізів останніх на поточний час і/або до зрізів перших для отримання актуальних даних (тобто коли не заданий період у параметрах віртуальних таблиць) Зріз Першихі Зріз Останніх);
  • при цьому інші умови для віртуальних таблиць Зріз Першихі Зріз Останніхзадаються лише значення вимірювань (і роздільників, що у режимі Незалежно та спільно);
  • в обмеженнях доступу до даних регістру використовуються лише виміри (і роздільники, що перебувають у режимі Незалежно та спільно).

Повний список усіх умов, коли у запитах використовуються результати регістру відомостей, див.документації до платформи 1С: Підприємство.

Наприклад, якщо в конфігурації передбачені запити, що часто виконуються, до регістру ЦіниНоменклатуридля отримання поточних цін номенклатури:

ВИБРАТИ Номенклатура. Артикул ЯК Артикул, ЦіниНоменклатури. Ціна ЯК Ціна, . . . З Довідник. Номенклатура ЯК Номенклатура ЛІВОЕ З'ЄДНАННЯ РеєстрВідомостей. ЦіниНоменклатури. зріз останніх(, видціни = &ВидЦени) ЯК ЦіниНоменклатуриПО ЦіниНоменклатури. Номенклатура = Номенклатура. Посилання . . .

то при дотриманні всіх інших умов, перерахованих вище, встановлення якості Дозволити підсумки: зріз останніхсуттєво прискорить виконання таких запитів, за рахунок того, що вибірка виконуватиметься безпосередньо з додаткових таблиць, у яких зберігаються лише останні значення (для зрізу останніх) та перші значення (для зрізу перших).

1.2. Крім того, слід розглянути альтернативні варіанти перегляду запитів до регістру таким чином, щоб ці умови виконувались.

Наприклад, якщо в деяких випадках дані в регістр ЦіниНоменклатуризаписуються майбутньою датою, а під час підбору товарів до цього регістру виконується запит завжди на поточну дату (дата явно задана у параметрі віртуальної таблиці Зріз Останніх), то підсумки не пришвидшуватимуть виконання таких запитів. Оскільки результати будуються лише перших і останніх записів регістру.

Однак якщо при відкритті форми підбору товарів аналізувати, чи є реєстратори з майбутньою датою, і якщо їх немає – виконувати інший запит до зрізу останніх без встановлення дати, такий запит працюватиме швидше.

2. У решті випадків, не слід дозволяти підсумки для періодичних регістрів відомостей. Насамперед, якщо

  • найчастіше (завжди) до віртуальних таблиць зрізу перших/останніх періодичного регістру відомостей виконуються запити на конкретний період (наприклад, на дату документа).
  • в умовах для віртуальних таблиць Зріз Першихі Зріз Останніхнайчастіше (завжди) використовуються підзапити та з'єднання (звернення «через точку» до полів пов'язаних таблиць). Наприклад, у цьому випадку:

3. Не потрібно передбачати у конфігурації окремого механізму перерахунку результатів, оскільки актуалізація таблиць підсумків виконується автоматично за кожного запису набору записів в регістр.

Іноді потрібно запитом отримати з періодичного регістру відомостей дані кілька дат відразу. Типовий приклад – робота з курсами валют. Розглянемо алгоритм розв'язання цього завдання з прикладу.

Постановка задачі

У базі створено документ «Реалізація Товарів Послуг», у шапці якого є реквізит «Валюта». Запит потрібно для кожного документа отримати актуальний курс валюти з шапки на дату документа. Зберігання курсів валют здійснюється в періодичному регістрі відомостей "Курси Валют".
Рішенням «в лоб» цього завдання міг би бути запит у циклі: отримання всіх документів з їх датами та валютою та у вибірці звернення до віртуальної таблиці зрізу останніх регістру «КурсиВалют». Але т.к. запит у циклі - це "погано", спробуємо реалізувати завдання одним запитом.

Рішення

Для вирішення завдання будемо використовувати факт, що таблиці у запиті можна поєднувати не тільки на рівність полів.

ВИБРАТИ Реалізація Товарів Послуг. Посилання, Реалізація Товарів Послуг. Валюта, МАКСИМУМ (Курси Валют. Період) ЯК Період ПОМІСТИТИ В Т Періоди Установки Курсів З Документ. ПО Реалізація Товарів Послуг. Валюта = Курси Валют. Валюта І Реалізація Товарів Послуг. Дата > = Курси Валют. Період ЗГРУПУВАТИ ПО Реалізація Товарів Послуг. Посилання, Реалізація Товарів Послуг. Валюта; //////////////////////////////////////////////////// ////////////////////////////// ВЫБРАТЬ ВТПериодыУстановкиКурсов.Ссылка, ВТПериодыУстановкиКурсов.Валюта, КурсыВалют.Курс ИЗ ВТПериодыУстановкиКурсов КАК ВТПериодыУстановкиКурсов ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений. Курси Валют ЯК Курси Валют ПО ВТПеріодиУстановкиКурсів.Період = КурсиВалют.Період І ВТПеріодиУстановкиКурсів.Валюта = КурсиВалют.Валюта

Порядок дій у запиті:

  1. Отримання кожного документа періоду встановлення курсу валюти.Документи поєднуються з ФІЗИЧНОЮ таблицею «КурсиВалют». Тут слід звернути увагу до умови з'єднання. Валюти мають бути рівними, а дата документа >= періоду регістру відомостей.
    В результаті такого з'єднання для кожного документа буде отримано безліч рядків, що задовольняють умові: всі записи курсів валют валюти документа, встановлені не пізніше дати документа.
    Завершальним етапом буде угруповання рядків із отриманням максимального періоду курсу. У результаті кожного документа буде отримано необхідний період установки курсу для потрібної валюти (максимальна дата установки курсу валюти, але з більше дати документа). Результат міститься в тимчасову таблицю ВТПеріоди Установки Курсів.
  2. Отримання курсу.Тимчасова таблиця ВТПеріоди Установки Курсів з'єднується з ФІЗИЧНОЮ таблицею «Курси Валют». З'єднання відбувається за Валютою документа та періодом встановлення курсу, визначеним у другій тимчасовій таблиці.

Регістри відомостей 1Сце структурований набір даних із вимірами та ресурсами. Призначений для зберігання періодичної інформації.

Періодичність

Інформація зберігається в розрізі вимірів та періоду. Регістру відомостей можна задати періодичність:

  • Неперіодичний
  • за реєстратором
  • секунда
  • тиждень
  • місяць
  • квартал

Періодичність необхідна вибору інформації з регістру на певний період. Якщо вказати періодичність, записи в регістр проводитимуться з періодом, коли було зроблено запис. Допустимо якщо подивитися регістр «Ціни номенклатури», можна побачити історію зміни цін, з якими вимірами та в який період часу було зроблено запис.

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

Реєстратори

Якщо робити запис у регістр відомостей за допомогою документа, потрібно встановити режим запису: «Підпорядкування реєстратору» і вибрати документ, яким робитиметься запис у регістр. Тоді в регістрі з'явиться поле «Реєстратор», де зберігатиметься інформація, яким документом було зроблено запис. Також реєстратор можна використовувати як період, для цього вкажіть у полі «Періодичність» — «По реєстратору». Підпорядкування реєстратору роблять, коли потрібно жорстко прив'язати регістр до документа та зміна записів у регістрі в ручному режимі стає недоступною.

Документи, які будуть у ролі реєстраторів, може бути дещо. Для того, щоб додати реєстратор, потрібно зайти у властивості потрібного регістру відомостей, перейти на вкладку «Реєстратори» та встановити галочки навпроти документів, які виконуватимуть роль реєстратора.

Подивитися рухи, які робить реєстратор можна з документа. Для цього потрібно зайти в документ, що Вас цікавить, натиснути: Перейти - Рухи документа по реєстратору.

У властивостях регістру не забудьте додати права, їх можна призначити на вкладці "Права". Потім у списку ролей потрібно вибрати роль, якій потрібно додати права на регістр і в списку прав встановити права на обрану роль.

Унікальність записів

Унікальність запису залежить від періоду та вимірів. Наприклад, якщо ви хочете записати в регістр «Ціни номенклатури» запис з однаковими вимірами, в той самий день, то у вас це не вийде і програма викличе помилку, оскільки періодичність регістру в межах дня.

Якщо періодичність задана реєстратором, він також бере участь в унікальності запису.

Для не періодичних та не залежних регістрів унікальність залежить від комбінації вимірювань.

Форми

Для перегляду записів використовуйте форму списку, в ній можна встановити відбір, по полям, що Вас цікавлять, подивитися історію записів і змінити їх через форму запису. Подивитися записи регістра можна так: у верхньому меню натиснути кнопку «Операції» — «Регістри відомостей». У вікні виберете потрібний Вам регістр. Після цього відкриється форма списку як таблиці, де кожна стоку є унікальним записом.

Для редагування / створення, використовуйте форму запису, якщо запис підпорядкований реєстратору, тоді поле буде недоступне і створити форму не вийде.

Додавати форми необхідно в конфігураторі, зайшовши в регістр відомостей, у вкладці «Форми» і натиснути на «лупу» у потрібного типу форми. Далі відкриється вікно, де можна налаштувати поля майбутньої форми (розташування, назви та прописати функціонал).


Вимірювання, ресурси та реквізити

Вимірювання призначені для формування унікальності запису, за ними надалі можна здійснювати відбір та робити зріз за конкретним виміром. Поєднання вимірювань та формує ключ запису. Краще не створювати багато вимірювань, щоб таблиця не розросталася і в процесі роботи з нею, не гальмувала.

Виміри мають галочку «Ведуче», якщо вона встановлена, то запис зберігатиметься в базі даних, поки існує даний вимір. Провідних вимірів можна зробити кілька. Наприклад, у регістрі відомостей «Ціни номенклатури», провідним виміром є номенклатура, якщо видалити номенклатуру, яка бере участь у записі, тоді автоматично видаляється запис у регістрі відомостей з цієї номенклатури.

Ресурси призначені для зберігання сумової інформації: кількість, ціна і т.д. Ресурси надалі отримуватимемо на певний період часу (якщо регістр періодичний), за вимірами.

Реквізити, як правило, призначені для зберігання додаткової інформації, вони не беруть участь в унікальності запису. Наприклад, в реквізити можна заносити таку інформацію як автор, коментар і т.д.

З регістром відомостей можна робити такі действия:

  • Видалення запису в регістрі відомостей 1С

Особливості

— Унікальність записів за набором вимірів: кожен запис у регістрі відомостей — це нове значення ресурсу.

— Записи регістру відомостей можуть бути як періодичними, так і ні.

— Реєстр відомостей може бути залежним та незалежним від реєстратора.

— Є можливість зробити зріз перших та останніх записів на потрібну дату. Це реалізовано віртуальними таблицями: «СрезПерших» та «ЗрезОстанніх». Для використання цих таблиць можна скористатися як відбором, і запитом (у конструкторі запитів ви введіть ці віртуальні таблиці і можете зробити з них запит). Ці таблиці будуть доступними, якщо регістр відомостей періодичний.

Регістр "Ціни номенклатури" - періодичний регістр відомостей, записи проводитися за реєстратором.

На зображенні видно, що періодичність встановлена ​​не більше дня. Отже, ціну можна змінити один раз на день за унікальними протягом дня вимірами.

Реєстр підпорядкований документу "Встановлення цін номенклатури". Отже, запис у регістр походить із цього документа. Рухи за конкретним документом можна переглянути із форми документа «Встановлення цін номенклатури».

Регістр призначений для зберігання інформації щодо ціни номенклатури, з вимірами «Тип цін», «Номенклатура» та «Характеристика номенклатури». Провідним вимірами є всі три поля виміру, за ним можна буде робити відбір під час вибірки.

Висновок:після прочитання статті Ви зможете створити регістр відомостей 1С, додати виміри та ресурси, налаштувати форми редагування та списку. Створити запис та зробити вибірку існуючих записів. Якщо залишилися питання, скористайтесь коментарями в статті, постараюся оперативно дати відповідь на питання, що Вас цікавить.

Сподобалася стаття? Поділіться з друзями!