Для чего нужен «Основной отбор по периоду» у РС
Редактирование регистра сведений
Если для регистра указано, что он переиодический и выбран независимый режим записи, то становится доступным свойство Основной отбор по периоду. Если флажок установлен, то наряду с основными измерениями и реквизитами регистра учавствующими в отборе записей при регистрации изменений, можно указывать отбор по полю «Период» (см. главу 18 «Механизмы обмена данными» параграф «Служба регистрации изменений»).
Разработка структуры регистра сведений
Свойства измерения (ресурса, реквизита) регистра сведений
Индексировать. Для измерений свойство доступно для редактирования, если измерение не является ведущим. Для измерений, ресурсов и реквизитов с установленным свойством Индексировать создается отдельный индекс, что увеличивает производительность при работе с регистром.
При просмотре регистра в режиме «1С:Предприятие» существует возможность сортировать записи регистра по индексированным измерениям, ресурсам и реквизитам.
Периодические регистры сведений
Многие программисты, знакомые с версией 7.7 и желающие освоить версию 8, спрашивают, куда делись периодические реквизиты справочников и периодические константы. А если их нет, то какой механизм их заменяет? В 1С:Предприятии 8 для хранения истории изменения значений предназначены периодические регистры сведений.
Вообще регистры сведений предназначены для хранения информации, развернутой по комбинации измерений. Главное отличие периодического регистра сведений от обычного заключается в том, что в нем присутствует дополнительное системное измерение «Период», имеющее тип «дата». Это позволяет получать не только текущие сведения об объекте, но также на любой момент времени.
Для периодического реквизита при создании указывается свойство «Периодичность» из следующих возможных значений:
- в пределах секунды,
- в пределах дня,
- в пределах месяца,
- в пределах квартала,
- в пределах года,
- по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).
Обратите внимание, что тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и т.д.). Более того, в регистре сведений можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения».
Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день. Структура регистра представлена ниже:
Подробная информация о структуре регистра сведений КурсыВалют приведена в следующей таблице:
| Измерения: | Валюты | тип «СправочникСсылка.Валюты», ведущее, запрет незаполненных значений |
| Ресурсы: | тип «число», длина 15, точность 4, неотрицательное тип «число», длина 10, точность 0, неотрицательное |
|
| Периодичность | В пределах дня | |
| Режим записи | Независимый |
Данные в этот регистр сведений можно вводить вручную с помощью формы списка.
ВНИМАНИЕ. В регистр сведений с определенной периодичностью, не равной «По позиции регистратору», нельзя ввести две записи с одинаковым набором измерений и периодом, т.е. нельзя ввести два курса одной валюты в один день. Если периодичность записи регистра имеет значение «По позиции регистратора», то ключ уникальности записи также содержит и ссылку на документ-регистратор, т.е. в таком регистре не может существовать две записи с одинаковым набором измерений, периодом и регистратором. Это неотъемлемое свойство регистра сведений, отличающее его от остальных регистров.
Добавление новых записей в регистр сведений, а также перебор имеющихся записей производится стандартным для всех регистров способом. В данном разделе мы рассмотрим только самое важное — получение информации из периодического регистра на определенный момент времени.
Обращение к периодическим сведениям с помощью методов
Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» периодического регистра сведений понимаются первые или последние значения ресурсов по указанным измерениям. При этом применяются следующие методы:
Возвращает в виде структуры значения ресурсов одной записи регистра, соответствующей указанным значениям всех (!) измерений регистра и периоду.
ПолучитьПоследнее (<Конец периода>, <Отбор>)
Этот метод возвращает актуальное значение ресурсов, действовавшее на заданную дату. Если он не находит запись в регистре по данной комбинации измерений точно на заданный период, то возвращается структура, содержащая значения ресурсов ближайшей более поздней записи.
ПолучитьПервое (<Начало периода>, <Отбор>)
Этот метод действует аналогично методу ПолучитьПоследнее, но если записи на данный момент не находится, то возвращается структура, содержащая значения ресурсов ближайшей более ранней записи.
СрезПоследних (<Конец периода>, <Отбор>)
Эти методы аналогичны методам ПолучитьПоследнее и ПолучитьПервое соответственно , но при их использовании, как правило, не указывается одно или несколько измерений. В результате возвращается не структура, как в предыдущих случаях, а таблица значений , заполненная данными найденных записей регистра сведений.
СрезПервых (<Начало периода>, <Отбор>)
При вызове методов ПолучитьПервое, ПолучитьПоследнее, СрезПервых и СрезПоследних первый параметр может иметь тип «дата», МоментВремени или Граница, но его можно вообще не указывать, тогда будут найдены значения ресурсов из самой первой или последней записи регистра соответственно.
Продемонстрируем использование этих методов на примерах:
Пример 1. Получение курса валюты точно на заданную дату (если записи именно на эту дату нет, то в элементах структуры будут пустые значения).
Пример 2. Получение актуального курса валюты на заданную дату (если записи именно на эту дату нет, то будет найдена ближайшая более поздняя запись)
Пример 3. Получение актуальных курсов всех валют на заданную дату (отбор не указан, т.е. мы хотим получить сведения по всем значениям измерений).
Пример 4. Получение актуальных оптовых цен на товары (указан отбор по измерению «ТипЦен»)
Обращение к периодическим сведениям с помощью запросов
Для получения данной информации служит виртуальная таблица среза последних/первых записей регистра сведений. По структуре она полностью идентична основной таблице регистра сведений и содержит следующие поля:
| Метод | Описание |
|---|---|
| Поле | Описание |
|---|---|
| <Имя измерения> | Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений. |
| <Имя реквизита> | Набор полей, содержащий значения реквизитов регистра. |
| <Имя ресурса> | Набор полей, который содержит значения ресурсов регистра. |
| Активность | Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени. |
| МоментВремени | Содержит момент времени записи регистра. |
| НомерСтроки | Содержит номер строки, определяемый как порядковый номер записи в наборе записей. |
| Период | Содержит период, к которому относится запись регистра. |
| Регистратор | Содержит ссылку на документ-регистратор движения. |
При обращении к виртуальным таблицам СрезПервых и СрезПоследних можно указать следующие параметры:
| Параметр | Описание |
|---|---|
| Дата | Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние/ранние записи. |
| Условие | Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние/ранние. Условие будет применяться к исходным записям, а не к уже отобранным. |
Приведем примеры обращения к записям регистра сведений с помощью запросов:
Пример 1. Выбрать все записи регистра сведений
Пример 2. Получить актуальный курс одной валюты на заданную дату
Пример 3. Выбрать актуальные курсы всех валют на заданную дату
Пример 4. Получить актуальный прайс-лист на заданную дату (указан определенный тип цен, например, «Розничная»)
Основной отбор по периоду регистр сведений что это
1. Регистр сведений — это
2. Виды регистров сведений
3. Измерения, ресурсы, реквизиты регистра сведений
4. Периодический регистр сведений
5. Свойства регистра и измерений
6. Добавление записи в регистр сведений
7. Изменение значения ресурса записи регистра сведений
8. Удаление выбранных записей в регистре сведений
9. Очистка регистра сведений от записей
10. Получить значение ресурса регистра сведений на дату
1. Регистр сведений — это
Регистр сведений предназначен для хранения показателей состояния в разрезе измерений. В отличии от других регистров, ресурсы регистра сведений могут содержать не только числовые значения, в том числе может быть составным.
2. Виды регистров сведений
- Независимый регистр сведений — регистр не подчинен регистратору (документу).
- Зависимый регистр сведений — регистр подчинен регистратору (документу).
- Непериодический регистр сведений — информация в регистре храниться без привязки к дате.
- Периодический регистр сведений — информация в регистре развернута во времени, одним из измерений является дата, называемым Периодом.
Измерения – описывают разрезы, в которых хранится информация.
Ресурсы – содержат хранимую информацию в разрезе измерения.
Тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ПеречислениеСсылка и т.д.). В ресурсе можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения». Ресурс может быть составным типом.
4. Периодический регистр сведений
- Непериодический
- В пределах секунды
- В пределах дня
- В пределах месяца
- В пределах квартала
- В пределах года
- По позиции регистратора
5. Свойства регистра и измерений
Основной отбор по периоду (для регистра) — если регистр периодический и не подчинен регистратору, то доступно это свойство. Если флажок установлен, то наряду с основными измерениями и реквизитами регистра, участвующими в отборе записей при регистрации изменений для плана обмена, можно указывать отбор по полю Период.
Ведущий (для измерения) — имеет смысл когда измерение имеет тим ссылка на объект. Записи в регистре будут существовать пока существует объект, ссылка на который выбрана в качестве значения этого измерения. При удалении объекта все записи в регистре по этому объекту будут автоматически удалены.
6. Добавление записи в регистр сведений
Добавление через МенеджерЗаписи, подойдет для добавления одной записи.
НоваяЗапись . Период = Дата ;
НоваяЗапись . Номенклатура = Номенклатура ;
НоваяЗапись . Цена = Цена ;
НоваяЗапись . Записать ();
Добавление через НаборЗаписей, подойдет для добавления одной или нескольких записей.
НовыйНаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НовыйНаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НовыйНаборЗаписей . Отбор.Номенклатура . Установить ( Номенклатура ,Истина);
НоваяЗапись = НовыйНаборЗаписей . Добавить ();
НоваяЗапись . Период = Дата ;
НоваяЗапись . Номенклатура = Номенклатура ;
НоваяЗапись . Цена = Цена ;
НовыйНаборЗаписей . Записать ();
7. Изменение значения ресурса записи регистра сведений
Изменение значение ресурса записи через НаборЗаписей, подойдет для изменения одной или нескольких записей.
НаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НаборЗаписей . Отбор . Номенклатура . Установить ( Номенклатура ,Истина);
НаборЗаписей . Прочитать ();
Если Не НаборЗаписей . Количество () = 0 Тогда
СуществующаяЗапись = НаборЗаписей [ 0 ];
СуществующаяЗапись . Период = Дата ;
СуществующаяЗапись . Номенклатура = Номенклатура ;
СуществующаяЗапись . Цена = Цена ;
НаборЗаписей . Записать ();
КонецЕсли;
8. Удаление выбранных записей в регистре сведений
Удаление записей через НаборЗаписей, подойдет для удаления одной или нескольких записей.
НаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НаборЗаписей . Отбор . Номенклатура . Установить ( Номенклатура ,Истина);
НаборЗаписей . Записать ();
Как сделать Отбор периодических реквизитов справочника? |
Я |
27.08.10 — 12:42
Как известно что периодическим реквезитам нельзя использовать командты ВыбратьЭлементыПоРеквезиту или УстановитьОбор (галочки отбор и сортировка не доступны)
Как выйти из ситуации?
МОжет есть какая нибудь хорошая компонента (dll) для работы со справочниками….(вроде в 1cpp, 7plus, таких функций не замечал)
1 — 27.08.10 — 12:43
ТП и нет проблем..
2 — 27.08.10 — 12:45
тП — это что такое? ТЗ, СЗ…меня не устраивают…а ТП??
3 — 27.08.10 — 12:55
Перебирать весь справочник и закидывать в Список, займет больше времени чем стандартная функция ВыбратьЭлементыПоРЕк….. поэтому не хочеться использоватьСписокЭлементов
4 — 27.08.10 — 12:56
Какие есть другие варианты?
5 — 27.08.10 — 13:02
+
6 — 27.08.10 — 13:04
Пиши прямой запрос к 1SCONST
7 — 27.08.10 — 13:04
(2) ТабличноеПоле из 1с++
8 — 27.08.10 — 13:16
(7) 1CPP_Classes.als, 1C++.als, 1C++_Add.als, 1CPP_Classes.als просмотрел….но что-то не вижу функций отбора…
(6) через dbf чтоли?
9 — 27.08.10 — 23:12
тема затухла….
10 — 27.08.10 — 23:13
(8) Используй поставщикДанных…
11 — 27.08.10 — 23:20
(10)…..да ну….что-то пахло, но не совсем убедительно было….дайка попробую….поставщикданных говоришь….
он управляет списком в форме?…или вообще всем справочником вне формы списка?…я так задал этот вопрос по ходу….покамись еще не подрубил ее и не прочитал описание функции….
12 — 27.08.10 — 23:21
он управляет данными, которые будут показываться в ТП…
13 — 27.08.10 — 23:28
эх,щас бы проверил….но удаленка что-то не работает…думаю завтро проверю…Спасибо Денис…..Я так понимаю ТабличноеПоле это на подобие ТЗ и СЗ? и не имеет формы диалога? или что-то я путаю? и на самом ли деле будет быстрее делать отбор через ТП, чем через Цикл, а затем ИспользоватьСписок?
14 — 27.08.10 — 23:30
(13) тп — это элеменгт диалога. Отдельно не существует.
А быстрее — это как запрос напишешь
15 — 27.08.10 — 23:36
Элемент диалога? да ну…а как его закинуть*? Программно видимо только да?
16 — 27.08.10 — 23:40
ни в одной из этих описаний не нашел ТП в чистом виде…1CPP_Classes.als, 1C++.als, 1C++_Add.als, 1CPP_Classes.als
в последнем описании есть классы_ДемоТП…но там только Форма.ДГС, форма.ПКС, Форма.формаспискасправочника….
Где рыть?
17 — 27.08.10 — 23:44
ТТабличноеПОлесНастройками?
18 — 28.08.10 — 00:11
ИндексированнаяТаблица?
19 — 28.08.10 — 00:12
стоп
а если сначала использовать метод ИспользоватьДату() ???
20 — 28.08.10 — 00:12
всё равно не будет искать 67
21 — 28.08.10 — 00:12
?
22 — 28.08.10 — 00:13
Думаю не проканает….будет крякать неправильный реквезит….
23 — 28.08.10 — 00:19
(19) как и ожидалось…не работает…
24 — 28.08.10 — 00:20
блин где-то видел я этого «поставщикаданных»….чтот не могу найти
25 — 28.08.10 — 00:25
да
нельзя сделать, чтоб Сортировка с «Периодическим» сочетались =(
26 — 28.08.10 — 00:26
оФорма = СоздатьОбъект(«Форма»);
оФорма.УстановитьФорму(Форма);
тпПечатьТоваров = оФорма.СоздатьЭлементУправления(«ТабличноеПоле»,
27 — 28.08.10 — 00:32
блин запарился ждать помощи…может мне поможет http://openconf.1cpp.ru/beta/artbear/1cpp_classes.rar, решил скачать и посмотреть…
28 — 28.08.10 — 00:34
главное чтобы этот ТП, помог мне решить мой ТАСК
29 — 28.08.10 — 01:48
30 — 28.08.10 — 08:50
подрубил поставщикаданных…через пример…пример в виде обработки…поменял справочник контрагенты на интересующий меня другой справочник, вроде бы все работает, но только в обработке….
А теперь вопрос как возвратить элемент? допустим в документ? заменить форму списка справочника этой обработкой?
31 — 28.08.10 — 08:54
(40) ПриначалеВыбора()
открытьФорму()
В обработке — ВыполнитьВыбор()
В документе ОбработкаПодбора()
32 — 28.08.10 — 09:04
Хорошо….
В доке пропишу
Процедура ПриначалеВыбора() //хотя приначалевыборазначения еще есть процедура…
ОткрытьФорму(«Обработка.СпрТовары);
КонецПРоцедуры
а в обработке?
Дописать
Процедура ВыполнитьВыбор()
КонецПроцедуры
33 — 28.08.10 — 09:06
что-то не клеется…где то я что то не понимаю…..как получить результат обработки? т.е. получить выбранный элемент из обработки? найти его опять же в справочнике?
я полагаю результатом должен быть сам элемент?
34 — 28.08.10 — 09:08
читаю описание ТП…по http://www.1cpp.ru/docum/icpp/html/TableField.html#id3… в правильном направлении движусь?
35 — 28.08.10 — 09:10
(33) я ж написал ВыполнитьВыбор
Форма.ВыполнитьВыбор(<?>);
Form.MakeChoice(<?>);
Синтаксис:
Форма.ВыполнитьВыбор(<Знач>)
Назначение:
Осуществляет выбор в форме, открытой для подбора или выбора значения (аналогично интерактивному двойному клику в подборе).
Параметры:
<Знач> — значение, которое выбирается в форме, открытой для подбора или выбора значения.
Замечание:
Доступ к методу возможен только в контексте Модуля формы через атрибут Форма.
36 — 28.08.10 — 09:27
Вот я туплююю….
ДЕнис…
объясни на пальцах….
у меня есть допустим диалог с типом «справочник.товары» на форме1 куда надо вставить выбранное значение и форма2 сама обработка….
в форме 1 к диалогу я креплю процедуру: форма.ВыполнитьВыбор(«Обработка.Форма2»)…
короче страшно туплю…..
плиз..хелп
37 — 28.08.10 — 09:29
ойблин..
ОбработкаВыбора() лепится в ту форму, из котрой должен придти ответ.
38 — 28.08.10 — 09:38
в форму из которой должен прийти ответ (обработка поставщика данных)
Процедура ОбработкаВыбора()
Форма.ВыполнитьВыбор(контекстзначение);
КонецПроцедуры
а в форму в диалог куда должен возвратить значение
перем контекстзначение;
//*******************************************
Процедура Подбор()
ОткрытьПодбор(«Отчет.Новый1»,,контекстзначение) ;
КонецПроцедуры
ни хрена не понял……
39 — 28.08.10 — 09:40
F ngthm допиши процедуру ОбработкаПодбора() и удивись…
40 — 28.08.10 — 09:49
влииин или у меня обработка неправильная…..и ли у меня мозги неправильные…грешу на последнее…..
Процедура ОбработкаПодбора()
Сообщить(контекстзначение);
КонецПроцедуры
дописал следующее…..
не фига….открывается форма обработки….а я не могу выбрать значения…. при двойном нажатии мыши она либо редактируется, либо открывается сама форма элемента…..
не могу удивиться….покамись…
41 — 28.08.10 — 10:55
последний шаг вроде остался…а денис не выдержал издевательства и свалил…
42 — 28.08.10 — 11:12
Можешь попроще попробовать. Прямым запросом получаешь список элементов по своим условиям, а потом ИспользоватьСписокЭлементов() в стандартной форме списка. И дальше стандартно работаешь со справочником.
СЗ = СоздатьОбъект(«СписокЗначений») ;
ЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса,СЗ) ;
ИспользоватьСписокЭлементов(СЗ) ;
43 — 28.08.10 — 11:17
(42) в принципе вариант через запрос…(на много быстрее будет чем перебор?)….а вообще мне Табличное Поле очень понравилось…много функций…Как раз, то что мне нужно….главное теперь ее внедрить..
44 — 28.08.10 — 11:18
Намного быстрее будет.
45 — 28.08.10 — 11:24
(44) выполнитьИнструкцию ВК?
46 — 28.08.10 — 11:25
(43) Если тебе только отбор нужен, то на мой взгляд, то ТП несколько излишне будет, слишком много телодвижений. Для журнала документов со множественным отбором ТП самое то.
ВыполнитьИнструкцию это 1С++.
47 — 28.08.10 — 11:27
ODBCRecordSet .
48 — 28.08.10 — 11:33
(46) в точку попал….как раз для этих и целей нужен тП….., все те функции которые внедрены в обработку ТП, как раз и нужны…всякие отбор, фильтры, и т.д. и т.п.
49 — 28.08.10 — 11:36
(46) чувствую для файлового варианта не подойдет… или я ошибаюсь?
50 — 28.08.10 — 11:41
Для файлового варианта подойдет, только запрос надо писать по другому и там кажется не работает виртуальное значение $ПоследнееЗначение для периодических реквизитов. Надо самому написать. Для файловой не пробовал.
51 — 28.08.10 — 11:44
select
$Номенклатура.descr as Наименование,
$Номенклатура.Цена as Цена
from $Справочник.Номенклатура as Номенклатура
where Номенклатура.цена >0
думааешь подойдет?
мне последнее значение не надо! только те где цена есть…
52 — 28.08.10 — 11:46
(48) Ты кажется не совсем правильно понимаешь. ТП в чистом виде служит для отображения данных, а фильтры и отборы накладываются на источник данных. Это тогда ищи готовые классы для справочников, на http://www.rikcenter.ru/solutions.php например, но там для SQL.
53 — 28.08.10 — 11:48
(52)….не я все понял… просто я скачал готовую обработку с ТП….Подрубаю нужный мне справочник и красота….вот только не могу его сейчас использовать в доках и так далее…потому что эту обработку не могу привязать к доку!
54 — 28.08.10 — 11:49
Цена периодическая ? $ПоследнееЗначение это аналог Получить(НаДату) для периодических реквизитов. Я ж говорю для получения периодического реквизита в файловой я тебе так сразу не скажу как получить.
55 — 28.08.10 — 11:50
Так тебе для справочника надо или для доков, ты как-то перепрыгиваешь быстро.
56 — 28.08.10 — 11:51
Смотри у меня есть справочник номенклатура…которую я использую для подбора в доках…..(ну допустим в табличной части выбираю номенклатуру и должен открыться не стандартная форма списка справочника, а обработка с ТП)…
57 — 28.08.10 — 11:55
(54)….а че номенклатура.цена….в запросе не проканает? ей тоже типа.получить(датадок) нужен да? опять же в тупиковую ситуацию попадаю…вся проблема из-за этого и началась…
58 — 28.08.10 — 12:05
Если периодическая не проканает. Ты бы еще немного почитал про хранение периодических реквизитов. (42) я предложил для простоты. Чтобы не мучится с ТП. А вот как там делать выбор не знаю.
59 — 28.08.10 — 12:11
Могу тольк предположить, что надо смотреть в сторону события ТП Выбор() и там уже Форма.ВыполнитьВыбор()
, вместо того что там прописано.
60 — 28.08.10 — 12:12
(58) спасибо за точно расширил мой узкий кругозор!!!….
а если допустим у меня был бы скульный вариант, то как выглядил бы мой код? так?
Запрос=СоздатьОбъект(«Запрос»);
Запрос.УстБД(сервер);
СЗ = СоздатьОбъект(«СписокЗначений») ;
ТекстЗапроса=»
|select
|$Номенклатура.descr as Наименование,
|$Номенклатура.цена as Наименование,
|from $Справочник.Номенклатура as Номенклатура
|where $Номенклатура.цена>0″
Запрос.ВыполнитьИнструкцию(ТекстЗапроса,СЗ) ;
ИспользоватьСписокЭлементов(СЗ) ;
61 — 28.08.10 — 12:12

62 — 28.08.10 — 12:13
(59) смотрел на Выбор()….что-т не связка не получается
63 — 28.08.10 — 12:22
ТекстЗапроса=»
|select
|Номенклатура.id as [Номенклатура $Справочник.Номенклатура]
|
|from $Справочник.Номенклатура as Номенклатура
|where $ПоследнееЗначение.Номенклатура.Цена(Номенклатура.id,GetDate())>0″
Примерно так.
viktor_vv
64 — 28.08.10 — 12:34
Там еще с типами данных надо будет смотреть при сравнении. ПоследнееЗначение вернет строку.
В статье рассмотрено описание и предназначение регистров сведений, а также примеры работы с регистрами сведений средствами встроенного языка 1С – создание и редактирование наборов записей, отдельных записей, работа с ключом записи.
Содержание
Регистры сведений в 1С 8
Что такое регистр сведений
Регистр сведений – это объект конфигурации, который предназначен для хранения произвольной информации в разрезе нескольких измерений. Например, можно хранить соответствие материально-ответственных лиц и складов, курсы валют или цену на товары. Можно представить регистр сведений как многомерную таблицу, где на каждом пересечении измерений хранятся значения, которые называются Ресурсы.
Помимо измерений и ресурсов, у регистров сведений могут быть определены реквизиты – вспомогательная информация, служащая для уточнения данных – например, ответственный пользователь, комментарий и т.п.
Значения в регистре сведений могут храниться не только в разрезах измерений, но также они могут быть развернуты во времени. В этом случае к записям добавляется стандартное измерение Период. Регистры с информацией, развернутой во времени, называются периодическими.
Периодические регистры сведений позволяют получить информацию о срезе наиболее ранних или наиболее поздних записей.
Строки в многомерной таблице регистра сведений называются записями. Уникальность записей регистра сведений определяется как комбинация измерений и периода. В случае, если регистр сведений не периодический, то период будет не заполнен, и уникальные записи будут отличаться по комбинации измерений. Платформа не допускает создания двух записей с одинаковым набором измерений и периодом. Измерения и период образуют т.н. составной ключ, и называются ключевыми полями.
Записи в регистр сведений могут вноситься как вручную, независимо одна от другой, так и при помощи документов, единым набором. Документ, которым вносится запись в регистр сведений, называется регистратором.
Свойства регистра сведений. Основные настройки
Основные свойства регистра сведений, уникальные только для этого объекта метаданных – это Периодичность и Режим записи. Рассмотрим создание и настройку регистра сведений на примере хранения тарифов работников.

Периодичность регистра сведений
Данное свойство отвечает за доступность стандартного реквизита Период. Периодичность может быть
- В пределах секунды
- В пределах дня
- В пределах месяца
- В пределах квартала
- В пределах года
В случае, если регистр сведений подчинен регистратору (см. ниже), становится доступным еще один вариант периода – по позиции регистратора.
Поле Период входит в составной ключ записи; можно добавлять записи с одинаковым составом измерений, но с разным периодом. Если периодичность – по позиции регистратора, то дата документа может совпадать с точностью до секунды – все равно это будут разные записи, т.к. в этом случае позиция регистратора будет определяться как момент времени (Дата + ссылка на документ). В зависимости от выбранной периодичности, период записи будет автоматически приводиться к началу периода в свойстве Периодичность. Например, если указана периодичность “В пределах дня”, то к началу суток, если “В пределах месяца” – то соответственно к первому числу месяца, и т.д.
Режим записи регистра сведений 1С
Режим записи определяет, можно ли редактировать записи регистра сведений вручную, или они будут вноситься движениями документа-регистратора. Для регистров сведений с режимом записи “Независимый” можно указывать основной отбор для измерений. В случае, если при этом регистр сведений периодический, становится возможным указание флажка Основной отбор по периоду.
Что такое ведущее измерение и основной отбор?
Флаг Ведущее у измерения регистра сведений означает, то данная запись имеет смысл пока существует объект, ссылка на который хранится в данном измерении. Например, если удалить из базы данных сотрудника “Иванов Иван”, то автоматически из регистра сведений будут удалены все записи по тарифам, где в измерении “Сотрудник” был указан Иванов Иван. Если данный флаг не установлен, то при удалении объекта, записи остались бы в регистре с битой ссылкой на него.
Также свойство “Ведущее” у измерения отвечает за построение пользовательского интерфейса. В карточке объекта, который является ведущим измерением, появляется гиперссылка для быстрого перехода к регистру сведений с отбором по текущему объекту.
Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду включает основной отбор для период для периодических регистров.
Проектирование структуры регистра сведений
Следует стараться избегать архитектурных решений, когда значение одного ресурса регистра сведений меняется значительно чаще чем значение другого. В этом случае целесообразно выделить такие ресурсы в отдельный регистр сведений. Это связано с тем, что в момент записи записываются все ресурсы, а не только измененный, что приводит к неоправданной нагрузке на СУБД.
Получение данных из нескольких ресурсов одного регистра сведений выполняется быстрее, чем получение одного ресурса из нескольких регистров
Следует внимательно отнестись к вопросу – какие поля многомерной таблицы должны быть измерениями, а какие – ресурсами. В зависимости от прикладной задачи, подход может быть различным.
Например, мы хотим знать, какие материально ответственные лица закреплены за тем или иным складским помещением. Если таких МОЛ более одного человека, то правильная архитектура регистра будет такая:
Измерения: МОЛ
Ресурсы: Склад
Если же нам требуется гарантировать, что у одного склада может быть только одно материально ответственное лицо, то состав регистра сведений будет следующий:
Измерения: Склад
Ресурсы: МОЛ
Примеры работы с регистрами сведений в 1С
Программная запись в регистр сведений 1С
Программно добавить записи в независимый регистр сведений можно двумя способами: при помощи менеджера записи, и при помощи набора записей.
//Использование менеджера записи регистра сведений
НоваяЗапись = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
//Сотрудник - это переменная, реквизит формы, параметр и т.п. с типом СправочникСсылка.Сотрудники
НоваяЗапись.Сотрудник = Сотрудник;
НоваяЗапись.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
НоваяЗапись.Тариф = 1500;
НоваяЗапись.Записать();
//Использование набора записей
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьНабора.Тариф = 1500;
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Тариф = 6000;
НаборЗаписей.Записать();
Следует иметь в виду, что если не установить отбор для набора записей, при записи такого набора будет заменен весь регистр сведений!
Набор записей регистра сведений
Общий порядок добавления новых записей в регистр сведений:
- Создать набор записей
- Установить у него отбор по тем измерениям и периоду (если регистр периодический), по которым нужно добавить новые записи
- Добавить в набор необходимое количество новых записей
- Записать набор записей
Рассмотрим на примерах работу с набором записей средствами языка 1С
// работа с набором записей
//создание набора записей
НаборТарифы = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
//количество записей набора
Колво = НаборТарифы.Количество(); //0
//чтение набора записей из базы
//если не вызвать метод Прочитать и не добавить записи, то запишется пустой набор записей!
НаборТарифы.Прочитать();
Колво = НаборТарифы.Количество(); //вернет количество записей в наборе
//добавление записей
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Период = ТекущаяДата();
ЗаписьНабора.Тариф = 6000;
//выгрузка в таблицу значений
ТаблицаТарифов = НаборТарифы.Выгрузить();
//удаление всех записей набора
НаборТарифы.Очистить();
//загрузка из таблицы значений
НаборТарифы.Загрузить(ТаблицаТарифов);
//удаление первой записи набора
НаборТарифы.Удалить(0);
//выгрузка одной колонки в массив
МассивТоваров = НаборТарифы.ВыгрузитьКолонку("Сотрудник");
//загружаем обратно
НаборТарифы.ЗагрузитьКолонку(МассивТоваров, "Сотрудник");
//сумма всех значений ресурса, если его тип содержит тип Число
Итог = НаборТарифы.Итог("СуммаТарифа");
//запись набора
НаборТарифы.Записать();
Изменение записей регистра сведений
Для того, чтобы изменить существующие записи регистра сведений, нужно сначала прочитать их через набор записей, потом перебрать в цикле, изменить и записать набор записей.
Изменим, например, все часовые оклады, добавив 10%.
//Изменение записей регистра сведений
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
//Добавим 10%
ЗаписьНабора.Тариф = ЗаписьНабора.Тариф*1.1;
КонецЦикла;
НаборЗаписей.Записать();
Удаление записей регистра сведений
//Удаление записей из регистра сведений
//1. Удалить записи с определенным отбором
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.ПоДням);
НаборЗаписей.Отбор.Период.Установить(ДатаФильтра);
//Запишем пустой набор записей
НаборЗаписей.Записать();
//2. Очистить регистр сведений программно
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
//Все записи регистра сведений будут удалены
//3. Выборочное удаление записей по какому-нибудь условию
//Здесь рассмотрим пример обработки записей с учетом значения реквизитов
//Наложить отбор непосредственно на реквизиты нельзя, поэтому следует использовать другой способ
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
МассивЗаписейКУдалению = Новый Массив;
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
Если ЗаписьНабора.Примечание = "Служебная запись" Тогда
МассивЗаписейКУдалению.Добавить(ЗаписьНабора);
КонецЕсли;
КонецЦикла;
//Вторым циклом удалим ненужные записи из набора регистра сведений
Для Каждого ЗаписьКУдалению Из МассивЗаписейКУдалению Цикл
НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;
НаборЗаписей.Записать();
Менеджер записи регистра сведений
//Создание при помощи менеджера записи регистра сведений
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Записать();
//Изменение записи через менеджер записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Прочитать();
Если ЗаписьМенеджер.Выбран() Тогда
ЗаписьМенеджер.Тариф = 7000;
ЗаписьМенеджер.Записать();
КонецЕсли;
//Удаление при помощи менеджера записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Удалить();
Ключ записи регистра сведений
// создать ключ записи
//пустой ключ
ПустойКлюч = Новый("РегистрСведенийКлючЗаписи.ТарифыРаботников");
//используя менеджер
ПустойКлюч = РегистрыСведений.ТарифыРаботников.ПустойКлюч();
//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Период", Дата(2021,01,31));
ЗначенияКлюча.Вставить("Сотрудник", СсылкаНаСотрудника);
ЗначенияКлюча.Вставить("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
КлючЗаписи = РегистрыСведений.ТарифыРаботников.СоздатьКлючЗаписи(ЗначенияКлюча);
Изменение записей в регистр сведений с подчинением регистратору
Рассмотрим пример. Допустим, у нас есть документ “Назначение материально ответственных лиц”, в котором мы в табличной части указываем склад и соответствующее ему МОЛ. Этот документ записывает движения в регистр сведений МОЛПоСкладам, со следующими настройками:
- Измерения: Склад, тип СправочникСсылка.Склады
- Ресурсы: МОЛ, тип СправочникСсылка.Сотрудники
- Реквизиты: Примечание, тип Строка(100)
- Периодичность: в пределах месяца
- Режим записи: Подчинение регистратору
Для изменения записей регистра сведений, подчиненного регистратору, нужно иметь ссылку на документ-регистратор. После этого необходимо получить движения объекта по этой ссылке, по нужному регистру. Далее мы получаем набор записей, и работа с ним аналогична работе при использовании метода СоздатьНаборЗаписей. Для того чтобы изменить движения документа, также следует вызвать метод Прочитать. Второй вариант – заново добавить нужные записи в движения, в этом случае новый набор полностью заменит старый.
ОбъектРегистратор = СсылкаНаДокумент.ПолучитьОбъект();
ДвиженияПоРегистру =ОбъектРегистратор.Движения.МОЛПоСкладам;
ДвиженияПоРегистру.Прочитать();
Для Каждого ЗаписьДокумента Из ДвиженияПоРегистру Цикл
ЗаписьДокумента.Примечание = "Запись обработана программно";
КонецЦикла;
ДвиженияПоРегистру.Записать();
Примеры работы с периодическим регистром сведений
Периодический регистр сведений позволяет получать данные о самых первых и самых последних записях. Для этого платформа предусматривает две виртуальные таблицы – СрезПервых и СрезПоследних. В определенных случаях можно включить итоги для среза первых и/или последних. Это может многократно ускорить получение данных, так как при этом будут созданы физические таблицы, откуда данные будут извлекаться гораздо быстрее, чем из виртуальных.
Для работы с виртуальными таблицами периодического регистра сведений можно использовать два подхода – объектные методы и язык запросов. Рассмотрим каждый из этих способов. Для наглядности срез первых мы получим при помощи объектной техники, а срез последних – при помощи запроса.
Получить самые ранние записи (Срез первых)
Получим самые ранние записи тарифов с видом тарифа “ПоДням”
//Как получить самые первые записи
Отбор = Новый Структура("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
СрезПервых = РегистрыСведений.ТарифыРаботников.СрезПервых(ДатаСреза, Отбор);
//Получим таблицу значений со структурой колонок, аналогичной структуре регистра сведений
//В результат попадут наиболее ранние записи регистра, соответствующие установленным значениям ключевых полей.
//Записи подбираются для каждой комбинации из всех имеющихся значений измерений регистра.
//При этом, если есть записи с датой реньше, чем начало периода, они учитываться не будут.
Для Каждого СтрСреза Из СрезПервых Цикл
Сообщить(СтрШаблон("Самый ранний тариф по дням для сотрудника %1: %2", СтрСреза.Сотрудник, СтрСреза.Тариф));
КонецЦикла;
Получить самые поздние записи (Срез последних)
//Как получить последние записи регистра сведений на дату
//В случае работы с запросом, можно накладывать более сложные фильтры, и извлекать только необходимые данные,
// например, только сотрудника и тариф, без лишних полей
ЗапросПоследних = Новый Запрос("ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(ТекущиеТарифы.Сотрудник) КАК Сотрудник,
| ТекущиеТарифы.Тариф КАК Тариф
|ИЗ
| РегистрСведений.ТарифыРаботников.СрезПоследних(&ДатаСреза, ВидТарифа = ЗНАЧЕНИЕ(Перечисление.ВидыТарифов.Почасовой)) КАК ТекущиеТарифы");
ЗапросПоследних.УстановитьПараметр(ДатаСреза, ДатаСреза);
Выборка = ЗапросПоследних.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("Текущий почасовой тариф для сотрудника %1: %2", Выборка.Сотрудник, Выборка.Тариф));
КонецЦикла;
Регистр сведений 1С 8 — объект метаданных, предназначенный для хранения справочной информации в разрезе определенных разработчиком измерений.
Типичный пример использования регистра сведений — хранение информации о курсе валют в разрезе валюты и периода.
Рассмотрим подробнее свойства и настройки регистра сведений.
Два главных свойства регистра сведения — Периодичность
и Режим записи
.
Это уникальные свойства регистра сведений, которых больше нет ни у одного объекта метаданных. Рассмотрим их подробнее.
Данное свойство позволяет добавить к списку измерений дополнительное измерение — Период
. С его помощью можно решить большое количество задач: хранение информации в базе данных, учитывая актуальность на определенную дату. Прикладных примеров использования периодов множество: хранение значение валюты на каждый день, хранение цены номенклатуры и т.д.
Периодичность может принимать следующие значения:
- Непериодический
- В пределах секунды
- В пределах дня
- В пределах месяца
- В пределах квартала
- В пределах года
Получите 267 видеоуроков по 1С бесплатно:
При выборе периодичности, отличной от варианта Непериодический, система будет контролировать уникальность записей в пределах заданного промежутка времени. Если запись не уникальна, система 1C выдаст сообщение и не даст произвести запись в базу данных.
А одна из главных особенностей периодического регистра сведений — возможность получать готовые значения «Среза первых» и «Среза последних». Эта информация позволяет очень быстро получить из базы данных информацию о последнем (первом) установленном значении на определенную дату.
Режим записи регистра сведений
В 1С 8.2 и 8.3 это свойство может быть либо в значении «Независимый», либо — «Подчинение регистратору». В первом случае записи можно будет произвести как программно, так и из формы списка регистра сведений. Во втором случае обязательно указание документа-регистратора записи. Это накладывает определенные ограничения, но в то же время открывает новые возможности.
Свойства измерения регистра сведений
Также следует обратить внимание на палитру свойств измерений регистра сведений 1С 8.3. Особенно на флаги Ведущее и Основной отбор:
- Ведущее
— свойство измерения, подразумевающее под собой информацию о том, что без значения этого измерения запись регистра не имеет смысл. На деле это означает что система при удалении значения из измерения удаляет еще и запись регистра с «Ведущим» измерением. Может быть установлено только одно измерение. - Основной отбор
— если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду
включает основной отбор для период для периодических регистров.
Добавить новые записи в регистр сведений можно двумя способами — с помощью менеджера записи и с помощью набора записей. Первый случай подойдет для одиночной записи, второй — для двух и и более записей.
Использование менеджера записи:
НоваяЗапись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию(«USD»);
НоваяЗапись.Период = Дата(31,12,2016);
НоваяЗапись.Курс = 100;
НоваяЗапись.Кратность = 1;
НоваяЗапись.Записать();
Использование набора записей регистра сведений 1С:
НовыйНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
//если вы не установите отбор — удалятся все записи регистра сведений
НовыйНаборЗаписей.Отбор.Валюта.Установить(Доллар, Истина);
НовыйНаборЗаписей.Отбор.Период.Установить(Дата(31,12,2016), Истина);
//формируем непосредственно запись набора
НоваяЗаписьНабора = НовыйНаборЗаписей.Добавить();
НоваяЗаписьНабора.Валюта = Справочники.Валюты.НайтиПоНаименованию(«USD»);
НоваяЗаписьНабора.Период = Дата(31,12,2016);
НоваяЗаписьНабора.Курс = 100;
НоваяЗаписьНабора.Кратность = 1;
НовыйНаборЗаписей.Записать();
В 1с 7.7 у справочников были интересные реквизиты — периодические, они могли запоминать значение реквизита с привязкой к времени, работать с ними было не так чтобы очень уж удобно но, за неимением альтернатив, приходилось. После перехода на 8-ку многие программисты с удивлением обнаружили отсутствие периодических реквизитов в справочниках.
Типовые задачи, которые решаются с помощью периодических регистров сведений это хранение информации с привязкой к времени. Информация может быть разнородной это и цены на номенклатуру, и занимаемое работником должности в разные периоды времени, и параметры налогового учета предприятия. В 8 аналогом периодических реквизитов выступают периодические регистры сведенный.
Для того чтобы повторить функционал 7,7 нужно проделать следующее:
Создать регистр сведенный «ПереодическиеДанныеКонтрагента», указать, что это периодический регистр сведений с периодичностью день.
Теперь нам нужно добавить на закладке «Данные» — измерение «Контрагент» тип, которого совпадает со справочником, в котором мы хотим реализовать аналогичный периодическому реквизиту функционал. В ветку «Реквизиты» добавляем те реквизиты данные, которых привязаны ко времени. Для контрагента это могут быть юридический и физический адрес, основной телефон, имя руководителя, основной факс и т.д.
После сохранения конфигурации, получить доступ к регистру сведений можно будет через боковое меню (в режиме управляемого приложения), см. скриншот.
В режиме обычного приложения через кнопку «Перейти»
Но если мы посмотрим на заполненный регистр, то заметим что понять какая информация актуальная довольно сложно, поскольку мы видим весь набор данных вцелом, а не только актуальную на данный момент информацию.

Для начала добавим на форму группу, которую назовем «Контактные данные» в нее добавим два реквизита «Руководитель» и «Телефон»
А в модуле формы на событие «ПриОткрытии» повесим действия по получению актуальных данных:
&
НаКлиенте
Процедура
ПриОткрытии(Отказ)
//Вставити вміст обробника
дані=
ОтриматиАктуальніДані()
;
попытка
Директор =
дані.
керівник;
исключение
конецпопытки
;
попытка
телефон =
дані.
телефон;
исключение
конецпопытки
;
КонецПроцедуры
Функция получения актуальных данных следующая:
функция
ОтриматиАктуальніДані()
//Вставити вміст обробника
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Даний фрагмент побудований конструктором.
// При повторному використанні конструктора, внесені вручну зміни будуть втрачені!!!
Запрос =
Новый
Запрос;
Запрос.
Текст =
»
ВЫБРАТЬ
| ПеріодичніДанніКонтрагентаСрезПоследних.
Контрагент,
| ПеріодичніДанніКонтрагентаСрезПоследних.
Керівник,
| ПеріодичніДанніКонтрагентаСрезПоследних.
Адреса,
| ПеріодичніДанніКонтрагентаСрезПоследних.
Телефон
|ИЗ
| РегистрСведений.
ПеріодичніДанніКонтрагента.
СрезПоследних КАК ПеріодичніДанніКонтрагентаСрезПоследних
|ГДЕ
| ПеріодичніДанніКонтрагентаСрезПоследних.
Контрагент =
&
Контрагент
»
;
Запрос.
УстановитьПараметр(»
Контрагент
»
,
объект.
Ссылка)
;
РезультатЗапроса =
Запрос.
Выполнить
()
;
ВыборкаДетальныеЗаписи =
РезультатЗапроса.
Выбрать()
;
дані=
новый
структура;
Пока
ВыборкаДетальныеЗаписи.
Следующий()
Цикл
// Вставити обробку вибірки ВыборкаДетальныеЗаписи
//ВыборкаДетальныеЗаписи.Керівник;
дані.
Вставить(»
керівник
»
,
ВыборкаДетальныеЗаписи.
Керівник)
;
дані.
Вставить(»
телефон
»
,
ВыборкаДетальныеЗаписи.
Телефон)
;
Сообщить(ВыборкаДетальныеЗаписи.
Телефон)
;
КонецЦикла
;
Возврат
дані ;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Конецфункции
Я воспользовался запросом, хотя можно использовать для этих целей и менее громоздкой конструкцией:
Отбор = новый структура;
отбор.Вставить(«Контрагент»,объект);
данные = регистрысведений.КонтактнаІнформація.ПолучитьПоследнее(,отбор);
сообщить(данные.Керівник);
сообщить(данные.Количество());
Обратите внимание, то в функцию ПолучитьПоследнее
передаются два параметра момент времени и отбор, но если нам нужно на текущий момент то первый параметр можно опустить, в отборе название ключа должно совпадать со значением измерения регистра.
Главное не забыть в регистре выставить соответствующие галочки на закладке «Прочие»
Если разобраться, то периодический регистр сведений это намного более гибкий инструмент по сравнению с периодическими реквизитами в 7.7. В типовых конфигурациях он широко используется.
Многие программисты, знакомые с версией 7.7 и желающие освоить версию 8, спрашивают, куда делись периодические реквизиты справочников и периодические константы. А если их нет, то какой механизм их заменяет? В 1С:Предприятии 8 для хранения истории изменения значений предназначены периодические регистры сведений.
Вообще регистры сведений предназначены для хранения информации, развернутой по комбинации измерений. Главное отличие периодического регистра сведений от обычного заключается в том, что в нем присутствует дополнительное системное измерение «Период», имеющее тип «дата». Это позволяет получать не только текущие сведения об объекте, но также на любой момент времени.
Для периодического реквизита при создании указывается свойство «Периодичность» из следующих возможных значений:
— в пределах секунды,
— в пределах дня,
— в пределах месяца,
— в пределах квартала,
— в пределах года,
— по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).
Обратите внимание, что тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и т.д.). Более того, в регистре сведений можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения».
Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день.
Подробная информация о структуре регистра сведений КурсыВалют приведена в следующей таблице:
Измерения: Валюты тип «СправочникСсылка.Валюты», ведущее, запрет незаполненных значений
Ресурсы: Курс тип «число», длина 15, точность 4, неотрицательное
Кратность тип «число», длина 10, точность 0, неотрицательное
Периодичность В пределах дня
Режим записи Независимый
Данные в этот регистр сведений можно вводить вручную с помощью формы списка.
ВНИМАНИЕ.
В регистр сведений с определенной периодичностью, не равной «По позиции регистратору», нельзя ввести две записи с одинаковым набором измерений и периодом, т.е. нельзя ввести два курса одной валюты в один день. Если периодичность записи регистра имеет значение «По позиции регистратора», то ключ уникальности записи также содержит и ссылку на документ-регистратор, т.е. в таком регистре не может существовать две записи с одинаковым набором измерений, периодом и регистратором. Это неотъемлемое свойство регистра сведений, отличающее его от остальных регистров.
Добавление новых записей в регистр сведений, а также перебор имеющихся записей производится стандартным для всех регистров способом. В данном разделе мы рассмотрим только самое важное
— получение информации из периодического регистра на определенный момент времени.
Обращение к периодическим сведениям с помощью методов
Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» периодического регистра сведений понимаются первые или последние значения ресурсов по указанным измерениям. При этом применяются следующие методы:
Получить
(<Период>, <Отбор>)
Возвращает в виде структуры значения ресурсов одной записи регистра, соответствующей указанным значениям всех (!) измерений регистра и периоду.
ПолучитьПоследнее
(<Конец периода>, <Отбор>)
Этот метод возвращает актуальное значение ресурсов, действовавшее на заданную дату. Если он не находит запись в регистре по данной комбинации измерений точно на заданный период, то возвращается структура, содержащая значения ресурсов ближайшей более поздней записи.
ПолучитьПервое
(<Начало периода>, <Отбор>)
Этот метод действует аналогично методу ПолучитьПоследнее, но если записи на данный момент не находится, то возвращается структура, содержащая значения ресурсов ближайшей более ранней записи.
СрезПоследних
(<Конец периода>, <Отбор>)
Эти методы аналогичны методам ПолучитьПоследнее и ПолучитьПервое соответственно, но при их использовании, как правило, не указывается одно или несколько измерений. В результате возвращается не структура, как в предыдущих случаях, а таблица значений, заполненная данными найденных записей регистра сведений.
При вызове методов ПолучитьПервое, ПолучитьПоследнее, СрезПервых и СрезПоследних первый параметр может иметь тип «дата», МоментВремени или Граница, но его можно вообще не указывать, тогда будут найдены значения ресурсов из самой первой или последней записи регистра соответственно.
Продемонстрируем использование этих методов на примерах:
Пример 1
.
Получение курса валюты точно на заданную дату (если записи именно на эту дату нет, то в элементах структуры будут пустые значения).
СтруктураКурсКратность = РегистрыСведений.КурсыВалют.Получить(ВыбДата, ВалютаОтбор);
Если СтруктураКурсКратность.Курс = 0 Тогда
Сообщить(«Курс точно на эту дату не указан!»);
Иначе
Сообщить(«Курс валюты:» + СокрЛП(СтруктураКурсКратность.Курс) + «, кратность: » + СокрЛП(СтруктураКурсКратность.Кратность));
КонецЕсли;
Пример 2.
Получение актуального курса валюты на заданную дату (если записи именно на эту дату нет, то будет найдена ближайшая более поздняя запись)
ВалютаОтбор = Новый Структура(«Валюта», ВыбВалюта);
СтруктураКурсКратность = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ВыбДата, ВалютаОтбор);
Сообщить(«Актуальный курс на заданную дату: » + СтруктураКурсКратность.Курс);
Пример 3.
Получение актуальных курсов всех валют на заданную дату (отбор не указан, т.е. мы хотим получить сведения по всем значениям измерений).
тзДанные = РегистрыСведений.КурсыВалют.СрезПоследних(ВыбДата,);
Сообщить(«Для валюты » + Строка(Стр.Валюта) + » курс на заданную дату: » + Строка(Стр.Курс) + «, кратность: » + Строка(Стр.Кратность));
КонецЦикла;
Пример 4.
Получение актуальных оптовых цен на товары (указан отбор по измерению «ТипЦен»)
ОтборТипЦен = Новый Структура(«ТипЦен», Перечисления.ТипыЦен.Оптовая);
тзДанные = РегистрыСведений.ЦеныКомпании.СрезПоследних(ВыбДата, ОтборТипЦен);
Для Каждого Стр Из тзДанные Цикл
Сообщить(«Для номенклатуры » + Строка(Стр.Номенклатура) + » оптовая цена: » + Строка(Стр.Цена));
КонецЦикла;
Обращение к периодическим сведениям с помощью запросов
Для получения данной информации служит виртуальная таблица среза последних/первых записей регистра сведений. По структуре она полностью идентична основной таблице регистра сведений и содержит следующие поля:
<Имя измерения>
— Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений.
<Имя реквизита>
— Набор полей, содержащий значения реквизитов регистра.
<Имя ресурса>
— Набор полей, который содержит значения ресурсов регистра.
Активность
— Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени.
МоментВремени
— Содержит момент времени записи регистра.
НомерСтроки
— Содержит номер строки, определяемый как порядковый номер записи в наборе записей.
Период
— Содержит период, к которому относится запись регистра.
Регистратор
— Содержит ссылку на документ-регистратор движения.
При обращении к виртуальным таблицам СрезПервых и СрезПоследних можно указать следующие параметры:
Дата —
Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние/ранние записи.
Условие —
Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние/ранние. Условие будет применяться к исходным записям, а не к уже отобранным.
Приведем примеры обращения к записям регистра сведений с помощью запросов:
Пример 1.
Выбрать все записи регистра сведений
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют
Пример 2.
Получить актуальный курс одной валюты на заданную дату
ВЫБРАТЬ Валюта, Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ВыбДата, Валюта = &ВыбВалюта);
Пример 3.
Выбрать актуальные курсы всех валют на заданную дату
ВЫБРАТЬ Валюта, Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ВыбДата);
Пример 4.
Получить актуальный прайс-лист на заданную дату (указан определенный тип цен, например, «Розничная»)
ВЫБРАТЬ Номенклатура, Цена
ИЗ РегистрСведений.ЦеныКомпании.СрезПоследних(&ВыбДата, ТипЦен=&ВыбТипЦен);
Резюме
— Периодический регистр сведений является мощным инструментом для хранения истории изменения практически любой информации.
— Периодичность регистра сведений может изменяться в широких пределах: от позиции документа-регистратора (минимальная периодичность) до года (максимальная периодичность). В 1С:Предприятии 8 есть также непериодические регистры сведений.
— Тип ресурсов регистра сведений может быть примитивный (число, строка, дата, булево), ссылочный (ссылка на элемент справочника, документ, значение перечисления) или ХранилищеЗначения.
— Периодический регистр сведений может выдавать значения ресурсов точно на заданную дату, наиболее позднее или наиболее раннее значение на заданную дату или срез первых и срез последних на определенную дату по заданным значениям измерениям.
— Обращение к данным регистра сведений возможно как с помощью методов, так и с помощью запросов.
В данной статье рассмотрим теоретические основы работы с регистрами расчёта, а также выполним расчёт заработной платы сотрудника пропорционально количеству отработанных часов.
Теория
Регистр расчета(РР)
— объект метаданных конфигурации, служащий для реализации периодических расчетов в системе 1С. Из очевидных областей применения регистров расчета можно выделить следующие: расчет заработной платы, расчет квартплаты, расчет арендной платы.
По своей структуре регистры расчета похожи на регистры накопления или регистры сведений. Они так же как и регистры накопления имеют измерения, ресурсы, реквизиты, но принцип действия регистров расчета абсолютно другой.
По сути своей измерения в регистре накопления служат «фильтром
» в разрезе которого мы получаем данные из регистра накопления. Как пример, когда мы берём «остатки» по регистру накопления «Остатки товаров» в разрезе определённой номенклатуры или «срез последних» по регистру сведений «Оклады сотрудников» в разрезе определённого сотрудника. В отличии от регистра накопления измерения в периодическом регистре расчета служат для реализации ««(это когда протяженные во времени виды расчета конкурируют между собой на интервале периода действия записи т.е. как пример, вид расчета командировка вытесняет вид расчета оклад по периоду действия) и ««(это когда вид расчета премия зависит от вида расчета оклад за прошлые периоды).
механизма вытеснения по периоду действия
«:
Здесь мы видим что вид расчёта «Командировка» обладает протяжённостью во времени и действует с 10 по 20 апреля, «Командировка» указана как вытесняющий вид расчёта для вида расчета «Оклад». «Оклад» также обладает протяжённостью во времени и действует с 1 по 30 апреля. Так как «Командировка» указана как вытесняющий вид расчёта для вида расчета «Оклад»(имеет больший приоритет, чем оклад) и действует на периоде действия оклада, то происходит вытеснение оклада командировкой и формируется «Фактический период действия оклада».»Фактический период действия оклада» это период действия оклада после вытеснения командировкой, в нашем случае он состоит из 2 периодов — с 1 по 9 апреля и с 21 по 30 апреля и в сумме составляет 19 дней. Механизм вытеснения по периоду действия работает только для протяжённых во времени расчетов.
На рисунке выше графически показан принцип «механизма зависимости по базовому периоду
«:
Допустим, в конце апреля 2017 мы хотим начислить сотруднику премию в размере 10% от оклада. В качестве базовых видов расчёта для премии указан оклад.
Но в качестве «базы» для расчета премии мы возьмём не весь месяц апрель, а только интервал с 10 по 20 апреля(11 дней). Рассчитаем базу для премии, оклад сотрудника составляет 60000 рублей, в месяце имеем 30 дней, дневной оклад = 60000/30 = 2000 руб. Далее 2000*11 = 22000 руб. База для расчета премии составляет 22000 рублей.
Рассчитаем премию: (22000/100)*10 = 2200 руб. Премия в размере 10% от оклада составляет 2200 рублей.
С регистром расчета тесно связан прикладной объект метаданных «План видов расчета».
План видов расчета(ПВР)
— объект метаданных конфигурации, хранящий в себе сведения о типах видов расчетов и определяющий влияние разных расчетов друг на друга.
Один план видов расчета может использоваться в нескольких регистрах расчета, но один регистр расчета не может использовать несколько планов видов расчета одновременно.
Регистр расчета является таблицей в которой хранятся рассчитанные данные, а в плане видов расчета хранятся алгоритмы расчета этих данных. Регистр расчета обязательно должен иметь хотя бы один документ регистратор, который делает движения по регистру расчета(например Начисление зарплаты).
Механизмы расчета в системе 1С Предприятие устроены таким образом, что сперва требуется сделать записи в регистр расчета и только после этого выполнить расчет на основе этих данных. К примеру, нельзя рассчитать премию на основе оклада пока этот самый оклад не записан в регистр расчета.
Практика
Рассмотрим подробнее регистры расчета на практике:
Шаг 1
.Начнём с плана видов расчета. План видов расчета необходимо создать перед созданием регистра расчета. План видов расчета создаём перед регистром расчёта потому, что перед созданием таблицы для хранения рассчитанных данных(т.е. регистра расчета) необходимо задать алгоритмы расчета этих данных(т.е. план видов расчета).
Создадим план видов расчета «Основные начисления». Сразу же перейдём на вкладку «Расчет». Здесь мы сразу же видим флаг «Использует период действия
«, при установке данного флага все виды расчета входящие в данный план будут обладать протяжённостью во времени
(например Оклад, Командировка), а также для данного плана видов расчета включается «механизма вытеснения по периоду действия
«. Если флаг «Использует период действия» не установлен, то виды расчета не будут обладать протяжённостью во времени(например Премия, Штраф) и «механизма вытеснения по периоду действия» действовать не будет. Также на данной вкладке есть разделы «Зависимость от базы» и «Базовые планы видов расчета» — они служат для реализации «механизма зависимости по базовому периоду
«, но об нём поговорим позже. Пока оставим «Зависимость от базы» в режиме «Не зависит».
Создадим предопределённый вид расчета «Оклад». На вкладке «Основное» всё просто. Задаём имя и код вида расчета.
Благодаря тому, что мы установили флаг «Использует период действия
» у нас появилась вкладка «Вытесняющие
» и включился «механизм вытеснения по периоду действия
«.
На данной вкладке мы указываем виды расчета, которые будут вытеснять оклад по периоду действия(например Командировка).
Примечание
: в «Вытесняющие» можно добавить виды расчета принадлежащие только данному плану видов расчета.
Также есть вкладка «Ведущие
» — на ней указываются виды расчета при изменении которых должен пересчитываться текущий вид расчёта. Здесь можно указать и виды расчёта из других планов видов расчёта. Например, вид расчета «Оклад» является ведущим для вида расчёта «Премия» т.е. при изменении оклада у нас должна пересчитаться и премия т.к. премия начисляется в зависимости от оклада. В данном случае вид расчёта «Оклад» принадлежит ПВР «Основные начисления» использующем период действия, а вид расчета «Премия» принадлежит ПВР «Дополнительные начисления» не использующем период действия.
Шаг 2
.Создадим справочник «Графики» со структурой по-умолчанию. В справочнике «Графики» будем хранить режимы работы сотрудников(пятидневка, шестидневка и.т.д.).
Шаг 3
.Также нам нужен объект в котором мы будем хранить Производственный календарь(рабочие и выходные дни). Для этих целей используем непериодический независимый регистр сведений.
Создадим непериодический независимый регистр сведений «Графики работы» с 2 измерениями «Дата» и «График» и ресурсом «Количество часов».
Благодаря регистру сведений «Графики работы» мы сможем начислять заработную плату от оклада пропорционально количеству отработанных дней.
Шаг 4
.Создадим документ «Начисление зарплаты» со структурой реквизитов показанной ниже:
Реквизиты:
Оперативное проведение ставим в значение «Запретить»
т.к. оно не имеет смысла для механизма периодических расчётов в 1С — ни премию, ни оклад, ни штраф мы никогда не начисляем в реальном времени.
Создадим форму документа с настройками по-умолчанию.
Шаг 5
. Наконец-то мы дошли и до создания регистров расчета.
Объект метаданных регистр расчета расположен в ветке «Регистры расчета» конфигуратора.
Создадим регистр расчета «Основные начисления». Настройки регистра расчета рассмотрим ниже:
1.В поле «План видов расчета» указываем ПВР «Основные начисления» созданный на шаге 1.
2.Ставим флаг «Период действия» в значение «Истина» т.к. ПВР, указанный на шаге 1 обладает протяжённостью во времени.
После установки данного флага у нас сразу же становятся доступны стандартные реквизиты «ПериодДействия», «ПериодДействияНачало», «ПериодДействияКонец» это значит, что виды расчета регистрируемые в данном регистре расчета также обладают протяжённостью во времени
и у нас становится доступен «механизма вытеснения по периоду действия
«.
P.S. Если указать ПВР, обладающий протяжённостью во времени
у РР с флагом «Период действия» в значении «Ложь», то данный ПВР будет работать как ПВР не обладающий протяжённостью во времени.
3.После установки флага «Период действия» в значение «Истина» у нас становятся доступны поля «График», «Значение графика», «Дата графика».
В поле «График» указываем регистр сведений «Графики работы», созданный на шаге 3.
В поле «Значение графика» указываем ресурс «КоличествоЧасов» регистра сведений «Графики работы».
В поле «Дата графика» указываем измерение «Дата» регистра сведений «Графики работы».
4.В поле «Периодичность» указываем значение «Месяц» это значит, что данные в регистр у нас будут заноситься ежемесячно.
Ниже представлена структура метаданных регистра:
Флаг «Базовое» у измерения влияет только на производительность, его можно и не проставлять, но если поставить, то поле «Сотрудник» будет проиндексировано.
Измерение «Сотрудник» — оно применяется в «механизме вытеснения по периоду действия
» и «механизме зависимости по базовому периоду
«.
Ресурс «Сумма» — туда запишется рассчитанная зарплата.
Реквизит «График» указан как реквизит, а не измерение регистра т.к. ни его, ни он ничего не вытесняет — по сути справочное поле. Важно!!! Не забудьте заполнить поле «Связь с графиком»
у реквизита «График», там должно быть указано измерение «График» регистра сведений «Графики работы» иначе размер заработной платы не будет рассчитываться.
Реквизит «Параметр» будет хранить значение оклада.
Вот теперь когда мы указали связь с РС «Графики работы» у нас будет рассчитываться заработная плата сотрудника пропорционально количеству отработанных дней.
В качестве регистратора указываем документ «Начисление зарплаты
«, созданный на шаге 4.
Шаг 6
. Делаем движения по регистру расчета «Основные начисления».
Вернёмся к документу «Начисление зарплаты» созданному на шаге 4.
Опишем обработку проведения в модуле объекта документа:
Фрагмент кода обработки проведения документа
1С (Код)
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// регистр ОсновныеНачисления
Движения.ОсновныеНачисления.Записывать = Истина;
Движения.ОсновныеНачисления.Очистить();
ПериодРегистрации=НачалоМесяца(Дата);
Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания);
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;
Движение.График = ТекСтрокаОсновныеНачисления.График;
Движение.Параметр = ТекСтрокаОсновныеНачисления.Размер;
КонецЦикла;
КонецПроцедуры
|
Процедура // регистр ОсновныеНачисления Движения. Движения. ПериодРегистрации=НачалоМесяца(Дата) Для Движение= Движение. Движение. Движение. Движение. Движение. Движение. Движение. Движение. КонецЦикла; КонецПроцедуры |
Создадим тестовый документ и проведём его:
Перейдём в «Движения документа»:
Видим, что период регистрации установился как начало месяца т.к. периодичность РР указана «Месяц». Так же видим, что заполнились все поля кроме суммы(ЗП ещё не рассчитана).
Шаг 7
.Напишем код расчета заработной платы.
Создадим общий модуль «Расчет» со следующими флагами:
В данном общем модуле у нас и будет происходить сам расчёт.
Напишем в модуле «Расчет» экспортную функцию «Рассчитать начисления»:
Так как мы заполнили в настройках РР «Основные начисления» поля «График», «Значение графика», «Дата графика» у нас стала доступна виртуальная таблица регистра расчета ДанныеГрафика,
в запросе к виртуальной таблице нас интересуют поля:
«КоличествоЧасовФактическийПериодДействия» —
содержит рассчитанное на основании данных графика количество фактически отработанных часов
«КоличествоЧасовПериодДействия» —
содержит рассчитанное на основании данных графика количество рабочих часов в периоде расчёта
Процедура расчета заработной платы
1С (Код)
Процедура РассчитатьНачисления(Регистратор, НаборЗаписей) Экспорт
//Оклад
Запрос=Новый Запрос;
Запрос.Текст=»ВЫБРАТЬ
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовФактическийПериодДействия, 0) КАК ЧасовФакт,
| ОсновныеНачисленияДанныеГрафика.Параметр,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовПериодДействия, 0) КАК ЧасовПлан,
| ОсновныеНачисленияДанныеГрафика.НомерСтроки
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(| Регистратор = &Регистратор
| И ВидРасчета = &ВидРасчетаОклад) КАК ОсновныеНачисленияДанныеГрафика»;
Запрос.УстановитьПараметр(«Регистратор», Регистратор); // передаём документ регистратор чтобы поиск выполнялся только по текущему документу
Запрос.УстановитьПараметр(«ВидРасчетаОклад», ПланыВидовРасчета.ОсновныеНачисления.Оклад); //устанавливаем вид расчёта оклад т.к. рассчитываем оклад
Выборка=Запрос.Выполнить().Выбрать();
СтруктураПоиска=Новый Структура;
СтруктураПоиска.Вставить(«НомерСтроки»,0); //создадим структуру для поиска данных для расчёта по номеру строки
Для Каждого Запись Из НаборЗаписей Цикл //цикл по набору записей текущего документа
СтруктураПоиска.НомерСтроки=Запись.НомерСтроки; //заполняем номер строки для поиска
Если Выборка.НайтиСледующий(СтруктураПоиска) Тогда //ищем в выборке данные для расчёта по текущему номеру строки
Запись.Сумма =?(Выборка.ЧасовПлан=0,0, Выборка.ЧасовФакт/Выборка.ЧасовПлан * Выборка.Параметр); //рассчитываем ЗП пропорционально отработанным дням, в Параметр — текущий оклад
КонецЕсли;
Выборка.Сбросить(); //сбросим выборку, нужно чтобы следующая запись набора записей делала поиск по выборке сначала
КонецЦикла;
НаборЗаписей.Записать(,Истина); //записываем рассчитанные записи в базу, передаём параметр Замещать = Истина
КонецПроцедуры
|
//Оклад Запрос=Новый Запрос. | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовФактическийПериодДействия, 0) КАК ЧасовФакт, | ОсновныеНачисленияДанныеГрафика.Параметр, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.КоличествоЧасовПериодДействия, 0) КАК ЧасовПлан, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Регистратор |
Многие программисты 1С никогда не сталкивались в своей практике с компонентой «Расчет»,поэтому, когда им приходится сдавать экзамены на Специалиста по Платформе 8.0, где в каждомзадании есть задача по сложным периодическим расчетам, возникают сложности, прежде всего сложности понимания.
Попробуем разобраться с этой компонентой в 8.0. Вместо того чтобы решать различные задачи на расчет попробуем разобраться с этой компонентой так, чтобы можно было решить любую задачу по расчету. Изучив это пособие, вы поймете, как устроены иработают регистры расчета.
Для примера будем использовать каркасную конфигурацию, устанавливаемую на экзаменах.
Честно говоря, я долго пытался придумать, для чего еще нужны расчеты, но не придумал, поэтому будем рассматривать задачу расчета зарплаты.
Что такое расчеты
В принципе, конечный продукт расчета зарплаты — это набор записей регистра расчета вида:
|
Сотрудник |
Период |
Вид расчета |
Результат |
Данные |
Комментарий |
|
Измерение |
Служебный |
Служебный |
Реквизит |
||
Значение в колонке «Данные» отражают базовый оклад работника (согласно
трудового договора), но эта сумма может быть увеличена премиями, уменьшена штрафами и невыходами и т.п., поэтому реальная сумма к выплате заносится после выполнения расчета в колонку «Результат». В этом и заключается расчет. Сумма по колонке «Ресурс» для данного сотрудника — причитающаяся ему зарплата.
Таким образом
регистр расчета — по сути набор записей, по структуре похож на оборотный регистр накопления. Просто для выполнения сложных расчетов для него указываются дополнительные настройки, которые позволяют затем строить много виртуальных таблиц для регистра расчета, хотя, по сути
этот регистр — просто набор записей, указанных на рисунке.
Каждая запись регистра расчетов относится к определенному виду расчета и периоду времени.
Виды расчетов
Каждая запись видов расчета имеет служебный реквизит — вид расчетов.
Вид расчетов можно представлять себе как элемент особого справочника типа «План видов расчетов» — он также имеет реквизиты, табличные части, предопределенные и заведенные пользователем элементы. В системе может быть несколько таких «справочников».
Для примера заведем план видов расчета Основной и в нем предопределенные виды расчета оклад
, премия
, невыход
, командировка
.
Виды расчета используются функционально для того, чтобы отразить влияние записей регистра расчета друг на друга. Но сокращенно говорят о влиянии видов расчета друг на друга:
|
Вид расчета |
Описание |
Пример |
|
По базовому периоду |
Результат расчета зависимого периода зависит от результата базового периода. Если результат базового периода изменится, то результат зависимого периода нужно пересчитать. |
Премия зависит по базовому периоду от оклада. |
|
Вытеснение по периоду |
Период действия зависимого периода вытесняет период действия базового периода, таким образом |
Невыход влияет на фактический период действия оклада. |
|
Ведущие расчеты |
Расчет зависит от ведущего расчета, но не прямо а косвенно, т.е. расчет А |
Премия зависит по базе от оклада, но также косвенно зависит и от невыхода. |
В силу подобного влияния, период действия записи регистра расчетов делится на четыре периода:
|
Период |
Описание |
|
Период регистрации |
В каком периоде зарегистрировано событие, т.е. обычно |
|
Период действия |
В каком периоде действует событие, т.е. к какому периоду относится событие. |
|
Базовый период |
Имеет смысл только для периодов, имеющих базовый период — описывает интервал базового периода. |
|
Фактический период действия |
Если период действия вытесняется другими видами расчетов, то фактический период действия состоит из нескольких периодов, когда этот вид расчета фактически действует. |
Период регистрации задается одним числом — началом периода, соответствующим периодичности регистра расчета. Даже если мы установим в это служебное поле другую дату, он все равно заменится на начало периода. Остальные периоды задаются двумя полями — началом и концом периода.Фактический период действия — это набор периодов, т.к. он может состоять из нескольких интервалов дат.
Графики времени
В системе имеется возможность связывать данные из регистров расчета с графиками времени, чтобы по любому периоду можно было получить количество рабочих часов.
График времени — это простой регистр сведений, одно измерение которого хранит дату, другое связывается с измерением регистром расчета, а один из ресурсов используется для учета времени.
Измерение, которое связывается с регистром расчета обычно носит
смысл «вид графика».
|
Дата |
Вид графика |
Значение |
|
11.01.05 пт |
Пятидневка |
|
|
11.01.05 пт |
Шестидневка |
|
|
12.01.05 сб |
Пятидневка |
|
|
12.01.05 сб |
Шестидневка |
Почему используется измерение дата, а не периодический регистр сведений? Все очень просто — если 11 января в пятницу по пятидневке у нас 8 рабочих часов, то это еще не значит, что на следующий день у нас будет опять же 8 рабочих часов. А ведь если бы мы использовали периодический регистр, значение на следующий день бралось бы из предыдущего дня при отсутствии записей.
Таким образом, имея определенный период (фактического действия, регистрации, базовый период и т.п.) мы можем автоматически получить количество часов за этот период по графику.
Перерасчет
Перерасчет чем-то напоминает границу последовательности. Так как у нас есть зависимые расчеты, то при изменении их базовых и ведущих расчетов система должна как-то отметить, что мы должны пересчитать зависимые расчеты.
Для этого и служат перерасчеты.
Если мы рассчитаем базовые записи, то система отметит в перерасчетах, что нам нужно рассчитать зависимые записи. Как только мы рассчитаем зависимые записи, перерасчеты очистятся.
По сути
перерасчеты — это список записей регистра расчета, которые нужно перерасчитать
.
Если в перерасчетах не заводить ни одного измерения, то при изменении базовых расчетов в список перерасчета занесутся все зависимые записи.
Если мы заведем измерение «Сотрудник» в перерасчете, то при изменении базового расчета по сотруднику в перерасчеты добавятся зависимые записи только по этому сотруднику.
Практическое задание
Достаточно теории. Попробуем изучить детали на практике. За основу возьмем каркасную конфигурацию.
Постановка задачи:
Пусть премия задается фиксированным процентом к окладу (за вычетом невыходов и командировочных).
Командировочные пусть оплачиваются в двойном окладе + фиксированная сумма выплат за каждый день командировки.
Пусть за невыходы с сотрудника взымается
штраф в размере половины оклада за период невыхода.
Ход выполнения:
Начальная подготовка
Создадим новый план видов расчета «Основной».
Определим виды расчета и зависимости между ними:
|
Базовые |
Вытесняющие |
Ведущие |
|
|
Оклад |
Невыход, Командировка |
||
|
Премия |
Невыход, Командировка |
Оклад, Невыход, Командировка |
|
|
Командировка |
|||
|
Невыход |
Занесем эти виды расчета в план видов расчета «Основной» и в свойствахвидов расчета поставим зависимости согласно таблице.
В регистре расчета зарплаты сделаем измерение «Сотрудник» типа «ФизическиеЛица
» — чтобы в регистре был разрез аналитики по сотрудникам.
В конфигурации уже имеется документ «Начисление зарплаты».
В нем две даты в шапке — «дата» и «период регистрации», а также по две даты «дата начала» и «датаконца
» в каждой строчке.
Подразумевается что дата — это просто дата оформления документа, период регистрации указывает, за какой месяц мы считаем зарплату, а даты в каждой строке описывают период действия каждого вида расчета.
Добавим в модуль документа первоначальную установку реквизита «Данные» — в него будем заносить начальный оклад, установку периода регистрации, периода действия и базового периода.
Модуль документа будет выглядеть примерно так:
Для К
аждого ТекСтрокаСписок
Из Список Цикл
// регистр Расчеты
Движение = Движения.Р
асчеты.Добавить
();
Движение.С
торно
= Ложь;
Движение.В
идРасчета
= ТекСтрокаСписок.ВидРасчета
;
Движение.П
ериодДействияНачало
= НачалоДня
(ТекСтрокаСписок.ДатаНачала
);
Движение.П
ериодДействияКонец
= КонецДня
();
Движение.П
ериодРегистрации
= ПериодРегистрации
;
Движение.Б
азовыйПериодНачало
= НачалоДня
(ТекСтрокаСписок.ДатаНачала
);
Движение.Б
азовыйПериодКонец
= КонецДня
(ТекСтрокаСписок.ДатаОкончания
);
Движение.С
отрудник
= ТекСтрокаСписок.Сотрудник
;
Движение.Г
рафикРаботы
= ТекСтрокаСписок.График
;
Движение.Р
езультат
= 0;
Движение.Д
анные
= ТекСтрокаСписок.Размер
;
КонецЦикла
;
Реквизит Сторно
нужен чтобы сторнировать
записи (аналог минуса).
Проставляем вид расчета, даты приводим к началу и концу дня. Конечно
базовый период можно проставлять только у зависимых по базе видов расчета, а Данные можно проставлять только у оклада, но и так все работает.
Все документы датировать будем 20.01.2003, период регистрации будем ставить 02.01.2003 (специально указываю не начальные и конечные данные, здесь это неважно, все равно при записи в ПериодРегистрации
преобразуется в начало периода 01.01.2003). Январь 2003 года используем, потому что за этот период заполнены графики работ.
Заведем перерасчет «Перерасчет», добавим в него измерение «Сотрудник», связанное с измерением «Сотрудник».
Играем с Перерасчетами.
Для игры откроем консоль запроса — обработка «ПроизовльныйЗапрос
» в каркасной конфигурации. Создадим новый запрос конструктором запроса, добавим туда виртуальную таблицу Перерасчеты.Р
асчеты.Перерасчет
, текст запроса будет таким:
ВЫБРАТЬ
РасчетыПерерасчет.О
бъектПерерасчета
,
РасчетыПерерасчет.В
идРасчета
,
РасчетыПерерасчет.С
отрудник
ИЗ
РегистрРасчета.Р
асчеты.Перерасчет
КАК РасчетыПерерасчет
Сформируем три документа — первым начислим оклад сотрудникам А
и Б. Сотрудник А работает с 1 по 31 января, Б работает с 1 по 20 января. Вторым начислим премию сотруднику Б
за период с 1 по 31 января, третьим назначим невыход сотруднику А с 20 по 25 января.
Играем с Фактическим периодом действия.
Создадим новый запрос — на этот раз в него добавим данные таблицы РегистрыРасчета.Р
асчеты.ФактическийПериодДействия
.
Сформируем запрос и увидим, что сотруднику А
период действия оклада разбит на два периода — с 1 по 19 и с 26 по 31 января. Надеюсь вам понятно, что период был разбит на два, т.к. невыход вытеснил оклад.
Думаю, механизмы работы регистра расчета проясняются на глазах.
Изучаем графики.
Теперь попробуем начислить зарплату по окладу сотрудника.
Создадим новый запрос по регистру расчета используя виртуальную таблицу РегистрыРасчета.Р
асчеты.ДанныеГрафика
. У этой виртуальной таблицы можно задать параметр — условие отбора записей, например Сотрудник=&ВыбСотрудник
и ВидРасчета=&ВидРасчета
и График=&ВидГрафика
.
Зададим в параметрах запроса конкретных сотрудников, виды расчета и графиков и посмотрим, сколько часов получается в результате.
|
Колонка результата |
Значение |
|
ЗначениеПериодДействия |
На какой период действия в часах была запись в регистре. |
|
ЗначениеФактическийПериодДействия |
Сколько сотрудник фактически проработал в часах |
|
ЗначениеБазовыйПериод |
Для оклада смысла не имеет, для премии — количество рабочих часов в базовом периоде. |
|
ЗначениеПериодРегистрации |
Сколько рабочих часов в периоде регистрации (месяц январь) |
Взаимодействие объектов встроенного языка для работы с регистрами сведений
РегистрСведенийМенеджерЗаписи.<имя>. Позволяет читать, записывать и удалять отдельную запись регистра сведений. Используется только для регистров сведений, не изменяемых регистраторами, т. е. для которых в конфигураторе установлен режим записи Независимый.
РегистрСведенийЗапись.<имя>. Предоставляет доступ к записи регистра сведений. Объект не создается непосредственно, а предоставляется другими объектами, связанными с регистром сведений. Например, данный объект представляет записи регистра в наборе записей.
РегистрСведенийКлючЗаписи.<имя>. Представляет собой набор значений, однозначно идентифицирующих запись регистра. Объект используется в тех случаях, когда необходимо сослаться на определенную запись. Например, он выступает в качестве значения свойства ТекущаяСтрока табличного поля, отображающего список записей регистра.
Информация в регистре сведений хранится в виде записей, каждая из которых содержит значения измерений и соответствующие им значения ресурсов. Измерения регистра описывают разрезы, в которых хранится информация, а ресурсы регистра непосредственно содержат хранимую информацию. В отличие от регистра накопления, ресурсы могут содержать любую информацию. Вместе с каждой записью, находящейся в регистре сведений, можно хранить дополнительную произвольную информацию. Для этого служат реквизиты регистра сведений.
Измерения
Измерения, к значениям которых необходим быстрый доступ (например, при реализации отборов), следует располагать первыми, далее – в порядке убывания «популярности в отборах». Таким образом будет обеспечиваться возможность эффективного применения индексов при реализации задач чтения информации из таблицы регистра.
Также необходимо иметь в виду, что, например, SQL Server накладывает определенное ограничение – не более 16 полей в индексе. Поэтому работа с регистрами, имеющими очень большое количество измерений, может быть неэффективна по скорости из-за невозможности использования индексов.
Если в регистре сведений есть набор данных для разных измерений, и в конфигураторе попытаться удалить измерение, то система выдаст ошибку, что записи стали не уникальными.
Свойства:
- Ведущее
Свойство Ведущее имеет смысл использовать лишь тогда, когда измерение имеет тип ссылки на объект базы данных. Установка свойства Ведущее будет говорить о том, что запись регистра сведений представляет интерес, пока существует тот объект, ссылка на который выбрана в качестве значения этого измерения в этой записи. При удалении объекта все записи регистра сведений по этому объекту тоже будут автоматически удалены.
Если измерению установлен тип «СправочникСсылка», то в форме элемента справочника для ведущего измерения, в панели навигации в группе Перейти появится ссылка. По ней возможен переход к записям этого регистра, которые содержат в измерении ссылку на этот элемент справочника.
- Основной отбор
Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование «Основной отбор по периоду» включает основной отбор для период для периодических регистров.
- Запрет незаполненных значений
При установке этого свойства срабатывает проверка на заполненность измерения в момент записи. Если это свойство было добавлено после того, как в регистр были добавлены значения с пустым значением измерения, то при реструкторизации базы ошибка не будет выведена, так как проверка срабатывает только при записи набора данных.
В отношении поля Период для периодических регистров сведений и в отношении поля Регистратор регистра сведений с подчиненным режимом записи подобная проверка выполняется всегда.
Периодичность
Если записи подчинены регистратору, то у регистра добавляется служебное поле «Регистратор», в которое записывается ссылуа на документ, который совершил проводки. Так же добавляются поля «Номер строки» и «Активность».
«Регистратор» обеспечивает привязку к документу, но не всегда входит в разряд ключевых полей.
Для того чтобы поле Регистратор стало ключевым, необходимо для такого регистра сведений (с режимом записи Подчинение регистратору) установить для свойства Периодичность значение «По позиции регистратора».
С прикладной точки зрения это означает возможность хранения в регистре сведений данных с привязкой к временной оси с дробностью до момента времени. Соответственно данные можно получать тоже на момент времени.
Еще одной особенностью регистра, подчиненного регистратору является то, что появляется служебное поле «Активно», которое можно менять. Снять или установить активность можно только для всех записей набора записей, подчиненных некоему регистратору. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени.
Индексы
Непериодический регистр сведений
Измерение1 + [Измерение2 +…]
Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании.
Этот индекс создается, если есть хоть одно измерение регистра.
ИзмерениеN + Измерение1 + [Измерение2 +…]
Индекс, включающий все измерения. Первое поле – ИзмерениеN, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании.
Этот индекс создается, если:
- для измерения измерениеN задано свойство Индексировать или свойство Ведущее;
- измерениеN – не первое измерение;
- измерениеN – не единственное измерение.
Реквизит + Измерение1 + [Измерение2 +…]
Индекс, в котором первое поле – Реквизит, затем все измерения в том порядке, в котором они заданы при конфигурировании.
Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать.
Ресурс + Измерение1 + [Измерение2 +…]
Индекс, в котором первое поле – Ресурс, затем все измерения в том порядке, в котором они заданы при конфигурировании.
Этот индекс создается, если для ресурса свойство Индексировать установлено в значение Индексировать.
В данный индекс включается поле Ресурс, и затем все измерения в том порядке, в котором они заданы в составе регистра как объекта конфигурации.
Периодический регистр сведений
Период + [Измерение1 + …]
Этот индекс создается всегда для любого периодического регистра сведений.
Измерение1 + [Измерение2 +…] + Период
Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, и поле Период.
Этот индекс создается, если есть хоть одно измерение регистра.
ИзмерениеN + Период + Измерение1 + [Измерение2 +…]
Индекс, включающий поле Период и все измерения. Первое поле – ИзмерениеN, затем поле Период, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании.
Этот индекс создается, если:
- для измерения измерениеN свойство Индексировать установлено в значение Индексировать;
- измерениеN – не единственное измерение.
Дополнительный индекс для регистра сведений, подчиненного регистратору
Регистратор + НомерСтроки
Этот индекс создается всегда для любого регистра сведений, подчиненного регистратору.
Регистр сведений с периодичностью «По позиции регистратора»
Период + Регистратор + НомерСтроки
Регистратор + НомерСтроки
Эти индексы создаются всегда для любого регистра сведений с периодичностью По позиции регистратора.
Измерение1 + [Измерение2 + …] + Период + Регистратор + НомерСтроки
Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, поле Период, поле Регистратор и поле НомерСтроки.
Этот индекс создается, если есть хоть одно измерение регистра.
Измерение + Период + Регистратор + НомерСтроки
Этот индекс создается, если для измерения свойство Индексировать установлено в значение Индексировать.
Реквизит + Период + Регистратор + НомерСтроки
Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать.
Ресурс + Период + Регистратор + НомерСтроки
Этот индекс создается, если для ресурса свойство Индексировать установлено в значение Индексировать.
Последовательность событий
Последовательность событий при сохранении данных из формы записи регистра сведений (записать и закрыть)
Работа с формой записи регистра сведений осуществляется при помощи объекта РегистрСведенийМенеджерЗаписи.<имя>, который, в свою очередь, использует объект РегистрСведенийНаборЗаписей.<имя>.
Особенности внутренней реализации объекта РегистрСведенийМенеджерЗаписи.<имя> таковы, что в случае сохранения существующей записи регистра сведений обработчики события Перед Записью() и ПриЗаписи() модуля набора записей будут вызваны дважды: сначала для старого набора записей (с количеством записей 0) и затем для нового (с количеством записей 1).
Последовательность событий при сохранении данных из формы набора записей регистра сведений (записать и закрыть)
МоментВремени и Граница
Момент времени — комбинация даты и ссылки на документ. Позволяет разделить и упорядочить документы в пределах одной секунды, выстраивая все документы в однозначную последовательность. Момент времени имеет один метод – Сравнить(), при помощи которого возможно сравнение двух моментов времени между собой.
МоментВремени() — это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница.
МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая);
Момент = Новый МоментВремени(ТекДокумент.Дата, ТекДокумент.Ссылка); // создает объект момент времени по ссылке и дате документа.
Момент времени и Границу можно передавать в качестве входного параметра виртуальных таблиц регистров сведений
Шаблоны использования
- // Пример: получить текущую цену из периодического регистра сведений «Цены».
Элемент = Справочники.Номенклатура.НайтиПоКоду(4);
Отбор = Новый Структура(«Номенклатура», Элемент);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(ТекущаяДата(), Отбор);
Цена = ЗначенияРесурсов.Цена;
- // Пример: Получить начальную цену из периодического регистра сведений Цены.
ИмяРегистра = «Цены»;
Услуга = Справочники.Номенклатура.НайтиПоНаименованию(«Диагностика»);
Отбор = Новый Структура;
Отбор.Вставить(«Номенклатура», Услуга );
Цена = РегистрыСведений[ИмяРегистра].ПолучитьПервое(ТекущаяДата(), Отбор).Цена;
- // Пример: активизировать требуемую строку списка регистра сведений.
СтруктураКлючевыхПолей = Новый Структура;
СтруктураКлючевыхПолей.Вставить(«Период», Дата(«20040331000000»));
СтруктураКлючевыхПолей.Вставить(«Номенклатура», Справочники.Номенклатура.НайтиПоКоду(«0000006»));
Элементы.Материалы.ТекущаяСтрока = РегистрыСведений.Цены.СоздатьКлючЗаписи(СтруктураКлючевыхПолей);
- // Пример: показать номенклатуру, цена на которую была установлена в заданную дату и время.
Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(ЗаданнаяДата, Истина);
Набор.Прочитать();
Для Каждого ОчереднаяЗапись Из Набор Цикл
Сообщить(«Номенклатура = «+ ОчереднаяЗапись.Номенклатура +», цена = «+ ОчереднаяЗапись.Цена);
КонецЦикла;
- // Пример: добавить новое значение цены в регистр «Цены».
Запись = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДата();
Запись.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(«0000005»);
Запись.Цена = 568;
Запись.Записать();
ВАЖНО! Так как при работе с менеджером записи система по умолчанию работает через набор записей, то доступна возможность управления процессом записи, например через событие «ПередЗаписью». Однако надо иметь ввиду, что если после чтения записи изменяются значения её ключевых свойств (период или измерение), то при записи происходит 2 записи набора записей (см картинку выше):
- запись пустого набора для старого значения ключевых полей
- запись набора с новыми данными.
Соответственно событие «ПередЗаписью» срабатывает дважды и это надо учитывать.
- // Добавить запись через набор записей
НаборЗап = РегистрыСведений.Цены.СоздатьНаборЗаписей();
НаборЗап.Отбор.Номенклатура.значение = СсылкаНоменклатура; //Если не установит отбор, то будут замещены все записи.
// Если регистр имеет несколько измерений, а в отборе установим только одно, то при записи набора будут удалены все записи с данной номенклатурой и записана только одна запись. Не забываем про период, так как он тоже является «измерением» регистра.
НаборЗап.Прочитать(); //Если не прочитать, то тоже замещены все записи для данной номенклатуры
Запись = НаборЗап.Добавить();
Запись.Номенклатура = Ссылка;
Запись.Период = ТекущаяДата();
Запись.Цена = Цена;
НаборЗап.Записать();
- // Пример, получить значение ресурса по набору измерений. Для метода Получить() обязательна передача параметра, содержащего структуру отбора значений по всем измерениям.
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить(«ФизическоеЛицо», ПроверяемоеЛицо);
СтруктураОтбора.Вставить(«Подразделение», ВыбранноеПодразделение);
СтруктураРесурсов = РегистрыСведений.Сотрудники.Получить(СтруктураОтбора);
Должность = СтруктураРесурсов.Должность;
- // Пример: удалить все записи регистра сведений за текущий месяц.
Выборка = РегистрыСведений.Цены.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
Пока Выборка.Следующий() Цикл
Выборка.ПолучитьМенеджерЗаписи().Удалить();
КонецЦикла;
- // Пример: удалить все записи регистра сведений через выборку по отбору.
ОтборР = Новый Структура(«Документ»);
ОтборР.Документ = Ссылка;
// в качестве полей для отбора могут использоваться измерения или реквизиты регистра, для которых в конфигураторе установлен признак индексирования в значение Индексировать или установлен признак Ведущее. Но необходимо помнить, что отбор при этом возможен только на равенство и только по одному полю. Для периодических регистров доступна возможность отобрать записи за интервал времени.
Выборка = РегистрыСведений.МенеджерыКлиентов.Выбрать(,,ОтборР,);
Пока Выборка.Следующий() Цикл
Выборка.ПолучитьМенеджерЗаписи().Удалить();
КонецЦикла;
- // Пример получения записей регистра сведений, исключая границы интервала
// Установить значения границ
ГраницаНачалаИнтервала = Новый Граница(НачалоИнтервала, ВидГраницы.Исключая);
ГраницаКонцаИнтервала = Новый Граница(КонецИнтервала, ВидГраницы.Исключая);
// Подготовить структуру отбора по измерению «Номенклатура»
СтруктураОтбора = Новый Структура(«Номенклатура», ВыбранныйТовар);
// Получить выборку записей
ВыборкаЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.Выбрать(ГраницаНачалаИнтервала, ГраницаКонцаИнтервала, СтруктураОтбора);
Пока ВыборкаЗаписей.Следующий() Цикл
// Выполнить действие с очередной записью
//…
КонецЦикла;
- // Пример: удалить все записи (полностью очистить регистр).
НабоЗаписей= РегистрыСведений.Цены.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
- // Пример: показать изменение цен на элемент номенклатуры в течение года.
Отбор = Новый Структура(«Номенклатура», Справочники.Номенклатура.НайтиПоКоду(«0000005»));
Выборка = РегистрыСведений.Цены.Выбрать(НачалоГода(ТекущаяДата()), ТекущаяДата(), Отбор);
Пока Выборка.Следующий() цикл
Сообщить(«Дата = » + Выборка.Период + «, цена = » + Выборка.Цена);
КонецЦикла;
Проектирование регистров сведений
Что лучше? Создать несколько регистров с большим количеством ресурсов или, наоборот, создать много регистров, но с меньшим количеством ресурсов?
При ответе на это вопрос надо учитывать:
Структурный подход. Каждая запись в регистре сведений содержит информацию о том, что для данной комбинации ключевых полей установлены некоторые значения ресурсов. То есть если запись добавляется или модифицируется, это выполняется для всех значений ресурсов.
Восприятие пользователем. При проектировании регистра важно проанализировать, как реально меняются значения данных, которые будут храниться в регистре, и выработать определенную модель отражения этих изменений в базе данных. Важно, чтобы отражение предметной области в регистре правильно воспринималось пользователем.
Учет потенциальных модификаций состава регистра. Если в перспективе может потребоваться добавить новые измерения и весь список измерений можно разбить на логические группы, то предпочтительнее создать несколько регистров, которые содержат отдельный логический набор измерений.
Время получения данных, необходимых для работы механизмов решения. Например, при работе некоторого механизма важно получать данные объекта и данные, связанные с данным объектом. Очевидно, что получение этих связанных данных из нескольких ресурсов одного регистра (одной таблицы) будет происходить в общем случае быстрее, нежели получение этих данных из нескольких регистров (нескольких таблиц).
Время записи информации в базу данных. Запись в несколько регистров сведений в общем случае будет выполняться медленнее, нежели запись одной записи с несколькими ресурсами.
«Слабое звено». Если данные одного из ресурсов нужно модифицировать очень часто, то объем базы будет расти существеннее, если в составе регистра много ресурсов. Особенно, если какой-нибудь из ресурсов будет являться хранилищем значений, в котором будет храниться картинка или бинарные данные. Такие данные вообще целесообразнее выделять в отдельный регистр.
Эффективность применения индексов. Расстановки измерений регистра сведений имеет важное значение. Измерения, к значениям которых необходим быстрый доступ (например, при реализации отборов), следует располагать первыми, далее – в порядке убывания «популярности в отборах». Таким образом будет обеспечиваться возможность эффективного применения индексов при реализации задач чтения информации из таблицы регистра.
!
Пример проектирования регистра сведений можно посмотреть здесь https://career.i-neti.ru/struktura-registra-svedeniy-1s/
-
Как известно что периодическим реквезитам нельзя использовать командты ВыбратьЭлементыПоРеквезиту или УстановитьОбор (галочки отбор и сортировка не доступны)
Как выйти из ситуации?
МОжет есть какая нибудь хорошая компонента (dll) для работы со справочниками….(вроде в 1cpp, 7plus, таких функций не замечал) -
Offline
WaRDeR
Модераторы
Команда форума
Модератор- Регистрация:
- 23 ноя 2006
- Сообщения:
- 3.264
- Симпатии:
- 19
- Баллы:
- 29
Не совсем понятна суть вопроса…
если база DBF — то перебором
если SQL — то запросом -
ээ перебором не пойдет…..слишком справочник большой….время жалко… мне бы быстренько примерно как стандартная процедура выбратьэлементыпореквезиту….ЧТОБЫ ВРЕМЯ не ЖРАЛО
-
Offline
WaRDeR
Модераторы
Команда форума
Модератор- Регистрация:
- 23 ноя 2006
- Сообщения:
- 3.264
- Симпатии:
- 19
- Баллы:
- 29
тогда можно добавить не периодический реквизит, который будет дублировать значение периодического
-
да…..да такого было трудно додуматься…. нет этот вариант не пойдет….в моем случае он еще больше проблем создает…
-
Так озвучте поподробнее вашу проблему на КОНКРЕТНОМ примере структуры… Что вы вообще хотите добиться?
Просто поиск по реквизиту? Отображение чего-то в форме списка? Фильтр?
В зависимости от задачи и будем искать решение!
-
в справочнике номенклатуры каждый день документом от поставщиков проставляются цены (с периодическим типом)…
после того как новый документ поставщика был создан у старого документа отменяем проведение, чтобы цены старые не висели (потому что только цены последнего документа должны отображаться в справочнике)
итого мы получаем что номенклатура всех поставщиков с последними ценами должна отбираться, а пустые без цен, соответственно исчезнуть….
есть масса способов как этот вариант решить….но мне нужен стандартный отборпореквезиту…без всяких флагов обновлений… -
Offline
Requin
Опытный в 1С- Регистрация:
- 10 май 2010
- Сообщения:
- 1.911
- Симпатии:
- 2
- Баллы:
- 29
Так если вы храните только последнюю цену поступления, то зачем периодический реквизит?
-
Offline
Requin
Опытный в 1С- Регистрация:
- 10 май 2010
- Сообщения:
- 1.911
- Симпатии:
- 2
- Баллы:
- 29
И вот эту идею я не совсем понимаю.
Что значит номенклатура всех поставщиков с последними ценами? И что значит пустые без цен?
Или вам нужно, чтобы в справочнике отображались только те элементы, цены которых проставили документом от поставщиков сегодня? Поясните. -
Requin, прав — уберите периодический реквизит из цены и добавьте еще один реквизит — поставщик (по нему и отбирайте). Я бы сделал немного по другому — через ПОДЧИНЕННЫЙ справочник цен (реквизиты: дата/цена/поставщик).



































