Как добавить в регистр сведений реквизит справочника

47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

1

1C 8.x

Добавление данных из справочника в регистр сведений

10.05.2016, 20:23. Показов 17448. Ответов 63


Здравствуйте всем, вопрос конечно я думаю для профи — легкий, но для новичка (для меня) — не понятен.*
Конфигурация УПП. Есть справочник Должности и регистр сведений ДолжностныеКомпетенцииРабтоников. В справочнике в табличное поле добавляются данные о компетенциях,эти данные записываются в регистр сведений, если допустим уже созданную строку изменить, то в регистре она соответственно тоже изменится, а не добавится новая. Регистр был не периодический, сделала периодичным в пределах дня. Вопрос: как сделать, чтоб при изменении строки с данными компетенции в справочнике, в регистр сведений добавлялась новая строка, а не изменялась предыдущая.



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

10.05.2016, 20:37

2

nastena_r_v, у вас УПП доработана, я так понимаю? Поскольку в типовой в справочнике Должности я табличных полей не наблюдаю.
Посмотрите код, где создаются записи в регистре при записи Должности. Поскольку регистр независимый, то вероятно прописано через СоздатьМенеджерЗаписи(), далее выставляется значение ключевых полей и Прочитать() — так получается имеющаяся запись. Достаточно убрать Прочитать() для создания новой записи. И не забудьте выставлять период записи, если сделали регистр периодическим.



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

10.05.2016, 20:54

 [ТС]

3

GreenkA, нет, УПП не доработанная. Справочник не должности организаций, а должности. Я Вас немного не поняла ))
разве код должен прописываться в регистре? А не в процедуре справочника ПриЗаписи?



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

10.05.2016, 20:55

4

Цитата
Сообщение от GreenkA
Посмотреть сообщение

где создаются записи в регистре при записи Должности.

это и подразумевает процедуру ПриЗаписи(…) Должности)



1



nastena_r_v

47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

10.05.2016, 20:59

 [ТС]

5

GreenkA, конфигурация типовая, все эти данные вней есть.
А процедура ПриЗаписи не существует. Зато есть:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Проверяем, записана ли компетенция
// иначе предлагаем записать - с тем, чтобы можно было 
// вводить записи регистра
Процедура РегистрСведенийСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
    
    Если ЭтоНовый() Тогда
        Отказ = (Вопрос("Информация о компетенции еще не записана! Записать?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да,) <> КодВозвратаДиалога.Да);
        Если Не Отказ Тогда
            Отказ = Не ЗаписатьВФорме();
        КонецЕсли;
        
        Если Не Отказ тогда
            Должность = Ссылка;
            РегистрСведенийСписок.Отбор.Должность.Значение       = Должность;
            РегистрСведенийСписок.Отбор.Должность.ВидСравнения  = ВидСравнения.Равно;
            РегистрСведенийСписок.Отбор.Должность.Использование = Истина;
        КонецЕсли;
    КонецЕсли;
 
КонецПроцедуры // РегистрСведенийСписокПередНачаломДобавления



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

10.05.2016, 21:20

6

nastena_r_v, а, ну здесь получается вынесен на форму элемента справочника Должности список записей регистра. Т.е. в Должности записи регистра изменяются напрямую.



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

11.05.2016, 04:05

 [ТС]

7

GreenkA, а как сделать чтоб при изменении или добавлении строки в справочнике, добавлялась новая строка в регистр?



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

11.05.2016, 09:22

8

Цитата
Сообщение от nastena_r_v
Посмотреть сообщение

добавлении строки в справочнике,

Сейчас через справочник Должности записи регистра изменяются напрямую. Если вам надо добавлять каждый раз при изменении новые записи: измените справочник Должности, создайте там табличное поле, которое будет заполняться СрезомПоследних() по регистру при открытии. При записи должности через СоздатьМенеджерЗаписи() можно создавать новые записи в регистре сведений. Лучше создать колонку-метку изменений строки в новой таблице, чтобы каждый раз не перезаписывать всю таблицу в регистр.



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

11.05.2016, 12:46

 [ТС]

9

GreenkA, про срез последних понятно. А на счет СоздатьМенеджерЗаписи и далее- не очень.



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

11.05.2016, 14:01

10

nastena_r_v, создаете таблицу значений на форме элемента справочника Должности с колонками идентичными измерениям и ресурсам регистра сведений + дополнительную колонку МеткаИзменения(типа Булево), скроете ее от пользователя, убрав в свойствах Видимость. Для каждой новой и измененной строки таблицы будете выставлять эту метку в Истина.
Далее для события элемента формы Должности ПриЗаписи():

1C
1
2
3
4
5
6
7
8
9
Процедура ПриЗаписи(Отказ)
    ИзмененныеСтрокиТаблицы = ТабличноеПоле1.НайтиСтроки(Новый Структура("МеткаИзменения",Истина));
    Для к = 0 по ИзмененныеСтрокиТаблицы.Количество() - 1 Цикл
        НоваяЗапись = РегистрыСведений.ДолжностныеКомпетенцииРаботников.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, ИзмененныеСтрокиТаблицы[к]);
        НоваяЗапись.Период = ТекущаяДата();
        НоваяЗапись.Записать();
    КонецЦикла;
КонецПроцедуры



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

11.05.2016, 20:06

 [ТС]

11

GreenkA, ну я так поняла, я могу оставить уже существующее табличное поле? и в него добавить измерения из регистра? в принципе, там не считая измерения должность, 1 измерение- компетенция и стандартный реквизит- период, т.к. поставила периодичность, в пределах дня.

Добавлено через 1 минуту

Цитата
Сообщение от GreenkA
Посмотреть сообщение

создаете таблицу значений

и еще, глупый вопрос, но как ее создать на форме? это же вроде некий набор данных.



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

12.05.2016, 09:59

12

Цитата
Сообщение от nastena_r_v
Посмотреть сообщение

я могу оставить уже существующее табличное поле

существующее «табличное поле» — это список записей регистра сведений! Если вы его оставите, то все изменения в этой таблице будут происходить напрямую в регистре, никаких новых записей при изменении строки не будет.

Цитата
Сообщение от nastena_r_v
Посмотреть сообщение

но как ее создать на форме

см скрин

Добавление данных из справочника в регистр сведений

После создания таблицы значений, правой кнопкой мыши — Добавить колонку и задаете имя и тип.



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

12.05.2016, 14:52

 [ТС]

13

GreenkA, условие не срабатывает и в регистр соответственно ничего не добавляется. Вроде сделала все, как Вы сказали.



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

12.05.2016, 15:06

14

nastena_r_v, покажите код.



1



nastena_r_v

47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

12.05.2016, 15:26

 [ТС]

15

GreenkA, сейчас выложу. А подскажите, через какой метод обратиться к полю табличного поля?

Добавлено через 11 минут
GreenkA, Короче, намутила воду видимо я )))
п.с с программированием -трудности, так что строго не судите, я учусь ))

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Процедура ПриОткрытии()
    
    ЭлементыФормы.ПолеДолжносныеНормы.ДобавитьСтроку(ДолжностныеНормы);
    ЭлементыФормы.ПолеТребований.ДобавитьСтроку(Требования);
    
    Должность = Ссылка;
                  
    КомпетенцияПриОткрытии  = ТабличноеПоле1.Компетенция;
    ПериодПриОткрытии   = ТабличноеПоле1.Период;
    ДолжностьПриОткрытии  = Должность;
    
    Прочитать();
        
    Если НаборЗаписей.Количество() = 0 тогда
        НаборЗаписей.Добавить();
        ЗаписьИзНабора            = НаборЗаписей[0];
        ЗаписьИзНабора.Период   = ПериодПриОткрытии;
    КонецЕсли; 
    
    //Добавляет действие "Редактировать код"
    РаботаСДиалогами.ДобавитьВМенюДействияКнопкуРедактированияКода(ЭлементыФормы.ДействияФормы.Кнопки.Подменю);
    РаботаСДиалогами.УстановитьДоступностьПоляВводаНомера(Метаданные(),ЭтаФорма,ЭлементыФормы.ДействияФормы.Кнопки.Подменю,ЭлементыФормы.Код);
 
КонецПроцедуры // ПриОткрытии
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Процедура ПриЗаписи(Отказ)
    
        Если ДолжностьПриОткрытии <> Должность 
        ИЛИ КомпетенцияПриОткрытии <> ТабличноеПоле1.Компетенция  Тогда       
        Если ПериодПриОткрытии <> ТабличноеПоле1.Период Тогда
 
            МенеджерЗаписи = РегистрыСведений.ДолжностныеКомпетенцииРаботников.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Период           = ПериодПриОткрытии;
            МенеджерЗаписи.Должность        = ДолжностьПриОткрытии;
            МенеджерЗаписи.Компетенция     = ПериодПриОткрытии;
            
            МенеджерЗаписи.Записать();
            
            ЗаписьИзНабора            = НаборЗаписей[0];
            ЗаписьИзНабора.Период   = ТабличноеПоле1.Период;
            ЗаписьИзНабора.Должность    = Должность;
            ЗаписьИзНабора.Компетенция  = ТабличноеПоле1.Компетенция;
                    
        Иначе
            Сообщить("Необходимо установить период для компетенции");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;     
    
КонецПроцедуры

Это вот без Вашего кода.
Вообще я хотела, чтоб при открытии справочника отображались последние — текущие данные с регистра, и при записи, если эти данные не равны последним данным в регистре, чтоб добавлялись новые. Но видимо я вообще все не так делаю ))



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

12.05.2016, 17:28

16

nastena_r_v, опишите структуру и назначение ПолеДолжносныеНормы, ПолеТребований и НаборЗаписей НаборЗаписей — это таблица значений или опять список записей регистра?



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

12.05.2016, 18:12

 [ТС]

17

GreenkA, ПолеДолжносныеНормы и ПолеТребований — это реквизиты с типовой конфигурации. На них ,я думаю, можно не обращать внимание. Набор записей — это я предполагаю — список записей регистра.



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

12.05.2016, 19:58

18

nastena_r_v, вы так и не создали новую таблицу значений на форме? Я же писала выше как именно ее создать…

Добавлено через 3 минуты
Мне вот интересно, смысл делать регистр периодическим, если там даже ресурсов нет? Или вы изменяли регистр ДолжностныеКомпетенцииРаботников?
У меня там только измерение Должность и Компетенция. Я к тому, что СрезПоследних получает последние записи по ресурсам в разрезе измерений, а ресурсов и нет. Будут все равно выдаваться все компетенции.
Тут как вариант Компетенции сделать ресурсом… Но надо смотреть, на что еще это повлияет в УПП…



1



47 / 47 / 1

Регистрация: 03.05.2012

Сообщений: 266

12.05.2016, 20:00

 [ТС]

19

GreenkA, создала. Просто не в отдельной вкладке, как предложили Вы, а в том же месте.
И поле «МеткаИсправления», я тоже добавила, но не задействовала его. В коде думаю Вы сам увидели.
Так же для отображенияпоследних данных, я добавила колонку Действие, тип значения — ПеречисленияВидыДействияСНачислением (он используется в кадровом перемещении: начать, изменить, не изменять, прекратить).

Миниатюры

Добавление данных из справочника в регистр сведений
 



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

12.05.2016, 20:02

20

nastena_r_v, так какая структура регистра ДолжностныеКомпетенцииРаботников у вас?



0



Запись элемента справочника в регистр сведений

Я
   Эльчин

11.03.13 — 12:36

Есть справочник Услуги, регистр сведений РегистрУслуг. Записываю так:

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

   Регистр = РегистрыСведений.РегистрУслуг.СоздатьМенеджерЗаписи();

   Регистр.Период = ТекущаяДата();

   Регистр.Услуга = Объект.Наименование;

   Регистр.Цена = Объект.Цена;

   Регистр.Скидка = Объект.Скидка;

   Регистр.Записать();

КонецПроцедуры

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

  

Партнерская программа EFSOL Oblako

   andreymongol82

1 — 11.03.13 — 12:37

Регистр.Услуга = Объект.Наименование;

Регистр.Услуга — какого типа?

   Alex375

2 — 11.03.13 — 12:38

А Вы уверены что в регистре измерение «Услуга» типа строка? Что-то меня тревожат смутные сомнения по этому поводу…

   НафНаф

3 — 11.03.13 — 12:38

а точно наименование нужно, а не ссылка?

   MSII

4 — 11.03.13 — 12:39

Измерение Услуга — Тип СправочникСсылка.Услуги, зуб даю.

   andreymongol82

5 — 11.03.13 — 12:39

(4) Сдается мне, что тип СправочникСсылка.Номенклатура…

   Эльчин

6 — 11.03.13 — 12:43

(1) СправочникСсылка.Услуги

   andreymongol82

7 — 11.03.13 — 12:44

(4) Проспорил, блин.

(6) Ну дык попробуйте, вместо

Регистр.Услуга = Объект.Наименование;

Регистр.Услуга = Объект.Ссылка;

   Alex375

8 — 11.03.13 — 12:44

ну тогда надо записывать ссылку, а не наименование :)

   vs1c

9 — 11.03.13 — 12:45

А по мне так — занавес.

   MSII

10 — 11.03.13 — 12:45

Ура. Я сохранил свой зуб.

(6) Ну а зачем ты в него строку пишешь? Да еще обманул нас, говоришь, типы совпадают.

   Эльчин

11 — 11.03.13 — 12:45

Получилось. спосибо всем. Тип менял. Был СправочникСсылка.Услуги. спосибо большое

   Эльчин

12 — 11.03.13 — 12:47

(10) я думал что тип должен быть СправочникСсылка.Услуги. по этому говорил что типы совподают. простите. спосибо еше раз

   НафНаф

13 — 11.03.13 — 12:47

(11) а теперь? что-то я очкую за тебя

   andreymongol82

14 — 11.03.13 — 12:48

(13) Да не очкуй, он так сто раз уже делал

   Alex375

15 — 11.03.13 — 12:53

(11) ты тип в регистре поменял? Если так, тогда дело думаю продолжится в другой ветке.

   Reset

16 — 11.03.13 — 12:57

(11) Поменял в регистре тип измерения на строку?

   Эльчин

17 — 11.03.13 — 13:29

(15) нет проблем. всё получается. простите, в чем проблема? знаю что у меня есть проблемы, как у всех новычках. но в программе в чем проблема? всё получается. Поменял в регистре тип измерения на строку

   hhhh

18 — 11.03.13 — 13:32

(17) йо!!

   НЕА123

19 — 11.03.13 — 13:36

(18)

нормально все. душа у ТС требует зажигательные танцы.

   hhhh

20 — 11.03.13 — 13:39

(19) может он тут на копии тренируется, всё нормально, а завтра пойдет к клиентам и накатит это на рабочую базу?

   Reset

21 — 11.03.13 — 13:41

(17) Ну, к примеру, нужно было тебе выйти из дома, а ты забыл в какую сторону дверь открывается. В (7) тебе подсказали, в какую.

Подсказку ты проигнорировал и вышиб дверь напрочь могучим своим плечом.

Собственно, в этом и проблема.

   mikecool

22 — 11.03.13 — 13:43

фееричная ветка

   Reset

23 — 11.03.13 — 13:43

подсказки на самом деле еще в (2) (3).

В (7) уже пальцем ткнуто

   Эльчин

24 — 11.03.13 — 13:55

я понимаю это. но поменяю тип СправочникСсылка.Услуги. Делаю так:

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

   Регистр = РегистрыСведений.РегистрУслуг.СоздатьМенеджерЗаписи();

   Регистр.Период = ТекущаяДата();

   Регистр.Услуга = Объект.Ссылка;

   Регистр.Цена = Объект.Цена;

   Регистр.Скидка = Объект.Скидка;

   Регистр.Записать();

КонецПроцедуры

когда элемент новый, колонка Услуга не заполняетя, а при повторном записе заполняеия. думфл что пока строкой обойтись. да, правда, это болшая проблема в далнейшем. а как делать что колонка Услуга тоже заполнялась?

   НафНаф

25 — 11.03.13 — 14:16

(24) нужно чтобы объект был записан, внезапно

   Эльчин

26 — 11.03.13 — 15:26

(25) понимаю это. но как делать? на форумах есть это тема. но нет ответа

   Эльчин

27 — 11.03.13 — 15:29

сделал. процедура не ПередЗаписьюНаСервере, а ПослеЗаписиНаСервере должна было быть. все по моему всё. да? спосибо за помош и терпиливость

   НафНаф

28 — 11.03.13 — 15:49

лучше ПриЗаписи, в транзакции

   Эльчин

29 — 11.03.13 — 16:10

а как проверить что элемент новый или нет?

   Эльчин

30 — 11.03.13 — 16:12

(28) приЗаписи колонка Услуга не заполняется.

   Эльчин

31 — 11.03.13 — 17:19

как проверить что элемент новый или нет?

   Эльчин

32 — 11.03.13 — 17:20

ЭтоНовый, Пустая(), Параметры.Ключ.Пустая() ….. никак не получается

   НафНаф

33 — 11.03.13 — 17:24

в модуле объекта ЭтоНовый()

   hhhh

34 — 11.03.13 — 17:25

(32) передЗаписью проверить

   Эльчин

35 — 11.03.13 — 18:39

(33) ПриЗаписи проверяю ЭтоНовый(), всегда возврашает ложь, (34) ПередЗаписю проверяю условие возврашает чего надо, но колонка Услуга не заполняется.  по моему надо ПриЗаписи проверить, но как проверить. как я понил ПриЗаписи это уже не новый, а ПередЗаписю не дасть заполнить колонку Услуга. Потому что Ссылка пустая. что делать?

   Alex375

36 — 12.03.13 — 04:25

(35) надо в перед записью новому элементу принудительно ссылку назначить и тогда все получится.

   МимохожийОднако

37 — 12.03.13 — 07:01

Откуда взялся Объект? ТекущийОбъект я увидел.

   Starhan

38 — 12.03.13 — 07:37

(33)а Ниф-Ниф есть?

   hhhh

39 — 12.03.13 — 07:44

   Эльчин

40 — 12.03.13 — 13:55

(36) как можно этого сделать?

   Reset

41 — 12.03.13 — 13:59

(40) Не надо оно в твоем случае. Делай как в (28)

Зачем тебе знать про ЭтоНовый?

   Reset

42 — 12.03.13 — 14:08

(40) Отвечать-то будешь?

   Эльчин

43 — 12.03.13 — 14:10

не понимаю (28), кажется есть что то по имени Транзакция. не знаю как исползовать. если можете пишите пример об этом для задачи как можно подобен этому. думаю что понили меня, с грамматикой не очень хорошо у меня

   Эльчин

44 — 12.03.13 — 14:11

если не можете всё равно спосибо

   Reset

45 — 12.03.13 — 14:13

(43) Понимания термина транзакция в данном контексте не требуется. Делай просто ПриЗаписи, поверь на слово.

Зачем тебе нужно знать про ЭтоНовый?

   Reset

46 — 12.03.13 — 14:15

Для чего потребовалось (31)?

   Эльчин

47 — 12.03.13 — 14:35

(46)  потому что, когда при записи сделаю так:

Процедура ПриЗаписи(Отказ)    

   Регистр = РегистрыСведений.РегистрУслуг.СоздатьМенеджерЗаписи();

   Регистр.Период = ТекущаяДата();

   Регистр.Услуга = Ссылка;

   Регистр.Цена = Цена;

   Регистр.Скидка = Скидка;

   Регистр.Записать();    

КонецПроцедуры

новый элемент записывается как надо. но когда изменяю элемент, и новый элемент добавляется, и тот элемент сам тоже изменяется. в резултате в регистре появляется 2 одиноковые записи. в второй раз уже 3 одиноковый запис и так далее…

   Reset

48 — 12.03.13 — 14:38

(47) При каждой записи появляется новая запись в регистре, все верно. Этакое версионирование. А нужно чтобы было как?

   Reset

49 — 12.03.13 — 14:40

(47) Нужно только первый раз «при создании» запомнить цену скидку?

А если пользователь первый раз забудет ввести, запишет, а правильные укажет при повторной записи?

   Reset

50 — 12.03.13 — 14:42

Вариант записывать каждый раз «в одну и ту же запись» не рассматриваем, как бессмысленный

   Эльчин

51 — 12.03.13 — 14:50

да, да, да… кажется всё правилно. уже 2 дня мучуюсь здесь. спосибо Reset, спосибо большое

   Эльчин

52 — 12.03.13 — 14:51

проста когда изменяю имя, и в новом, и в старом записи имя изменяется. я хотел кажется от этово избежать. сейчась вижу что это и так надо быть

   Reset

53 — 12.03.13 — 14:56

(52) «Имя» изменяется, потому что записи относятся к одному и то же элементу. Если нужно чтобы хранилось разное наименование (история его смены), добавь ресурс в регистр Наименование и запоминай его тоже

  

Эльчин

54 — 12.03.13 — 15:03

ОК

Регистры сведений позволяют хранить произвольные данные в разрезе нескольких измерений. Они позволяют получить срез информации (текущее значение показателей) на любой момент времени.

Для регистров сведений связь с регистраторами не всегда обязательна.

Добавление записей в регистр сведений

Программно добавить записи в регистр сведений можно двумя способами:

  • с помощью объекта МенеджерЗаписи;
  • с помощью объекта НаборЗаписей.

Добавление записей с помощью объекта МенеджерЗаписи

Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Таким образом, для того, чтобы в периодический, независимый регистр сведений “КурсыВалют” с измерением “Валюта” и ресурсами “Курс” и “Кратность” добавить одну запись – курс и кратность валюты на определенную дату – можно использовать следующий код:

КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

КурсыВалютМенеджерЗаписи.Период     = ДатаУстановкиКурса; // Дата курса 
КурсыВалютМенеджерЗаписи.Валюта     = Валюта; // СправочникСсылка.Валюты
КурсыВалютМенеджерЗаписи.Курс       = ЗначениеКурсаНаДату; // Устанавливаемый курс
КурсыВалютМенеджерЗаписи.Кратность  = 1; // Кратность

КурсыВалютМенеджерЗаписи.Записать();

Добавление записей в независимый регистр сведений помощью объекта НаборЗаписей

Добавление записей в независимый регистр сведений с помощью НабораЗаписей выполняется по следующему алгоритму:

  1. Создание объекта НабораЗаписи;
  2. Установка отбора по измерениям и периоду (если регистр периодический);
  3. Добавление и заполнение значений полей записи;
  4. Запись набора.

Для примера выполним добавление записей в тот же регистр сведений “КурсыВалют“, предварительно установив отбор по измерению “Валюта” и периоду.

КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта);
КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса);

Запись = КурсыВалютНаборЗаписей.Добавить();
Запись.Период = ДатаУстановкиКурса;
Запись.Валюта = Валюта; // СправочникСсылка.Валюты
Запись.Курс   = ЗначениеКурсаНаДату; // Устанавливаемый курс
Запись.Кратность = 1; // Кратность

КурсыВалютНаборЗаписей.Записать();

Добавление записей в регистр сведений, подчиненный регистратору

Для добавление записей в регистр сведений, подчиненный регистратору, выполняется с помощью объекта НаборЗаписей по следующему алгоритму:

  1. Создание объекта НаборЗаписей;
  2. Установка отбора по определенному регистратору;
  3. Заполнение записей набора;
  4. Запись набора.
// ДанныеДляПроведения - хранит данные для заполнения регистра сведений (например, выгрузка результата запроса)

НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);

ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), ДанныеДляПроведения);

НаборЗаписей.Записать();

Изменение записей в регистре сведений

Изменение записей в независимом регистре сведений

Изменять записи в независимом регистре сведений можно как с помощью МенеджераЗаписи, так и с помощью НабораЗаписей. Изменение записей выполняется по следующему алгоритму:

  1. Создание объекта МенеджерЗаписи или НаборЗаписи;
  2. Установить отборы;
  3. Чтение записей из базы данных, соответствующих наложенному отбору;
  4. Редактирование полученных записей;
  5. Запись измененных записей.

При изменении записей в независимом регистре сведений с помощью объекта МенеджерЗаписи, действуют такие же ограничения как и при добавлении. При изменении записи с помощью менеджера, после чтения значений выполним проверку – есть ли записи для изменения.

КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

КурсыВалютМенеджерЗаписи.Период     = ДатаУстановкиКурса; // Дата курса 
КурсыВалютМенеджерЗаписи.Валюта     = Валюта; // СправочникСсылка.Валюты

КурсыВалютМенеджерЗаписи.Прочитать();

Если КурсыВалютМенеджерЗаписи.Выбран() Тогда
    КурсыВалютМенеджерЗаписи.Курс       = ЗначениеКурсаНаДату; // Устанавливаемый курс
    КурсыВалютМенеджерЗаписи.Кратность  = 1; // Кратность

    КурсыВалютМенеджерЗаписи.Записать();
КонецЕсли;

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

КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта);
КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса);

КурсыВалютНаборЗаписей.Прочитать();

Для Каждого Запись Из КурсыВалютНаборЗаписей Цикл
    Запись.Курс   = ЗначениеКурсаНаДату; // Устанавливаемый курс
    Запись.Кратность = 1; // Кратность
КонецЦикла;

КурсыВалютНаборЗаписей.Записать();

Изменение записей в регистрах сведений подчиненных регистраторам

Изменение записей регистров, подчиненных регистраторам, возможно только с помощью наборов записей. При этом всегда используется отбор по регистратору. Нельзя добавлять или удалять отдельные записи. Можно только считывать и записывать записи по регистратору.

Изменение записей выполняется по следующему алгоритму:

  1. Создать объект НаборЗаписей;
  2. Установить отбор по определенному регистратору;
  3. Прочитать набор;
  4. Изменить записи набора;
  5. Записать набор.
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    МероприятияТрудовойДеятельности.Регистратор КАК Регистратор
    |ИЗ
    |    РегистрСведений.МероприятияТрудовойДеятельности КАК МероприятияТрудовойДеятельности";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    
    Сообщить(СтрШаблон("Изменение записей по регистратору: %1", Выборка.Регистратор));

    НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);

    Для каждого Запись Из НаборЗаписей Цикл
        Запись.ДатаМероприятия = Дата(2021, 12, 12);
    КонецЦикла;

    НаборЗаписей.Записать();

КонецЦикла;

Удаление записи в регистре сведений

Удаление записи из независимого регистра сведений

Для удаления записи из независимого регистра сведений выполняется по следующему алгоритму:

  1. Создать объект НаборЗаписей;
  2. Установить нужные отборы по измерениям и, если регистр периодический, периоду;
  3. Записать набор без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Валюта.Установить(Валюта);
НаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса);

НаборЗаписей.Записать();

Удаление записи из регистра сведений подчиненного регистратору

  1. Создать объект НаборЗаписей;
  2. Установить отбор по определенному регистратору;
  3. Прочитать набор;
  4. Удалить записи из набора (по условию);
  5. Записать набор.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

    Если Запись.Валюта = Валюта Тогда 
        // Предположим, что хотим удалить записи по регистратору
        // с определенной Валютой

        НаборЗаписей.Удалить(Запись);

    КонецЕсли;

КонецЦикла;

НаборЗаписей.Записать();

НаборЗаписей.Записать();

  • АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
  • ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Работа с регистрами сведений в 1С 8.x
  • Как добавить запись в непериодический независимый регистр сведений?
  • Как считать содержимое непериодического независимого регистра сведений «СобственныеКонтрагенты»?
  • Как удалить все записи из независимого регистра сведений?
  • Как удалить записи независимого регистра сведений с отбором по конкретной организации?
  • Как добавить запись в периодический независимый регистр сведений?
  • Как прочитать (изменить) записи в периодическом независимом регистре сведений?
  • Как удалить записи в периодическом независимом регистре сведений?
  • Как в периодическом независимом регистре сведений «КурсыВалют» удалить все записи по валютам с наименованиями «EUR» и «USD», период которых меньше 01 января 2005 года?
  • Как прочитать данные, актуальные на определенную дату, из регистра сведений «Курсы валют» с отбором по нескольким валютам (отбор по измерениям)?
  • Как поменять период у записей периодического независимого регистра, соответствующих ряду условий?
  • Как «сделать периодическим» реквизит уже заполненного справочника?
  • Как добавить записи в регистр сведений, подчиненный регистратору?
  • Как прочитать (изменить) записи в регистре сведений, подчиненном регистратору?
  • Как удалить записи из регистра сведений, подчиненного регистратору?

Как добавить запись в непериодический независимый регистр сведений?

НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); 

НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); 
НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); 

НоваяЗапись = НаборЗаписей.Добавить(); 
НоваяЗапись. Номенклатура = ТекущаяНоменклатура; 
НоваяЗапись.Свойство = ТекущееСвойство; 
НоваяЗапись.Значение = ТекущееЗначение; 

НаборЗаписей.Записать();          
Как считать содержимое непериодического независимого регистра сведений «СобственныеКонтрагенты»?

НаборЗаписей = РегистрыСведений.СобственныеКонтрагенты.СоздатьНаборЗаписей(); 
НаборЗаписей.Прочитать(); 

// Перебрать записи в цикле… 
Для Каждого Запись из НаборЗаписей Цикл 
	РегистрКонтрагент = Запись.Контрагент; 
	РегистрВидСвязи = Запись.ВидСвязи; 
	РегистрОбъект = Запись.Объект; 
КонецЦикла; 

// … или выгрузить записи в таблицу значений. 
ТаблицаЗаписей = НаборЗаписей.Выгрузить(); 


ВЫБРАТЬ 
	* 
ИЗ 
	РегистрыСведений.СобственныеКонтрагенты          
Как удалить все записи из независимого регистра сведений?

НаборЗаписей = РегистрыСведений.ТорговоеОборудование.СоздатьНаборЗаписей(); 
НаборЗаписей.Записать();          
Как удалить записи независимого регистра сведений с отбором по конкретной организации?

НаборЗаписей = РегистрыСведений.ОбъектыСтроительстваОрганизаций.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Организация.Установить(УдаляемаяОрганизация); 
НаборЗаписей.Записать();          
Как добавить запись в периодический независимый регистр сведений?

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 

НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); 
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); 

НовЗапись = НаборЗаписей.Добавить(); 
НовЗапись.Валюта = ТекущаяВалюта; 
НовЗапись.Период = ТекущаяДата; 
НовЗапись.Курс = ТекущийКурс; 
НовЗапись.Кратность = ТекущаяКратность; 

НаборЗаписей.Записать(Истина);          
Как прочитать (изменить) записи в периодическом независимом регистре сведений?

НаборЗаписей = РегистрыСведений.Валюты.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Период.Установить(ДатаЗаписи); 

НаборЗаписей.Прочитать(); 

Для Каждого Запись Из НаборЗаписей Цикл 
	// Чтение и сообщение данных полей записи. 
	Сообщить(Строка(Запись.Период) + " " + Строка(Запись.Валюта) + " " + Строка(Запись.Курс)); 
	// Изменение данных полей записи. 
	Запись.Курс = 0; 
КонецЦикла; 

НаборЗаписей.Записать();          
Как удалить записи в периодическом независимом регистре сведений?

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 
НаборЗаписей.Записать();          
Как в периодическом независимом регистре сведений «КурсыВалют» удалить все записи по валютам с наименованиями «EUR» и «USD», период которых меньше 01 января 2005 года?

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
	|	* 
	|ИЗ 
	|	РегистрСведений.КурсыВалют КАК КурсыВалют 
	|ГДЕ 
	|	(КурсыВалют.Период >= ДАТАВРЕМЯ(2005, 1, 1) 
	|	ИЛИ 
	|	НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""USD"") 
	|	И 
	|	НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""EUR""))"; 


ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить(); 

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 
НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей); 
НаборЗаписей.Записать();          
Как прочитать данные, актуальные на определенную дату, из регистра сведений «Курсы валют» с отбором по нескольким валютам (отбор по измерениям)?

Запрос = Новый Запрос; 
МассивВалют = Новый Массив; 
МассивВалют.Добавить(Валюта1); 
МассивВалют.Добавить(Валюта2); 

Запрос.УстановитьПараметр("МассивВалют", МассивВалют); 
Запрос.УстановитьПараметр("ДатаПолучения", ДатаПолучения); 

Запрос.Текст = " 
	|ВЫБРАТЬ 
	|	ВалютыСрезПоследних.Валюта, 
	|	ВалютыСрезПоследних.Курс 
	|ИЗ 
	|	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаПолучения, Валюта В (&МассивВалют)) КАК ВалютыСрезПоследних"; 

ТаблицаКурсов = Запрос.Выполнить().Выгрузить();          
Как поменять период у записей периодического независимого регистра, соответствующих ряду условий?

Процедура ЗаменаПериода() 

	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ 
	|	ОтветственныеЛицаОрганизации.Период, 
	|	ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница, 
	|	ОтветственныеЛицаОрганизации.ОтветственноеЛицо 
	|ИЗ 
	|	РегистрСведений.ОтветственныеЛицаОрганизации КАК ОтветственныеЛицаОрганизации 
	|ГДЕ 
	|	ОтветственныеЛицаОрганизации.Период <= ДАТАВРЕМЯ(2005, 1, 1) 
	|	И 
	|	ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница.Наименование | ПОДОБНО "Групп-Трейдинг" 
	|	И 
	|	(ОтветственныеЛицаОрганизации.Должность.Наименование ЕСТЬ NULL 
	|		ИЛИ 
	|		НЕ(ОтветственныеЛицаОрганизации.Должность.Наименование | ПОДОБНО "Продавец" 
	|			ИЛИ 
	|			ОтветственныеЛицаОрганизации.Должность.Наименование | ПОДОБНО "Кладовщик"))"; 

	Результат = Запрос.Выполнить(); 
	Выборка = Результат.Выбрать(); 

	Запись = РегистрыСведений.ОтветственныеЛицаОрганизации.СоздатьМенеджерЗаписи(); 

	Пока Выборка.Следующий() Цикл 
		Запись.Период = Выборка.Период; 
		Запись.СтруктурнаяЕдиница = Выборка.СтруктурнаяЕдиница; 
		Запись.ОтветственноеЛицо = Выборка.ОтветственноеЛицо;

		Запись.Прочитать(); 

		Если Запись.Выбран() Тогда 
			Запись.Период = Дата(2004, 1, 1); 
			Запись.Записать(); 
		КонецЕсли; 
	КонецЦикла; 

КонецПроцедуры;           
Как «сделать периодическим» реквизит уже заполненного справочника?

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
	|	&ДатаУстановки КАК Период, 
	|	Проекты.Ссылка КАК Проект, 
	|	Проекты.Ответственный 
	|ИЗ 
	|	Справочник.Проекты КАК Проекты 
	|ГДЕ 
	|	(НЕ(Проекты.ЭтоГруппа)) И (НЕ(Проекты.Ответственный = &Ответственный))"; 

Запрос.УстановитьПараметр("Ответственный", Справочники.Пользователи.ПустаяСсылка()); 
Запрос.УстановитьПараметр("ДатаУстановки", Дата(2000,1,1)); 

ТаблицаРезультат = Запрос.Выполнить().Выгрузить(); 

НаборЗаписей = РегистрыСведений.ЗакреплениеПроектов.СоздатьНаборЗаписей(); 
НаборЗаписей.Загрузить(ТаблицаРезультат); 
НаборЗаписей.Записать();          
Как добавить записи в регистр сведений, подчиненный регистратору?

НаборЗаписей = РегистрыСведений.ЛимитыВозвратнойТары.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор); 
НоваяЗапись = НаборЗаписей.Добавить(); 
НоваяЗапись.Период = ВыбранныйРегистратор.Дата; 
НоваяЗапись.Номенклатура = ВыбраннаяНоменклатура; 
НоваяЗапись.ДоговорКонтрагента = ВыбранныйДоговор; 
НоваяЗапись.ЛимитПоставщика = 50; 
НаборЗаписей.Записать(); 


НаборЗаписей = РегистрыСведений.ЛимитыВозвратнойТары.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор); 
НоваяЗапись = НаборЗаписей.Добавить(); 
НоваяЗапись.Период = ВыбранныйРегистратор.Дата; 
НоваяЗапись.Номенклатура = ВыбраннаяНоменклатура; 
НоваяЗапись.ДоговорКонтрагента = ВыбранныйДоговор; 
НоваяЗапись.ЛимитПокупателю = 25; 
НаборЗаписей.Записать(Ложь);          
Как прочитать (изменить) записи в регистре сведений, подчиненном регистратору?

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор); 
НаборЗаписей.Прочитать(); 
Для Каждого Запись Из НаборЗаписей Цикл 
	// Чтение и сообщение данных полей записи. 
	Сообщить(Строка(Запись.Период) + " " + Строка(Запись.ТипЦен) +" "+ Строка(Запись.Номенклатура) + 
	" " + Строка(Запись.Цена) + " " + Строка(Запись.ПроцентСкидкиНаценки)); 
	// Изменение данных полей записи. 
	Запись.ПроцентСкидкиНаценки = 0; 
КонецЦикла; 
НаборЗаписей.Записать();          
Как удалить записи из регистра сведений, подчиненного регистратору?

Запрос = Новый Запрос; 
Запрос.Текст = " 
	|	ВЫБРАТЬ 
	|	ЦеныНоменклатурыКонтрагентов.Регистратор 
	|ИЗ 
	|	РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК ЦеныНоменклатурыКонтрагентов"; 

Результат = Запрос.Выполнить(); 
Выборка = Результат.Выбрать(); 

НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыКонтрагентов.СоздатьНаборЗаписей(); 
Пока Выборка.Следующий() Цикл 
	НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); 
	НаборЗаписей.Записать(); 
КонецЦикла;          

Задайте вопрос программисту 1С

В статье рассмотрено описание и предназначение регистров сведений, а также примеры работы с регистрами сведений средствами встроенного языка 1С – создание и редактирование наборов записей, отдельных записей, работа с ключом записи.

Содержание

Регистры сведений в 1С 8

Что такое регистр сведений

Регистр сведений – это объект конфигурации, который предназначен для хранения произвольной информации в разрезе нескольких измерений. Например, можно хранить соответствие материально-ответственных лиц и складов, курсы валют или цену на товары. Можно представить регистр сведений как многомерную таблицу, где на каждом пересечении измерений хранятся значения, которые называются Ресурсы.

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

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

Периодические регистры сведений позволяют получить информацию о срезе наиболее ранних или наиболее поздних записей.

Строки в многомерной таблице регистра сведений называются записями. Уникальность записей регистра сведений определяется как комбинация измерений и периода. В случае, если регистр сведений не периодический, то период будет не заполнен, и уникальные записи будут отличаться по комбинации измерений. Платформа не допускает создания двух записей с одинаковым набором измерений и периодом. Измерения и период образуют т.н. составной ключ, и называются ключевыми полями.

Записи в регистр сведений могут вноситься как вручную, независимо одна от другой, так и при помощи документов, единым набором. Документ, которым вносится запись в регистр сведений, называется регистратором.

Свойства регистра сведений. Основные настройки

Основные свойства регистра сведений, уникальные только для этого объекта метаданных – это Периодичность и Режим записи. Рассмотрим создание и настройку регистра сведений на примере хранения тарифов работников.

Периодичность регистра сведений

Данное свойство отвечает за доступность стандартного реквизита Период. Периодичность может быть

  • В пределах секунды
  • В пределах дня
  • В пределах месяца
  • В пределах квартала
  • В пределах года

В случае, если регистр сведений подчинен регистратору (см. ниже), становится доступным еще один вариант периода – по позиции регистратора.

Поле Период входит в составной ключ записи; можно добавлять записи с одинаковым составом измерений, но с разным периодом. Если периодичность – по позиции регистратора, то дата документа может совпадать с точностью до секунды – все равно это будут разные записи, т.к. в этом случае позиция регистратора будет определяться как момент времени (Дата + ссылка на документ). В зависимости от выбранной периодичности, период записи будет автоматически приводиться к началу периода в свойстве Периодичность. Например, если указана периодичность “В пределах дня”, то к началу суток, если “В пределах месяца” – то соответственно к первому числу месяца, и т.д.

Режим записи регистра сведений 1С

Режим записи определяет, можно ли редактировать записи регистра сведений вручную, или они будут вноситься движениями документа-регистратора. Для регистров сведений с режимом записи “Независимый” можно указывать основной отбор для измерений. В случае, если при этом регистр сведений периодический, становится возможным указание флажка Основной отбор по периоду.

Что такое ведущее измерение и основной отбор?

Флаг Ведущее у измерения регистра сведений означает, то данная запись имеет смысл пока существует объект, ссылка на который хранится в данном измерении. Например, если удалить из базы данных сотрудника “Иванов Иван”, то автоматически из регистра сведений будут удалены все записи по тарифам, где в измерении “Сотрудник” был указан Иванов Иван. Если данный флаг не установлен, то при удалении объекта, записи остались бы в регистре с битой ссылкой на него.

Также свойство “Ведущее” у измерения отвечает за построение пользовательского интерфейса. В карточке объекта, который является ведущим измерением, появляется гиперссылка для быстрого перехода к регистру сведений с отбором по текущему объекту.

Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду включает основной отбор для период для периодических регистров.

Проектирование структуры регистра сведений

Следует стараться избегать архитектурных решений, когда значение одного ресурса регистра сведений меняется значительно чаще чем значение другого. В этом случае целесообразно выделить такие ресурсы в отдельный регистр сведений. Это связано с тем, что в момент записи записываются все ресурсы, а не только измененный, что приводит к неоправданной нагрузке на СУБД.

Получение данных из нескольких ресурсов одного регистра сведений выполняется быстрее, чем получение одного ресурса из нескольких регистров

Следует внимательно отнестись к вопросу – какие поля многомерной таблицы должны быть измерениями, а какие – ресурсами. В зависимости от прикладной задачи, подход может быть различным.

Например, мы хотим знать, какие материально ответственные лица закреплены за тем или иным складским помещением. Если таких МОЛ более одного человека, то правильная архитектура регистра будет такая:

Измерения: МОЛ
Ресурсы: Склад

Если же нам требуется гарантировать, что у одного склада может быть только одно материально ответственное лицо, то состав регистра сведений будет следующий:

Измерения: Склад
Ресурсы: МОЛ

Примеры работы с регистрами сведений в 1С

Программная запись в регистр сведений 1С

Программно добавить записи в независимый регистр сведений можно двумя способами: при помощи менеджера записи, и при помощи набора записей.

//Использование менеджера записи регистра сведений
НоваяЗапись = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
//Сотрудник - это переменная, реквизит формы, параметр и т.п. с типом СправочникСсылка.Сотрудники
НоваяЗапись.Сотрудник = Сотрудник;
НоваяЗапись.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
НоваяЗапись.Тариф = 1500;
НоваяЗапись.Записать();

//Использование набора записей
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьНабора.Тариф = 1500;

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Тариф = 6000;

НаборЗаписей.Записать();

Следует иметь в виду, что если не установить отбор для набора записей, при записи такого набора будет заменен весь регистр сведений!

Набор записей регистра сведений

Общий порядок добавления новых записей в регистр сведений:

  1. Создать набор записей
  2. Установить у него отбор по тем измерениям и периоду (если регистр периодический), по которым нужно добавить новые записи
  3. Добавить в набор необходимое количество новых записей
  4. Записать набор записей

Рассмотрим на примерах работу с набором записей средствами языка 1С

// работа с набором записей
	
//создание набора записей
НаборТарифы = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
 
//количество записей набора
Колво = НаборТарифы.Количество(); //0
 
//чтение набора записей из базы
//если не вызвать метод Прочитать и не добавить записи, то запишется пустой набор записей!
НаборТарифы.Прочитать();
Колво = НаборТарифы.Количество(); //вернет количество записей в наборе
 
//добавление записей
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Период = ТекущаяДата();
ЗаписьНабора.Тариф = 6000;
 
//выгрузка в таблицу значений
ТаблицаТарифов = НаборТарифы.Выгрузить();
 
//удаление всех записей набора
НаборТарифы.Очистить();
 
//загрузка из таблицы значений
НаборТарифы.Загрузить(ТаблицаТарифов);
 
//удаление первой записи набора
НаборТарифы.Удалить(0);
 
//выгрузка одной колонки в массив
МассивТоваров = НаборТарифы.ВыгрузитьКолонку("Сотрудник");

//загружаем обратно
НаборТарифы.ЗагрузитьКолонку(МассивТоваров, "Сотрудник");
 
//сумма всех значений ресурса, если его тип содержит тип Число
Итог = НаборТарифы.Итог("СуммаТарифа");
 
//запись набора
НаборТарифы.Записать();

Изменение записей регистра сведений

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

Изменим, например, все часовые оклады, добавив 10%.

//Изменение записей регистра сведений
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
	//Добавим 10%
	ЗаписьНабора.Тариф = ЗаписьНабора.Тариф*1.1;
КонецЦикла;
НаборЗаписей.Записать();

Удаление записей регистра сведений

//Удаление записей из регистра сведений

//1. Удалить записи с определенным отбором
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.ПоДням);
НаборЗаписей.Отбор.Период.Установить(ДатаФильтра);
//Запишем пустой набор записей
НаборЗаписей.Записать();

//2. Очистить регистр сведений программно
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
//Все записи регистра сведений будут удалены

//3. Выборочное удаление записей по какому-нибудь условию
//Здесь рассмотрим пример обработки записей с учетом значения реквизитов
//Наложить отбор непосредственно на реквизиты нельзя, поэтому следует использовать другой способ
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
МассивЗаписейКУдалению = Новый Массив;
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
	Если ЗаписьНабора.Примечание = "Служебная запись" Тогда
		МассивЗаписейКУдалению.Добавить(ЗаписьНабора);
	КонецЕсли;
КонецЦикла;
//Вторым циклом удалим ненужные записи из набора регистра сведений
Для Каждого ЗаписьКУдалению Из МассивЗаписейКУдалению Цикл
	НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;
НаборЗаписей.Записать();

Менеджер записи регистра сведений

//Создание при помощи менеджера записи регистра сведений
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Записать();

//Изменение записи через менеджер записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Прочитать();

Если ЗаписьМенеджер.Выбран() Тогда
	ЗаписьМенеджер.Тариф = 7000;
	ЗаписьМенеджер.Записать();
КонецЕсли;

//Удаление при помощи менеджера записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Удалить();

Ключ записи регистра сведений

// создать ключ записи
//пустой ключ	
ПустойКлюч = Новый("РегистрСведенийКлючЗаписи.ТарифыРаботников");
//используя менеджер
ПустойКлюч = РегистрыСведений.ТарифыРаботников.ПустойКлюч();
 
//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Период", Дата(2021,01,31));
ЗначенияКлюча.Вставить("Сотрудник", СсылкаНаСотрудника);
ЗначенияКлюча.Вставить("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
КлючЗаписи = РегистрыСведений.ТарифыРаботников.СоздатьКлючЗаписи(ЗначенияКлюча);

Изменение записей в регистр сведений с подчинением регистратору

Рассмотрим пример. Допустим, у нас есть документ “Назначение материально ответственных лиц”, в котором мы в табличной части указываем склад и соответствующее ему МОЛ. Этот документ записывает движения в регистр сведений МОЛПоСкладам, со следующими настройками:

  • Измерения: Склад, тип СправочникСсылка.Склады
  • Ресурсы: МОЛ, тип СправочникСсылка.Сотрудники
  • Реквизиты: Примечание, тип Строка(100)
  • Периодичность: в пределах месяца
  • Режим записи: Подчинение регистратору

Для изменения записей регистра сведений, подчиненного регистратору, нужно иметь ссылку на документ-регистратор. После этого необходимо получить движения объекта по этой ссылке, по нужному регистру. Далее мы получаем набор записей, и работа с ним аналогична работе при использовании метода СоздатьНаборЗаписей. Для того чтобы изменить движения документа, также следует вызвать метод Прочитать. Второй вариант – заново добавить нужные записи в движения, в этом случае новый набор полностью заменит старый.

ОбъектРегистратор = СсылкаНаДокумент.ПолучитьОбъект();
ДвиженияПоРегистру =ОбъектРегистратор.Движения.МОЛПоСкладам;
ДвиженияПоРегистру.Прочитать();
Для Каждого ЗаписьДокумента Из ДвиженияПоРегистру Цикл
	ЗаписьДокумента.Примечание = "Запись обработана программно";
КонецЦикла;
ДвиженияПоРегистру.Записать();

Примеры работы с периодическим регистром сведений

Периодический регистр сведений позволяет получать данные о самых первых и самых последних записях. Для этого платформа предусматривает две виртуальные таблицы – СрезПервых и СрезПоследних. В определенных случаях можно включить итоги для среза первых и/или последних. Это может многократно ускорить получение данных, так как при этом будут созданы физические таблицы, откуда данные будут извлекаться гораздо быстрее, чем из виртуальных.

Для работы с виртуальными таблицами периодического регистра сведений можно использовать два подхода – объектные методы и язык запросов. Рассмотрим каждый из этих способов. Для наглядности срез первых мы получим при помощи объектной техники, а срез последних – при помощи запроса.

Получить самые ранние записи (Срез первых)

Получим самые ранние записи тарифов с видом тарифа “ПоДням”

//Как получить самые первые записи
Отбор = Новый Структура("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
СрезПервых = РегистрыСведений.ТарифыРаботников.СрезПервых(ДатаСреза, Отбор);
//Получим таблицу значений со структурой колонок, аналогичной структуре регистра сведений
//В результат попадут наиболее ранние записи регистра, соответствующие установленным значениям ключевых полей.
//Записи подбираются для каждой комбинации из всех имеющихся значений измерений регистра.
//При этом, если есть записи с датой реньше, чем начало периода, они учитываться не будут.
Для Каждого СтрСреза Из СрезПервых Цикл
	Сообщить(СтрШаблон("Самый ранний тариф по дням для сотрудника %1: %2", СтрСреза.Сотрудник, СтрСреза.Тариф)); 
КонецЦикла;

Получить самые поздние записи (Срез последних)

//Как получить последние записи регистра сведений на дату
//В случае работы с запросом, можно накладывать более сложные фильтры, и извлекать только необходимые данные,
// например, только сотрудника и тариф, без лишних полей
ЗапросПоследних = Новый Запрос("ВЫБРАТЬ
|	ПРЕДСТАВЛЕНИЕ(ТекущиеТарифы.Сотрудник) КАК Сотрудник,
|	ТекущиеТарифы.Тариф КАК Тариф
|ИЗ
|	РегистрСведений.ТарифыРаботников.СрезПоследних(&ДатаСреза, ВидТарифа = ЗНАЧЕНИЕ(Перечисление.ВидыТарифов.Почасовой)) КАК ТекущиеТарифы");
ЗапросПоследних.УстановитьПараметр(ДатаСреза, ДатаСреза);
Выборка = ЗапросПоследних.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(СтрШаблон("Текущий почасовой тариф для сотрудника %1: %2", Выборка.Сотрудник, Выборка.Тариф)); 
КонецЦикла;

На чтение 7 мин Просмотров 17.7к. Опубликовано 12.10.2017

Регистры сведений в 1С предназначены для хранения произвольных данных в разрезе нескольких измерений и, при необходимости, в разрезе времени. Рассмотрим подробнее работу с этим прикладным объектом.

  • Предназначение регистра сведений
  • Добавление записей
  • Изменение записей
  • Чтение записей
  • Удаление записей
  • Очистка регистра сведений

Содержание

  1. Предназначение регистра сведений
  2. Добавление записей
  3. Изменение записей
  4. Чтение записей
  5. Удаление записей
  6. Очистка регистра сведений

Предназначение регистра сведений

Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.

При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:

Периодичность регистра сведений

Регистры сведений, для которых указана периодичность, называются периодическими.

Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:

Режим записи регистра сведений

Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:

  • измерения — описывают разрезы, в которых хранится информация;
  • период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
  • регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
  • ресурсы — непосредственно хранят информацию для комбинации измерений;
  • реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.

Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).

Добавление записей

Программно добавить записи в регистр сведений можно при помощи:

  • объекта НаборЗаписей;
  • объекта МенеджерЗаписи.

Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи использует объект НаборЗаписей.

Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:

  1. создание объекта НаборЗаписей;
  2. наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
  3. добавление и заполнение значений полей записей;
  4. запись набора записей.

// Добавление записи в независимый непериодический регистр сведений
НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); // Этап 1
НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); // Этап 2
// Этап 3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяПодсистемы = ИмяПодсистемы;
НоваяЗапись.Версия = НомерВерсии;
НаборЗаписей.Записать(); // Этап 4

// Добавление записи в независимый периодический регистр сведений
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
// Этап3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Валюта = Доллар;
НоваяЗапись.Курс = 57.92;
НоваяЗапись.Кратность = 1;
НаборЗаписей.Записать(); // Этап 4

Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи выглядит так:

  1. создание объекта МенеджерЗаписи;
  2. заполнение значений полей записи;
  3. запись записи.

// Добавление записи в независимый непериодический регистр сведений
Запись = РегистрыСведений.ВерсииПодсистем.СоздатьМенеджерЗаписи(); // Этап 1

// Этап 2
Запись.ИмяПодсистемы = ИмяПодсистемы;
Запись.Версия = НомерВерсии;

Запись.Записать(); // Этап 3

// Добавление записи в независимый периодический регистр сведений
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1

// Этап 2
Запись.Период = ТекущаяДата();
Запись.Валюта = Доллар;
Запись.Курс = 57.92;
Запись.Кратность = 1;

Запись.Записать(); // Этап 3

Изменение записей

Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи. Ограничения объекта МенеджерЗаписи были описаны в разделе Добавление записей.

Общая схема редактирования записей регистров сведений:

  1. создание объекта НаборЗаписей или МенеджерЗаписи;
  2. наложение отборов;
  3. чтение записей базы данных, соответствующих наложенным отборам;
  4. редактирование прочитанных записей;
  5. запись отредактированных записей.

// Редактирование записей с использованием объекта НаборЗаписей
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Период.Установить(ДатаКурса);
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Прочитать(); // Этап 3
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Курс = 57.84; // Этап 4
КонецЦикла;
НаборЗаписей.Записать(); // Этап 5

// Редактирование записей с использованием объекта МенеджерЗаписи
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1
// Этап 2
Запись.Период = ДатаКурса;
Запись.Валюта = Доллар;
Запись.Прочитать(); // Этап 3
Если Запись.Выбран() Тогда // Проверка, что запись существует
Запись.Курс = 57.92; // Этап 4
Запись.Записать(); // Этап 5
КонецЕсли;

Чтение записей

Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.

Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют»;

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;

Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.

// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПоследних.Период,
| КурсыВалютСрезПоследних.Валюта,
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних»;

Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;

// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых»;

Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;

Кроме чтения запросом возможно использование методов объектной модели.

Для непериодических регистров сведений:

  • Выбрать(<Отбор>, <Порядок>) — выбирает записи с указанным отбором;
  • ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
  • Получить(<Отбор>) — получает ресурсы записи с отбором по всем измерениям.

Для периодических регистров сведений:

  • Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>) — выбирает записи с указанным отбором, у которых период находится между <НачалоИнтервала> и <КонецИнтервала>;
  • ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
  • Получить(<Период>, <Отбор>) — получает ресурсы записи с отбором по всем измерениям и периоду;
  • ПолучитьПервое(<НачалоПериода>, <Отбор>) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
  • ПолучитьПоследнее(<КонецПериода>, <Отбор>) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
  • СрезПервых(<НачалоПериода>, <Отбор>) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
  • СрезПоследних(<КонецПериода>, <Отбор>) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.

Удаление записей

Для удаления записи(записей) в независимом регистре сведений необходимо:

  1. создать набор записей;
  2. наложить требуемые отборы на измерения и период (если регистр периодический);
  3. записать набор записей без предварительного чтения.

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));

НаборЗаписей.Записать();

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

  1. создать набор записей;
  2. наложить отбор на регистратора;
  3. записать набор записей без предварительного чтения.

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор);
НаборЗаписей.Записать();

Очистка регистра сведений

Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();

Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:

  1. получить перечень ссылок всех регистраторов регистра сведений;
  2. последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.

Запрос = Новый Запрос(«ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры»);

Выборка = Запрос.Выполнить().Выбрать();

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Записать();

Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.

При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:

Регистры сведений, для которых указана периодичность, называются периодическими.

Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:

Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:

  • измерения — описывают разрезы, в которых хранится информация;
  • период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
  • регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
  • ресурсы — непосредственно хранят информацию для комбинации измерений;
  • реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.

Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).

Добавление записей

Программно добавить записи в регистр сведений можно при помощи:

  • объекта НаборЗаписей;
  • объекта МенеджерЗаписи.

Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи использует объект НаборЗаписей.

Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:

  • создание объекта НаборЗаписей;
  • наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
  • добавление и заполнение значений полей записей;
  • запись набора записей.
// Добавление записи в независимый непериодический регистр сведений
НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); // Этап 1
НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); // Этап 2
// Этап 3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяПодсистемы = ИмяПодсистемы;
НоваяЗапись.Версия = НомерВерсии;
НаборЗаписей.Записать(); // Этап 4
// Добавление записи в независимый периодический регистр сведений
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
// Этап3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Валюта = Доллар;
НоваяЗапись.Курс = 57.92;
НоваяЗапись.Кратность = 1;
НаборЗаписей.Записать(); // Этап 4

Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи выглядит так:

  • создание объекта МенеджерЗаписи;
  • заполнение значений полей записи;
  • запись записи.
// Добавление записи в независимый непериодический регистр сведений
Запись = РегистрыСведений.ВерсииПодсистем.СоздатьМенеджерЗаписи(); // Этап 1
// Этап 2
Запись.ИмяПодсистемы = ИмяПодсистемы;
Запись.Версия = НомерВерсии;
Запись.Записать(); // Этап 3
// Добавление записи в независимый периодический регистр сведений
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1
// Этап 2
Запись.Период = ТекущаяДата();
Запись.Валюта = Доллар;
Запись.Курс = 57.92;
Запись.Кратность = 1;
Запись.Записать(); // Этап 3

Изменение записей

Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи. Ограничения объекта МенеджерЗаписи были описаны выше.

Общая схема редактирования записей регистров сведений:

  • создание объекта НаборЗаписей или МенеджерЗаписи;
  • наложение отборов;
  • чтение записей базы данных, соответствующих наложенным отборам;
  • редактирование прочитанных записей;
  • запись отредактированных записей.
// Редактирование записей с использованием объекта НаборЗаписей
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Период.Установить(ДатаКурса);
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Прочитать(); // Этап 3
Для Каждого Запись Из НаборЗаписей Цикл 
     Запись.Курс = 57.84; // Этап 4
КонецЦикла;
НаборЗаписей.Записать(); // Этап 5
// Редактирование записей с использованием объекта МенеджерЗаписи
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1
// Этап 2
Запись.Период = ДатаКурса;
Запись.Валюта = Доллар;
Запись.Прочитать(); // Этап 3
Если Запись.Выбран() Тогда // Проверка, что запись существует
    Запись.Курс = 57.92; // Этап 4
    Запись.Записать(); // Этап 5
КонецЕсли;

Чтение записей

Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |  КурсыВалют.Период,
    |  КурсыВалют.Валюта,
    |  КурсыВалют.Курс
    |ИЗ
    |  РегистрСведений.КурсыВалют КАК КурсыВалют";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // обход результата выполнения запроса
КонецЦикла;

Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.

// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта»
// и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |  КурсыВалютСрезПоследних.Период,
    |  КурсыВалютСрезПоследних.Валюта,
    |  КурсыВалютСрезПоследних.Курс
    |ИЗ
    |  РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних";

Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта);
Запрос.УстановитьПараметр("Период", ВыбраннаяДата);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // обход результата выполнения запроса
КонецЦикла;
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта»
// и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |  КурсыВалютСрезПервых.Период,
    |  КурсыВалютСрезПервых.Валюта,
    |  КурсыВалютСрезПервых.Курс
    |ИЗ
    |  РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых";

Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта);
Запрос.УстановитьПараметр("Период", ВыбраннаяДата);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // обход результата выполнения запроса
КонецЦикла;

Кроме чтения запросом возможно использование методов объектной модели.

Для непериодических регистров сведений:

  • Выбрать(Отбор, Порядок) — выбирает записи с указанным отбором;
  • ВыбратьПоРегистратору(Регистратор) — выбирает все записи указанного регистратора;
  • Получить(Отбор) — получает ресурсы записи с отбором по всем измерениям.

Для периодических регистров сведений:

  • Выбрать(НачалоИнтервала, КонецИнтервала, Отбор, Порядок) — выбирает записи с указанным отбором, у которых период находится между НачалоИнтервала и КонецИнтервала;
  • ВыбратьПоРегистратору(Регистратор) — выбирает все записи указанного регистратора;
  • Получить(Период, Отбор) — получает ресурсы записи с отбором по всем измерениям и периоду;
  • ПолучитьПервое(НачалоПериода, Отбор) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
  • ПолучитьПоследнее(КонецПериода, Отбор) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
  • СрезПервых(НачалоПериода, Отбор) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
  • СрезПоследних(КонецПериода, Отбор) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.

Удаление записей

Для удаления записи (записей) в независимом регистре сведений необходимо:

  • создать набор записей;
  • наложить требуемые отборы на измерения и период (если регистр периодический);
  • записать набор записей без предварительного чтения.
  • НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    
    НаборЗаписей.Отбор.Валюта.Установить(Доллар);
    НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
    
    НаборЗаписей.Записать();

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

    • создать набор записей;
    • наложить отбор на регистратора;
    • записать набор записей без предварительного чтения.
    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор);
    НаборЗаписей.Записать();

    Очистка регистра сведений

    Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:

    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 
    НаборЗаписей.Записать();

    Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:

    • получить перечень ссылок всех регистраторов регистра сведений;
    • последовательно записать пустой набор записей с отбором по регистраторам из первого пункта.
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        | ЦеныНоменклатуры.Регистратор
        |ИЗ
        | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры"
    );
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    Пока Выборка.Следующий() Цикл 
         НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
         НаборЗаписей.Записать();
    КонецЦикла;

    Понравилась статья? Поделить с друзьями:
  • Как ограбить нелегальный бизнес доктора в валентайне
  • Как жилинспекция может наказать управляющую компанию
  • Как оплатить в приложении газпромбанка по реквизитам
  • Как заблокировать бизнес аккаунт в ватсапе на айфоне
  • Как оплатить выставленный счет через тинькофф бизнес