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

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

Рекомендуем Вам тестовое изменение записей в регистре сведений выполнять на копии информационной базы.

Если Вы нуждаетесь в готовом решении по быстрому изменению записей регистра сведений — обратите внимание на нашу разработку Изменение записей регистра сведений​. Обработка позволит Вам решить все задачи по изменению записей в регистре сведений и значительно сэкономить время на разработку аналогичного решения!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наши разработки:
Расширенная форма списка номенклатуры для УТ11, КА2, ERP2

Расширенная форма списка номенклатуры для УТ11, КА2, ERP2

Расширение конфигурации позволяет выводить остатки по всем необходимым складам, отображать цены номенклатуры в списке и применять различные отборы. После установки ...
Далее
Конструктор прайс-листов (прайс-заказов) для УТ11, КА2, ERP2

Конструктор прайс-листов (прайс-заказов) для УТ11, КА2, ERP2

Расширение позволяет формировать произвольные прайс-листы с выгрузкой в Excel и обратной загрузкой в 1С (после обработки прайс-листа клиентом). Конструктор также ...
Далее
Помощник продаж (расширение для УТ11, КА2, ERP2)

Помощник продаж (расширение для УТ11, КА2, ERP2)

Помощник продаж выполнен в виде расширения конфигурации 1С, которое существенно дополняет возможности стандартного списка номенклатуры, превращая его в полноценное рабочее ...
Далее
Розница: Расширенная форма списка номенклатуры

Розница: Расширенная форма списка номенклатуры

Расширение конфигурации изменяет форму списка номенклатуры и добавляет в него функционал, позволяющий выводить остатки по любому складу, цены номенклатуры и ...
Далее
Контроль минимальной цены в заказах и реализациях (УТ11, КА2, ERP2)

Контроль минимальной цены в заказах и реализациях (УТ11, КА2, ERP2)

Расширение конфигурации позволяет быстро решить проблему продажи товара по цене ниже закупочной или цены себестоимости. Контроль будет работать в разрезе ...
Далее
Удаление записей регистра сведений (универсальная обработка)

Удаление записей регистра сведений (универсальная обработка)

Обработка позволяет по расширенному отбору удалять записи в регистре сведений. Если отбор не задан - будет выполнена полная очистка. Поддерживается ...
Далее

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

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

16 − тринадцать =