1с как определить тип регистра программно
&НаСервере
Процедура ЧтениеЗаписи ()
// Чтение всех записей регистра "ЦеныРеализации" по организации ОАО "Гипермаркет АЗИЯ" (упорядоченных по дате).
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Активность = Истина И
| ЦеныРеализации.Организация = &ВыбОрганизация
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.Период" ;
Запрос . УстановитьПараметр ( "ВыбОрганизация" , Справочники . Организации . НайтиПоНаименованию ( "ОАО ""Гипермаркет АЗИЯ""" ));
РезультатЗапроса = Запрос . Выполнить ();
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
Сообщить ( "за " + Записи . Период + " на " + Записи . Номенклатура + " " + Записи . Контрагент + " руб." );
Поиск и программное изменение записи документа в регистр сведений в 1С 8.3:&НаСервере
Процедура ПоискИИзменениеЗаписи ()
УстановкаЦенСсылка = Документы . УстановкаЦен . НайтиПоНомеру ( "ПТО-00000001" , '20201231' );
УстановкаЦен = УстановкаЦенСсылка . ПолучитьОбъект ();
// Получение набора записей документа Установка цен № ПТО-00000001 от 31.12.20 в регистр "ЦеныРеализации"
НаборЗаписей = УстановкаЦен . Движения . ЦеныРеализации ;
// Чтение набора записей из базы данных.
НаборЗаписей . Прочитать ();
Для Каждого Запись Из НаборЗаписей Цикл
// Получение старых значений
Сообщить ( " по " + Запись . Организация + ", " + Запись . Контрагент + ", " + Запись . Номенклатура + " ОАО ""Гипермаркет АЗИЯ""" );
НоваяЗапись . Контрагент = Справочники . Контрагенты . НайтиПоНаименованию ( "ООО ""БелИмпортТорг""" );
НоваяЗапись . Номенклатура = Справочники . Номенклатура . НайтиПоНаименованию ( "Молоко 3,2%" );
НоваяЗапись . Цена = 3 ;
// Замещение старых записей и запись новых
НаборЗаписей . Записать (Истина);
&НаСервере
Процедура ЧтениеЗаписиЗапросом ()
// Если не требуется изменять найденные записи.
СсылкаДок = Документы . УстановкаЦен . НайтиПоНомеру ( "ПТО-00000001" , '20201231' );
// Чтение запросом записей регистра сведений "ЦеныРеализации" текущего документа
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.НомерСтроки" ;
Запрос . УстановитьПараметр ( "Регистратор" , СсылкаДок );
РезультатЗапроса = Запрос . Выполнить ();
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
Сообщить ( "по документу " + Записи . Регистратор + " по " + Записи . Организация + ", "
+ Записи . Контрагент + " " + Записи . Номенклатура + " руб." );
&НаСервере
Процедура ПолучениеНаиболееРаннихЗаписей ()
// Параметры виртуальной таблицы СрезПервых:
// 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
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . Валюта = Доллар ;
НоваяЗапись . Курс = 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
КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
Для периодических регистров сведений:
Удаление записей
Для удаления записи(записей) в независимом регистре сведений необходимо:
- создать набор записей;
- наложить требуемые отборы на измерения и период (если регистр периодический);
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
НаборЗаписей . Отбор . Период . Установить ( НачалоДня ( ТекущаяДата ()));НаборЗаписей . Записать ();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений . ЦеныНоменклатуры . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Регистратор . Установить ( СсылкаНаДокументРегистратор );
НаборЗаписей . Записать ();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей ();
НаборЗаписей . Записать ();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.
Остались вопросы?
Спросите в комментариях к статье.
7 комментариев
Для этого примера интересным решением будет использовать независимый регистр сведений с индексированным реквизитом ДокументДвижение, используя его как аналог Регистратора. В этом случае можно будет получить профит при записи регистра.
Не понятно за счет чего может быть профит при записи набора записей независимого регистра сведений. Можете пояснить?
Читайте также: