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

  Маркет42 - Место для твоих разработок  

Подскажите как обратится к реквизиту регистра сведений при изменении (+)

Я
   BigShmax

07.11.11 — 18:00

есть периодический Регистр сведений.

нужно обработать Реквизит2 при изменении Реквизит1

Процедура РегистрСведенийСписокРеквизит1ПриИзменении(Элемент)

   // тут надо записать в Реквизит два свое значение.

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

в «Элемент»  хранится Реквизит который  изменяем, как обратится к другим?

  

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

   Elf_80_lvl

1 — 07.11.11 — 18:10

Никак

   Elf_80_lvl

2 — 07.11.11 — 18:12

Наверное нужно обрабатывать событие изменения строки а не одного реквизита.

   Натажко

3 — 07.11.11 — 18:12

ТекДанные = РегистрСведенийСписок.ТекущиеДанные;

Если ТекДанные <> Неопределено Тогда

 ТекДанные.Реквизит2 = «тратата»;

КонецЕсли

   BigShmax

4 — 07.11.11 — 18:12

да ладно

   BigShmax

5 — 07.11.11 — 18:18

(3)

{РегистрСведений.МойРегистрСведений.Форма.ФормаСписка.Форма(4)}: Поле объекта не обнаружено (ТекущиеДанные)

   ТекДанные = РегистрСведенийСписок.ТекущиеДанные;

   Elf_80_lvl

6 — 07.11.11 — 18:19

(3) (5) Работает если использовать событие РегистрСведенийСписокПередОкончаниемРедактирования

   BigShmax

7 — 07.11.11 — 18:27

(6)   возможно оно мне подойдет — не могу найти  куда это событие прписать :-(

   BigShmax

8 — 07.11.11 — 18:30

событие нашел — ща попробую заюзать

   BigShmax

9 — 07.11.11 — 18:31

та же ошибка

   Натажко

10 — 07.11.11 — 19:06

(9) мои пардония, не то написала %)

ТекДанные = ЭлементыФормы.РегистрСведенийСписок.ТекущиеДанные;

   BigShmax

11 — 08.11.11 — 13:16

(10)  респект и уважуха — работает

   Не Печенкин

12 — 08.11.11 — 13:19

событие ПриЗаписи модуля набора записей регистра сведений не прдлагать?

   BigShmax

13 — 08.11.11 — 13:31

а у мну  все  как в (3) + (10)  работает

  

Не Печенкин

14 — 08.11.11 — 13:35

(13) отлично, только если не из этой формы оно меняется, то?

Быстрый старт в Python для 1С Разработчиков | 1s-to-python.ru

CJS

49 / 49 / 8

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

Сообщений: 380

1

Получить доступ к значению Регистра Сведений из формы Документа

30.09.2012, 21:11. Показов 22889. Ответов 19

Метки нет (Все метки)


Привет всем.
Я совсем начинающий.

Искал и в гугле и здесь на форуме и на форуме 1С , но путного ничего не могу найти. Справка непонятно объясняет, по крайней мере для начинающего.

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

1C
1
СтрокаТабличнойЧасти=Элементы.Приход.ТекущиеДанные;

, где Приход это табличная часть в ПриходнаяНакладная.

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

Задача сделать чтоб вот так:

1C
1
СтрокаТабличнойЧасти.Цена = РегистрыСведений.ЦеныНоменклатуры.Цена

Подскажите, пожалуйста, где можно прочесть об этом.

Ну там еще дальше будет проблема чтобы выбрать правильную цену (там 3 поля: Цена, ОптРозница, Металлопрокат …… и всего 9 разновидностей цен , а надо одну выбрать), но то уже буду пробовать и может получится, когда дойду до этого.

Заранее благодарен за внимание.



0



900 / 877 / 8

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

Сообщений: 2,680

30.09.2012, 21:19

2

Вашу задачу можно решить с помощью запроса.
Регистр сведений периодический?



0



49 / 49 / 8

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

Сообщений: 380

30.09.2012, 21:25

 [ТС]

3

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

Регистр сведений периодический?

Да да , периодический. А как именно запросом решить?



0



2954 / 1766 / 82

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

Сообщений: 8,280

01.10.2012, 09:55

4

Загляните в регистр и посмотрите, каким образом на одну номенклатурину хранится 9 значений цен. Очевидно, присутствует ещё одно измерение. А может, и не одно



1



CJS

49 / 49 / 8

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

Сообщений: 380

01.10.2012, 11:05

 [ТС]

5

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

Загляните в регистр и посмотрите, каким образом на одну номенклатурину хранится 9 значений цен. Очевидно, присутствует ещё одно измерение. А может, и не одно

Вообще это учебная конфигурация.
Там получается 2 измерения, по 3 значения в каждом:
1-ое Ищмерение — ТМЦ , хранит в себе вид металлопроката, имеет 3 значения: двутавр, уголок,труба.
2-ое измерение — ВидЦены, хранит вид цены : приходная, оптовая , розничная.

Задача: когда в документе я изменяю ТМЦ , то в колонку документа Цена должно подставляться значение из РегистраСведений (в моем РегистреСведений это ресурс Цена).
Только нужно не любую цену (их 9 штук — по 3 для каждого вида ТМЦ) , а ту, которая соответствует ТМЦ которое я выбрал в документе(ПриходнаяНакладная). Ну и также это должна быть цена которая в измерении ВидЦены указана как «приходная».

Пробовал я по примерам сделать выборку, запрос к БД , но что-то не получается у меня. Но не суть в этом. Решил по другому поступить:

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

Я так понимаю после этого переменная НаборЗаписей содержит все 9 строк моего РегистаСведений. И как мне кажется нужно эти записи перебирать одну за другой и искать где одновременно нужные мне значения в двух измерениях регистра.

Но как перебирать?как сравнивать? как потом обратиться к отобранной записи … Может у кого-то есть примерчик небольшой?



0



Fenomen

900 / 877 / 8

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

Сообщений: 2,680

01.10.2012, 12:06

6

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Запрос = Новый Запрос;
Запрос.Текст = "
Выбрать ЦеныНоменклатуры.Цена
ИЗ РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,Номенклатура = &Номенклатура И ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры";
ЗАпрос.УстановитьПараметр("Дата",ДатаНаКоторуюНужноПолучитьЦену);
ЗАпрос.УстановитьПараметр("Номенклатура", ВашаНоменклатура);
ЗАпрос.УстановитьПараметр("ВидЦены", ВашВидЦен);
 
Цена = 0;
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
   Выборка = Результат.Выбрать();
   Выборка.Следующий();
   Цена = Выборка.Цена;
КонецЕсли;



1



duk337

2954 / 1766 / 82

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

Сообщений: 8,280

01.10.2012, 12:08

7

Этот текст (примерный) Вам говорит о чём-нибудь?

1C
1
ВЫБРАТЬ Цена ИЗ РегистрСведений.Цены(&Дата) Где ВидЦены=&ХочуТакойВидЦены И ТМЦ=&Номенклатурина



0



CJS

49 / 49 / 8

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

Сообщений: 380

01.10.2012, 12:27

 [ТС]

8

Fenomen, спасибо большое! сейчас буду разбираться

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

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

Этот текст (примерный) Вам говорит о чём-нибудь?

1C
1
ВЫБРАТЬ Цена ИЗ РегистрСведений.Цены(&Дата) Где ВидЦены=&ХочуТакойВидЦены И ТМЦ=&Номенклатурина

Ну это очень похоже на SQL. но проблемней, потому-что более тяжело обратиться к нужному объекту , чтобы выбрать из него.
(&Дата) для чего в этом месте , я не понял. А также для чего значек & я тоже покамисть не понимаю.
Ну в конце условие отбора. Но обратно таки непонятно зачем & , и не понятно как после равно указывать &ХочуТакойВидЦены , ведь мне нужно указать «приходная» , а указывается по разному — бывает в одинарных кавычках или двойных … а может еще предварять каким оператором нужно. например & . А если нужно сравнивать со значением из другого реквизита, то тут думаю прямо нужно указать через точку путь к этому реквизиту(хотя вот тут проблемы с указанием пути, тут посложнее чем в Делфи).

Короче знания на нуле — работать и работать.



0



2954 / 1766 / 82

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

Сообщений: 8,280

01.10.2012, 12:39

9

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

Ну это очень похоже на SQL

Он и есть. & — подстановка значения параметра. Fenomen — спасибо ему — расписал всё подробно (я просто нажал кнопку до его реплики).

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

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

с указанием пути, тут посложнее чем в Делфи

Проще. Есть функция запроса ЗНАЧЕНИЕ

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



1



900 / 877 / 8

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

Сообщений: 2,680

01.10.2012, 12:41

10

СрезПоследних — Это виртуальная таблица регистра. Она возвращает цены на определенную дату.
Знаком & отмечаются параметры запроса. Они должны быть установлены методом УстановитьПараметр запроса.

Добавлено через 59 секунд

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

Где ВидЦены=&ХочуТакойВидЦены И ТМЦ=&Номенклатурина

Это неправильно. Фильтр должен быть в параметрах виртуальной таблицы СрезПоследних. См. мой текст запроса.

Добавлено через 28 секунд

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

и не понятно как после равно указывать &ХочуТакойВидЦены , ведь мне нужно указать «приходная» , а указывается по разному — бывает в одинарных кавычках или двойных …

ВидЦены — какого типа?



1



CJS

49 / 49 / 8

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

Сообщений: 380

01.10.2012, 13:16

 [ТС]

11

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

ВидЦены — какого типа?

Совсем замотался! у меня же это в объекте Перечисления который называется ВидыЦен. Там у меня 3 значения : Оптовая, Розничная, Приходная. Значит мне нужно вот так:

1C
1
ЗАпрос.УстановитьПараметр("ВидЦены", Перечисление.ВидыЦен.Значения.Приходная);

И вроде не ругается пока мисть на это. Но может заругается когда остальное исправлю.

Вот как у меня получилось когда я у себя в ФормеДокумента это прописал (должно работать так: я в документе установил какое мне нужно ТМЦ, а оно автоматически поставило цену взятую из РЕгистра Сведений) :

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
&НаКлиенте
Процедура ПриходТМЦПриИзменении(Элемент)
 
//здесь строка Документа, в которой есть столбец Цена ... вот его мне и надо из РегистраСведений 
//изменить
СтрокаТабличнойЧасти=Элементы.Приход.ТекущиеДанные;
 
Запрос = Новый Запрос; // здесь указывает на ошибку: "Тип не определен(Запрос)"
Запрос.Текст = " Выбрать 
|ЦеныНоменклатуры.Цена
|ИЗ РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,ТМЦ = &ТМЦ И ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры";
 
ЗАпрос.УстановитьПараметр("Дата",СтрокаТабличнойЧасти.Дата);   
ЗАпрос.УстановитьПараметр("ТМЦ",СтрокаТабличнойЧасти.ТМЦ);//установленное ТМЦ 
ЗАпрос.УстановитьПараметр("ВидЦены", Перечисление.ВидыЦен.Значения.Приходная);
 
СтрокаТабличнойЧасти.Цена = 0; //Зачем вводить эту переменную и обнулять?
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
   Выборка = Результат.Выбрать();
   Выборка.Следующий();
СтрокаТабличнойЧасти.Цена = Выборка.Цена; // то,что мне нужно здесь присваивается?
КонецЕсли;
 
КонецПроцедуры

Добавлено через 1 минуту
и вот такую ошибку выдает(почему-то 2 раза ее дублирует):

{Документ.ПриходнаяНакладная.Форма.ФормаДокумента1 .Форма(25,16)}: Тип не определен (Запрос)
Запрос = Новый <<?>>Запрос; (Проверка: Тонкий клиент)
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента1 .Форма(25,16)}: Тип не определен (Запрос)
Запрос = Новый <<?>>Запрос; (Проверка: Тонкий клиент)

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

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

Проще. Есть функция запроса ЗНАЧЕНИЕ
Добавлено через 1 минуту
Только к переменной Вы так не обратитесь. Только к значениям объектов метаданных, которые заданы в конфигураторе.

А Вы не подскажете где можно почитать про то, как обращаться к интересующему значению, интересующего объекта? Может где-то есть это в систематизированном виде? А то у меня такое впечатление слаживается. что к каждому объекту нужно по своему обращаться … много ньюансов как-то …

В Делфи там просто — есть форма Form1,на ней разные объекты, например Button1. Вот берется и пишется Form1.Button1.ТребуемоеСвойство … и так к любому объету … ну тут же не тут то было …. тут как-то запутаннее , более сложнее.



0



Модератор

Эксперт 1С

3708 / 2905 / 572

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

Сообщений: 11,442

Записей в блоге: 1

01.10.2012, 13:17

12

Запрос нужно выполнять на Сервере

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

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

В Делфи там просто — есть форма Form1,на ней разные объекты, например Button1. Вот берется и пишется Form1.Button1.ТребуемоеСвойство … и так к любому объету … ну тут же не тут то было …. тут как-то запутаннее , более сложнее.

Тут точно так же — только ты должен понимать в каком контексте ты сейчас пишешь(пытаешься к чему либо обратиться)



1



49 / 49 / 8

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

Сообщений: 380

01.10.2012, 13:34

 [ТС]

13

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

Запрос нужно выполнять на Сервере

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

Тут точно так же — только ты должен понимать в каком контексте ты сейчас пишешь(пытаешься к чему либо обратиться)

Сделал вот так : &НаСервере , но все равно выдает эту ошибку. но только теперь к ней прибавилось и то, что неправильно я к перечислению обращаюсь:

{Документ.ПриходнаяНакладная.Форма.ФормаДокумента1 .Форма(25,16)}: Тип не определен (Запрос)
Запрос = Новый <<?>>Запрос; (Проверка: Тонкий клиент)
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента1 .Форма(32,38)}: Переменная не определена (Перечисление)
ЗАпрос.УстановитьПараметр(«ВидЦены», <<?>>Перечисление.ВидыЦен.Значения.Приходная); (Проверка: Сервер)

Про контекст пишется в книге Радченко. Там пишется что при чтении кода. мы можем определить откуда взялась определенная переменная . Нужно пройти 6 шагов: объявлена ли она в модуле формы, есть ли у формы реквизит такой, есть ли у объекта такое свойство и т. д.
Но все равно не понятно как из любого места обратиться к любому интересующему элементу … как путь к нему задать …. вот об этом хотелось бы прочитать ….
Справка там хорошая. но она дает справочную информацию — напоминалку для того, кто разобрался, но хочет напомнить себе.



0



Fenomen

900 / 877 / 8

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

Сообщений: 2,680

01.10.2012, 13:47

14

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

Сделал вот так : &НаСервере , но все равно выдает эту ошибку.

Нужно так:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
&НаКлиенте
Процедура ПриходТМЦПриИзменении(Элемент)
 
             ПриходТМЦПриИзмененииНаСервере();
 
КонецПроцедуры
 
&НаСервере
Процедура ПриходТМЦПриИзмененииНаСервере()
 
          Ваш код.
 
КонецПроцедуры

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

но только теперь к ней прибавилось и то, что неправильно я к перечислению обращаюсь:

ПеречислениЯ



1



Модератор

Эксперт 1С

3708 / 2905 / 572

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

Сообщений: 11,442

Записей в блоге: 1

01.10.2012, 15:37

15

Обращение ко всем менеджерам производиться через ТОЧКУ
Справочники.ИмяСправочника — «получение менеджера справочника по имени» его свойств и методов

В запросе:
Первая таблица указывается в единственном числе
Значение(Справочник.ИмяСправочника.Значение) — доступ только к предопределенным значениям — созданным в конфигураторе



1



CJS

49 / 49 / 8

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

Сообщений: 380

01.10.2012, 17:51

 [ТС]

16

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

Нужно так:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
&НаКлиенте
Процедура ПриходТМЦПриИзменении(Элемент)
 
             ПриходТМЦПриИзмененииНаСервере();
 
КонецПроцедуры
 
&НаСервере
Процедура ПриходТМЦПриИзмененииНаСервере()
 
          Ваш код.
 
КонецПроцедуры

ПеречислениЯ

Переделал.

Вот так получилось:

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
26
27
28
29
30
31
32
33
34
35
&НаКлиенте
Процедура ПриходТМЦПриИзменении(Элемент)
  СтрокаТабличнойЧасти=Элементы.Приход.ТекущиеДанные;
  Дата=  СтрокаТабличнойЧасти.Дата;
  ТМЦ= СтрокаТабличнойЧасти.ТМЦ;
  Цена= СтрокаТабличнойЧасти.Цена;
  
             ПриходТМЦПриИзмененииНаСервере(Дата,ТМЦ ,Цена );
 
 
КонецПроцедуры
 
&НаСервере
Процедура ПриходТМЦПриИзмененииНаСервере(Дата,ТМЦ ,Цена)
        
 
Запрос = Новый Запрос;
Запрос.Текст = " Выбрать 
|ЦеныНоменклатуры.Цена
|ИЗ РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,ТМЦ = &ТМЦ И ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры";
 
ЗАпрос.УстановитьПараметр("Дата",Дата);   
ЗАпрос.УстановитьПараметр("ТМЦ",ТМЦ);
ЗАпрос.УстановитьПараметр("ВидЦены", Перечисления.ВидыЦен.Значения.Приходная);
 
Цена = 0; 
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
   Выборка = Результат.Выбрать();
   Выборка.Следующий();
Цена = Выборка.Цена;   // 
КонецЕсли;
 
 
КонецПроцедуры

Немного переделал, потому что я так понял что СтрокаТабличнойЧасти нужно на клиенте получать, а потом передавать на сервер. А то иначе пишет что «Текущие данные таблицы недоступны на сервере».
В режиме отладки запускается и не ругается.
Но потом когда я в документе изменяю ТМЦ, то пишет :

Поле не обнаружено (Дата)



0



Dethmontt

Модератор

Эксперт 1С

3708 / 2905 / 572

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

Сообщений: 11,442

Записей в блоге: 1

01.10.2012, 19:16

17

1. Плохая переменная «ДАТА» — не однозначная… Лучше используйте какой нибудь свой префикс
Например «мДата»
2. СтрокаТабличнойЧасти.Дата — у вас что дата в табличной части???
3. Перечисления.ВидыЦен.Значения.Приходная — нету свойства ЗНАЧЕНИЯ у менеджера перечислений, обращение к значению предопределенных значений выполняется аналогично справочнику
Пример:

1C
1
2
ЗначениеПеречисления = Перечисления.ИмяПеречисления.ИмяЗначения;
ЗначениеПредопределенногоЭлементаСправочника = Справочники.ИмяСправочника.ИмяПредопределенногоЭлементаСправочника;



1



Fenomen

900 / 877 / 8

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

Сообщений: 2,680

01.10.2012, 20:20

18

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

ПриходТМЦПриИзмененииНаСервере(Дата,ТМЦ ,Цена );

Здесь должно быть:

1C
1
ПриходТМЦПриИзмененииНаСервере(Объект.Дата,ТМЦ ,Цена )

Добавлено через 50 секунд

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

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

Это Вы абсолютно правильно поняли.



1



CJS

49 / 49 / 8

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

Сообщений: 380

01.10.2012, 20:54

 [ТС]

19

Ребята благодарю за внимание к проблеме!
Решил по другому это дело — оказывается в книге Радченко очень похожее на мое решение расписывается.
Блин, стыдно, но нужно было в первую очередь открыть — ведь там глава так и называется «Регистры сведений»… а я давай вместо этого по просторам интернета и по форуму …

Вобщем вот так оно делается:

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

Подробное описание в главе 9 Радченко. Там почти такое, разница в том что здесь по 2-м измерениям отбор.

СтрокаТабличнойЧасти.Дата — у вас что дата в табличной части???

точно! спасибо! теперь буду внимание обращать.

Перечисления.ВидыЦен.Значения.Приходная — нету свойства ЗНАЧЕНИЯ у менеджера перечислений, обращение к значению предопределенных значений выполняется аналогично справочнику

Благодарю! именно на это оно и ругалось когда я делал последний код, который впоследствии все-таки стал успешным.
Я так понимаю это только с опытом придет понимание как и к какому объекту обращаться.

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

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

Здесь должно быть:Код 1C
1 ПриходТМЦПриИзмененииНаСервере(Объект.Дата,ТМЦ ,Цена )

Да, уже понял.
Спасибо за помощь.



1



fimbulwinter

308 / 308 / 1

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

Сообщений: 1,073

02.10.2012, 01:00

20

1C
1
2
3
4
Цена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ДатаНаКоторуюНужноПолучитьЦену, Новый  Структура("Номенклатура, ВидЦены", Номенклатура, ВидЦены)).Цена;
Если НЕ Цена = Неопределено Тогда
СтрокаЧегоТоТам.Цена = Цена;
КонецЕсли;



2



 Like 

#0
by чувак

Например хочу получить список реквизитов (идентификатор) Регистра сведений «Счета учета номенклатуры»

 Like 

#1
by Волшебник

Метаданные.РегистрыСведений.СчетаУчетаНоменклатуры.Реквизиты

 Like 

#2
by чувак

Сейчась попробуем

 Like 

#3
by чувак

Спасибо. Помогло. Также можно обращатся к измерениям и ресурсам

Тэги:

Ответить:

Комментарии доступны только авторизированным пользователям

Регистрация

Похожие вопросы 1С

  • Непонятки при получениии сведений из регистра сведений
  • Запрос по реквизитам и реквизитам табличной части документа с условием
  • Как программно обратиться к субконто …
  • Есть ключ записи регистра сведений. Как получить имя этого регистра?
  • v7: Как обратиться к реквизитам регистра в запросе?
  • Как связать период Регистра накопления и Регистра сведений во внутреннем запросе
  • Отбор регистра на форме списка регистра сведений
  • Как обратиться из модуля формы справочника к реквизитам табличной части документа
  • Как обратиться к дополнительным реквизитам(ТЧ) документа?

В этой группе 1С

  • Как запихнуть название полей запроса например в Массив
  • v8: КАК в 1С получить остаток от деления
  • Windows 2003 как сохранить фон рабочего стола для терминалов?
  • Получение данных в 1С из базы на Firedird. Средствами ADO или ODBC.
  • Ошибка при загрузки данных.
  • v7: При удалении строк документа столкнулся с проблемой, вылетает 1С!
  • как сделать переподключение к sql базе из 1С программно ?
  • v7: Счет-фактура выписана не ну ту организацию. Как исправить?
  • v7: Закрытие 20 счета в сельском хозяйстве
  • Как получить дебиторскую задолженность в ТиС
  • v8: Как открыть печатную форму не модально из модального окна
  • Как в табличной части документа сделать вычисляемое поле…
  • Глюки с таблицей остатков! 18-й релиз платформы 8.0
  • Как определить каталог, откуда запущена внешняя обработка?
  • Как скопировать документ в конфигураторе?
  • К базе с помощью 1CPP.dll прикручено дополнение на главный модуль.
  • Выбор субконто без выбора типа субконто в БП 8 при изменении счета
  • общая файловая ошибка при доступе к файлу картинки
  • Первое слово в строке (1С 7,7)
  • v7: БП 8.0. Почему возникают ВР при начислении амортизации ОС?

На чтение 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.

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

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

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

В поле АктуальнаяПодписка нужно подтягивать значение Подписка с регистра сведений по срезу последних

документ в которой нужно подтягивать

61c353cd0bfcd214980961.png

регистр сведений

61c353801afcc347800127.png

Написал вот такой код. Что-то не так с запросом

&НаСервере
Процедура ПользовательПриИзмененииНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
		|ИЗ
		|	РегистрСведений.ПодпискиПользователей.СрезПоследних КАК ПодпискиПользователейСрезПоследних
		|ГДЕ
		|	ПодпискиПользователейСрезПоследних.Пользователь = &Пользователь";
	
	Запрос.УстановитьПараметр("Пользователь", Объект.Пользователь.Наименование);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	
	Если Объект.Пользователь.Наименование = Объект.Пользователь.Наименование Тогда
		
		ЭтотОбъект["АктуальнаяПодписка"] = ВыборкаДетальныеЗаписи.Подписка;
		
	КонецЕсли;
	
КонецПроцедуры


  • Вопрос задан

    более года назад

  • 160 просмотров

Пользователь должен быть ссылкой на него, а не наименованием.

Пригласить эксперта

С запросом всё так, точнее не так, но не заполняется оно у вас не поэтому.
Выборку то нужно обходить. Если вы уверены что там у вас одна запись, то вот так:

ВыборкаДетальныеЗаписи.Следующий();
ЭтотОбъект["АктуальнаяПодписка"] = ВыборкаДетальныеЗаписи.Подписка;

И у вас там условие странное.

1) При использовании виртуальных таблиц, таких как как СрезПоследних, отбор лучше указывать в параметрах виртуальной таблицы. Иначе при создании виртуальной таблицы тратится лишнее время на отбор записей, которые в принципе не нужны.

2) Судя по скрину в комментарии, «Пользователь» и «Подписка» — это измерения. Следовательно в срезе последних для одного пользователя может быть несколько подписок и не все из них будут актуальными. Условие по актуальности нужно прописать в условии запроса и передать туда параметром дату актуальности документа (в зависимости от задачи может не равняться текущему времени)

3) Чтобы получать доступ к данным выборки запроса, следует использовать метод Следующий()

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


  • Показать ещё
    Загружается…

23 мар. 2023, в 08:23

40000 руб./за проект

23 мар. 2023, в 05:53

15000 руб./за проект

23 мар. 2023, в 00:00

56000 руб./за проект

Минуточку внимания

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

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

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

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

Перед тем как начать основную тему замечу: для того чтобы программно работать непосредственно с регистром сведений: создать новую запись, удалить или редактировать имеющуюся, получать выборку или срез первых (последних) и т.п., — необходимо работать с объектом Менеджер регистров, а после уже можно проводить различные вышеперечисленные манипуляции с регистром сведений.

Создать менеджер регистра сведений достаточно просто, например:

МенеджерЦеныНаТопливо = РегистрыСведений.ЦеныНаТопливо;

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

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

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

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

МенеджерЗаписи.Период           = ТекущаяДата();
МенеджерЗаписи.ВидТоплива       = ВидТоплива;
МенеджерЗаписи.ПоставщикТоплива = ПоставщикТоплива;
МенеджерЗаписи.Цена             = Цена;
МенеджерЗаписи.Записать();

Объект РегистрСведенийМенеджерЗаписи позволяет управлять записью регистра сведений и применим только для независимых регистров. Доступ к записи обеспечивается путем присвоения значений полям объекта, которые соответствуют измерениям, ресурсам и реквизитам регистра. В Вашем примере это измерения Период, ВидТоплива и Поставщик, а также ресурс Цена.

Структура независимого регистра сведений

Переменные, которые присваиваются полям регистра в моем случае это реквизиты управляемой формы 1С.

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

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

Как сделать так, чтобы регистр ЦеныНаТопливо не перезаписывался при одинаковых измерениях и периоде? Для этого нам понадобятся два метода объекта РегистрСведенийМенеджерЗаписи — метод Прочитать и метод Выбран.

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

В этом случае наш код изменится.

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

Если Не МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Период           = ТекущаяДата();
        МенеджерЗаписи.ВидТоплива       = ВидТоплива;
        МенеджерЗаписи.ПоставщикТоплива = ПоставщикТоплива;
        МенеджерЗаписи.Цена             = Цена;
        МенеджерЗаписи.Записать();
КонецЕсли;

В этом случае мы присваиваем значения ключевым полям (измерениям) и периоду. А после применяем метод Прочитать. Данный метод считывает записи с регистра по указанным ключевым полям (измерениям) и периоду. Если есть записи с данным набором полей, то метод Выбран возвращает Истину, иначе – Ложь. В Вашем примере, если метод Выбран вернул значение Ложь (записей нет), то мы  присваиваем значения измерениям и ресурсу и записываем.

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

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

Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Период           = ТекущаяДата();
        МенеджерЗаписи.ВидТоплива       = ВидТоплива; 
        МенеджерЗаписи.ПоставщикТоплива = ПоставщикТоплива;
        МенеджерЗаписи.Удалить();
КонецЕсли;

Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

В статье рассмотрено описание и предназначение регистров сведений, а также примеры работы с регистрами сведений средствами встроенного языка 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", Выборка.Сотрудник, Выборка.Тариф)); 
КонецЦикла;

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