1с как определить тип регистра программно

Обновлено: 04.07.2024


&НаСервере
Процедура ЧтениеЗаписи ()

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

Запрос . УстановитьПараметр ( "ВыбОрганизация" , Справочники . Организации . НайтиПоНаименованию ( "ОАО ""Гипермаркет АЗИЯ""" ));
РезультатЗапроса = Запрос . Выполнить ();

Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл

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

Поиск и программное изменение записи документа в регистр сведений в 1С 8.3:

&НаСервере
Процедура ПоискИИзменениеЗаписи ()

УстановкаЦенСсылка = Документы . УстановкаЦен . НайтиПоНомеру ( "ПТО-00000001" , '20201231' );
УстановкаЦен = УстановкаЦенСсылка . ПолучитьОбъект ();

// Получение набора записей документа Установка цен № ПТО-00000001 от 31.12.20 в регистр "ЦеныРеализации"
НаборЗаписей = УстановкаЦен . Движения . ЦеныРеализации ;

// Чтение набора записей из базы данных.
НаборЗаписей . Прочитать ();

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

// Получение старых значений
Сообщить ( " по " + Запись . Организация + ", " + Запись . Контрагент + ", " + Запись . Номенклатура + " ОАО ""Гипермаркет АЗИЯ""" );
НоваяЗапись . Контрагент = Справочники . Контрагенты . НайтиПоНаименованию ( "ООО ""БелИмпортТорг""" );
НоваяЗапись . Номенклатура = Справочники . Номенклатура . НайтиПоНаименованию ( "Молоко 3,2%" );
НоваяЗапись . Цена = 3 ;

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

Чтение записи документа в регистре сведений запросом в 1С 8.3:

&НаСервере
Процедура ЧтениеЗаписиЗапросом ()

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

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

Запрос . УстановитьПараметр ( "Регистратор" , СсылкаДок );
РезультатЗапроса = Запрос . Выполнить ();

Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл

Сообщить ( "по документу " + Записи . Регистратор + " по " + Записи . Организация + ", "
+ Записи . Контрагент + " " + Записи . Номенклатура + " руб." );

Получение наиболее ранних записей регистра сведений через срез первых на дату в 1С 8.3:

&НаСервере
Процедура ПолучениеНаиболееРаннихЗаписей ()

// Параметры виртуальной таблицы СрезПервых:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

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

Запрос . УстановитьПараметр ( "ВыбОрганизация" , Справочники . Организации . НайтиПоНаименованию ( "ОАО ""Гипермаркет АЗИЯ""" ));
Запрос . УстановитьПараметр ( "ВыбНоменклатура" , Справочники . Номенклатура . НайтиПоНаименованию ( "Молоко 3,2%" ));
РезультатЗапроса = Запрос . Выполнить ();

Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл

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

Получение наиболее поздних записей регистра сведений через срез последних на дату в 1С 8.3:

&НаСервере
Процедура ПолучениеНаиболееПозднихЗаписей ()

// Параметры виртуальной таблицы СрезПоследних:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

// Получение цен на Молоко 3,2% для каждого контрагента на конец 2 квартала 2020 года (включительно)
// по организации ОАО "Гипермаркет АЗИЯ".
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| ЦеныРеализацииСрезПоследних.Период,
| ЦеныРеализацииСрезПоследних.Активность,
| ЦеныРеализацииСрезПоследних.Номенклатура,
| ЦеныРеализацииСрезПоследних.Контрагент,
| ЦеныРеализацииСрезПоследних.Организация,
| ЦеныРеализацииСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации.СрезПоследних(
| ДАТАВРЕМЯ(2020, 06, 30, 23, 59, 59),
| Активность = Истина И
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦеныРеализацииСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализацииСрезПоследних.Контрагент" ;

Запрос . УстановитьПараметр ( "ВыбОрганизация" , Справочники . Организации . НайтиПоНаименованию ( "ОАО ""Гипермаркет АЗИЯ""" ));
Запрос . УстановитьПараметр ( "ВыбНоменклатура" , Справочники . Номенклатура . НайтиПоНаименованию ( "Молоко 3,2%" ));
РезультатЗапроса = Запрос . Выполнить ();

Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл

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

Создание записи в регистре сведений без привязки к документу в 1С 8.3:

&НаСервере
Процедура СозданиеЗаписиБезПривязкиКДокументу ()

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

// Создание записи - для единичных записей лучше использовать "Менеджер Записей"
НоваяЗапись = РегистрыСведений . КурсВалют . СоздатьМенеджерЗаписи ();
НоваяЗапись . Период = '20200401' ;
НоваяЗапись . Валюта = Справочники . Валюты . НайтиПоНаименованию ( "Евро" );
НоваяЗапись . Курс = 2.8010 ;
НоваяЗапись . Записать (Истина); // Замещение - если уже есть запись с такими же измерениями и таким же периодом


// Поиск, изменение и удаление созданной запись на дату
Выборка = РегистрыСведений . КурсВалют . Выбрать ( '20200401' , '20200401' );
Если Выборка . Следующий () Тогда

Запись = Выборка . ПолучитьМенеджерЗаписи ();
Запись . Прочитать ();
Запись . Курс = 2.8020 ; // Изменение курса Евро
Запись . Записать (Истина); // Запись курса Евро
Запись . Удалить (); // Удаление курса Евро

// Для группового изменения записей лучше использовать "Набор Записей"
Евро = Справочники . Валюты . НайтиПоНаименованию ( "Евро" );

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

Запись_1 = НаборЗаписей . Добавить ();
Запись_1 . Период = '20200401' ; // 01 апреля 2020 г.
Запись_1 . Валюта = Евро ;
Запись_1 . Курс = 2.8446 ;

Запись_2 = НаборЗаписей . Добавить ();
Запись_2 . Период = '20200402' ; // 02 апреля 2020 г.
Запись_2 . Валюта = Евро ;
Запись_2 . Курс = 2.8478 ;

Запись_3 = НаборЗаписей . Добавить ();
Запись_3 . Период = '20200403' ; // 03 апреля 2020 г.
Запись_3 . Валюта = Евро ;
Запись_3 . Курс = 2.8320 ;

Запись_4 = НаборЗаписей . Добавить ();
Запись_4 . Период = '20200404' ; // 04 апреля 2020 г.
Запись_4 . Валюта = Евро ;
Запись_4 . Курс = 2.7943 ;

Запись_5 = НаборЗаписей . Добавить ();
Запись_5 . Период = '20200405' ; // 05 апреля 2020 г.
Запись_5 . Валюта = Евро ;
Запись_5 . Курс = 2.7797 ;


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


// Описание типа строки:
НовСтрока = Новый ОписаниеТипов ( "Строка" );
// Описание строки с уточнением через квалификатор: максимальная длина строки = 50 символов
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока_50 = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

// Описание типа числа:
НовЧисло = Новый ОписаниеТипов ( "Число" );
// Описание числа с уточнением через квалификатор: общее число разрядов = 14, число дробной части = 3
КвалификаторыЧисла = Новый КвалификаторыЧисла ( 14 , 3 , ДопустимыйЗнак . Любой );
НовЧисло_14_3 = Новый ОписаниеТипов ( "Число" , КвалификаторыЧисла );

// Описание типа даты:
НовДата = Новый ОписаниеТипов ( "Дата" );
// Описание даты с уточнением через квалификатор: храниться только дата, без времени
КвалификаторыДаты = Новый КвалификаторыДаты ( ЧастиДаты . Дата );
НовДата_БезВремени = Новый ОписаниеТипов ( "Дата" , , , КвалификаторыДаты );

// Описание типа булево:
НовБулево = Новый ОписаниеТипов ( "Булево" ); // Истина, Ложь

// Описание типа справочника:
НовНоменклатура = Новый ОписаниеТипов ( "СправочникСсылка.Номенклатура" );

// Описание типа перечисление:
НовСпособОплаты = Новый ОписаниеТипов ( "ПеречислениеСсылка.СпособыОплаты" );

// Описание типа документа:
НовДоговор = Новый ОписаниеТипов ( "ДокументСсылка.Договор" );

// Описание типа структуры:
НовСтруктура = Новый ОписаниеТипов ( "Структура" );

// Описание типа соответствия:
НовСоответствие = Новый ОписаниеТипов ( "Соответствие" );

// Описание типа массива:
НовМассив = Новый ОписаниеТипов ( "Массив" );

// Описание типа хранилище значения:
НовХранилищеЗначения = Новый ОписаниеТипов ( "ХранилищеЗначения" );

// Описание типа таблица значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "ТаблицаЗначений" );

// Описание типа список значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "СписокЗначений" );

// Описание типа картинки:
НовКартинка = Новый ОписаниеТипов ( "Картинка" );

// Описание типа уникального идентификатора:
НовУникальныйИдентификатор = Новый ОписаниеТипов ( "УникальныйИдентификатор" );

// Описание типа объекта метаданых:
НовОбъектМетаданных = Новый ОписаниеТипов ( "ОбъектМетаданных, Строка" );

// Описание составного типа (Например: строка+структура+справочник):
СписокМассив = Новый Массив ;
СписокМассив . Добавить ( "Строка" );
СписокМассив . Добавить ( "Структура" );
СписокМассив . Добавить ( "СправочникСсылка.Номенклатура" );
ОписаниеСоставногоТипа = Новый ОписаниеТипов ( СписокМассив );

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

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

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

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

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

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

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

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

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

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

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

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

  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.

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

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

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

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

Читайте также: