Приведенный выше пример подойдет, но нужно будет учесть моменты: если элемент -группа, или если значение установлено документом? Удаление нужно поместить в блок «Попытка Исключение КонецПопытки;»
Для свертки баз широко используется такая процедура:
Процедура УдалениеЗначенийПериодическихРеквизитов(ДатаСвертки)
Сообщить(Строка(ТекущееВремя())+» Удаляем значения периодических реквизитов в справочниках до даты свертки»);
Периодический = СоздатьОбъект(«Периодический»);
Для т = 1 По Метаданные.Справочник() Цикл
Состояние(«Удаление значений периодических реквизитов справочника «+Метаданные.Справочник(т).Идентификатор);
// Список периодических реквизитов
ПериодическиеРеквизиты = СоздатьОбъект(«СписокЗначений»);
Для п = 1 По Метаданные.Справочник(т).Реквизит() Цикл
Если Метаданные.Справочник(т).Реквизит(п).Периодический = 1 Тогда
// Есть периодический реквизит
ПериодическиеРеквизиты.ДобавитьЗначение(Метаданные.Справочник(т).Реквизит(п).Идентификатор);
КонецЕсли;
КонецЦикла;
Если ПериодическиеРеквизиты.РазмерСписка() > 0 Тогда
Сообщить(«Удаление значений периодических реквизитов справочника «+Метаданные.Справочник(т).Идентификатор);
Справ = СоздатьОбъект(«Справочник.»+Метаданные.Справочник(т).Идентификатор);
Если Метаданные.Справочник(т).Владелец.Выбран() = 1 Тогда
// подчиненный справочник (необходимо сначала выбрать владельца)
Владельцы = СоздатьОбъект(«Справочник.» + Метаданные.Справочник(т).Владелец.Идентификатор);
Владельцы.ВыбратьЭлементы();
Пока Владельцы.ПолучитьЭлемент() = 1 Цикл
Справ.ИспользоватьВладельца(Владельцы.ТекущийЭлемент());
Справ.ВыбратьЭлементы();
Пока Справ.ПолучитьЭлемент() = 1 Цикл
Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
СтрокаСостояния();
ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
//Сообщить(«Текщий период. реквизит = «+ИдРекв);
Периодический.ИспользоватьОбъект(Строка(ИдРекв), Справ.ТекущийЭлемент());
// оставляем только одно значение периодического реквизита до даты свертки
// остальные удаляем
Периодический.ОбратныйПорядок(1);
Периодический.ВыбратьЗначения(, ДатаСвертки);
СчетчикЗначений = 0;
Пока Периодический.ПолучитьЗначение() = 1 Цикл
Если СчетчикЗначений > 0 Тогда
Периодический.Удалить();
КонецЕсли;
СчетчикЗначений = СчетчикЗначений + 1;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Иначе
// обычный справочник
Справ.ВыбратьЭлементы();
Пока Справ.ПолучитьЭлемент() = 1 Цикл
Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
СтрокаСостояния();
ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
//Сообщить(«Текщий период. реквизит = «+ИдРекв);
Попытка //т.к. для групп многие реквизиты не доступны
Периодический.ИспользоватьОбъект(ИдРекв, Справ.ТекущийЭлемент());
Исключение
//Сообщить(«Невозможно получить реквизит [«+ИдРекв+»] для элемента «+ Справ.Код);
Продолжить;
КонецПопытки;
// оставляем только одно значение периодического реквизита до даты свертки
// остальные удаляем
Периодический.ОбратныйПорядок(1);
Периодический.ВыбратьЗначения(, ДатаСвертки);
СчетчикЗначений = 0;
Пока Периодический.ПолучитьЗначение() = 1 Цикл
Если СчетчикЗначений > 0 Тогда
Попытка //нельзя удалить значения, установленные документами
Периодический.Удалить();
Исключение
//ОписаниеОшибки()
КонецПопытки;
КонецЕсли;
СчетчикЗначений = СчетчикЗначений + 1;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла
КонецПроцедуры // УдалениеЗначенийПериодическихРеквизитов()
Перейти к навигации
перейти к содержанию
1С 77 Удаление периодических реквизитов на дату
Объект Периодический, метод Удалить():
Удалить()
Синтаксис:
Удалить()
Назначение:
Удалить периодическое значение на заданную дату.
Возвращает: 1 – если вызов метода закончился успешно, 0 – иначе.
Замечание:
До вызова данного метода периодическое значение следует выбрать при помощи методов ПолучитьЗначение или НайтиЗначение.
// УДАЛЕНИЕ ********************************************************************************************************************** // Процедура ПоКнУдалить() // ОБНУЛИМ ПЕРЕМЕННЫЕ Перем Пер; Перем СтрСЗ; // СОЗДАДИМ ПЕРИОДИЧЕСКИЙ Пер = СоздатьОбъект(«Периодический»); // ОБНУЛИМ ПЕРЕМЕННЫЕ ТекКоличество =0; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл СтрокаСостояния(); // ПРОВЕРКА Если ТЗ.Пометка = МеткиНет Тогда Продолжить; КонецЕсли; // ОБНУЛИМ ПЕРЕМЕННЫЕ ТекОбъект = «»; // ЗАПОМНИМ ПЕРЕМЕННЫЕ ТекОбъект = ТЗ.Спр; // ОБНУЛИМ ПЕРЕМЕННЫЕ ТекРеквизит = «»; // ЗАПОМНИМ ПЕРЕМЕННЫЕ ТекРеквизит = СЗ_Рекв.ПолучитьЗначение(СЗ_Рекв.ТекущаяСтрока(), СтрСЗ); // ФИЛЬТР Пер.ИспользоватьОбъект(ТекРеквизит, ТекОбъект); // ПЕРЕБОР ЗНАЧЕНИЙ Если Пер.ВыбратьЗначения(ТЗ.Дата, ТЗ.Дата) = 1 Тогда Пока Пер.ПолучитьЗначение() = 1 Цикл // ОБНУЛИМ ПЕРЕМЕННЫЕ ТекДокумент = «»; // ЗАПОМНИМ ПЕРЕМЕННЫЕ ТекДокумент = Пер.ТекущийДокумент(); // ПРОВЕРКА Если ПустоеЗначение(ТекДокумент) = 0 Тогда // СООБЩЕНИЕ глпВыводСообщение(«Пропущено значение » + СокрЛП(Пер.Значение) + » на дату » + СокрЛП(ТЗ.Дата) + «, введено документом » + глПредставлениеДокумента(ТекДокумент), глфВозвратФлагОтладка(ФлагОтладка)); Продолжить; КонецЕсли; // ПРОВЕРКА Если Пер.Значение <> ТЗ.ЗнРекв Тогда // СООБЩЕНИЕ глпВыводСообщение(«Пропущено значение » + СокрЛП(Пер.Значение) + » на дату » + СокрЛП(ТЗ.Дата) + «, отличается от выбранного значения » + СокрЛП(ТЗ.ЗнРекв), глфВозвратФлагОтладка(ФлагОтладка)); Продолжить; КонецЕсли; // ПОПЫТКА Попытка Пер.Удалить(); // СООБЩЕНИЕ глпВыводСообщение(«Удалено значение — » + СокрЛП(ТЗ.ЗнРекв) + » на дату » + СокрЛП(ТЗ.Дата), 1); // СЧЕТЧИК ТекКоличество = ТекКоличество + 1; Исключение // СООБЩЕНИЕ глпВыводСообщение(ОписаниеОшибки(), 1, «!»); КонецПопытки; КонецЦикла; КонецЕсли; КонецЦикла; // ЗАПОЛНИМ ТЗ Сформировать(РежимТЗ, 0); // ПРЕДУПРЕЖДЕНИЕ Предупреждение(«Выполнено!», 60); // СООБЩЕНИЕ глпВыводСообщение(«Удалено — «+ Строка(ТекКоличество) +» значений», 1); КонецПроцедуры // ПоКнУдалить()
Показать
На чтение 7 мин Просмотров 17.7к. Опубликовано 12.10.2017
Регистры сведений в 1С предназначены для хранения произвольных данных в разрезе нескольких измерений и, при необходимости, в разрезе времени. Рассмотрим подробнее работу с этим прикладным объектом.
- Предназначение регистра сведений
- Добавление записей
- Изменение записей
- Чтение записей
- Удаление записей
- Очистка регистра сведений
Содержание
- Предназначение регистра сведений
- Добавление записей
- Изменение записей
- Чтение записей
- Удаление записей
- Очистка регистра сведений
Предназначение регистра сведений
Регистры сведений в 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
КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют»;Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПоследних.Период,
| КурсыВалютСрезПоследних.Валюта,
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
- Выбрать(<Отбор>, <Порядок>) — выбирает записи с указанным отбором;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Отбор>) — получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
- Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>) — выбирает записи с указанным отбором, у которых период находится между <НачалоИнтервала> и <КонецИнтервала>;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Период>, <Отбор>) — получает ресурсы записи с отбором по всем измерениям и периоду;
- ПолучитьПервое(<НачалоПериода>, <Отбор>) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
- ПолучитьПоследнее(<КонецПериода>, <Отбор>) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
- СрезПервых(<НачалоПериода>, <Отбор>) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
- СрезПоследних(<КонецПериода>, <Отбор>) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи(записей) в независимом регистре сведений необходимо:
- создать набор записей;
- наложить требуемые отборы на измерения и период (если регистр периодический);
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));НаборЗаписей.Записать();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор);
НаборЗаписей.Записать();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.
Запрос = Новый Запрос(«ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры»);Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Записать();