Как программно заполнить реквизит регистра сведений при добавлении в него записи? |
Я |
23.03.10 — 11:38
Есть измерение — показатель(составной тип)
Есть реквизит — ТипЗначения(просто строка)
Как заполнять ТипЗначения при записи в регистр, в зависимости от типа показателя? ну чтобы пользователь ТипЗначения вручную не заполнял
1 — 23.03.10 — 11:40
Перед записью обходишь набор и присваиваешь чо надо.
2 — 23.03.10 — 11:40
ПередЗаписью никто не отменял
3 — 23.03.10 — 11:40
В модуле регистра есть два обработчика ПередЗаписью и ПриЗаписи. Там все и делать
4 — 23.03.10 — 11:46
(0) А связь по типу не работает?
А что за регистр? И почему для хранения таких наборов не используется ПВХ?
5 — 23.03.10 — 12:02
перед записью в отборе записи еще нет
6 — 23.03.10 — 12:03
т.е. не в отборе, а в наборе
7 — 23.03.10 — 12:05
(5) Ага, а заводится она там от сырости.
Не болтайте ерундой!
8 — 23.03.10 — 12:17
(7) сори, обшипся)
9 — 23.03.10 — 12:26
а если передзаписью обходит набор и присвоить что надо — его же снова надо будет записат — и тогда вечный кайф)
10 — 23.03.10 — 12:27
(9) Нафига его перезаписывать, если он еще не записан?
11 — 23.03.10 — 12:44
кароче, в модуле набора записей:
Для каждого Запись Из ЭтотОбъект Цикл
Запись.ТипЗначения = «!»;
КонецЦикла;
так? или нет?
12 — 23.03.10 — 13:27
ау! научите грамоте)) куда все пропали??
13 — 23.03.10 — 13:38
(11) проверить — не судьба?
14 — 23.03.10 — 14:06
не работает так) вот и спрашиваю
15 — 23.03.10 — 16:28
есть еще добрые знающие люди?:)
16 — 23.03.10 — 16:31
В модуле-то в модуле, а в каком обработчике?
17 — 23.03.10 — 16:35
(16) в том то и вопрос! если ПередЗаписью — то объект ЭтотОбъект записей еще не содержит — это ж набор записей, че там будет перед записью — все правильно — ничего. А ПриЗаписи — записи в нем есть, но как их изменить? если их поменять — надо снова записывать
18 — 23.03.10 — 16:35
(17) Это все одна транзакция! Есть там объект и в ПередЗаписью.
19 — 23.03.10 — 16:42
если сделать вот так:
Процедура ПередЗаписью(Отказ, Замещение)
Если Не ЭтотОбъект.Выбран() Тогда
ЭтотОбъект.Прочитать();
КонецЕсли;
Для каждого Запись Из ЭтотОбъект Цикл
Запись.ТипЗначения = «-«;
КонецЦикла;
КонецПроцедуры
то при редактировании существующей записивыдает ошибку что «Запись с такими ключевыми полями уже существует» и дальше все измерения
20 — 23.03.10 — 16:47
(19) Не понял, зачем читать?
21 — 23.03.10 — 16:58
(20) пока не прочитать в нем записей нет
22 — 23.03.10 — 17:00
(21) Ищи лучше — должны быть.
23 — 23.03.10 — 17:01
(21) Не болтайте ерунодй!
Убери нафиг все свои Прочитать() и Записать().
24 — 23.03.10 — 17:02
(21) В нем записи, которые ты записываешь.
ЗЫ. Может ты не в том модуле?
ЗЗЫ. Ты суслика видишь?
25 — 23.03.10 — 17:05
блин, нету нифига, обыскался уже
hhhh
26 — 23.03.10 — 17:15
(25) а точно добавление записи у тебя, а не замещение существующей?
На чтение 7 мин Просмотров 17.8к. Опубликовано 12.10.2017
Регистры сведений в 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
КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют»;Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПоследних.Период,
| КурсыВалютСрезПоследних.Валюта,
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
- Выбрать(<Отбор>, <Порядок>) — выбирает записи с указанным отбором;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Отбор>) — получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
- Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>) — выбирает записи с указанным отбором, у которых период находится между <НачалоИнтервала> и <КонецИнтервала>;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Период>, <Отбор>) — получает ресурсы записи с отбором по всем измерениям и периоду;
- ПолучитьПервое(<НачалоПериода>, <Отбор>) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
- ПолучитьПоследнее(<КонецПериода>, <Отбор>) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
- СрезПервых(<НачалоПериода>, <Отбор>) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
- СрезПоследних(<КонецПериода>, <Отбор>) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи(записей) в независимом регистре сведений необходимо:
- создать набор записей;
- наложить требуемые отборы на измерения и период (если регистр периодический);
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));НаборЗаписей.Записать();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор);
НаборЗаписей.Записать();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.
Запрос = Новый Запрос(«ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры»);Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Записать();
+3
Событие ПередЗаписью регистра сведений. Как перед записью изменить значение реквизита записи?
Событие ПередЗаписью возникает перед выполнением записи набора регистра сведений. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи набора регистра сведений.
Пример проверки на условие и заполнение реквизита Цвет:
Код 1C v 8.х
Процедура ПередЗаписью(Отказ, Замещение)
Для Каждого ТекЗапись Из ЭтотОбъект Цикл
Если ТекЗапись.СерияНоменклатуры.Восстановленный Тогда
ТекЗапись.Цвет="2551650";
Иначе
ТекЗапись.Цвет="";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Ниже приведен пример процедуры ПередЗаписью для регистра сведений «Курсы», который содержит курсы валют по периодам. При попытке ввести или изменить курс валюты период которого раньше даты регистрации фирмы будет выведено два сообщения:
Код 1C v 8.2 УП
Процедура ПередЗаписью (Отказ, Замещение)
ДатаРегистрации = Константы.ДатаРегистрации.Получить ();
Для Каждого ТекЗапись Из ЭтотОбъект Цикл
Если ТекЗапись.Период < ДатаРегистрации Тогда
// Если период раньше даты регистрации
Отказ = Истина; // отказ от записи
Сообщить(" Запись от " + ТекЗапись.Период +
" с курсом " + ТекЗапись.Курс +
" раньше даты регистрации фирмы!");
КонецЕсли;
КонецЦикла;
Если Отказ Тогда
Сообщить ("Запись не выполнена!");
КонецЕсли;
КонецПроцедуры
В статье рассмотрено описание и предназначение регистров сведений, а также примеры работы с регистрами сведений средствами встроенного языка 1С – создание и редактирование наборов записей, отдельных записей, работа с ключом записи.
Содержание
Регистры сведений в 1С 8
Что такое регистр сведений
Регистр сведений – это объект конфигурации, который предназначен для хранения произвольной информации в разрезе нескольких измерений. Например, можно хранить соответствие материально-ответственных лиц и складов, курсы валют или цену на товары. Можно представить регистр сведений как многомерную таблицу, где на каждом пересечении измерений хранятся значения, которые называются Ресурсы.
Помимо измерений и ресурсов, у регистров сведений могут быть определены реквизиты – вспомогательная информация, служащая для уточнения данных – например, ответственный пользователь, комментарий и т.п.
Значения в регистре сведений могут храниться не только в разрезах измерений, но также они могут быть развернуты во времени. В этом случае к записям добавляется стандартное измерение Период. Регистры с информацией, развернутой во времени, называются периодическими.
Периодические регистры сведений позволяют получить информацию о срезе наиболее ранних или наиболее поздних записей.
Строки в многомерной таблице регистра сведений называются записями. Уникальность записей регистра сведений определяется как комбинация измерений и периода. В случае, если регистр сведений не периодический, то период будет не заполнен, и уникальные записи будут отличаться по комбинации измерений. Платформа не допускает создания двух записей с одинаковым набором измерений и периодом. Измерения и период образуют т.н. составной ключ, и называются ключевыми полями.
Записи в регистр сведений могут вноситься как вручную, независимо одна от другой, так и при помощи документов, единым набором. Документ, которым вносится запись в регистр сведений, называется регистратором.
Свойства регистра сведений. Основные настройки
Основные свойства регистра сведений, уникальные только для этого объекта метаданных – это Периодичность и Режим записи. Рассмотрим создание и настройку регистра сведений на примере хранения тарифов работников.
Периодичность регистра сведений
Данное свойство отвечает за доступность стандартного реквизита Период. Периодичность может быть
- В пределах секунды
- В пределах дня
- В пределах месяца
- В пределах квартала
- В пределах года
В случае, если регистр сведений подчинен регистратору (см. ниже), становится доступным еще один вариант периода – по позиции регистратора.
Поле Период входит в составной ключ записи; можно добавлять записи с одинаковым составом измерений, но с разным периодом. Если периодичность – по позиции регистратора, то дата документа может совпадать с точностью до секунды – все равно это будут разные записи, т.к. в этом случае позиция регистратора будет определяться как момент времени (Дата + ссылка на документ). В зависимости от выбранной периодичности, период записи будет автоматически приводиться к началу периода в свойстве Периодичность. Например, если указана периодичность “В пределах дня”, то к началу суток, если “В пределах месяца” – то соответственно к первому числу месяца, и т.д.
Режим записи регистра сведений 1С
Режим записи определяет, можно ли редактировать записи регистра сведений вручную, или они будут вноситься движениями документа-регистратора. Для регистров сведений с режимом записи “Независимый” можно указывать основной отбор для измерений. В случае, если при этом регистр сведений периодический, становится возможным указание флажка Основной отбор по периоду.
Что такое ведущее измерение и основной отбор?
Флаг Ведущее у измерения регистра сведений означает, то данная запись имеет смысл пока существует объект, ссылка на который хранится в данном измерении. Например, если удалить из базы данных сотрудника “Иванов Иван”, то автоматически из регистра сведений будут удалены все записи по тарифам, где в измерении “Сотрудник” был указан Иванов Иван. Если данный флаг не установлен, то при удалении объекта, записи остались бы в регистре с битой ссылкой на него.
Также свойство “Ведущее” у измерения отвечает за построение пользовательского интерфейса. В карточке объекта, который является ведущим измерением, появляется гиперссылка для быстрого перехода к регистру сведений с отбором по текущему объекту.
Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду включает основной отбор для период для периодических регистров.
Проектирование структуры регистра сведений
Следует стараться избегать архитектурных решений, когда значение одного ресурса регистра сведений меняется значительно чаще чем значение другого. В этом случае целесообразно выделить такие ресурсы в отдельный регистр сведений. Это связано с тем, что в момент записи записываются все ресурсы, а не только измененный, что приводит к неоправданной нагрузке на СУБД.
Получение данных из нескольких ресурсов одного регистра сведений выполняется быстрее, чем получение одного ресурса из нескольких регистров
Следует внимательно отнестись к вопросу – какие поля многомерной таблицы должны быть измерениями, а какие – ресурсами. В зависимости от прикладной задачи, подход может быть различным.
Например, мы хотим знать, какие материально ответственные лица закреплены за тем или иным складским помещением. Если таких МОЛ более одного человека, то правильная архитектура регистра будет такая:
Измерения: МОЛ
Ресурсы: Склад
Если же нам требуется гарантировать, что у одного склада может быть только одно материально ответственное лицо, то состав регистра сведений будет следующий:
Измерения: Склад
Ресурсы: МОЛ
Примеры работы с регистрами сведений в 1С
Программная запись в регистр сведений 1С
Программно добавить записи в независимый регистр сведений можно двумя способами: при помощи менеджера записи, и при помощи набора записей.
//Использование менеджера записи регистра сведений
НоваяЗапись = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
//Сотрудник - это переменная, реквизит формы, параметр и т.п. с типом СправочникСсылка.Сотрудники
НоваяЗапись.Сотрудник = Сотрудник;
НоваяЗапись.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
НоваяЗапись.Тариф = 1500;
НоваяЗапись.Записать();
//Использование набора записей
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьНабора.Тариф = 1500;
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Тариф = 6000;
НаборЗаписей.Записать();
Следует иметь в виду, что если не установить отбор для набора записей, при записи такого набора будет заменен весь регистр сведений!
Набор записей регистра сведений
Общий порядок добавления новых записей в регистр сведений:
- Создать набор записей
- Установить у него отбор по тем измерениям и периоду (если регистр периодический), по которым нужно добавить новые записи
- Добавить в набор необходимое количество новых записей
- Записать набор записей
Рассмотрим на примерах работу с набором записей средствами языка 1С
// работа с набором записей
//создание набора записей
НаборТарифы = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
//количество записей набора
Колво = НаборТарифы.Количество(); //0
//чтение набора записей из базы
//если не вызвать метод Прочитать и не добавить записи, то запишется пустой набор записей!
НаборТарифы.Прочитать();
Колво = НаборТарифы.Количество(); //вернет количество записей в наборе
//добавление записей
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Период = ТекущаяДата();
ЗаписьНабора.Тариф = 6000;
//выгрузка в таблицу значений
ТаблицаТарифов = НаборТарифы.Выгрузить();
//удаление всех записей набора
НаборТарифы.Очистить();
//загрузка из таблицы значений
НаборТарифы.Загрузить(ТаблицаТарифов);
//удаление первой записи набора
НаборТарифы.Удалить(0);
//выгрузка одной колонки в массив
МассивТоваров = НаборТарифы.ВыгрузитьКолонку("Сотрудник");
//загружаем обратно
НаборТарифы.ЗагрузитьКолонку(МассивТоваров, "Сотрудник");
//сумма всех значений ресурса, если его тип содержит тип Число
Итог = НаборТарифы.Итог("СуммаТарифа");
//запись набора
НаборТарифы.Записать();
Изменение записей регистра сведений
Для того, чтобы изменить существующие записи регистра сведений, нужно сначала прочитать их через набор записей, потом перебрать в цикле, изменить и записать набор записей.
Изменим, например, все часовые оклады, добавив 10%.
//Изменение записей регистра сведений
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
//Добавим 10%
ЗаписьНабора.Тариф = ЗаписьНабора.Тариф*1.1;
КонецЦикла;
НаборЗаписей.Записать();
Удаление записей регистра сведений
//Удаление записей из регистра сведений
//1. Удалить записи с определенным отбором
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.ПоДням);
НаборЗаписей.Отбор.Период.Установить(ДатаФильтра);
//Запишем пустой набор записей
НаборЗаписей.Записать();
//2. Очистить регистр сведений программно
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
//Все записи регистра сведений будут удалены
//3. Выборочное удаление записей по какому-нибудь условию
//Здесь рассмотрим пример обработки записей с учетом значения реквизитов
//Наложить отбор непосредственно на реквизиты нельзя, поэтому следует использовать другой способ
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
МассивЗаписейКУдалению = Новый Массив;
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
Если ЗаписьНабора.Примечание = "Служебная запись" Тогда
МассивЗаписейКУдалению.Добавить(ЗаписьНабора);
КонецЕсли;
КонецЦикла;
//Вторым циклом удалим ненужные записи из набора регистра сведений
Для Каждого ЗаписьКУдалению Из МассивЗаписейКУдалению Цикл
НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;
НаборЗаписей.Записать();
Менеджер записи регистра сведений
//Создание при помощи менеджера записи регистра сведений
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Записать();
//Изменение записи через менеджер записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Прочитать();
Если ЗаписьМенеджер.Выбран() Тогда
ЗаписьМенеджер.Тариф = 7000;
ЗаписьМенеджер.Записать();
КонецЕсли;
//Удаление при помощи менеджера записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Удалить();
Ключ записи регистра сведений
// создать ключ записи
//пустой ключ
ПустойКлюч = Новый("РегистрСведенийКлючЗаписи.ТарифыРаботников");
//используя менеджер
ПустойКлюч = РегистрыСведений.ТарифыРаботников.ПустойКлюч();
//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Период", Дата(2021,01,31));
ЗначенияКлюча.Вставить("Сотрудник", СсылкаНаСотрудника);
ЗначенияКлюча.Вставить("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
КлючЗаписи = РегистрыСведений.ТарифыРаботников.СоздатьКлючЗаписи(ЗначенияКлюча);
Изменение записей в регистр сведений с подчинением регистратору
Рассмотрим пример. Допустим, у нас есть документ “Назначение материально ответственных лиц”, в котором мы в табличной части указываем склад и соответствующее ему МОЛ. Этот документ записывает движения в регистр сведений МОЛПоСкладам, со следующими настройками:
- Измерения: Склад, тип СправочникСсылка.Склады
- Ресурсы: МОЛ, тип СправочникСсылка.Сотрудники
- Реквизиты: Примечание, тип Строка(100)
- Периодичность: в пределах месяца
- Режим записи: Подчинение регистратору
Для изменения записей регистра сведений, подчиненного регистратору, нужно иметь ссылку на документ-регистратор. После этого необходимо получить движения объекта по этой ссылке, по нужному регистру. Далее мы получаем набор записей, и работа с ним аналогична работе при использовании метода СоздатьНаборЗаписей. Для того чтобы изменить движения документа, также следует вызвать метод Прочитать. Второй вариант – заново добавить нужные записи в движения, в этом случае новый набор полностью заменит старый.
ОбъектРегистратор = СсылкаНаДокумент.ПолучитьОбъект();
ДвиженияПоРегистру =ОбъектРегистратор.Движения.МОЛПоСкладам;
ДвиженияПоРегистру.Прочитать();
Для Каждого ЗаписьДокумента Из ДвиженияПоРегистру Цикл
ЗаписьДокумента.Примечание = "Запись обработана программно";
КонецЦикла;
ДвиженияПоРегистру.Записать();
Примеры работы с периодическим регистром сведений
Периодический регистр сведений позволяет получать данные о самых первых и самых последних записях. Для этого платформа предусматривает две виртуальные таблицы – СрезПервых и СрезПоследних. В определенных случаях можно включить итоги для среза первых и/или последних. Это может многократно ускорить получение данных, так как при этом будут созданы физические таблицы, откуда данные будут извлекаться гораздо быстрее, чем из виртуальных.
Для работы с виртуальными таблицами периодического регистра сведений можно использовать два подхода – объектные методы и язык запросов. Рассмотрим каждый из этих способов. Для наглядности срез первых мы получим при помощи объектной техники, а срез последних – при помощи запроса.
Получить самые ранние записи (Срез первых)
Получим самые ранние записи тарифов с видом тарифа “ПоДням”
//Как получить самые первые записи
Отбор = Новый Структура("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
СрезПервых = РегистрыСведений.ТарифыРаботников.СрезПервых(ДатаСреза, Отбор);
//Получим таблицу значений со структурой колонок, аналогичной структуре регистра сведений
//В результат попадут наиболее ранние записи регистра, соответствующие установленным значениям ключевых полей.
//Записи подбираются для каждой комбинации из всех имеющихся значений измерений регистра.
//При этом, если есть записи с датой реньше, чем начало периода, они учитываться не будут.
Для Каждого СтрСреза Из СрезПервых Цикл
Сообщить(СтрШаблон("Самый ранний тариф по дням для сотрудника %1: %2", СтрСреза.Сотрудник, СтрСреза.Тариф));
КонецЦикла;
Получить самые поздние записи (Срез последних)
//Как получить последние записи регистра сведений на дату
//В случае работы с запросом, можно накладывать более сложные фильтры, и извлекать только необходимые данные,
// например, только сотрудника и тариф, без лишних полей
ЗапросПоследних = Новый Запрос("ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(ТекущиеТарифы.Сотрудник) КАК Сотрудник,
| ТекущиеТарифы.Тариф КАК Тариф
|ИЗ
| РегистрСведений.ТарифыРаботников.СрезПоследних(&ДатаСреза, ВидТарифа = ЗНАЧЕНИЕ(Перечисление.ВидыТарифов.Почасовой)) КАК ТекущиеТарифы");
ЗапросПоследних.УстановитьПараметр(ДатаСреза, ДатаСреза);
Выборка = ЗапросПоследних.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("Текущий почасовой тариф для сотрудника %1: %2", Выборка.Сотрудник, Выборка.Тариф));
КонецЦикла;
Запись в регистр сведений программно
Запись в регистр сведений программно одна из типовых операций в 1с.
В “1с:Предприятие 8” имеется два способа выполнить программную запись в регистр сведений.
Как добавить записи в независимый регистр сведений?
Регистр сведений менеджер записей
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи.<имя>
Во-первых создадим независимый регистр сведений цены:
В нашем независимом регистр сведений “Цены” измерениями будут “Номенклатура”, “ВидЦены” и ресурс “Цена”.
Во-вторых создадим внешнюю обработку для изменения Регистра Сведений “Цены” при помощи программного кода.
Обработка содержит четыре реквизита:
- Номенклатура;
- Видцены;
- Цена;
- ДатаИзменения.
Реквизит “ДатаИзменения” был добавлен для того, чтобы заполнить значение “Период” в Регистре Сведений “Цены”.
Чтобы добавить одну запись, содержащую значение цены выбранной номенклатуры, можно использовать следующий код:
МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период=объект.ДатаИзменения;
МенеджерЗаписи.Номенклатура =объект.Номенклатура;
МенеджерЗаписи.ВидЦены = объект.ВидЦены;
МенеджерЗаписи.Цена = Объект.Цена;
МенеджерЗаписи.Записать();
Результат выполнения кода:
В результате запись будет добавлена в регистр, или, если регистр уже содержит запись с выбранными значениями измерений “Номенклатура” и “ВидЦены”, – существующая запись будет заменена новой. Ссылка на обработку: Ссылка. Мы произвели Запись в регистр сведений программно.
Регистр сведений набор записей
Если требуется добавить несколько записей в регистр сведений, можно использовать объект РегистрСведенийНаборЗаписей.<имя>
Во-первых будем использовать уже готовый Регистр Сведений “Цены”.
Во-вторых Изменим обработку, добавив в неё Табличную Часть “Список Цен”.
В-третьих в процедуре НаСервере заполним следующий код:
НаборЗаписей = РегистрыСведений.Цены.СоздатьНаборЗаписей();
//Устанавливаем отбор
НаборЗаписей.Отбор.Номенклатура.Установить(объект.Номенклатура);
НаборЗаписей.Отбор.Период.Установить(Объект.ДатаИзменения);
//формируем список записей
ТаблицаЦен=объект.СписокЦен;
для каждого Строка из ТаблицаЦен цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Номенклатура=объект.Номенклатура;
НоваяЗапись.Период=объект.ДатаИзменения;
НоваяЗапись.ВидЦены=Строка.ВидЦены;
НоваяЗапись.Цена=Строка.Цена;
конецЦикла;
//Запись в регистр
НаборЗаписей.Записать();
Проверим работу обработки.
Результат заполнения Регистра Сведений при помощи Набора Записей.
В результате произвед=ли заполнение Регистра Сведений при помощи Набора Записей. Ссылка на внешнюю обработку: ссылка.
Дополнительный пример кода.
&НаСервере
Процедура Команда1НаСервере()
движ = регистрысведений.Занятыеместа.СоздатьМенеджерЗаписи();
движ.Билет=объект.билет;
движ.пассажир = объект.пассажир;
движ.рейс = объект.Рейс;
движ.статусместа = объект.стаутсместа;
движ.Записать();
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
//билет=элементы.билет;
//пассажир=элементы.пассажир;
//статус=элементы.стаутсместа;
Команда1НаСервере();
КонецПроцедуры
2 / 2 / 0 Регистрация: 20.06.2018 Сообщений: 36 |
|
1 |
|
Заполнение реквизита справочника из регистра сведений01.08.2018, 13:44. Показов 6430. Ответов 7
Есть справочник номенклатура с реквизитом штрихкод и есть регистр сведений (измерение штрихкод, ресурс номенклатура). Надо чтобы при записи элемента регистра сведений по соответствующей номенклатуре происходило заполнение реквизита штрихкод. Понимаю так, что надо создать процедуру ПриЗаписиНаСервере, но вот там я теряюсь как обратиться к нужной номенклатуре, только через запрос? Получается надо получить нужную ссылку, по ней получить объект, а потом изменить его элемент, или не так?
0 |
So much heresy… 24 / 16 / 11 Регистрация: 30.07.2018 Сообщений: 114 |
|
01.08.2018, 14:27 |
2 |
Раз штрихкод хранится в регистре сведений, не надо его дублировать в реквизите справочника — это бесполезно, избыточно и вообще фу. Да будет БСП.
0 |
2 / 2 / 0 Регистрация: 20.06.2018 Сообщений: 36 |
|
01.08.2018, 14:30 [ТС] |
3 |
Раз штрихкод хранится в регистре сведений, не надо его дублировать в реквизите справочника — это бесполезно, избыточно и вообще фу. Да будет БСП. Хорошо, я согласен с вами 1. Так и сделано
0 |
So much heresy… 24 / 16 / 11 Регистрация: 30.07.2018 Сообщений: 114 |
|
01.08.2018, 14:45 |
4 |
Сообщение было отмечено MikhailDr как решение Решение
1. Так и сделано Вы в самом первом сообщении написали: «измерение штрихкод, ресурс номенклатура». Опечатка? Ресурс и измерение разные вещи.
2. Наверное смогу сам сделать Кстати, если сделать номенклатуру ресурсом, а штрихкод измерением, то проверки не надо — и так будет проверяться уникальность. В типовых конфигурациях так.
3. А вот здесь можете подсказать подробнее как это сделать? Надеюсь, мы сейчас про управляемые формы, иначе то, что напишу ниже, не будет иметь смысла.
1 |
2 / 2 / 0 Регистрация: 20.06.2018 Сообщений: 36 |
|
01.08.2018, 15:03 [ТС] |
5 |
Я пишу
есть регистр сведений измерение штрихкод Вы пишите
1. В регистре сведений штрихкод сделать измерением. Мне кажется мы пишем об одном и том же, что в регистре сведений штрихкод должен быть измерением или я что-то не понимаю?
В обработчике «ПриСозданииНаСервере» модуля формы элемента справочники «Номенклатура» добавить установку отбора в динамическом списке «Штрихкоды» для поля «Номенклатура» по значению ссылки текущего элемента справочника. В моей базе сначала создается номенклатурная позиция, а потом ей присваивается штрихкод, т.е. при создании на сервере элемента справочника в регистре сведений еще не будет соответствующего ей штрихкода
0 |
So much heresy… 24 / 16 / 11 Регистрация: 30.07.2018 Сообщений: 114 |
|
01.08.2018, 15:26 |
6 |
По поводу измерения вы совершенно правы, я туплю, извините.
0 |
2 / 2 / 0 Регистрация: 20.06.2018 Сообщений: 36 |
|
02.08.2018, 09:10 [ТС] |
7 |
Спасибо, все получилось
0 |
Эксмет |
02.08.2018, 09:24
|
Не по теме:
Спасибо, все получилось Чем смог. Обращайтесь)
0 |
Содержание:
1. Свойства регистров сведений, влияющие на указание их ключа при записи в режиме конфигурации 1С
2. Объект встроенного языка программирования 1С для записи регистров сведений в 1С 8.3
1. Свойства регистров сведений, влияющие на указание их ключа при записи в режиме конфигурации 1С
Регистры сведений – удобный механизм хранения различной информации (ресурсов) в сопоставлении с какими-то наборами 1С ключевых полей (измерений – или «ключами записей»). Одному (уникальному) набору ключа может соответствовать только один набор ресурсов, что отличает их, например, от справочников, которые в принципе могут иметь одинаковые значения ключевых полей (код, наименование и т.д.). Если в 1С 8 регистр сведений периодический, то уникальность набора измерений расширяется еще и в разрезе периода – т.е. ключ записи регистра составляет уникальный набор измерений плюс значение периода записи. Кроме того, регистры сведений, в отличие от тех же справочников, обладают большими возможностями по параллельной работе с СУБД (операции записи/чтения), т.к. архитектура их таблиц в СУБД позволяет производить более тонкие блокировки.
Рассмотрим, какие бывают особенности записи регистров сведений 1С 8.3 программно.
К таковым относятся:
· Режим записи 1С
— Независимый
— Подчинение регистратору
· Периодичность
— Непериодический
— Периодический: в переделах секунды, дня, месяца, квартала или года; если регистр сведений подчиненный регистратору, то к вариантам периодичности добавляется еще и «по позиции регистратора»
Таким образом, существует четыре разновидности свойств регистров сведений, каждой из которых соответствует своя полнота указания в 1С ключевых полей при записи.
Самый простой механизм записи имеет независимый, непериодический регистр сведений: для его записи достаточно указать значения обязательных к заполнению измерений (но не менее одного).
Если регистр «подчинен регистратору», то среди ключевых полей появляется обязательное для заполнения поле «Регистратор». Запись таки регистров ведется, как правило, в процедурах обработки проведения документов – но это не обязательно – важно, чтобы было заполнено поле «Регистратор». Интересно, что в качестве регистратора может выступать не только ссылка на проводимый документ, но и ссылка на любой другой документ допустимого типа – т.е. текущий проводимый документ может формировать по регистру сведений движения для другого документа.
Если регистр периодический, то среди 1С ключевых полей появляется обязательное для заполнения поле «Период». При передаче значения в этой поле оно (значение) всегда преобразуется к «началу периода» выбранного для регистра варианта периодичности: например, если периодичность регистра «В пределах месяца», а мы отправляем в поле «Период» значение 09.10.2022 19:29:35, то в этом поле «Период» будет зафиксировано значение 01.10.2022 0:00:00 – и именно оно будет участвовать в запросах. Для вариантов периодичности «По позиции регистратора» и «В пределах секунды» эти преобразования не столь очевидны, но, тем не менее, о разнице между «позицией» и «секундой» помнить нужно.
Для периодического регистра 1С подчиненного регистратору требуется самая полная форма заполнения ключа: помимо обязательных измерений следует заполнять и «Период» и «Регистратор».
2. Объект встроенного языка программирования 1С для записи регистров сведений в 1С 8.3
В 1С 8 регистр сведений можно заполнять (записывать) с помощью двух объектов:
· РегистрСведенийМенеджерЗаписи
· РегистрСведенийНаборЗаписей
С точки зрения производительности важно понимать, что когда мы используем менеджер записи 1С, то каждая запись отправляется в СУБД отдельным запросом (например, в цикле), в то время, как в 1С набор записей регистра сведений за одно обращение к СУБД можно записать сразу много записей.
Также следует помнить, что в 1С 8 регистр сведений по одному ключу может хранить только один набор ресурсов, и если вы попытаетесь добавить запись с уже существующим набором 1С ключевых полей, то в общем случае получите ошибку «запись с такими ключевыми полями уже существует». Для управления такой ситуацией в команде «Записать» есть параметр «Замещать» (как у менеджера записи, так и у набора записей). При «Замещать» = Истина мы перепишем значения существующих ключей и уникальность будет сохранена.
Еще одна особенность наборов записей: он предоставляет разработчику возможность работы с «событиями», такими как «ОбработкаЗаполнения», «ПередЗаписью», «ПриЗаписи» и другими (см. описание встроенного языка), что может быть полезно при решении многих задач.
Мы рассмотрели особенности регистров, которые влияет на их запись. Конкретные пр
имеры программного кода 1С по записи регистров можно легко найти в документации и на просторах интернета.
Специалист компании «Кодерлайн»
Игорь Борисенко