Как заменить значение ресурса регистра сведений — универсальная процедура (1С: Программисту: Регистры сведений)

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

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

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

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

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

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

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

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

		ЭлементыФормы.Индикатор2.Значение = ЭлементыФормы.Индикатор2.Значение + 1; //указываем прирост внутри цикла

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

		ЗаполнитьЗначенияСвойств(текЗапись, СтрокаЗаполнения);

		// прочитаем эту запись (внимание, эта команда обязательна, иначе можно ненароком очистить весь регистр!)
		текЗапись.Прочитать();

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

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

		Иначе // спозиционироваться не удалось, можно выходить
			Сообщить("Возникла проблема определения " + НовоеЗначениеРесурса + " в регистре через менеджер записи " + НовоеЗначениеРесурса);
		КонецЕсли;

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

Здесь можно скачать пример обработки замены ресурса и измерения (в зависимости от регистра) «ПартияТовара» во всех регистрах сведений на примере конфигурации логистики: [download id=»6″]
В этой обработке используется приведенная тут универсальная процедура — можно посмотреть пример ее использования.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *