1с регистр сведений найти запись по реквизиту

Регистр сведение. Как получить запись по реквизиту?

Я
   VanoZZZ

21.08.07 — 13:19

Как?

  

Партнерская программа EFSOL Oblako

   ABCD

1 — 21.08.07 — 13:25

Запись регистра не имеет объектной сущности, следовательно ее нельзя «ПОЛУЧИТЬ».

скажи конкретно что тебе надо?

   VanoZZZ

2 — 21.08.07 — 13:26

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

   ABCD

3 — 21.08.07 — 13:29

Для этого

1)создай набор записей.

2) установи отбор по значениям измерений, равным значениям измерений в удаляемой записи.

3) прочитай этот набор записей.

4) очисти его

5) и запиши уже пустой набор записей

   Регистратор

4 — 21.08.07 — 13:32

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

   VanoZZZ

5 — 21.08.07 — 13:36

(3) не очень конечно быстрый способ, но я что то другого пока не нашел

(4) запросом можно получить данные из регистра, а не сами записи, следовательно не удалить

   уродина

6 — 21.08.07 — 13:39

(5) создать набор, потом — отбор, потом просто записать пустой. записи с данным отбором — удалятся.

   VanoZZZ

7 — 21.08.07 — 13:45

(6) В отборе набора записей нельзя использовать реквизиты регистра, только измерения

НаборРегистраСведений.отбор[измерение].Установить(ЗначениеОтбора)

Мне не понятно, почему нет методов для поиска по реквизиту регистра

   ABCD

8 — 21.08.07 — 13:57

>>Мне не понятно, почему нет методов для поиска по реквизиту регистра

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

   уродина

9 — 21.08.07 — 13:59

(7) по реквизиту — только запросом… реквизит — это как бы просто для справки информация…

   уродина

10 — 21.08.07 — 14:00

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

  

den_valley

11 — 04.09.07 — 11:31

Возникла ситуация, выкрутился следующим образом:

   Запрос = Новый Запрос;

   Запрос.Текст =

   «ВЫБРАТЬ

   |    *

   |ИЗ

   |    РегистрСведений.СкидкиКонтрагентов КАК СкидкиКонтрагентов

   |ГДЕ

   |    СкидкиКонтрагентов.Приказ = &Приказ»;

   Запрос.УстановитьПараметр(«Приказ», ЭтотОбъект.Ссылка);

   Запрос.Выполнить().Выгрузить().ВыбратьСтроку();

   Результат = Запрос.Выполнить();

   Выборка = Результат.Выбрать();

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

   
   Пока Выборка.Следующий() Цикл

       Запись.Период = Выборка.Период;

       Запись.Контрагент = Выборка.Контрагент;

       Запись.Прочитать();

       Если Запись.Выбран() Тогда

           Сообщить(Строка(Запись.Период) + » » + Строка(Запись.Контрагент) + » » + Строка(Запись.Приказ)+ » удалена»);

           Запись.Удалить();

       КонецЕсли;

   КонецЦикла;

Регистр периодический, одно измерение контрагент, приказ соответственно — реквизит

TurboConf — расширение возможностей Конфигуратора 1С

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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С – создание и редактирование наборов записей, отдельных записей, работа с ключом записи.

Содержание

Регистры сведений в 1С 8

Что такое регистр сведений

Регистр сведений – это объект конфигурации, который предназначен для хранения произвольной информации в разрезе нескольких измерений. Например, можно хранить соответствие материально-ответственных лиц и складов, курсы валют или цену на товары. Можно представить регистр сведений как многомерную таблицу, где на каждом пересечении измерений хранятся значения, которые называются Ресурсы.

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

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

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

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

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

Свойства регистра сведений. Основные настройки

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

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

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

  • В пределах секунды
  • В пределах дня
  • В пределах месяца
  • В пределах квартала
  • В пределах года

В случае, если регистр сведений подчинен регистратору (см. ниже), становится доступным еще один вариант периода – по позиции регистратора.

Поле Период входит в составной ключ записи; можно добавлять записи с одинаковым составом измерений, но с разным периодом. Если периодичность – по позиции регистратора, то дата документа может совпадать с точностью до секунды – все равно это будут разные записи, т.к. в этом случае позиция регистратора будет определяться как момент времени (Дата + ссылка на документ). В зависимости от выбранной периодичности, период записи будет автоматически приводиться к началу периода в свойстве Периодичность. Например, если указана периодичность “В пределах дня”, то к началу суток, если “В пределах месяца” – то соответственно к первому числу месяца, и т.д.

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

Режим записи определяет, можно ли редактировать записи регистра сведений вручную, или они будут вноситься движениями документа-регистратора. Для регистров сведений с режимом записи “Независимый” можно указывать основной отбор для измерений. В случае, если при этом регистр сведений периодический, становится возможным указание флажка Основной отбор по периоду.

Что такое ведущее измерение и основной отбор?

Флаг Ведущее у измерения регистра сведений означает, то данная запись имеет смысл пока существует объект, ссылка на который хранится в данном измерении. Например, если удалить из базы данных сотрудника “Иванов Иван”, то автоматически из регистра сведений будут удалены все записи по тарифам, где в измерении “Сотрудник” был указан Иванов Иван. Если данный флаг не установлен, то при удалении объекта, записи остались бы в регистре с битой ссылкой на него.

Также свойство “Ведущее” у измерения отвечает за построение пользовательского интерфейса. В карточке объекта, который является ведущим измерением, появляется гиперссылка для быстрого перехода к регистру сведений с отбором по текущему объекту.

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

Проектирование структуры регистра сведений

Следует стараться избегать архитектурных решений, когда значение одного ресурса регистра сведений меняется значительно чаще чем значение другого. В этом случае целесообразно выделить такие ресурсы в отдельный регистр сведений. Это связано с тем, что в момент записи записываются все ресурсы, а не только измененный, что приводит к неоправданной нагрузке на СУБД.

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

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

Например, мы хотим знать, какие материально ответственные лица закреплены за тем или иным складским помещением. Если таких МОЛ более одного человека, то правильная архитектура регистра будет такая:

Измерения: МОЛ
Ресурсы: Склад

Если же нам требуется гарантировать, что у одного склада может быть только одно материально ответственное лицо, то состав регистра сведений будет следующий:

Измерения: Склад
Ресурсы: МОЛ

Примеры работы с регистрами сведений в 1С

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

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

//Использование менеджера записи регистра сведений
НоваяЗапись = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
//Сотрудник - это переменная, реквизит формы, параметр и т.п. с типом СправочникСсылка.Сотрудники
НоваяЗапись.Сотрудник = Сотрудник;
НоваяЗапись.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
НоваяЗапись.Тариф = 1500;
НоваяЗапись.Записать();

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

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьНабора.Тариф = 1500;

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Тариф = 6000;

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

Следует иметь в виду, что если не установить отбор для набора записей, при записи такого набора будет заменен весь регистр сведений!

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

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

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

Рассмотрим на примерах работу с набором записей средствами языка 1С

// работа с набором записей
	
//создание набора записей
НаборТарифы = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
 
//количество записей набора
Колво = НаборТарифы.Количество(); //0
 
//чтение набора записей из базы
//если не вызвать метод Прочитать и не добавить записи, то запишется пустой набор записей!
НаборТарифы.Прочитать();
Колво = НаборТарифы.Количество(); //вернет количество записей в наборе
 
//добавление записей
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Период = ТекущаяДата();
ЗаписьНабора.Тариф = 6000;
 
//выгрузка в таблицу значений
ТаблицаТарифов = НаборТарифы.Выгрузить();
 
//удаление всех записей набора
НаборТарифы.Очистить();
 
//загрузка из таблицы значений
НаборТарифы.Загрузить(ТаблицаТарифов);
 
//удаление первой записи набора
НаборТарифы.Удалить(0);
 
//выгрузка одной колонки в массив
МассивТоваров = НаборТарифы.ВыгрузитьКолонку("Сотрудник");

//загружаем обратно
НаборТарифы.ЗагрузитьКолонку(МассивТоваров, "Сотрудник");
 
//сумма всех значений ресурса, если его тип содержит тип Число
Итог = НаборТарифы.Итог("СуммаТарифа");
 
//запись набора
НаборТарифы.Записать();

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

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

Изменим, например, все часовые оклады, добавив 10%.

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

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

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

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

//2. Очистить регистр сведений программно
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
//Все записи регистра сведений будут удалены

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

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

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

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

Если ЗаписьМенеджер.Выбран() Тогда
	ЗаписьМенеджер.Тариф = 7000;
	ЗаписьМенеджер.Записать();
КонецЕсли;

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

Ключ записи регистра сведений

// создать ключ записи
//пустой ключ	
ПустойКлюч = Новый("РегистрСведенийКлючЗаписи.ТарифыРаботников");
//используя менеджер
ПустойКлюч = РегистрыСведений.ТарифыРаботников.ПустойКлюч();
 
//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Период", Дата(2021,01,31));
ЗначенияКлюча.Вставить("Сотрудник", СсылкаНаСотрудника);
ЗначенияКлюча.Вставить("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
КлючЗаписи = РегистрыСведений.ТарифыРаботников.СоздатьКлючЗаписи(ЗначенияКлюча);

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

Рассмотрим пример. Допустим, у нас есть документ “Назначение материально ответственных лиц”, в котором мы в табличной части указываем склад и соответствующее ему МОЛ. Этот документ записывает движения в регистр сведений МОЛПоСкладам, со следующими настройками:

  • Измерения: Склад, тип СправочникСсылка.Склады
  • Ресурсы: МОЛ, тип СправочникСсылка.Сотрудники
  • Реквизиты: Примечание, тип Строка(100)
  • Периодичность: в пределах месяца
  • Режим записи: Подчинение регистратору

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

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

Примеры работы с периодическим регистром сведений

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

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

Получить самые ранние записи (Срез первых)

Получим самые ранние записи тарифов с видом тарифа “ПоДням”

//Как получить самые первые записи
Отбор = Новый Структура("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
СрезПервых = РегистрыСведений.ТарифыРаботников.СрезПервых(ДатаСреза, Отбор);
//Получим таблицу значений со структурой колонок, аналогичной структуре регистра сведений
//В результат попадут наиболее ранние записи регистра, соответствующие установленным значениям ключевых полей.
//Записи подбираются для каждой комбинации из всех имеющихся значений измерений регистра.
//При этом, если есть записи с датой реньше, чем начало периода, они учитываться не будут.
Для Каждого СтрСреза Из СрезПервых Цикл
	Сообщить(СтрШаблон("Самый ранний тариф по дням для сотрудника %1: %2", СтрСреза.Сотрудник, СтрСреза.Тариф)); 
КонецЦикла;

Получить самые поздние записи (Срез последних)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     +7 

       

    Распечатать

    1С 8.3 : Как прочитать записи регистра сведений установив отбор и удалить записи?

    Прочитать записи регистра сведений можно двумя способами: Через Набор Записей или Менеджер 

    Вот пример через набор записей:

    Код 1C v 8.х

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

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

    Код 1C v 8.х

     НаборЗаписей = РегистрыСведений.CRM_Напоминания.СоздатьНаборЗаписей();
    Отбор = НаборЗаписей.Отбор;
    Отбор.Объект.Установить(Объект.Ссылка);
    Отбор.Завершено.Установить(Ложь);
    НаборЗаписей.Прочитать();

    Если НаборЗаписей.Количество() > 0 Тогда

    Если ЗадаватьВопрос Тогда
    ТекстВопроса = "Завершить все напоминания для " + Строка(Объект.Ссылка) + " ?";
    Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да);
    Иначе
    Ответ = КодВозвратаДиалога.Да
    КонецЕсли;

    Если Ответ = КодВозвратаДиалога.Да Тогда

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

    РегистрСведенийМенеджерЗаписи = РегистрыСведений.CRM_Напоминания.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(РегистрСведенийМенеджерЗаписи, Запись);
    РегистрСведенийМенеджерЗаписи.Прочитать();

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

    КонецЦикла;

    КонецЕсли;

    КонецЕсли;

    А вот пример через менеджер записи:

    Код 1C v 8.х

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

    Существует несколько видов регистров в 1С:

    • Накопления, хранящие остатки или обороты в числовом виде;
    • Расчета, хранящие виды расчетов и сами расчеты, обычно используются для расчета зарплаты;
    • Бухгалтерии с данными о бухгалтерских расчетах в виде Дт-Кт;
    • Регистры сведений.

    На последних мы остановимся поподробнее, поскольку они позволяют компилировать данные из БД по разрезам измерений. Например, в «Ценыноменклатуры» хранятся данные для конкретной номенклатуры и характеристики по определенному виду цен.

    Рис.1 Регистр «Ценыноменклатуры»
    Рис.1 Регистр «Ценыноменклатуры»

    Характеристики

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

    Рис.2 Периодичность и режим записи
    Рис.2 Периодичность и режим записи

    Если попытаться создать две записи в пределах одного периода, программа выдаст ошибку «Запись с такими ключевыми полями существует!» и не даст произвести запись в базу данных.

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

    Рис.3 Режимы записи
    Рис.3 Режимы записи

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

    Запись в регистр сведений 1С

    Строки в регистре с периодом и регистратором, содержащие информацию о ресурсах в разрезе измерений, называются записями.

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

    Пример записи при использовании объекта РегистрСведенийНаборЗаписей.

    Использование менеджера записи:

    
    	НоваяЗапись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    	НоваяЗапись.Валюта =     Справочники.Валюты.НайтиПоНаименованию(«USD»);
    	НоваяЗапись.Период = Дата(31,12,2016);
    	НоваяЗапись.Курс = 100;
    	НоваяЗапись.Кратность = 1;
    	НоваяЗапись.Записать();
    	
    

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

    Если записать без отбора данные в подчиненны регистр, возникнет ошибка.

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

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

    Пример записи через менеджер записи:

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

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

    Чтобы найти в регистре сведений запись и прочитать ее, нужна помощь запросов. Например, нам надо получить цены, внесенные определенным регистратором:

    
    	ВЫБРАТЬ
                  ЦеныНоменклатуры.Номенклатура,
                  ЦеныНоменклатуры.Цена
    	ИЗ
                  РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    	ГДЕ
                  ЦеныНоменклатуры.Регистратор = &Регистратор
    	
    

    Изменение и удаление записей

    Чтобы удалить запись регистра сведений, например, все курсы валюты EUR, воспользуйтесь следующим кодом:

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

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

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

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

    Добавление записей в регистр сведений выполняется с помощью набора записей. Набор записей — это коллекция нескольких записей регистра сведений.

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

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

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

    //добавляем новую запись
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = СсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

    //записываем набор записей
    НаборЦен.Записать();

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

    Если при записи не устанавливать отбор, то будет перезаписан весь регистр сведений, все предыдущие записи будут удалены:

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

    //добавляем новую запись
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = СсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

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

    Можно установить отбор только по одному измерению и сразу добавить несколько записей:

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

    //добавляем новую запись
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = СсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

    //добавляем еще одну запись
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 850;

    //записываем набор записей
    НаборЦен.Записать();

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

    Но если в метод Записать набора записей передать параметр Ложь, то запись будет выполнена с добавлением новых записей:

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

    //добавляем новую запись
    //не устанавливаем отбор в регистре сведений
    //так как будем записывать с добавлением
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = СсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

    //записываем набор записей с добавлением
    НаборЦен.Записать(Ложь);

    В результате в регистр сведений будет добавлена новая запись, но при этом все предыдущие записи не были удалены.

    Если попытаться добавить в регистр сведений записи, которые не совпадают с установленным отбором, то будет выброшено исключение «Запись не верна! Значение поля не соответствует установленному отбору»:

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

    //добавляем новую запись, но товар записываем не тот, который указали в отборе
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

    //записываем набор записей
    НаборЦен.Записать(); //НЕ ЗАПИШЕТСЯ

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

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

    //добавляем новые записи
    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = СсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 750;

    НоваяЦена = НаборЦен.Добавить();
    НоваяЦена.Товар = ЕщеОднаСсылкаНаТовар;
    НоваяЦена.ТипЦен = СсылкаНаТипЦен;
    НоваяЦена.Период = Дата;
    НоваяЦена.Цена = 950;

    //записываем набор записей
    НаборЦен.Записать();

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

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

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

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

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

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

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

    //записываем пустой набор записей
    НаборЦен.Записать();

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

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

    Если регистр сведений подчинен регистратору, то нужно устанавливать отбор по документу-регистратору:

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

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

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

    В данном примере мы удалили все записи, у которых цена больше или равна 500. Но можно было решить ее от обратного: выбрать все записи, у которых цена меньше 500, создать набор записей и загрузить в него результат запроса. Так как отбор не был установлен, то весь регистр будет перезаписан и в нем останутся только те записи, где цена меньше 500:

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

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

    Чтобы изменить существующие записи регистра сведений нужно сначала прочитать их через набор записей, потом перебрать в цикле, изменить и записать набор записей. Например, увеличим все цены по одному типу цен на 10%:

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

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

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

    Если регистр сведений подчинен регистратору, то отбор нужно устанавливать по регистратору:

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

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

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

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

    Менеджер записи можно создать программно:

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

    С помощью менеджера записи сначала была добавлена новая запись затем изменена и наконец удалена.

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

    Для примера добавим в модуль набора записей следующий код:

    Процедура ПередЗаписью(Отказ, Замещение)
    	Сообщить("Товар: " + ЭтотОбъект.Отбор.Товар);
    	Сообщить("Количество: " + ЭтотОбъект.Количество());
    КонецПроцедуры
    

    Откроем форму записи для товара Шкаф, изменим измерение товар на Тумбочку и запишем. В сообщениях увидим следующий результат:

    Сначала был записан старый пустой набор записей с товаром Шкаф, а потом новый с товаром Тумбочка.

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

    Программную работу с набором записей регистра сведений рассмотрим на примерах:

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

    Ключ записи регистра сведений

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

    //пустой ключ
    ПустойКлюч = Новый(«РегистрСведенийКлючЗаписи.ЦеныНаТовары»);
    //можно через менеджер
    ПустойКлюч = РегистрыСведений.ЦеныНаТовары.ПустойКлюч();

    //ключ на определенную запись регистра
    ЗначенияКлюча = Новый Структура;
    ЗначенияКлюча.Вставить(«Период», Дата(2021,4,1));
    ЗначенияКлюча.Вставить(«Товар», СсылкаНаТовар);
    ЗначенияКлюча.Вставить(«ТипЦен», СсылкаНаТипЦен);
    КлючНаЗапись = РегистрыСведений.ЦеныНаТовары.СоздатьКлючЗаписи(ЗначенияКлюча);

    Смотрите также:
    Электронный учебник по программированию в 1С
    Рекомендации по изучению программирования 1С с нуля
    Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
    Программирование в 1С 8.3 с нуля — краткий самоучитель
    Комплексная подготовка программистов 1С:Предприятие 8.2
    Сайты с уроками программирования и со справочниками
    Youtube-каналы с уроками программирования
    Сайты для обучения программированию
    Лекции и уроки

    Понравилась статья? Поделить с друзьями:
  • 1с реквизит полнотекстовый поиск использовать
  • 4 дворец бракосочетания бутырский часы работы
  • 1с реквизит список значений управляемая форма
  • 4 лапы зоомагазин на чертановской часы работы
  • 1с реквизит формы в значение таблица значений