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

 +35 

   

Распечатать

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

Код 1C v 8.х

 НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей();  			
НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата));
НаборЗаписей.Отбор.Организация.Установить(Организация);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
НовыйНомер = НаборЗаписей.Добавить();
НовыйНомер.Организация = Организация;
НовыйНомер.Период = НачалоГода(Дата);
НовыйНомер.Номер = 2; ном=1;
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
НовыйНомер = НаборЗаписей[0];
ном = НовыйНомер.Номер;
НовыйНомер.Номер = ном+1;
КонецЕсли;
НаборЗаписей.Записать();
Номер = Организация.Префикс + "-" + Ном + "/" + Строка(Прав(Год(ТекущаяДата()),2));

Код 1C v 8.х

 //Установить курс Валюты USD
КурсыВалют = РегистрыСведений.КурсыВалют;
НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
НаборКурсов.Отбор.Валюта.Установить(Доллар);
НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборКурсов.Прочитать();
Если НаборКурсов.Количество() = 0 Тогда
НовыйКурс = НаборКурсов.Добавить();
НовыйКурс.Валюта = Доллар;
НовыйКурс.Период = ТекущаяДата();
ИначеЕсли НаборКурсов.Количество() = 1 Тогда
НовыйКурс = НаборКурсов[0];
Иначе
Предупреждение("Курс валюты задается один раз в день.", 60);
Возврат;
КонецЕсли;
НовыйКурс.Курс = 31.44;
НовыйКурс.Кратность = 1;
НаборКурсов.Записать();

Код 1C v 8.х

  //В регистр были ошибочно записаны штрихкоды. 
// Нужно по заданным Номенклатуре (Товар) и Характеристике (ХарактеристикаТовара) найти эту запись и заменить там штрихкод.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура И
| ШтрихкодыНоменклатуры.Характеристика = &Характеристика";

Запрос.УстановитьПараметр("Номенклатура", Товар);
Запрос.УстановитьПараметр("Характеристика", ХарактеристикаТовара);

Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Номенклатура = Товар;
Если ЗначениеЗаполнено(ХарактеристикаТовара) Тогда
ТекЗапись.Характеристика = ХарактеристикаТовара;
Иначе
ТекЗапись.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
ТекЗапись.Штрихкод = ?(ПустаяСтрока(ШтрихКод),РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13(), Штрихкод);
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;
Иначе
НайденныйШтрихкод = Выборка.Штрихкод;
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Штрихкод = НайденныйШтрихкод;
ТекЗапись.Прочитать();

ТекЗапись.Штрихкод = Штрихкод;
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;

КонецЕсли;

Анализируем вид регистра для выбора варианта редактирования записей

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

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

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

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

Давайте рассмотрим пример изменения записей в регистре сведений КурсыВалют. Ниже показаны свойства этого регистра (сразу обращайте внимание на состав измерений регистра, режим записи и периодичность):

К примеру, нам необходимо перезаписать курс валюты. В первом варианте мы установим курс валюты без анализа уже записанных данных:

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

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

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

Процедура УстановитьКурсВалюты(Период, Валюта, Курс) Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); Запись.Период = Период; Запись.Валюта = Валюта; Запись.Прочитать(); Если Запись.Выбран() Тогда Запись.Курс = Курс; Запись.Записать(); КонецЕсли; КонецПроцедуры

С помощью функции Выбран() мы проверяем, считана запись или нет. Если запись существует (по установленному периоду и валюте) — мы устанавливаем новый курс. В этом варианте уже не нужно устанавливать кратность т.к. ее значение не изменится и будет записано старое значение.

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

Процедура УстановитьКурсВалюты(Период, Валюта, Курс) Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); Набор.Отбор.Период.Установить(Период); Набор.Отбор.Валюта.Установить(Валюта); Набор.Прочитать(); Если Набор.Количество() Тогда Запись = Набор[0]; Запись.Курс = Курс; Набор.Записать(); КонецЕсли; КонецПроцедуры

В примере выше мы создаем набор записей и устанавливаем для него отбор по измерениям и периоду. После установки отбора считываем записи. В результате в наборе будут ранее записанные записи. Т.к. мы установили полный отбор по измерениям (периоду и валюте) — максимальное количество записей в отборе равно 1. Поэтому мы проверяем набор на количество и если запись есть — устанавливаем новый курс валюты.

Все примеры, описанные выше, выполнят одинаковые действия по установке нового курса валют. Выбирайте вариант, который Вам более удобен и понятен.

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

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

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

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

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

Вначале мы устанавливаем отбор по регистратору. После указания отбора считываем записи по этому регистратору и в обходе набора записей ищем записи по определенной номенклатуре и с оптовым видом цен. Если цена хоть в одной записи будет изменена — набор будет модифицирован. Таким образом мы будем записывать только изменившиеся данные.

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

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

Если сравните этот пример с первым — изменилось только определение регистратора. Если первый пример изменял данные только в одном регистраторе — последний пример изменит записи по всем регистраторам в регистре сведений.

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

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

Наши разработки:

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

Менджер — ошибка «Значение не является значением объектного типа (Период)»

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

МенеджерЗаписи.Период = СтруктураЗаписи.Период;

МенеджерЗаписи.Объект = СтруктураЗаписи.Объект;

МенеджерЗаписи.ТипОповещения = СтруктураЗаписи.ТипОповещения;

МенеджерЗаписи.Прочитать();

В случае с набором тоже ошибка, делаю так:

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

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

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

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

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

      Запись.Оповещен = Истина;

  КонецЦикла;

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

Как сделать-то?:)

Изменение записи в регистре сведений, частая задача для программиста 1с в заметке рассмотрим несколько способов изменить запись в регистре. Рассмотрим два варианта создание набора записей и установка отбора и создание менеджера записей.

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

В примере ниже решим следующую задачу:

Оператор неверно записал штрихкод для товара с цветом и размером в базу данных. Необходимо зная товар (Номенклатура) и цвет с размером (Характеристика) найти штрихкод и исправить его. Неверный штрихкод мы не знаем.

Для решения задачи поступим следующим образом:

  1. Создадим набор записей регистра сведений
  2. Установим отбор
  3. Прочитаем запись
  4. Выбираем следующее действие в зависимости от количества найденных записей
    1. Если записи не найдены добавляем новую запись и добавляем штрихкод
    2. Если найдена 1 запись, то обновляем в ней штрихкод
    3. Если найдено несколько записей ничего не делаем, потому что не знаем какая запись с ошибкой
  5. Сообщаем результат работы
  6. Записываем изменения
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();  			
НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура);
НаборЗаписей.Отбор.Характеристика.Установить(Характеристика);
НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() = 0 Тогда
	НовыйНомер = НаборЗаписей.Добавить();
	НовыйНомер.Номенклатура		= Номенклатура;
	НовыйНомер.Характеристика	= Характеристика;
	НовыйНомер.Штрихкод			= Штрихкод;
	Текст = "Штрихкод записан, но у номенклатуры не было штрихкода";
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
	НовыйНомер = НаборЗаписей[0];
	НовыйНомер.Штрихкод = Штрихкод;
	Текст = "Штрихкод Исправлен";
ИначеЕсли НаборЗаписей.Количество() > 1 Тогда
	Текст = "У номенклатуры несколько штрихкодов, операция не выполнена";
КонецЕсли;

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

Рассмотрим ещё один пример в котором установим курс валют для валюты USD.

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

НовыйКурс.Курс = 59.13;
НовыйКурс.Кратность = 1;
НаборКурсов.Записать();   

Изменение записи через менеджер записей

Реализуем внесение штрихкода номенклатуры программно м помощью менеджера записи. Порядок действий следующий:

  1. Создаем менеджер записей
  2. Вносим данные о номенклатуре штрихкоде и характеристике
  3. Пытаемся записать
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = Номенклатура;
МенеджерЗаписи.Штрихкод  = Штрихкод;
Если ЗначениеЗаполнено(Характеристика) Тогда
	МенеджерЗаписи.Характеристика = Характеристика;
Иначе    
	МенеджерЗаписи.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
	
Попытка
	МенеджерЗаписи.Записать();
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;

Реализуем внесение штрихкода, через менеджер записей с отбором.

  1. Создадим менеджер записи регистра сведений
  2. Установим отборы
  3. Прочитаем регистр
  4. Далее действуем в зависимости от того найдена запись в регистре или нет
    1. Если запись найдена заменяем штрихкод
    2. Если запись не найдена заполняем все реквизиты
  5. Записываем запись в регистр
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура		= Номенклатура;
МенеджерЗаписи.Характеристика	= Характеристика;
МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда
	МенеджерЗаписи.Штрихкод			= Штрихкод;
Иначе
	МенеджерЗаписи.Номенклатура		= Номенклатура;
	МенеджерЗаписи.Характеристика	= Характеристика;
	МенеджерЗаписи.Штрихкод			= Штрихкод;
КонецЕсли;

Попытка
	МенеджерЗаписи.Записать();
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;

Дополнительная информация по теме:

  1. Про регистры сведений на сайте v8.1c – ссылка
  2. Заметки про программирование на платформе 1с – ссылка

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

Более подробно о регистрах сведений, их видах и о многом другом читайте в моей книге «Программировать в 1С за 11 шагов».

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

Для того что бы понять и изучить, принципы программной с регистрами сведений, сделаем небольшую задачу на тестовой конфигурации «Управляемое приложение 1С». Создадим обработку, которая будет менять цены определенного вида у всех товаров на определенную дату.

В конфигурации «Управляемое приложение» цены товаров хранятся в независимом периодическом регистре сведений, который имеет следующие данные

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

Создадим внешнюю обработку, которую назовем «ИзменитьЦены», и у которой будет один реквизит ВидЦены (тип СправочникСсылка.ВидыЦен),  второй реквизит – Процент (тип число), а третий реквизит – Дата (тип Дата). Создадим команду «Изменить цену», которую разместим в командной панели.

Для команды «Изменить цену» создадим обработчики на сервере и на клиенте, где будем изменять данные регистра сведений ЦеныТоваров.

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

Разберем код на листинге выше. В строке //1 мы создаем набор записей регистра сведений «ЦеныТоваров» с этим набором мы и будем в дальнейшем осуществлять все операции.

Тот набор записей, который мы получили, в принципе, он весь будет содержать все записи регистра сведений, после того как мы его прочтем, а нам нужно обработать только часть этого набора. Поэтому мы в строках //2 и //3 накладываем отборы на регистр сведений. Имейте в виду, что отбор в регистрах сведений можно устанавливать только на равенство! В строка //4 мы прочитали данные регистра сведений, и теперь можем к объекту РегистрЦены обращаться как к коллекции. Что мы и делаем в цикле ниже – мы обходим коллекцию, и в каждой итерации цикла изменяем цену (строка //5). В строке //6 просто записываем объект РегистрЦены, после этого наши изменения появятся в базе.

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

Если мы попробуем так сделать, то возникнет ошибка «Недопустимый тип сравнения».

Поэтому приходится выдумывать различные методы. Я покажу два из них. В первом мы с помощью запроса получим данные из регистра с отбором по нужному виду цен (это будут все данные), и изменим в поле запроса цены, которые будут входить в заданный период.  После этого получим выгрузку из запроса. Создадим набор записей регистра накопления с отбором по нужному виду цен (это обязательно, иначе мы затрем всё остальное), прочитаем этот отбор и загрузим в него нашу выгрузку из  запроса. После того как мы запишем регистр, обновятся все записи для данного вида цен, но только у тех, которые входят в период, пересчитается дата. Код данного алгоритма ниже. Период – это реквизит формы с типом СтандартныйПериод.

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

Замерим производительность этого способа.

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

&НаСервере
Процедура ИзменитьЦенуНаСервере()
РегистрЦены = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
РегистрЦены.Отбор.ВидЦен.Установить(ВидЦены);
РегистрЦены.Прочитать();
ТаблицаСРегистра = РегистрЦены.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
|    ТаблицаВыгрузки.Период КАК Период,
|    ТаблицаВыгрузки.ВидЦен КАК ВидЦен,
|    ТаблицаВыгрузки.Товар КАК Товар,
|    ТаблицаВыгрузки.Цена КАК Цена
|ПОМЕСТИТЬ втТаблица
|ИЗ
|    &ТаблицаВыгрузки КАК ТаблицаВыгрузки
|
|ИНДЕКСИРОВАТЬ ПО
|    ВидЦен,
|    Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    втТаблица.Период КАК Период,
|    втТаблица.ВидЦен КАК ВидЦен,
|    втТаблица.Товар КАК Товар,
|    ВЫБОР
|        КОГДА втТаблица.Период >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
|                И втТаблица.Период <= КОНЕЦПЕРИОДА(&ДатаКонца, ДЕНЬ)
|            ТОГДА втТаблица.Цена * ((100 + &ПроцентЦены) / 100)
|        ИНАЧЕ втТаблица.Цена
|    КОНЕЦ КАК Цена
|ИЗ
|    втТаблица КАК втТаблица»;
Запрос.УстановитьПараметр(«ДатаНачала»,Период.ДатаНачала);
Запрос.УстановитьПараметр(«ДатаКонца»,Период.ДатаОкончания);
Запрос.УстановитьПараметр(«ТаблицаВыгрузки»,ТаблицаСРегистра);
Запрос.УстановитьПараметр(«ПроцентЦены»,Процент);
Результат = Запрос.Выполнить();
Выгрузка = Результат.Выгрузить();
РегистрЦены.Загрузить(Выгрузка);
РегистрЦены.Записать();
КонецПроцедуры

Подробности об использовании таблиц значений в запросах Вы узнаете в моем курсе «Запрос в 1С: от новичка до профи».
Если брать мои замеры производительности, то первый способ в разы быстрее второго.

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

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

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

В этом коде я при помощи виртуальной таблицы регистра сведений СрезПоследних получаю все товары и цены на текущую дату. Подробно о работе виртуальных таблиц регистров сведений смотрите в моем курсе «Запрос в 1С: от новичка до профи». Потом мы отбираем все записи регистра сведений на текущую дату и очищаем их на всякий случай. А дальше используя функцию Добавить() набора записей регистра, добавляем что нам нужно.

Изучайте основы конфигурирования в 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

На чтение 7 мин Просмотров 17.8к. Опубликовано 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.

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

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

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

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

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

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

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

//добавляем новую запись
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

//записываем набор записей
НаборЦен.Записать();

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

Если при записи не устанавливать отбор, то будет перезаписан весь регистр сведений, все предыдущие записи будут удалены:

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

//добавляем новую запись
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

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

Можно установить отбор только по одному измерению и сразу добавить несколько записей:

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

//добавляем новую запись
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

//добавляем еще одну запись
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 850;

//записываем набор записей
НаборЦен.Записать();

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

Но если в метод Записать набора записей передать параметр Ложь, то запись будет выполнена с добавлением новых записей:

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

//добавляем новую запись
//не устанавливаем отбор в регистре сведений
//так как будем записывать с добавлением
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

//записываем набор записей с добавлением
НаборЦен.Записать(Ложь);

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

Если попытаться добавить в регистр сведений записи, которые не совпадают с установленным отбором, то будет выброшено исключение «Запись не верна! Значение поля не соответствует установленному отбору»:

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

//добавляем новую запись, но товар записываем не тот, который указали в отборе
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

//записываем набор записей
НаборЦен.Записать(); //НЕ ЗАПИШЕТСЯ

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

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

//добавляем новые записи
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 950;

//записываем набор записей
НаборЦен.Записать();

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

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

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

Для Каждого ЗаписьРег Из НаборЦен Цикл
	Сообщить(ЗаписьРег.Период);
	Сообщить(ЗаписьРег.Цена);
КонецЦикла;	

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

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

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

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

//записываем пустой набор записей
НаборЦен.Записать();

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

//создаем набор записей регистра сведений
НаборЦен = РегистрыСведений.ЦеныНаТовары.СоздатьНаборЗаписей();
//записываем пустой набор записей
НаборЦен.Записать();
//регистр сведений будет очищен

Если регистр сведений подчинен регистратору, то нужно устанавливать отбор по документу-регистратору:

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

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

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

В данном примере мы удалили все записи, у которых цена больше или равна 500. Но можно было решить ее от обратного: выбрать все записи, у которых цена меньше 500, создать набор записей и загрузить в него результат запроса. Так как отбор не был установлен, то весь регистр будет перезаписан и в нем останутся только те записи, где цена меньше 500:

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

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

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

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

//перебираем в цикле записи
Для Каждого ЗаписьРег Из НаборЦен Цикл
	//увеличиваем на 10%
	ЗаписьРег.Цена = ЗаписьРег.Цена * 1.1;	
КонецЦикла;	

//записываем набор записей
НаборЦен.Записать();

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

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

	//записываем набор записей
	НаборЦен.Записать();
КонецЦикла;	

Если регистр сведений подчинен регистратору, то отбор нужно устанавливать по регистратору:

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

	//записываем набор записей
	НаборЦен.Записать();
КонецЦикла;	

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

Менеджер записи регистра сведений используется при интерактивном редактировании записи регистра сведений. Когда мы открываем форму записи, то чтение выполняется именно через менеджер записи. Когда нажимаем на форме записи кнопку Записать, то запись выполняется через менеджер записи.

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

Менеджер записи можно создать программно:

//добавление записи в регистр сведений
//через менеджер записи
МенеджерЦен = РегистрыСведений.ЦеныНаТовары.СоздатьМенеджерЗаписи();
МенеджерЦен.Товар = СсылкаНаТовар;
МенеджерЦен.ТипЦен = СсылкаНаТипЦен;
МенеджерЦен.Период = Дата(2021,4,1);
МенеджерЦен.Цена = 500;
МенеджерЦен.Записать();

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

//удаление записи из регистра сведений
//через менеджер записи
МенеджерЦен = РегистрыСведений.ЦеныНаТовары.СоздатьМенеджерЗаписи();
МенеджерЦен.Товар = СсылкаНаТовар;
МенеджерЦен.ТипЦен = СсылкаНаТипЦен;
МенеджерЦен.Период = Дата(2021,4,1);
МенеджерЦен.Удалить();

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

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

Для примера добавим в модуль набора записей следующий код:

Процедура ПередЗаписью(Отказ, Замещение)
	Сообщить("Товар: " + ЭтотОбъект.Отбор.Товар);
	Сообщить("Количество: " + ЭтотОбъект.Количество());
КонецПроцедуры

Откроем форму записи для товара Шкаф, изменим измерение товар на Тумбочку и запишем. В сообщениях увидим следующий результат:

Сначала был записан старый пустой набор записей с товаром Шкаф, а потом новый с товаром Тумбочка.

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

Программную работу с набором записей регистра сведений рассмотрим на примерах:

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

//количество записей набора
Колво = НаборЦен.Количество(); //0

//чтение набора записей из базы
НаборЦен.Прочитать();
Колво = НаборЦен.Количество(); //6

//добавление записей
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 750;

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

//удаление всех записей набора
НаборЦен.Очистить();

//загрузка из таблицы значений
НаборЦен.Загрузить(ТаблицаЦен);

//удаление первой записи набора
НаборЦен.Удалить(0);

//выгрузка одной колонки в массив
МассивТоваров = НаборЦен.ВыгрузитьКолонку("Товар");
//загружаем обратно
НаборЦен.ЗагрузитьКолонку(МассивТоваров, "Товар");

//сумма всех цен
Итог = НаборЦен.Итог("Цена");

//запись набора
НаборЦен.Записать();

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

Так как регистр сведений относится к необъектным данным, то у него нет реквизита Ссылка. Если нужно сослаться на определенную запись регистра, то можно использовать Ключ записи. Ключ записи можно создать через конструктор или через менеджер регистра сведений методом СоздатьКлючЗаписи:

//пустой ключ
ПустойКлюч = Новый(«РегистрСведенийКлючЗаписи.ЦеныНаТовары»);
//можно через менеджер
ПустойКлюч = РегистрыСведений.ЦеныНаТовары.ПустойКлюч();

//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить(«Период», Дата(2021,4,1));
ЗначенияКлюча.Вставить(«Товар», СсылкаНаТовар);
ЗначенияКлюча.Вставить(«ТипЦен», СсылкаНаТипЦен);
КлючНаЗапись = РегистрыСведений.ЦеныНаТовары.СоздатьКлючЗаписи(ЗначенияКлюча);

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

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