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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 − восемь =