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

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

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

Я
   simol

26.09.06 — 10:24

Есть регистр сведений имеющий 4 измерения. Мне надо в записях регистра сведений значения первого измерения равные ЗНАЧЕНИЕ1 заменить на ЗНАЧЕНИЕ2. Регистр непериодический.

Как это лучше сделать кроме удалить строки со ЗНАЧЕНИЕМ1 и записать новые со ЗНАЧЕНИЕ2?

   ZolotarevAA

1 — 26.09.06 — 10:39

(0) Ничего не удалять. Просто заменить значения.

   Рассада

2 — 26.09.06 — 10:46

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

НаборЗаписей.Отбор.Изм1.Установить(Значение1);

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

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

//меняем значение измерения записи

КонецЦикла;

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

   simol

3 — 26.09.06 — 12:40

(2)Я добавил строку

НаборЗаписей.Отбор.Изм1.Использовать = Истина;

Но при записи ошибка. Мне кажется в том, что отбор какраз по тому измерению, которое я меняю и при записи измерение наверно не соответсвует отбору.

   Рассада

4 — 26.09.06 — 13:51

Наверное, тогда могу предложить только менять в цикле.

   simol

5 — 26.09.06 — 14:52

Сделал так

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

           НаборЗаписей.Отбор.Номенклатура.Значение = ПоНоменклатуре.Номенклатура;

           НаборЗаписей.Отбор.Номенклатура.Использование = Истина;

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

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

           НовыйНабор.Отбор.Номенклатура.Значение = Комплект.Ссылка;

           НовыйНабор.Отбор.Номенклатура.Использование = Истина;

           НовыйНабор.Загрузить(НаборЗаписей.Выгрузить());

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

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

               Запись.Номенклатура = Комплект.Ссылка;

           КонецЦикла;

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

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

   simol

6 — 26.09.06 — 14:54

Так лучше:

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

           НаборЗаписей.Отбор.Номенклатура.Значение = ПоНоменклатуре.Номенклатура;

           НаборЗаписей.Отбор.Номенклатура.Использование = Истина;

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

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

           НовыйНабор.Отбор.Номенклатура.Значение = Комплект.Ссылка;

           НовыйНабор.Отбор.Номенклатура.Использование = Истина;

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

           ВременнаяТаблица.ЗаполнитьЗначения(Комплект.Ссылка, «Номенклатура»);

           НовыйНабор.Загрузить(Загрузить);

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

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

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

  

simol

7 — 26.09.06 — 15:12

+(6)

          …НовыйНабор.Загрузить(ВременнаяТаблица);…

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

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

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

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

	// Создадим набор записей и для плана обмена определим, что выпоняется загрузка данных:
	НаборЗаписей = РегистрыСведений[ИмяРегистраСведений].СоздатьНаборЗаписей();
	НаборЗаписей.ОбменДанными.Загрузка = Истина;

	// запрос к регистру:
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("МассивСтарыхЗначенийИзмерения",	МассивСтарыхЗначенийИзмерения);
	Запрос.УстановитьПараметр("НовоеЗначениеИзмерения",			НовоеЗначениеИзмерения);

	// Подготовим таблицу значений для позиционирования (установки отбора) на нужных записях регистра:
	Запрос.Текст =
	"ВЫБРАТЬ *
	|ИЗ
	|	РегистрСведений." + ИмяРегистраСведений + " КАК Регистр
	|ГДЕ
	|	Регистр." + ИмяИзменяемогоИзмерения + " В (&МассивСтарыхЗначенийИзмерения)" + ДопУсловие;

	Сообщить("1 Приступаем к выполнению запроса к данным регистра """ + ИмяРегистраСведений + """ - " + ТекущаяДата());

	ТаблицаЗаполнения = Запрос.Выполнить().Выгрузить();
	Сообщить("2 Приступаем к обработке результата запроса к регистру """ + ИмяРегистраСведений + """ - " + ТекущаяДата());

	МаксимальноеЗначениеИндикатора = ТаблицаЗаполнения.Количество();

	// заполнение строки progress bar
	ЭлементыФормы.Индикатор2.Значение = 0; // обнуляем, чтобы при повторном запуске статусбар сбросился в 0
	ЭлементыФормы.Индикатор2.МаксимальноеЗначение = МаксимальноеЗначениеИндикатора; // задаем значение для 100%

	Старт = ТекущаяДата();
	ОчереднойСтарт = Старт;

	// переменные для организации прерывания(задержки) - подробнее про организацию цикла задержки выполнения модуля см. http://www.1c-h.ru/?p=2529
	// ПроцентеВыполненния - это реквизит формы (доступный пользователю для редактирования), в котором хранится размер "порции", по порохождению которой нужно приостановить выполнение
	ШагПрерывания = 1;
	ЧислоПрерывания = МаксимальноеЗначениеИндикатора * ПроцентеВыполненния / 100;

	ШестьУтраТекущегоДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 21600);
	ОдиннадцВечераТекДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 82800);
	ШестьУтраСледующгДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 108000);

	// для каждой строки таблицы значений установим отбор и перезапишем регистр
	Для Каждого СтрокаЗаполнения Из ТаблицаЗаполнения Цикл

		ТекущийПН = ЭлементыФормы.Индикатор2.Значение + 1; // - текущий порядковый номер обрабатываемой строки таблицы
		ЭлементыФормы.Индикатор2.Значение = ТекущийПН; // - указываем прирост внутри цикла для ползущего индикатора выполнения обработки

		// посчитаем, сколько времени затрачено и прикинем сколько времени осталось
		// для вывода на морду формы: уже затрачено времени:
		ЗатраченоВремени = ТекущаяДата() - Старт;
		// для вывода на морду формы: затрачено времени на обработку одной строки таблицы:
		ВремениНаЕдиницу = Окр(ЗатраченоВремени / ТекущийПН,8);
		// для вывода на морду формы: времени на выполнение еще требуется:
		ОсталосьВремени = Окр((МаксимальноеЗначениеИндикатора - ТекущийПН)*ВремениНаЕдиницу/60);

		Если ПрерватьНаПроцентахВыполнения И ТекущийПН > ЧислоПрерывания Тогда // ПрерватьНаПроцентахВыполнения - булево, галочка в форме о необходимости задержки выполнения
			// в дневное время цикл задержки:
			Если ТекущаяДата() > ШестьУтраТекущегоДня И ТекущаяДата() < ОдиннадцВечераТекДня Тогда // это день
				// сделаем паузу, чтобы рассосались блокировки
				// в этом цикле мы умножаем количество заданных секунд задержки для дня (СекундЗадержкиДнем) на номер шага прерывания, тем самым определяя, очередную порцию задержки относительно Текущего Времени
				Пока (ТекущаяДата() - Старт) < СекундЗадержкиДнем * ШагПрерывания Цикл
				КонецЦикла;
			// ночное время:
			ИначеЕсли ТекущаяДата() > ОдиннадцВечераТекДня И ТекущаяДата() < ШестьУтраСледующгДня Тогда
				// сделаем паузу, чтобы рассосались блокировки
				// в этом цикле мы умножаем количество заданных секунд задержки для ночи (СекундЗадержкиНочью) на номер шага прерывания, тем самым определяя, очередную порцию задержки относительно Текущего Времени
				Пока (ТекущаяДата() - Старт) < СекундЗадержкиНочью * ШагПрерывания Цикл
				КонецЦикла;
			КонецЕсли;
			//следующее число прерывания и очередной шаг прывания:
			ШагПрерывания = ШагПрерывания + 1;
			ЧислоПрерывания = МаксимальноеЗначениеИндикатора * ПроцентеВыполненния * ШагПрерывания / 100;

		КонецЕсли;
		// 1 - Сначала удалим записи, которые нужно удалить, запомнив слагаемые ресурсы во временной таблице значений "тзСлагаемых"

		// очистим таблицу слагаемых от строк:
		тзСлагаемых.Очистить();

		// для каждого элемента отбора определяем отбор для нашего набора записей по значению этой же графы в текущей строке из таблицы - резултата запроса:
		Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл
			ЭлементОтбора.Установить(СтрокаЗаполнения[ЭлементОтбора.Имя])
		КонецЦикла;

		НаборЗаписей.Прочитать(); // - сейчас в этом наборе записей одна строка регистра с уникальным набором измерений и с данными для слагаемых ресурсов

		Для Каждого текЗаписьНабора Из НаборЗаписей Цикл // строка в наборе записей тут одна, ну да ладно, надо же ее как-то получить ,почему бы не в цикле

			СтрокаСлагаемых = тзСлагаемых.Добавить();
			// запомним слагаемые в соответсвующих колонках:
			Для каждого ИмяКолонки Из МассивИменСлагаемыхРесурсов Цикл
				СтрокаСлагаемых[ИмяКолонки] = текЗаписьНабора[ИмяКолонки];
			КонецЦикла; // все, на выходе из цикла строка заполнена

			// Удаление и перезапись делаем в одной транзакции
			НачатьТранзакцию();

			НаборЗаписей.Удалить(текЗаписьНабора); // удаляем устаревшую запись из регистра
			НаборЗаписей.Записать(); // пока не запишем, удаление не подействует?

			// 2 - Теперь добавим новую строку с измененным значением измерения или приплюсуем суммируемые поля в уже существующую, если строка с таким набором измерений уже была

			// создаем менеджер записи
			текЗапись = РегистрыСведений[ИмяРегистраСведений].СоздатьМенеджерЗаписи();

			// заполним все поля новой записи из текущей строки таблицы с результатом запроса
			ЗаполнитьЗначенияСвойств(текЗапись, СтрокаЗаполнения);
			////// или то же самое можно сделать в цикле:
			////Для Каждого КолонкаТЗ Из ТаблицаЗаполнения.Колонки Цикл
			////	текЗапись[КолонкаТЗ.Имя] = СтрокаЗаполнения[КолонкаТЗ.Имя]; // заполнили пока полным набором страых значений
			////КонецЦикла;

			// подменим заменяемое измерение:
			текЗапись[ИмяИзменяемогоИзмерения] = НовоеЗначениеИзмерения;

			// ответственный момент: читаем эту запись (фактически пытаемся спозиционироваться - с проверкой, может уже существует), кстати, если эту команду не выполнить, то весь регистр очиститься как нечего делать, так что тут аккуратнее
			текЗапись.Прочитать();

			Если текЗапись.Выбран() Тогда // спозиционироваться удалось, значит такая запись уже существует и нужно складывать слагаемые ресурсы

				//текЗапись.Количество = текЗапись.Количество + Количество;
				Для каждого ИмяРесурса Из МассивИменСлагаемыхРесурсов Цикл
					текЗапись[ИмяРесурса] = текЗапись[ИмяРесурса] + СтрокаСлагаемых[ИмяРесурса];
				КонецЦикла;

				// записываем изменения в регистре
				текЗапись.Записать();

			Иначе // спозиционироваться не удалось, нужно добавить новую запись, слагаемые ресурсы можно просто записать

				//текЗапись.Записать();
				СтрокаЗаполнения[ИмяИзменяемогоИзмерения] = НовоеЗначениеИзмерения; // запишем новое значение в таблицу, чтобы установить по нему отбор и приплюсовать количество

				// создаем менеджер записи
				НовЗапись = РегистрыСведений[ИмяРегистраСведений].СоздатьМенеджерЗаписи();

				// заполним все поля новой записи из текущей строки таблицы с результатом запроса
				ЗаполнитьЗначенияСвойств(НовЗапись, СтрокаЗаполнения);
				НовЗапись.Записать();

			КонецЕсли;

			// Удаление и перезапись делаем в одной транзакции
			ЗафиксироватьТранзакцию();
		КонецЦикла;

		// очищаем для следующего использования:
		НаборЗаписей.Очистить();

	КонецЦикла;
	Сообщить("3 Окончание исправления  регистра """ + ИмяРегистраСведений + """ - " + ТекущаяДата());

КонецПроцедуры //ЗаменаРесурсаНезависимогоРегистра()

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

Next Post

  • v8

  • Программисту 1C

Чт Апр 14 , 2011

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

Breaking News

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Регистры сведений в 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
КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     +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(), Штрихкод);
    Попытка
    ТекЗапись.Записать();
    Исключение
    КонецПопытки;
    Иначе
    НайденныйШтрихкод = Выборка.Штрихкод;
    ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
    ТекЗапись.Штрихкод = НайденныйШтрихкод;
    ТекЗапись.Прочитать();

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

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Выбрать записи из регистра сведений

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

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

    МенеджерЗаписи

    = Выборка.ПолучитьМенеджерЗаписи();
    МенеджерЗаписи.Прочитать();//Изменить существующую запись
    МенеджерЗаписи.Валюта = Валюта;
    МенеджерЗаписи.Период = ТекущаяДата();
    МенеджерЗаписи.Курс = 10.00;
    МенеджерЗаписи.Записать();//Удалить существующую запись
    МенеджерЗаписи.Удалить();КонецЦикла;

    Добавить, изменить, удалить запись

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

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

    Добавить, изменить, удалить набор записей

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

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

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

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

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

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

    Вступайте в мою группу помощник программиста.
    В ней мы обсуждаем программирование в 1С.

    /// Как прочитать записи регистра сведений
    /// в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакПрочитатьЗаписиРегистраСведенийНаСервере()
     
        // Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов"
        // для организации ООО "Ромашка", упорядоченные по дате.
     
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ЦенаНаЕдуДляКлиентов.Период,
            |   ЦенаНаЕдуДляКлиентов.Регистратор,
            |   ЦенаНаЕдуДляКлиентов.НомерСтроки,
            |   ЦенаНаЕдуДляКлиентов.Активность,
            |   ЦенаНаЕдуДляКлиентов.Номенклатура,
            |   ЦенаНаЕдуДляКлиентов.Контрагент,
            |   ЦенаНаЕдуДляКлиентов.Организация,
            |   ЦенаНаЕдуДляКлиентов.Цена
            |ИЗ
            |   РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов
            |ГДЕ
            |   ЦенаНаЕдуДляКлиентов.Активность = Истина И
            |   ЦенаНаЕдуДляКлиентов.Организация = &ВыбОрганизация
            |УПОРЯДОЧИТЬ ПО
            |   ЦенаНаЕдуДляКлиентов.Период";
     
        Запрос.УстановитьПараметр(
            "ВыбОрганизация",
            Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
        );
     
        РезультатЗапроса = Запрос.Выполнить();
     
        Записи = РезультатЗапроса.Выбрать();
     
        Пока Записи.Следующий() Цикл
     
            Сообщить(
                "[" + Записи.Период + "] " +
                Записи.Контрагент + " " +
                Записи.Номенклатура + " " +
                Записи.Цена + " руб."
            );
     
        КонецЦикла;
     
    КонецПроцедуры
     
    /// Как получить наиболее поздние записи (срез последних)
    /// регистра сведений на указанную дату (включительно)
    /// в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакПолучитьНаиболееПоздниеЗаписиРегистраСведенийНаСервере()
     
        // За возможности выборки наиболее поздних записей регистра
        // сведений (среза последних) в разрезе заданной аналитики
        // отвечает виртуальная таблица СрезПоследних.
        // У неё есть следующие параметры:
        // 1. Период (включительно)
        // 2. Условие (например, Организация = &ВыбОрганизация)    
     
        // Получим цены на бананы для каждого контрагента
        // на конец 1 квартала 2014 года (включительно)
        // по организации ООО "Ромашка".
     
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Период,
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Активность,
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Номенклатура,
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент,
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Организация,
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Цена
            |ИЗ
            |   РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПоследних(
            |       ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
            |       Активность = Истина И
            |       Организация = &ВыбОрганизация И
            |       Номенклатура = &ВыбНоменклатура
            |   ) КАК ЦенаНаЕдуДляКлиентовСрезПоследних
            |УПОРЯДОЧИТЬ ПО
            |   ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент";
     
        Запрос.УстановитьПараметр("ВыбОрганизация",
            Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
        );
        Запрос.УстановитьПараметр("ВыбНоменклатура",
            Справочники.Номенклатура.НайтиПоНаименованию("Банан")
        );
     
        РезультатЗапроса = Запрос.Выполнить();
     
        Записи = РезультатЗапроса.Выбрать();
     
        Пока Записи.Следующий() Цикл
            Сообщить(
                "[" + Записи.Контрагент + ", " + Записи.Период + "] " +            
                Записи.Номенклатура + " " +
                Записи.Цена + " руб."
            );
        КонецЦикла;
     
    КонецПроцедуры
     
    /// Как получить наиболее ранние записи (срез первых)
    /// регистра сведений на указанную дату (включительно)
    /// в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакПрочитатьНаиболееРанниеЗаписиРегистраСведенийНаСервере()    
     
        // За возможности выборки наиболее ранних записей регистра
        // сведений (среза первых) в разрезе заданной аналитики
        // отвечает виртуальная таблица СрезПервых.
        // У неё есть следующие параметры:
        // 1. Период (включительно)
        // 2. Условие (например, Организация = &ВыбОрганизация)    
     
        // ! Нужно внимательно вдуматься. СрезПервых получает по каждой
        // комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ
        // РАННЮЮ, чем указанная дата.    
     
        // Получим самые первые цены, которые были установлены на бананы
        // для каждого контрагента в 2014 году (включительно)
        // по организации ООО "Ромашка".
     
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Период,
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Активность,
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Номенклатура,
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент,
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Организация,
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Цена
            |ИЗ
            |   РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПервых(
            |       ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
            |       Активность = Истина И
            |       Организация = &ВыбОрганизация И
            |       Номенклатура = &ВыбНоменклатура
            |   ) КАК ЦенаНаЕдуДляКлиентовСрезПервых
            |УПОРЯДОЧИТЬ ПО
            |   ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент";
     
        Запрос.УстановитьПараметр("ВыбОрганизация",
            Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
        );
        Запрос.УстановитьПараметр("ВыбНоменклатура",
            Справочники.Номенклатура.НайтиПоНаименованию("Банан")
        );
     
        РезультатЗапроса = Запрос.Выполнить();
     
        Записи = РезультатЗапроса.Выбрать();
     
        Пока Записи.Следующий() Цикл
            Сообщить(
                "[" + Записи.Контрагент + ", " + Записи.Период + "] " +
                Записи.Номенклатура + " " +
                Записи.Цена + " руб."
            );
        КонецЦикла;
     
    КонецПроцедуры
     
    /// Как найти и изменить програмно записи в регистр сведений
    /// документа в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере()
     
        // Предположим, у нас есть ссылка на проведенный документ
        // "Установка цен на еду" № ВМБП-000001
     
        УстановкаЦенСсылка =
            Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
                "ВМБП-000001", '20141231'
            );
     
        // Мы знаем, что этот документ делает записи в регистр
        // сведений "ЦенаНаЕдуДляКлиентов":
        // [Организация, Контрагент, Номенклатура] [Цена]
     
        // Наша задача: найти эти записи и изменит их (например, удвоим
        // цену) и записать вместо старых.
     
        // Используем объектную технику получения записей,
        // ведь мы будем их изменять.
     
        УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();
     
        // Получим набор записей этого документа в регистр
        // "ЦенаНаЕдуДляКлиентов"
     
        НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов;
     
        // Прочитаем записи из базы данных.
     
        НаборЗаписей.Прочитать();
     
        Для Каждого Запись Из НаборЗаписей Цикл
     
            // Выведем старые значения.
            Сообщить(
                "[" + Запись.Организация + ", " +
                Запись.Контрагент + ", " + 
                Запись.Номенклатура + "] " +
                "[" + Запись.Цена + "]"
            );
     
            Запись.Цена = Запись.Цена * 2;
     
        КонецЦикла;
     
        // Добавим новую запись.
     
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Период = ТекущаяДата();
        НоваяЗапись.Организация = 
            Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
        НоваяЗапись.Контрагент =
            Справочники.Контрагенты.НайтиПоНаименованию("Петров Ю.В.");
        НоваяЗапись.Номенклатура =
            Справочники.Номенклатура.НайтиПоНаименованию("Банан");
        НоваяЗапись.Цена = 500;    
     
        // Разом запишем набор записей.
        НаборЗаписей.Записать(
            Истина // Удалим старые записи и запишем вместо них новые.
        );
     
        // Теперь записи регистра "ЦенаНаЕдуДляКлиентов" для документа
        // № ВМБП000001, отличаются от тех, что были записаны
        // документом при проведении. Чтобы вернуть их к начальному виду
        // нужно заново провести документ.
     
    КонецПроцедуры
     
    /// Как прочитать записи документа в регистр сведений запросом
    /// в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере()    
     
        // Этот прием используется, если не требуется изменять
        // найденные записи.
     
        // Предположим, у нас есть ссылка на проведенный документ
        // "Установка цен на еду" № ВМБП-000001
     
        УстановкаЦенСсылка =
            Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
                "ВМБП-000001", '20141231'
            );
     
        // Мы знаем, что этот документ делает записи в регистр
        // сведений "ЦенаНаЕдуДляКлиентов".
        // Прочитаем эти записи запросом.
     
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ЦенаНаЕдуДляКлиентов.Период,
            |   ЦенаНаЕдуДляКлиентов.Регистратор,
            |   ЦенаНаЕдуДляКлиентов.НомерСтроки,
            |   ЦенаНаЕдуДляКлиентов.Активность,
            |   ЦенаНаЕдуДляКлиентов.Номенклатура,
            |   ЦенаНаЕдуДляКлиентов.Контрагент,
            |   ЦенаНаЕдуДляКлиентов.Организация,
            |   ЦенаНаЕдуДляКлиентов.Цена
            |ИЗ
            |   РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов
            |ГДЕ
            |   ЦенаНаЕдуДляКлиентов.Регистратор = &ВыбРегистратор
            |УПОРЯДОЧИТЬ ПО
            |   ЦенаНаЕдуДляКлиентов.НомерСтроки";
     
        Запрос.УстановитьПараметр(
            "ВыбРегистратор",
            УстановкаЦенСсылка
        );
     
        РезультатЗапроса = Запрос.Выполнить();
     
        Записи = РезультатЗапроса.Выбрать();
     
        Пока Записи.Следующий() Цикл
            Сообщить(
                "[" + Записи.Организация + ", " +
                Записи.Контрагент + ", " + 
                Записи.Номенклатура + "] " +
                "[" + Записи.Цена + "] <" +
                Записи.Регистратор + ">"
            );
        КонецЦикла;
     
    КонецПроцедуры
     
    /// Как создать записи в регистр сведений без привязки к
    /// документу в 1с 8.3, 8.2
     
    &НаСервере
    Процедура КакСоздатьЗаписиБезПривязкиКДокументуНаСервере()
     
        // Создавать записи в регистре сведений без привязки
        // к документу можно только для регистров, у которых
        // выбран режим записи "Независимый". В нашей конфигурации
        // таким регистром является "КурсВалют".    
        // Если бы мы захотели проделать такую же штуку для
        // регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось
        // воспользоваться документом "ОперацияБух" или им подобным
        // для ручных операций (см. аналогичный пример в регистрах
        // накопления).
     
        // Пример №1.
     
        // Для единичных записей удобно пользоваться менеджером
        // записей.
     
        НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
        НоваяЗапись.Период = '20140101';
        НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар");
        НоваяЗапись.Курс = 30;
        НоваяЗапись.Записать(
            Истина // замещать, если уже есть запись с такими же измерениями
            // и таким же периодом
        );
     
        // Пример №2.
     
        // При помощи менеджера можно также легко
        // менять или удалять единичные записи.
        // Найдём, изменим, а затем удалим созданную запись.
     
        Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101');
        Если Выборка.Следующий() Тогда
            Запись = Выборка.ПолучитьМенеджерЗаписи();
            // изменим
            Запись.Прочитать();
            Запись.Курс = 25;
            // запишем
            Запись.Записать(Истина);
            // и тут же удалим
            Запись.Удалить();
        КонецЕсли;
     
        // Пример №3.
     
        // Если нужно изменить сразу много записей - 
        // удобнее всего использовать набор записей.
     
        // Запишем курсы валют за первые 3 дня 2014 года.
     
        Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар");
     
        НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Валюта.Установить(Доллар);    
     
        Запись01 = НаборЗаписей.Добавить();
        Запись01.Период = '20140101';
        Запись01.Валюта = Доллар;
        Запись01.Курс = 30;
     
        Запись02 = НаборЗаписей.Добавить();
        Запись02.Период = '20140102';
        Запись02.Валюта = Доллар;
        Запись02.Курс = 40;
     
        Запись03 = НаборЗаписей.Добавить();
        Запись03.Период = '20140103';
        Запись03.Валюта = Доллар;
        Запись03.Курс = 60;
     
        // Запишем весь набор разом.
     
        НаборЗаписей.Записать(
            Истина // затрём все другие записи по 
            // доллару (мы установили его в отборе)
        );
     
    КонецПроцедуры
     
    /// Скачать и выполнить эти примеры на компьютере

    Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Как изменить значение дополнительного реквизита 1с
  • Как изменить значение диафрагмы на sony
  • Как изменить значение боковых кнопок на мышке
  • Как изменить значение бита на противоположное
  • Как изменить значение атрибута через css

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии