В предыдущей статье Работа с набором записей регистра сведений мы узнали, как использовать объект набор записей регистра сведений для группового создания записей. В процессе записи набора наш регистр или полностью очищается, или добавляются новые записи, сохраняя при этом старые. Причем контроль уникальности по измерениям во втором случае не ведется, и может возникнуть ошибка «Запись с такими ключевыми полями существует!»
Но очень часто возникают задачи, когда нужно отредактировать какие-то уже имеющиеся записи, например, сделав отбор по какому-то одному или нескольким измерениям. Эти задачи выполняются при помощи отборов набора записей.
Рассмотрим следующую задачу: в моей конфигурации есть независимый периодический регистр сведений «ЦеныНаТопливо», который имеет следующую структуру.
Нам нужно изменить все цены конкурентного поставщика за все периоды, умножив их на какой-то коэффициент. Для решения этой задачи нам нужно установить отбор по нужному нам поставщику, прочитать данные, обойти полученный набор записей и рекурсивно изменить цену.
МенеджерЦеныНаТопливо = РегистрыСведений.ЦеныНаТопливо; НаборЗаписей = МенеджерЦеныНаТопливо.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ПоставщикТоплива.Установить(Поставщик); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() <> 0 Тогда Для Каждого стрНабора из НаборЗаписей Цикл стрНабора.Цена = стрНабора.Цена * Коэффицент; КонецЦикла; НаборЗаписей.Записать(); КонецЕсли;
Переменные Поставщик и Коэффициент это реквизиты управляемой формы 1С.
В этом коде с помощью свойства Отбор объекта НаборЗаписей сделать так, чтобы в наборе были записи, соответствующие только нужному нам поставщику.
В отборе как к свойству объекта можно обращаться ко всем измерениям регистра сведений и к периоду, если имеем дело с периодическим регистром сведений. Если регистр сведений подчинен регистратору, то отбор возможен только по регистратору.
Когда мы обращаемся к свойству объекта Отбор посредством названия измерения, то мы получаем объект Элемент отбора, у данного объекта только один метод — Установить. Данный метод устанавливает значение отбора.
Можно производить отбор по одному полю, а можно и по нескольким. В случае отбора по нескольким полям логическая связь между полями будет осуществляться с помощью булевой операции «И».
Имейте в виду, что отбор в регистрах сведений можно устанавливать только на равенство!
После того, как мы установили отбор, нам необходимо извлечь данные из базы в объект Набор записей, осуществляется это с помощью метода Прочитать. Этот метод считывает записи из базы данных по установленному отбору и записывает их в объект НаборЗаписей.
Как Вы уже знаете, объект Набор записей является коллекцией объектов Запись регистров сведений. Поэтому после того, как мы с помощью метода Количество проверили, есть ли в принципе записи по данному отбору, мы обходим данную коллекцию с помощью цикла: Для каждого…Цикл. Где переменная НормаЗапись является объектом Запись регистров сведений. С помощью этого объекта мы получаем доступ ко всем полям записи регистра сведений и можем их изменять на свое усмотрение. После того, как мы поменяли все нужные нам записи, необходимо записать набор. Обращаю внимание, что записывается именно набор в целом, а не конкретная запись по отдельности.
Причем, с помощью отбора можно проверять наличие уже существующих записей. Например, будем записывать данные в наш регистр, но перед этим проверим, есть ли записи по нужным полям.
МенеджерЦеныНаТопливо = РегистрыСведений.ЦеныНаТопливо; НаборЗаписей = МенеджерЦеныНаТопливо.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ПоставщикТоплива.Установить(Поставщик); НаборЗаписей.Отбор.ВидТоплива.Установить(ВидТоплива); НаборЗаписей.Отбор.Период.Установить(Период); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = Период; НоваяЗапись.ПоставщикТоплива = Поставщик; НоваяЗапись.ВидТоплива = ВидТоплива; НоваяЗапись.Цена = Цена; НаборЗаписей.Записать(); КонецЕсли;
В этом коде мы с помощью отборов получаем определенный набор записи, который должен соответствовать установленным отборам. И если данных по установленным отборам нет, то создаем новую запись.
Имейте ввиду, что после того, как вы примените метод Прочитать к набору записей, то состав набора изменится согласно установленному отбору.
С помощью набора записей можно не только создавать новые записи, но и удалять имеющиеся. Например, решим следующую задачу: очистим все записи для определенного вида топлива.
МенеджерЦеныНаТопливо = РегистрыСведений.ЦеныНаТопливо; НаборЗаписей = МенеджерЦеныНаТопливо.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ВидТоплива.Установить(ВидТоплива); НаборЗаписей.Прочитать(); НаборЗаписей.Очистить(); НаборЗаписей.Записать();
В этом коде мы получаем данные для определенного набора и очищаем их.
Некоторые способы программного изменения регистра сведений
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
|
|||
VanoZZZ
21.08.07 — 13:19 |
Как? |
||
ABCD
1 — 21.08.07 — 13:25 |
Запись регистра не имеет объектной сущности, следовательно ее нельзя «ПОЛУЧИТЬ». |
||
VanoZZZ
2 — 21.08.07 — 13:26 |
Мне нужно получить запись регистра сведений, по определенному реквизиту, с целью ее удаления |
||
ABCD
3 — 21.08.07 — 13:29 |
Для этого |
||
Регистратор
4 — 21.08.07 — 13:32 |
запросом получить, и не очевидно что будет одна запись, надо расчитывать что их может быть любое количество |
||
VanoZZZ
5 — 21.08.07 — 13:36 |
(3) не очень конечно быстрый способ, но я что то другого пока не нашел |
||
уродина
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. Набор записей регистра сведений
2. Менеджер записи регистра сведений
Здравствуйте, коллеги! В данной статье рассмотрим, как получить записи регистра сведений с некоторым отбором записей для последующей работы с ними.
Предположим, что в некоторой базе существует регистр сведений, в котором хранятся данные о доставке товара. Задачей является по нажатию кнопки обновить информацию в каждой из этих записей или добавить новую информацию в пустые поля, получив набор записей регистра сведений.
1. Набор записей регистра сведений
Для того чтобы выполнить данную задачу, можно воспользоваться функцией набора записей регистра сведений с помощью объекта «НаборЗаписей». Для создания объекта «НаборЗаписей» необходимо обратиться к регистру сведений и вызвать метод «СоздатьНаборЗаписей()». В результате мы получим пустую коллекцию объектов типа «ЗаписьРегистраСведений».
Создание набора записей регистра сведений
Представим, что у нас есть некоторые начальные данные, и нам необходимо получить записи, в которых значения полей равны нашим начальным данным. Для этого воспользуемся свойством «Отбор» у полученного ранее объекта, после чего вызовем метод «Установить (Параметр отбора)». Данный метод можно вызывать несколько раз в случае, если нужно установить отбор записей регистра сведений по нескольким полям. Если отборов несколько, то связь будет осуществляться при помощи логического «И».
Отбор записей регистра сведений
После того как установлен отбор регистра, чтобы получить записи с установленным отбором, потребуется вызвать метод «Прочитать()», читающий записи регистра сведений с отбором, который был установлен ранее. После выполнения данного метода коллекция «Набор записей» заполнится данными отобранными из регистра сведений.
Метод чтения набора записей
Далее можно обойти полученную коллекцию циклом и добавить или изменить какие-то поля в каждой записи. Либо же обработать любым другим доступным способом.
Цикл набора записей
Для того чтобы записать измененные данные в базу, необходимо вызвать метод «Записать()», после чего весь набор записей после отбора будет снова записан в регистр сведений с измененными или новыми данными.
Команда записи в регистр сведений
Наборы записей регистра сведений подходят в случае, если необходимо записать большую коллекцию значений с некоторыми одинаковыми полями.
Особенность отбора в регистре сведений заключается в том, что его можно установить только на равенство, соответственно нельзя, например, установить отбор «Записи в которых поле «Количество» больше чем 4», можно использовать только «Записи в которых «Количество» равно 5».
В том случае, если необходимо выбрать записи по какому-либо другому условию, например, записи, в которых поле «количество» имеет значение больше 4, либо если нужно воспользоваться связью отличной от логического «И», например, «ИЛИ»: «Физическое лицо = ФИО» ИЛИ «Год рождения < 31.08.2000», придется написать запрос регистра сведений
Запрос у регистру сведений
Результатом этого будет подобная таблица:
Результат запроса к регистру сведений
В данном запросе к регистру сведений отбирались все записи, в которых дата рождения человека была меньше 31.08.2000, но при этом благодаря логическому «ИЛИ» в результат запроса был так же добавлен один человек, у которого дата рождения не удовлетворяла первому условию, но удовлетворяла второму.
После получения результата запроса с ним можно будет делать все что угодно, в том числе и записать снова в регистр.
2. Менеджер записи регистра сведений
Если в регистре сведений все записи уникальны или требуется получить только одну запись, следует воспользоваться объектом «Менеджер записи».
Менеджер записи регистра сведений создается аналогично Набору записей, но с использованием другого метода – СоздатьМенеджерЗаписей().
Метод СоздатьМенеджерЗаписией()
После создания можно установить отбор записей регистра сведений, задав значения полей и вызвать метод «Прочитать», который вернет в переменную «МенеджерЗаписи» запись регистра сведений.
Прочтение менеджера записей и его возвращение в регистр сведений
Далее можно производить с данной записью какие-либо действия, например, обратиться к одному из полей данной записи.
Действия с записью после возвращения менеджера в регистр сведений
Стоит отметить, что менеджер записи регистра сведений в отличие от набора записей регистра сведений доступен только для регистров с установленным свойством «Независимый» регистр сведений, то есть только для тех, у которых нет регистратора.
Специалист компании «Кодерлайн»
Айдар Фархутдинов
0
Как выполнить отбор в регистре сведений по значениям измерений и затем создать запись?
// создаем НаборЗаписей
НаборД = РегистрыСведений.НашРегистр.СоздатьНаборЗаписей();
// устанавливаем параметры отбора по полному набору Измерений регистра:
НаборД.Отбор.Измерение1.Установить(Значение1);
НаборД.Отбор.Измерение2.Установить(Значение2);
НаборД.Отбор.Измерение3.Установить(Значение3);
// Создаем новую строку в этом наборе записей:
СтрокаДанных = НаборД.Добавить();
// определяем значения Измерений этой строки:
СтрокаДанных.Измерение1 = Значение1;
СтрокаДанных.Измерение2 = Значение2;
СтрокаДанных.Измерение3 = Значение3;
// определяем значения Ресурсов
СтрокаДанных.Ресурс1 = Значение4;
СтрокаДанных.Ресурс2 = Значение5;
// определяем значения Реквизитов
СтрокаДанных.Реквизит1 = Значение6;
// пример другого варианта присвоения значения, когда, например, внутри цикла нужно указать значение ресурса, перебирая в цикле разные имена ресурсов (ИмяПоля):
СтрокаДанных[ИмяПоля] = Значение7; // где ИмяПоля - наименование измерения, ресурса или реквизита регистра
НаборД.Записать();
Регистры сведений в 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 КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалют.Период, | КурсыВалют.Валюта, | КурсыВалют.Курс |ИЗ | РегистрСведений.КурсыВалют КАК КурсыВалют"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» // и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата» Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалютСрезПоследних.Период, | КурсыВалютСрезПоследних.Валюта, | КурсыВалютСрезПоследних.Курс |ИЗ | РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних"; Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта); Запрос.УстановитьПараметр("Период", ВыбраннаяДата); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» // и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата» Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалютСрезПервых.Период, | КурсыВалютСрезПервых.Валюта, | КурсыВалютСрезПервых.Курс |ИЗ | РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых"; Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта); Запрос.УстановитьПараметр("Период", ВыбраннаяДата); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
Выбрать(Отбор, Порядок)
— выбирает записи с указанным отбором;ВыбратьПоРегистратору(Регистратор)
— выбирает все записи указанного регистратора;Получить(Отбор)
— получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
Выбрать(НачалоИнтервала, КонецИнтервала, Отбор, Порядок)
— выбирает записи с указанным отбором, у которых период находится междуНачалоИнтервала
иКонецИнтервала
;ВыбратьПоРегистратору(Регистратор)
— выбирает все записи указанного регистратора;Получить(Период, Отбор)
— получает ресурсы записи с отбором по всем измерениям и периоду;ПолучитьПервое(НачалоПериода, Отбор)
— получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;ПолучитьПоследнее(КонецПериода, Отбор)
— получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;СрезПервых(НачалоПериода, Отбор)
— получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;СрезПоследних(КонецПериода, Отбор)
— получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи (записей) в независимом регистре сведений необходимо:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(Доллар); НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата())); НаборЗаписей.Записать();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор); НаборЗаписей.Записать();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Записать();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из первого пункта.
Запрос = Новый Запрос( "ВЫБРАТЬ | ЦеныНоменклатуры.Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры" ); Выборка = Запрос.Выполнить().Выбрать(); НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); Пока Выборка.Следующий() Цикл НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); НаборЗаписей.Записать(); КонецЦикла;
Отбор доступен для измерений и реквизитов, у которых установлено свойство «Индексировать» или стоит флажок «Ведущее». По ресурсам отбор делать нельзя.
// НаборЗаписей = РегистрыСведений.Калькуляция.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); НаборЗаписей.Прочитать(); Для каждого Запись из НаборЗаписей цикл // Выполняем какие-то действия Запись.Сумма = 1999; //меняем значение реквизита или измерения КонецЦикла; НоваяЗапись = НаборЗаписей.Добавить(); // Добавляем новую запись НоваяЗапись.Сумма = 2700; .... НаборЗаписей.Записать() |
Добавление записей в регистр сведений выполняется с помощью набора записей. Набор записей — это коллекция нескольких записей регистра сведений.
Для добавление новых записей в регистр сведений нужно:
— Создать набор записей
— Установить у него отбор по тем измерениям и периоду (если регистр периодический), по которым нужно добавить новые записи
— Добавить в набор необходимое количество новых записей
— Записать набор записей
//создаем набор записей регистра сведений
НаборЦен = РегистрыСведений.ЦеныНаТовары.СоздатьНаборЗаписей();
//устанавливаем отбор по измерениям и периоду
НаборЦен.Отбор.Товар.Установить(СсылкаНаТовар);
НаборЦен.Отбор.ТипЦен.Установить(СсылкаНаТипЦен);
НаборЦен.Отбор.Период.Установить(Дата);//добавляем новую запись
НоваяЦена = НаборЦен.Добавить();
НоваяЦена.Товар = СсылкаНаТовар;
НоваяЦена.ТипЦен = СсылкаНаТипЦен;
НоваяЦена.Период = Дата;
НоваяЦена.Цена = 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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки