среда, 8 апреля 2015 г.

Библиотека функций работы с наборами записей регистров

Реально неудобно сделан в 1С 8 отбор для наборов записей регистров.
Начну с независимых регистров сведений. Зачем столько писать?
НЗ = РегистрыСведений.СохраненныеНастройки.СоздатьНаборЗаписей();
НЗ.Отбор.Пользователь.Установить(ВыборкаПольз.Пользователь);
НЗ.Отбор.ИмяОбъекта.Установить(Выборка.ИмяОбъекта);
НЗ.Отбор.НаименованиеНастройки.Установить(Выборка.НаименованиеНастройки);
Если все равно отбор можно установить только на равенство? Мне кажется структура тут была бы гораздо удобнее:
НЗ = СоздатьНаборЗаписейНезависимогоРС(РегистрыСведений.СохраненныеНастройки, Новый Структура("Пользователь,ИмяОбъекта,НаименованиеНастройки",Пользователь,ИмяОбъекта,НаименованиеНастройки));
Вот и сама функция:
//Создает набор записей независимого непериодического регистра сведений
//Параметры:
//Менеджер - менеджер региста сведений
//СтруктураОтбора - структура, содержащая измерения отбора для набора записей
Функция СоздатьНаборЗаписейНезависимогоРС(Менеджер,СтруктураОтбора) Экспорт
  
 НЗ = Менеджер.СоздатьНаборЗаписей();
 
 Для каждого Эл Из НЗ.Отбор Цикл
  ЗначениеОтбора = Неопределено;
  Если СтруктураОтбора.Свойство(Эл.Имя,ЗначениеОтбора) Тогда
   Эл.Установить(ЗначениеОтбора);
  КонецЕсли; 
 КонецЦикла; 
 
 Возврат НЗ;
 
КонецФункции
Для периодических РС в структуру отбора можно добавить период.
Наборы записей регистров (любых), подчиненных регистраторам. Вынуждены писать так:
НЗ = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НЗ.Отбор.Регистратор.Установить(Ссылка);
Считаю более удобной запись такую:
НЗ = СоздатьНаборЗаписейРегистратора(РегистрыСведений.ЦеныНоменклатуры,Ссылка);
И соответствующая функция:
Функция СоздатьНаборЗаписейРегистратора(Менеджер,Регистратор) Экспорт
  
 НЗ = Менеджер.СоздатьНаборЗаписей();
 НЗ.Отбор.Регистратор.Установить(Ссылка); 
 Возврат НЗ;
 
КонецФункции 
Наконец совершенно непонятно из каких соображений нужно принудительно заполнять измерения/период/регистратор по которым делается отбор, если все равно нельзя записать набор несоответствующий отбору? Добавим соответствующую процедуру:
//Записывает набор записей с установленными отборами
//Параметры:
//НЗ - набор записей
//Замещать - режим замещения существующих записей, необязательный
Процедура ЗаписатьНаборЗаписей(НЗ,Замещать=Истина) Экспорт

 МассивЗаполнения =  Новый Массив(НЗ.Количество());
 Для каждого Эл Из НЗ.Отбор Цикл
  Если Эл.Использование Тогда
   Для й=0 По МассивЗаполнения.ВГраница() Цикл
    МассивЗаполнения[й] = Эл.Значение;   
   КонецЦикла; 
   НЗ.ЗагрузитьКолонку(МассивЗаполнения,Эл.Имя);
  КонецЕсли; 
 КонецЦикла; 
 НЗ.Записать(Замещать);

КонецПроцедуры

Комментариев нет:

Отправить комментарий