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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наши разработки:
Учет сертификатов номенклатуры в УНФ (печать реестра сертификатов)

Учет сертификатов номенклатуры в УНФ (печать реестра сертификатов)

Расширение конфигурации добавит возможность вести учет сертификатов номенклатуры в конфигурации "Управление нашей фирмой, редакция 1.6". Вы сможете организовать учет сертификатов ...
Обмен 1С и OZON (УТ11, ERP2, КА2, БП3, УНФ, Розница)

Обмен 1С и OZON (УТ11, ERP2, КА2, БП3, УНФ, Розница)

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

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

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

Управление запасами: Товары поставщиков (УТ11, КА2, ERP2)

Функционал расширения конфигурации позволяет в удобной форме автоматически загружать прайс-листы поставщиков в 1С, анализировать загруженные данные, автоматически устанавливать цены с ...
Изменение записей регистра сведений (универсальная обработка)

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

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

Остатки товаров в РМК (УТ11, КА2, ERP2)

Расширение конфигурации добавит возможность просматривать остатки по складу для выбранных в РМК (рабочее место кассира) товаров. При этом Вы сможете ...

Комментарии 5

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

    Условие » Если Набор.Количество() Тогда » должно быть Если Набор.Количество()>0 Тогда

  • Здравствуйте, А где прописывать процедуры для изменения записей то, а то код есть, а где его применять не указано?

    • Добрый день!
      Если это разовое применение — обычно это делается во внешней обработке.

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

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