Навіщо потрібен регістр відомостей

Навіщо потрібен регістр відомостей



Навіщо потрібен регістр відомостей

Опис:

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

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

Регістр відомостей, фактично, є масивом даних, необхідний, щоб реалізувати функцію, яка може видати необхідну інформацію щодо певного набору аргументів. Аргументи функції називаються вимірами, а результат функції – ресурсами. У наведеному вище прикладі регістр "Ціни Конкурентів" міститиме виміри "Конкурент" та "Товар" та ресурс "Ціна". Ресурсів може бути більше одного: наприклад, можна зберігати оптову і роздрібну ціни.

Для розгортання цієї інформації у часі використовується поле "Період" регістру. Воно не вноситься як вимір, а додається системою автоматично при створенні періодичного регістру.

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

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

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

Дійсно, по одному товару за одним конкурентом може лише одна ціна. Якщо з будь-якої причини ми можемо отримати кілька цін і хочемо занести цю інформацію до бази даних, то нам потрібно створити ще один вимір для зберігання того значення, яким ці ціни можуть відрізнятися. Наприклад, можна завести вимір "ДжерелоІнформації". Тоді можна буде запроваджувати ціни конкурентів у розрізі джерел.

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

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

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

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

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

У програмних модулях для загальних дій над регістром відомостей (пошук, вибір та створення записів регістру) служить об'єкт РеєстрДовідокМенеджер. . Для читання, запису та видалення окремих записів регістру відомостей, що не керується реєстраторами, служить об'єкт РеєстрДокладівМенеджерЗапису. . Для зчитування та занесення набору записів до бази даних за певною умовою відбору служить об'єкт РеєстрДовідівНабірЗаписів. . Для динамічного обходу записів регістра служить об'єкт РеєстрДовідів Вибірка. .

/// Як прочитати записи регістру відомостей
/// 1с 8.3, 8.2 &На Сервері  Процедура ЯкПрочитатиЗаписиРеєстраВідомостейНаСервері()
// Прочитаємо всі записи регістру відомостей "ЦінаНаЕдуДляКлієнтів"
/ / Для організації ТОВ "Ромашка", упорядковані за датою. Запит  =
Новий Запит; Запит.Текст =
"ВИБРАТИ | ЦінаНа ЄдуДляКлієнтів.Період, | ЦінаНаЄдуДляКлієнтів.Реєстратор, | ЦінаНаЄдуДляКлієнтів.НомерРядки, | ЦінаНа ЕдуДляКлієнтів.Організація, |ЦінаНаЕдуДляКліентів.Ціна |З РеєстрЗведень. |УПОРЯДОЧИТИ ПО |; Запит.ВстановитиПараметр(
"Вибір Організація", Довідники.Організації.ЗнайтиПо Найменуванню("ТОВ""Ромашка""")
); РезультатЗапиту  = Запит.Виконати(); Записи  = РезультатЗапиту.Вибрати();
Поки що Записи.Наступний()
Цикл Повідомити(
"["
+ Записи.Період  +
"] "
+ Записи.Контрагент  +
" "
+ Записи.Номенклатура  +
" "
+ Записи.Ціна  +
"Руб."
);
КінецьЦикл;
КінецьПроцедури
/// Як отримати пізніші записи (зріз останніх)
/// регістра відомостей на вказану дату (включно)
/// 1с 8.3, 8.2 &На Сервері  Процедура ЯкОтриматиНайбільш ПізніЗаписиРеєстраВідомостейНаСервері()
// За можливості вибірки пізніших записів регістру
// відомостей (зрізу останніх) у розрізі заданої аналітики
// Відповідає віртуальна таблиця ЗрезОстанніх.
// Вона має такі параметри:
// 1. Період (включно)
// 2. Умова (наприклад, Організація = & Вибір Організація)
// Отримаємо ціни на банани для кожного контрагента
// на кінець 1 кварталу 2014 року (включно)
// з організації ТОВ "Ромашка". Запит  =
Новий Запит; Запит.Текст =
"Вибрати | Ціна на Еду для клієнтів з останніх. ліентовЗрезОстанніх.Ціна |З | , 59, 59), | Активність = Істина І |Організація І |; Запит.ВстановитиПараметр("Вибір Організація", Довідники.Організації.ЗнайтиПо Найменуванню("ТОВ""Ромашка""")
); Запит.ВстановитиПараметр("ВибНоменклатура", Довідники.Номенклатура.ЗнайтиПо Найменуванню("Банан")
); РезультатЗапиту  = Запит.Виконати(); Записи  = РезультатЗапиту.Вибрати();
Поки що Записи.Наступний()
Цикл Повідомити(
"["
+ Записи.Контрагент  +
", "
+ Записи.Період  +
"] "
+ Записи.Номенклатура  +
" "
+ Записи.Ціна  +
"Руб."
);
КінецьЦикл;
КінецьПроцедури
/// Як отримати найбільш ранні записи (зріз перших)
/// регістра відомостей на вказану дату (включно)
/// 1с 8.3, 8.2 &На Сервері  Процедура ЯкПрочитатиНайбільш РанніЗаписиРегістраВідомостейНаСервері()
// За можливості вибірки найбільш ранніх записів регістру
// відомостей (зрізу перших) у розрізі заданої аналітики
// Відповідає віртуальна таблиця СрезПервых.
// Вона має такі параметри:
// 1. Період (включно)
// 2. Умова (наприклад, Організація = & Вибір Організація)
//! Потрібно уважно вдуматись. Зріз Перших отримує по кожній
// комбінації вимірів найбільш ранній запис, але НЕ БІЛЬШЕ
// РАННЮЮ, ніж зазначена дата.
// Отримаємо найперші ціни, встановлені на банани
// для кожного контрагента у 2014 році (включно)
// з організації ТОВ "Ромашка". Запит  =
Новий Запит; Запит.Текст  =
"ВИБРАТИ | ЦінаНаЕдуДляКлієнтівСрезПервих.Період, | Перших.Ціна |З | , 00, 00), | Активність = Істина І |Організація І |; Запит.ВстановитиПараметр("Вибір Організація", Довідники.Організації.ЗнайтиПо Найменуванню("ТОВ""Ромашка""")
); Запит.ВстановитиПараметр("ВибНоменклатура", Довідники.Номенклатура.ЗнайтиПо Найменуванню("Банан")
); РезультатЗапиту  = Запит.Виконати(); Записи  = РезультатЗапиту.Вибрати();
Поки що Записи.Наступний()
Цикл Повідомити(
"["
+ Записи.Контрагент  +
", "
+ Записи.Період  +
"] "
+ Записи.Номенклатура  +
" "
+ Записи.Ціна  +
"Руб."
);
КінецьЦикл;
КінецьПроцедури
/// Як знайти та змінити програмні записи в регістр відомостей
/// Документи в 1с 8.3, 8.2 &На Сервері  Процедура ЯкЗнайтиІЗмінитиЗаписиДокументуНаСервері()
// Припустимо, ми маємо посилання на проведений документ
// "Встановлення цін на їжу" № ВМШП-000001 УстановкаЦенПосилання  = Документи.УстановкаЦінаНаЕдуДляКлієнтів.ЗнайтиПономеру(
"ВМШП-000001",
'20141231'
);
// Ми знаємо, що цей документ робить запис у регістр
// відомостей "ЦінаНаЕдуДляКлієнтів":
// [Організація, Контрагент, Номенклатура] [Ціна]
// Наше завдання: знайти ці записи і змінить їх (наприклад, подвоє
// Ціну) і записати замість старих.
// Використовуємо об'єктну техніку отримання записів,
// Адже ми їх змінюватимемо. УстановкаЦін  = УстановкаЦенПосилання.ОтриматиОб'єкт();
// Отримаємо набір записів цього документа в регістр
// "ЦінаНаЕдуДляКлієнтів" НабірЗаписів  = УстановкаЦін.Рухи.ЦінаНа ЄдуДляКлієнтів;
// Прочитаємо записи із бази даних. НабірЗаписів.Прочитати();
Для
кожного Запис  З НабірЗаписів  Цикл
// Виведемо старі значення. Повідомити(
"["
+ Запис.Організація  +
", "
+ Запис.Контрагент  +
", "
+ Запис.Номенклатура  +
"] "
+
"["
+ Запис.Ціна  +
"]"
); Запис.Ціна  = Запис.Ціна  *
2;
КінецьЦикл;
// Додамо новий запис. НовийЗапис  = НабірЗаписів.Додати(); НовийЗапис.Період  = ПоточнаДата(); НовийЗапис.Організація  = Довідники.Організації.ЗнайтиПо Найменуванню("ТОВ""Ромашка"""); НовийЗапис.Контрагент  = Довідники.Контрагенти.ЗнайтиПо Найменуванню("Петров Ю.В."); НовийЗапис.Номенклатура  = Довідники.Номенклатура.ЗнайтиПо Найменуванню("Банан"); НовийЗапис.Ціна  =
500;
// Разом запишемо набір записів. НабірЗаписів.Записати(
Істина
// Видалимо старі записи та запишемо замість них нові.
);
// Тепер записи регістру "ЦінаНаЕдуДляКлієнтів" для документа
// № ВМБП000001, відрізняються від тих, що були записані
// Документом під час проведення. Щоб повернути їх до початкового вигляду
// Треба заново провести документ.
КінецьПроцедури
/// Як прочитати записи документа в регістр відомостей запитом
/// 1с 8.3, 8.2 &На Сервері  Процедура ЯкПрочитатиЗаписиДокументуЗапитомНа Сервері()
// Цей прийом використовується, якщо не потрібно змінювати
// Знайдені записи.
// Припустимо, ми маємо посилання на проведений документ
// "Встановлення цін на їжу" № ВМШП-000001 УстановкаЦенПосилання  = Документи.УстановкаЦінаНаЕдуДляКлієнтів.ЗнайтиПономеру(
"ВМШП-000001",
'20141231'
);
// Ми знаємо, що цей документ робить запис у регістр
// відомостей "ЦінаНаЕдуДляКлієнтів".
// Прочитаємо ці записи запитом. Запит  =
Новий Запит; Запит.Текст  =
"ВИБРАТИ | ЦінаНа ЄдуДляКлієнтів.Період, | ЦінаНаЄдуДляКлієнтів.Реєстратор, | ЦінаНаЄдуДляКлієнтів.НомерРядки, | ЦінаНа ЄдуДляКлієнтів.Організація, |ЦінаНаЄдуДляКлієнтів.Ціна |З | ЦінаНа ЄдуДляКлієнтів.НомерРядки"; Запит.ВстановитиПараметр(
"ВибРеєстратор", УстановкаЦенПосилання  ); РезультатЗапиту  = Запит.Виконати(); Записи  = РезультатЗапиту.Вибрати();
Поки що Записи.Наступний()
Цикл Повідомити(
"["
+ Записи.Організація  +
", "
+ Записи.Контрагент  +
", "
+ Записи.Номенклатура  +
"] "
+
"["
+ Записи.Ціна  +
"] + Записи.Реєстратор  +
">"
);
КінецьЦикл;
КінецьПроцедури
/// Як створити записи в регістр відомостей без прив'язки до
/// Документом в 1с 8.3, 8.2 &На Сервері  Процедура ЯкСтворитиЗаписиБезПрив'язкиКДокументуНа Сервері()
// Створювати записи у регістрі відомостей без прив'язки
// До документа можна тільки для регістрів, у яких
// Вибрано режим запису "Незалежний". У нашій конфігурації
// Таким регістром є " Курс Валют " .
// Якби ми захотіли зробити таку ж штуку для
// регістру "Ціна На Єду Для Клієнтів", то нам би довелося
// скористатися документом "ОпераціяБух" або подібним до них
// для ручних операцій (див. аналогічний приклад у регістрах
// Нагромадження).
// Приклад №1.
// Для поодиноких записів зручно користуватися менеджером
// Записів. НовийЗапис  = РеєстриВідомостей.КурсВалют.СтворитиМенеджерЗаписи(); НовийЗапис.Період  =
'20140101'; НовийЗапис.Валюта  = Довідники.Валюти.ЗнайтиПо Найменуванню("Долар"); НовийЗапис.Курс  =
30; НовийЗапис.Записати(
Істина
// Заміщати, якщо вже є запис з такими ж вимірами
// і таким самим періодом
);
// Приклад №2.
// За допомогою менеджера можна також легко
// Змінювати або видаляти поодинокі записи.
// Знайдемо, змінимо, а потім видалимо створений запис. Вибірка  = РеєстриВідомостей.КурсВалют.Вибрати('20140101',
'20140101');
Якщо Вибірка.Наступний()
Тоді Запис  = Вибірка.ОтриматиМенеджерЗаписи();
// Змінимо Запис.Прочитати(); Запис.Курс  =
25;
// Запишемо Запис.Записати(Істина);
// і відразу видалимо Запис.Видалити();
КінецьЯкщо;
// Приклад №3.
// Якщо потрібно змінити відразу багато записів -
// Найзручніше використовувати набір записів.
// Запишемо курси валют за перші 3 дні 2014 року. Долар  = Довідники.Валюти.ЗнайтиПо Найменуванню("Долар"); НабірЗаписів  = РеєстриВідомостей.КурсВалют.СтворитиНабірЗаписів(); НабірЗаписів.Відбір.Валюта.Встановити(Долар); Запис01
= НабірЗаписів.Додати(); Запис01.Період  =
'20140101'; Запис01.Валюта  = Долар; Запис01.Курс  =
30; Запис02
= НабірЗаписів.Додати(); Запис02.Період  =
'20140102'; Запис02.Валюта  = Долар; Запис02.Курс  =
40; Запис03
= НабірЗаписів.Додати(); Запис03.Період  =
'20140103'; Запис03.Валюта  = Долар; Запис03.Курс  =
60;
// Запишемо весь набір разом. НабірЗаписів.Записати(
Істина
// затрем всі інші записи по
// долара (ми встановили його у відборі)
);
КінецьПроцедури
/// Завантажити та виконати ці приклади на комп'ютері

Регістри відомостей у мові 1С 8.3, 8.2 (у прикладах)

З повагою Володимир Мількін (викладач школи 1С програмістів та розробник обновлятора).

Подібні статті

  • Навіщо потрібен аніоніт
  • Навіщо потрібен ЕПРА
  • Навіщо потрібен Зілекса септ
  • Навіщо потрібен нагрівач в акваріум
  • Навіщо потрібен зворотний пінцет
  • Навіщо потрібен Суролан
  • Навіщо потрібен Акріхін
  • Навіщо потрібен кондиціонер для акваріумної води
  • Останні статті

  • Який найвищий водоспад у Південній Америці
  • водоемульсійний лак
  • Який раціон має бути у вівчарки
  • Паливний насос високого тиску будова
  • скільки часу линяють качки
  • У чому плюс німецької вівчарки
  • гриби рядовки як приготувати
  • кімнатні рослини які не люблять світла
  • Категорії