v8: Запись таблицы значений в регистр сведений с автоматическими отборамиЧтобы не мучаться с отборами и записать таблицу значений в регистр сведений, используйте мою функцию. | | Автор статьи: Последняя редакция №1 от 17.10.06 URL: http://kb.mista.ru/article.php?id=383 | |
Ключевые слова: регистр сведений,набор записей,запись,измерения
Отборы - это структура, которая указывает, по каким измерениям делать отборы при записи таблицы значений в регистр сведений.
ТЗ - таблица, которая записывается в регистр сведений.
Если измерение есть в Отборы и в ТЗ, то значение измерения берется из ТЗ, это дает бонусы:
1. Можно в Отборы указать значение измерения, общего для всех строк.
Также можно использовать какую-либо колонку ТЗ (имя колонки задается в КолонкаОчистки), непустое значение в которой указывает, что строка используется только для очистки регистра сведений по содержащимся в строке измерениям.
Это позволяет использовать одну и ту же ТЗ для заполнения данных и очистки регистра сведений по тем измерениям, где данных нет.
Например, если мы заполняем РС по подразделениям, можно сначала получить данные для занесения в регистр и занести их в ТЗ, а затем добавить в ТЗ по одной строке на каждое подразделение.
Таким образом будет гарантировано, что по тем подразделениям, по которым не было получено данных, но были старые данные, произойдет очистка значений.
//Позволяет записать таблицу значений в регистр сведений, перезаписывая старые записи
//Отборы - показывает, в разрезе каких измерений очищать записи
//КолонкаОчистки - указывает на колонку (если она есть), если в ней содержится значение, не равное Неопределено,
// то эта строка ТЗ не переносится в регистр сведений. Т.е. такие строки используются только для очистки значений.
Функция обЗаписатьРегистрСведений(РСМенеджер, ТЗ, Отборы, КолонкаОчистки=Неопределено)
НЗ=РСМенеджер.СоздатьНаборЗаписей();
//Получаем всевозможные наборы отборов из таблицы значений
СписокКлючей="";
Ключи=Новый Структура(); //Содержатся все ключи из отбора
Поиск=Новый Структура(); //Содержатся только те ключи, что есть в таблице значений
Для Каждого Отбор из Отборы Цикл
Ключи.Вставить(Отбор.Ключ, Отбор.Значение);
Если ТЗ.Колонки.Найти(Отбор.Ключ)<>Неопределено Тогда
Поиск.Вставить(Отбор.Ключ);
СписокКлючей=СписокКлючей+?(СписокКлючей="","",",")+Отбор.Ключ;
КонецЕсли;
КонецЦикла;
ТЗ1=ТЗ.Скопировать();
ТЗ1.Свернуть(СписокКлючей, ""); //Получаем различные наборы измерений
Для Каждого СтрОтбор из ТЗ1 Цикл
ЗаполнитьЗначенияСвойств(Поиск, СтрОтбор);
ЗаполнитьЗначенияСвойств(Ключи, СтрОтбор);
Строки=ТЗ.НайтиСтроки(Поиск); //Ищем строки по выбранным измерениям
//Устанавливаем отбор
Для Каждого Эл из Ключи Цикл
Если Эл.Значение<>Неопределено Тогда
НЗ.Отбор[Эл.Ключ].Значение=Эл.Значение;
НЗ.Отбор[Эл.Ключ].Использование=истина;
КонецЕсли;
КонецЦикла;
//Очищаем набор записей
НЗ.Очистить();
Для Каждого Стр ИЗ Строки Цикл
Если КолонкаОчистки<>Неопределено и Стр[КолонкаОчистки]<>Неопределено Тогда
Продолжить;
КонецЕсли;
МЗ=НЗ.Добавить();
ЗаполнитьЗначенияСвойств(МЗ, Ключи);
ЗаполнитьЗначенияСвойств(МЗ, Стр);
КонецЦикла;
НаборЗаписейЗаписать(НЗ);
КонецЦикла;
КонецФункции
Ссылку на обсуждение не смог найти поиском.
Потом выложу как-нибудь. |