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

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

В статье рассказано, как сделать отбор в Регистре сведений 1С разными способами. С примерами.

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

Далее приведу несколько примеров как сделать отбор по регистру сведений.

Пример отбора по одному реквизиту:

ОтборТипЦен = Новый Структура("ТипЦен");
ОтборТипЦен.ТипЦен = ВыбТипЦен;
ЦеныНоменклатуры = РегистрыСведений.ЦеныНоменклатуры;
Выборка = ЦеныНоменклатуры.Выбрать(,,ОтборТипЦен);

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

Пример отбора по нескольким полям используя запрос:

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

В примере происходит выборка цен с отбором по номенклатуре и по типу цен на текущую дату.

Пример отбора по нескольким полям и без запроса:

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

В данном примере я создаю набор записей по регистру сведений, и устанавливаю отбор по измерениям «Номенклатура» и «ТипЦен». Не забывать про оператор «Прочитать()» чтобы получить данные. Далее идет цикл по элементам, которые попали в отбор.

Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.

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

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

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

Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:

  • измерения — описывают разрезы, в которых хранится информация;
  • период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
  • регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
  • ресурсы — непосредственно хранят информацию для комбинации измерений;
  • реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.

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

Добавление записей

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

  • объекта НаборЗаписей ;
  • объекта МенеджерЗаписи .

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

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

  • создание объекта НаборЗаписей ;
  • наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
  • добавление и заполнение значений полей записей;
  • запись набора записей.

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

  • создание объекта МенеджерЗаписи ;
  • заполнение значений полей записи;
  • запись записи.

Изменение записей

Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи . Ограничения объекта МенеджерЗаписи были описаны выше.

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

  • создание объекта НаборЗаписей или МенеджерЗаписи ;
  • наложение отборов;
  • чтение записей базы данных, соответствующих наложенным отборам;
  • редактирование прочитанных записей;
  • запись отредактированных записей.

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

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

Читайте также:  Паскаль ожидалось имя процедуры или функции

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

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

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

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

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

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

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

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

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

    • создать набор записей;
    • наложить отбор на регистратора;
    • записать набор записей без предварительного чтения.

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

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

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

    • получить перечень ссылок всех регистраторов регистра сведений;
    • последовательно записать пустой набор записей с отбором по регистраторам из первого пункта.

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

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

    Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.

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

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

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

    Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:

    • измерения — описывают разрезы, в которых хранится информация;
    • период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
    • регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
    • ресурсы — непосредственно хранят информацию для комбинации измерений;
    • реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.

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

    Добавление записей

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

    • объекта НаборЗаписей ;
    • объекта МенеджерЗаписи .
    Читайте также:  Как покрасить подкладку в куртке

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

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

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

    // Добавление записи в независимый непериодический регистр сведений
    НаборЗаписей = РегистрыСведений . ВерсииПодсистем . СоздатьНаборЗаписей (); // Этап 1
    НаборЗаписей . Отбор . ИмяПодсистемы . Установить ( ИмяПодсистемы ); // Этап 2
    // Этап 3
    НоваяЗапись = НаборЗаписей . Добавить ();
    НоваяЗапись . ИмяПодсистемы = ИмяПодсистемы ;
    НоваяЗапись . Версия = НомерВерсии ;
    НаборЗаписей . Записать (); // Этап 4

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

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

    1. создание объекта МенеджерЗаписи ;
    2. заполнение значений полей записи;
    3. запись записи.

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

    // Этап 2
    Запись . ИмяПодсистемы = ИмяПодсистемы ;
    Запись . Версия = НомерВерсии ;

    Запись . Записать (); // Этап 3

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

    // Этап 2
    Запись . Период = ТекущаяДата ();
    Запись . Валюта = Доллар ;
    Запись . Курс = 57.92 ;
    Запись . Кратность = 1 ;

    Запись . Записать (); // Этап 3

    Изменение записей

    Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи . Ограничения объекта МенеджерЗаписи были описаны в разделе Добавление записей.

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

    1. создание объекта НаборЗаписей или МенеджерЗаписи ;
    2. наложение отборов;
    3. чтение записей базы данных, соответствующих наложенным отборам;
    4. редактирование прочитанных записей;
    5. запись отредактированных записей.

    // Редактирование записей с использованием объекта НаборЗаписей
    НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей (); // Этап 1
    // Этап 2
    НаборЗаписей . Отбор . Период . Установить ( ДатаКурса );
    НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
    НаборЗаписей . Прочитать (); // Этап 3
    Для Каждого Запись Из НаборЗаписей Цикл
    Запись . Курс = 57.84 ; // Этап 4
    КонецЦикла;
    НаборЗаписей . Записать (); // Этап 5

    // Редактирование записей с использованием объекта МенеджерЗаписи
    Запись = РегистрыСведений . КурсыВалют . СоздатьМенеджерЗаписи (); // Этап 1
    // Этап 2
    Запись . Период = ДатаКурса ;
    Запись . Валюта = Доллар ;
    Запись . Прочитать (); // Этап 3
    Если Запись . Выбран () Тогда // Проверка, что запись существует
    Запись . Курс = 57.92 ; // Этап 4
    Запись . Записать (); // Этап 5
    КонецЕсли;

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

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

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

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

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

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

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

    Читайте также:  Программа обеспечивающая взаимодействие операционной системы

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

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

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

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

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

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

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

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

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

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

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

    1. создать набор записей;
    2. наложить требуемые отборы на измерения и период (если регистр периодический);
    3. записать набор записей без предварительного чтения.

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

    НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
    НаборЗаписей . Отбор . Период . Установить ( НачалоДня ( ТекущаяДата ()));

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

    1. создать набор записей;
    2. наложить отбор на регистратора;
    3. записать набор записей без предварительного чтения.

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

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

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

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

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

    1. получить перечень ссылок всех регистраторов регистра сведений;
    2. последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.

    Запрос = Новый Запрос ( «ВЫБРАТЬ
    | ЦеныНоменклатуры.Регистратор
    |ИЗ
    | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры» );

    Выборка = Запрос . Выполнить (). Выбрать ();

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

    Остались вопросы?
    Спросите в комментариях к статье.

    6 комментариев

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

    Не понятно за счет чего может быть профит при записи набора записей независимого регистра сведений. Можете пояснить?

    Работа платформы с регистрами сведений несколько раз менялась. 8.3 стала более оптимальной и как бы мне не хотелось «потыкать палочкой» в 8.1 и в ранние версии 8.2, дабы показать как все было плохо, решил этого не делать. Кому станет любопытно «как было» — получит мотивацию изучить вопрос.

    Зачем накладывать Отбор, когда создаётся новый набор записей?

    Ссылка на основную публикацию
    Они обычно ходят всюду вместе
    A phrasal verbis usually a two-word verb: get on, go behind, fall off, turn up, run off. The most common...
    Ну что друзья запятые
    Следует отличать междометие «ну» от частицы. Междометие обособляется, частица — нет. 1. Междометие подразумевает, что говорящий задумался и подбирает слова,...
    Обзор кнопочных телефонов самсунг
    Если вы ищите лучший кнопочный телефон 2019 года, который можно подарить ребенку, пожилому человеку, или использовать в качестве резервного рабочего,...
    Определение задачи использует нерекомендуемый компонент планировщик
    Планировщик задач Windows позволяет пользователю выполнять продвинутую настройку ПК и совершать запуск нужных ему приложений и утилит в конкретное время...
    Adblock detector