1с удаление периодических реквизитов на дату

Приведенный выше пример подойдет, но нужно будет учесть моменты: если элемент -группа, или если значение установлено документом? Удаление нужно поместить в блок «Попытка Исключение КонецПопытки;»

Для свертки баз широко используется такая процедура:

Процедура УдалениеЗначенийПериодическихРеквизитов(ДатаСвертки)

   Сообщить(Строка(ТекущееВремя())+» Удаляем значения периодических реквизитов в справочниках до даты свертки»);        

   
   Периодический = СоздатьОбъект(«Периодический»);

   
   Для т = 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. Предназначение регистра сведений
  2. Добавление записей
  3. Изменение записей
  4. Чтение записей
  5. Удаление записей
  6. Очистка регистра сведений

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

Регистры сведений в 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.

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

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

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

Понравилась статья? Поделить с друзьями:
  • Boxberry проспект вернадского 39 часы работы
  • 1с узнать значение дополнительного реквизита
  • Яндекс это государственная компания или нет
  • Boxberry часы работы пунктов выдачи в москве
  • 1с унф дополнительные реквизиты номенклатуры