Примеры программирования с регистром сведений
Доброго времени суток, уважаемые коллеги! В этой заметке рассматриваются примеры программирования с независимым, то есть неподчиненным регистратору, периодическим и непериодическим регистром сведений. На этом сайте есть дополнительная информация, если вы хотите побольше узнать о работе с регистрами сведений.
- Как добавить новую запись в регистр сведений?
- Как удалить одну запись из регистра сведений?
- Как изменить запись регистра сведений?
- Как удалить все записи из регистра сведений?
Как добавить новую запись в регистр сведений?
Первый способ — использование объекта МенеджерЗаписи:
МенеджерЗаписи = РегистрыСведений.АдресныйКлассификатор.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Код = 9999; // Измерение
МенеджерЗаписи.ТипАдресногоЭлемента = 3; // Измерение
МенеджерЗаписи.Наименование = "Алматы"; // Ресурс
МенеджерЗаписи.Записать(Замещать);
Для периодического регистра сведений:
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = Дата('20220101'); // Служебное поле
МенеджерЗаписи.Валюта = Валюта; // Измерение
МенеджерЗаписи.Курс = 1; // Ресурс
МенеджерЗаписи.Кратность = 1; // Ресурс
МенеджерЗаписи.Записать(Замещать);
Немного поясним код выше. Менеджер записи позволяет работать только с одной записью независимого от регистратора регистра сведений. В том, как будет происходить добавление, немалую роль играет параметр <Замещать> метода Записать(). По умолчанию значение этого параметра равно Истина. Он определяет режим замещения существующей записи с тем же набором значений измерений регистра и с тем же периодом (для периодических регистров). Если параметр <Замещать> равен Истина, то существующая запись регистра сведений с таким набором удаляется, если записи нет, то добавляется новая. Если параметр <Замещать> равен Ложь и записи ещё не существует, то добавляется новая. Если запись уже есть, то система выдаст предупреждение: «Запись с такими ключевыми полями существует!». Ещё один пример, с программным добавлением настроек пользователя в регистр сведений вы можете посмотреть в этой заметке.
Второй способ — использование объекта НаборЗаписей:
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
// По этим двум измерениям производится отбор
НаборЗаписей.Отбор.Код.Установить(9999); // Измерение
НаборЗаписей.Отбор.ТипАдресногоЭлемента.Установить(3); // Измерение
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Код = 9999; // Измерение
НоваяЗапись.ТипАдресногоЭлемента = 3; // Измерение
НоваяЗапись.Наименование = "Алматы"; // Ресурс
НаборЗаписей.Записать(Замещать);
Для периодического регистра сведений:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
// По служебному полю Период и измерению Валюта производится отбор
НаборЗаписей.Отбор.Период.Установить(ДатаДень); // Служебное поле
НаборЗаписей.Отбор.Валюта.Установить(Валюта); // Измерение
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ДатаДень; // Служебное поле
НоваяЗапись.Валюта = Валюта; // Измерение
НоваяЗапись.Курс = 1; // Ресурс
НоваяЗапись.Кратность = 1; // Ресурс
НаборЗаписей.Записать(Замещать);
Поясним немного код, который приводился выше. Объект НаборЗаписей работает с записями регистра сведений, что и подразумевает под собой название этого объекта. Поэтому, чтобы добавить одну запись в регистр, нужно отфильтровать набор так, чтобы в нём оказалась одна запись, что и сделано в коде. Затем происходит добавление записи в набор. В том, как будет происходить добавление ключевую роль играет параметр <Замещать> метода Записать(). По умолчанию значение этого параметра равно Истина. Он определяет режим замещения существующей записи с тем же набором значений измерений регистра и с тем же периодом (для периодических регистров). Если параметр <Замещать> равен Истина, то существующая запись регистра сведений с таким набором замещается, если записи нет, то добавляется одна новая. Если параметр <Замещать> равен Ложь и записи ещё не существует, то добавляется новая. Если запись уже есть, то система выдаст предупреждение: «Запись с такими ключевыми полями существует!». Чтобы избавиться от одинаковых записей в регистре сведений можно каждой записи обеспечить уникальность.
Если в набор записей попадают несколько записей и параметр <Замещать> равен Истина, то все эти записи будут замещены одной. Поэтому, нужно очень внимательно следить, чтобы нечаянно не удалить лишние записи из регистра. Приведем для наглядности небольшой пример. Представим, что в регистре сведений есть такие записи:
Код | ТипАдресногоЭлемента | Наименование |
7 777 | 3 | Алматы |
8 888 | 3 | Алматы |
Если немного изменить код и сделать отбор только по полю ТипАдресногоЭлемента, а параметр <Замещать> установить в значение Истина:
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
// Произведём отбор только по одному измерению
НаборЗаписей.Отбор.ТипАдресногоЭлемента.Установить(3); // Измерение
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Код = 9999; // Измерение
НоваяЗапись.ТипАдресногоЭлемента = 3; // Измерение
НоваяЗапись.Наименование = "Алматы"; // Ресурс
НаборЗаписей.Записать(Истина);
То после работы алгоритма все записи с измерением ТипАдресногоЭлемента = 3 будут удалены и добавлена следующая запись:
Код | ТипАдресногоЭлемента | Наименование |
9 999 | 3 | Алматы |
Как удалить одну запись из регистра сведений?
Первый способ — использование объекта МенеджерЗаписи:
НоваяЗапись = РегистрыСведений.АдресныйКлассификатор.СоздатьМенеджерЗаписи();
НоваяЗапись.Код = 9999;
НоваяЗапись.ТипАдресногоЭлемента = 3;
НоваяЗапись.Наименование = "Алматы";
НоваяЗапись.Удалить();
Для периодического регистра сведений:
НоваяЗапись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ДатаДень; // Служебное поле
НоваяЗапись.Валюта = Валюта; // Измерение
НоваяЗапись.Удалить();
С помощью этого кода удаляется запись из набора записей с установленными значениями ключевых полей. Как уже было сказано выше, объект менеджер записи работает с одной записью, которая будет предварительно выбрана, например, по значению служебного поля Период и измерения Валюта, если говорить про код периодического регистра сведений. Если присвоить значение только служебному полю период, то удаления не произойдет, так как в регистре сведений не будет найдено записи с пустым значением валюты. То же самое справедливо и в отношении кода по регистру сведений АдресныйКлассификатор, если значение присвоить только, например, одному измерению Код.
Второй способ — использование объекта НаборЗаписей:
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
// По этим двум измерениям производится отбор
НаборЗаписей.Отбор.Код.Установить(9999); // Измерение
НаборЗаписей.Отбор.ТипАдресногоЭлемента.Установить(3); // Измерение
НаборЗаписей.Записать();
Для периодического регистра сведений:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
// По служебному полю Период и измерению Валюта производится отбор
НаборЗаписей.Отбор.Период.Установить(ДатаДень); // Служебное поле
НаборЗаписей.Отбор.Валюта.Установить(Валюта); // Измерение
НаборЗаписей.Записать();
Поясним код выше. С помощью отбора производится получение одной записи в наборе. Затем этот отбор очищается и записывается в регистр сведений. Так как параметр <Замещать> метода Записать() по умолчанию имеет значение Истина, то найденная запись удаляется без добавления новой, так как не было команды для этого.
Как изменить запись регистра сведений?
Первый способ — использование объекта МенеджерЗаписи:
МенеджерЗаписи = РегистрыСведений.АдресныйКлассификатор.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Код = 9999; // Измерение
МенеджерЗаписи.ТипАдресногоЭлемента = 3; // Измерение
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.ТипАдресногоЭлемента = 2; // Измерение
МенеджерЗаписи.Наименование = "Караганда"; // Ресурс
МенеджерЗаписи.Записать();
КонецЕсли;
Для периодического регистра сведений:
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ДатаДень; // Измерение
МенеджерЗаписи.Валюта = Валюта; // Измерение
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Курс = 6; // Ресурс
МенеджерЗаписи.Записать();
КонецЕсли;
Как видно из кода, сначала считывается запись регистра сведений при помощи метода Прочитать() по установленным значениям ключевых полей, а затем, если такая запись найдена МенеджерЗаписи.Выбран() = Истина, то производится её изменение. Параметр <Замещать> метода Записать() по умолчанию имеет значение Истина, поэтому найденная запись замещается новой.
Второй способ — использование объекта НаборЗаписей:
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
// По этим двум измерениям производится отбор
НаборЗаписей.Отбор.Код.Установить(9999); // Служебное поле
НаборЗаписей.Отбор.ТипАдресногоЭлемента.Установить(3); // Измерение
НаборЗаписей.Прочитать();
Если НаборЗаписей.Выбран() Тогда
Для каждого Запись Из НаборЗаписей Цикл
//Запись.ТипАдресногоЭлемента = 2; // Чтобы не было ошибки: Значение поля не соответствует установленному отбору
Запись.Наименование = "Караганда"; // Ресурс
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;
В коде выше закомментирована строка, которая изменяет измерение регистра. Так как отбор установлен по измерению ТипАдресногоЭлемента система не даст сделать это изменение. Чтобы изменить это измерение нужно убрать отбор по нему, тогда все записи с кодом 9999 будут изменены.
Для периодического регистра сведений:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
// По служебному полю Период и измерению Валюта производится отбор
НаборЗаписей.Отбор.Период.Установить(ДатаДень); // Служебное поле
НаборЗаписей.Отбор.Валюта.Установить(Валюта); // Измерение
НаборЗаписей.Прочитать();
Если НаборЗаписей.Выбран() Тогда
Для каждого Запись Из НаборЗаписей Цикл
Запись.Курс = 6; // Ресурс
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;
Как видно из кода, сначала считывается запись регистра сведений с помощью метода Прочитать() в соответствии с отбором, а затем, если такая запись найдена МенеджерЗаписи.Выбран() = Истина, то производится её изменение. Параметр <Замещать> метода Записать() по умолчанию имеет значение Истина, поэтому найденная запись замещается новой. Если настроить отбор так, чтобы в него попадали несколько записей, то все они будут изменены в цикле.
Как удалить все записи из регистра сведений?
Первый способ — использование объекта МенеджерЗаписи:
Выборка = РегистрыСведений.АдресныйКлассификатор.Выбрать();
Пока Выборка.Следующий() Цикл
МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
МенеджерЗаписи.Удалить();
КонецЦикла;
Для периодического регистра сведений:
Выборка = РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
МенеджерЗаписи.Удалить();
КонецЦикла;
В данном коде для получения записей используется объект РегистрСведенийВыборка. Так как в параметрах метода Выбрать() не указана фильтрация, то происходит выбор всех записей регистра. Затем в цикле, для каждой записи, вызывается объект РегистрСведенийМенеджерЗаписи, который даёт возможность удалить эти записи.
Второй способ — использование объекта НаборЗаписей:
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Для периодического регистра сведений:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Код, который приведён выше, удаляет все записи в регистре сведений, так как отбор не установлен, поэтому в набор записей попадают они все. По умолчанию метод Записать() имеет параметр <Замещать> равный значению Истина, а это значит, что удаляются все записи из набора. Так как дальше в коде добавления нет, то регистр сведений становится пустым.