Собственно, ничего нового и необычного. Собрано на скорую руку, возможно поможет тем, к кому как и ко мне прибегут с вопросами типа: "Кто редактировал?" или "Нужны данные, что и сколько пользователь за период сделал в программе?".
Тестировал на конфигурации "Управление торговым предприятием для Украины", редакция 1.2. (1.2.63.1), Платформа 1С:Предприятие 8.3 (8.3.15.1700)
Код основной процедуры:
Процедура ЗаполнениеТПСписок()
Если Пользователи.Количество() = 0 И Данные.Количество() = 0 Тогда
Предупреждение("Необходимо указать пользователей или данные справочников/документов отбора");
Возврат;
КонецЕсли;
Если НачПериода = Дата(1,1,1) ИЛИ КонПериода = Дата(1,1,1) Тогда
Предупреждение("Необходимо указать период отбора");
Возврат;
КонецЕсли;
Если НЕ ТПСписок.Количество() = 0 Тогда
Если НЕ Вопрос("Перезаполнить таблицу?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТПСписок.Очистить();
ТПСписок.Колонки.Очистить();
МассивСобытий = Новый Массив;
МассивПользователей = Новый Массив;
МассивМетаданных = Новый Массив;
МассивДанных = Новый Массив;
МассивСобытий.Добавить("_$Data$_.New");
МассивСобытий.Добавить("_$Data$_.Update");
Для Каждого Эл Из Метаданные.Документы Цикл
МассивМетаданных.Добавить(Эл);
КонецЦикла;
Для Каждого Эл Из Метаданные.Справочники Цикл
МассивМетаданных.Добавить(Эл);
КонецЦикла;
Фильтр = Новый Структура("ДатаНачала, ДатаОкончания, Событие, Метаданные");
Фильтр.ДатаНачала = НачПериода;
Фильтр.ДатаОкончания = КонецДня(КонПериода);
Фильтр.Событие = МассивСобытий;
Фильтр.Метаданные = МассивМетаданных;
Если НЕ Пользователи.Количество() = 0 Тогда
Для Каждого Эл Из Пользователи Цикл
ТекПользователь = Эл.Значение;
Если ТекПользователь = Неопределено ИЛИ НЕ ТипЗнч(ТекПользователь) = Тип("СправочникСсылка.Пользователи") Тогда
ТекПользователь = Справочники.Пользователи.ПустаяСсылка();
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ТекПользователь) Тогда
Продолжить;
КонецЕсли;
ТекНаимП = СокрЛП(ТекПользователь.Наименование);
Если ТекНаимП = Неопределено ИЛИ НЕ ТипЗнч(ТекНаимП) = Тип("Строка") Тогда
ТекНаимП = "";
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ТекНаимП) Тогда
Продолжить;
КонецЕсли;
МассивПользователей.Добавить(ТекПользователь.Наименование);
КонецЦикла;
Если НЕ МассивПользователей.Количество() = 0 Тогда
Фильтр.Вставить("Пользователь", МассивПользователей);
КонецЕсли;
КонецЕсли;
ТекСсылка = Неопределено;
Если НЕ Данные.Количество() = 0 Тогда
Для Каждого Эл Из Данные Цикл
ТекСсылка = Эл.Значение;
Если ТекСсылка = Неопределено ИЛИ НЕ ЗначениеЗаполнено(ТекСсылка) Тогда
Продолжить;
КонецЕсли;
Фильтр.Вставить("Данные", ТекСсылка);
Прервать;
КонецЦикла;
КонецЕсли;
Если МассивПользователей.Количество() = 0 И (ТекСсылка = Неопределено ИЛИ НЕ ЗначениеЗаполнено(ТекСсылка)) Тогда
Предупреждение("Необходимо корректно указать пользователей или данные справочников или документов отбора");
Возврат;
КонецЕсли;
СтрКолонок = "Дата,ИмяПользователя,Событие,Метаданные,Данные,ПредставлениеДанных";
СтрокаКолонок = "Date,UserName,EventName,MetadataName,Data,DataPresentation";
ТаблицаКолонок = ТаблицаКолонокЖурналаРегистрации();
// Переименовываем колонки журнала регистрации к типу "NameXML"
ПереименоватьКолонкиТаблицыЖурналаРегистрации(ТПСписок, "NameXML", , ТаблицаКолонок);
// Дополняем колонки
Если ТПСписок.Колонки.Найти("Месяц") = Неопределено Тогда
ТПСписок.Колонки.Добавить("Месяц", Новый ОписаниеТипов("Дата"), "Месяц", 15);
КонецЕсли;
Колонки = ТПСписок.Колонки;
ЛюбаяСсылка = Справочники.ТипВсеСсылки();
ЛюбаяСсылка = Новый ОписаниеТипов(ЛюбаяСсылка, Документы.ТипВсеССылки().Типы());
Если СтрокаКолонок = Неопределено Тогда
Для Каждого ОписаниеКолонки Из ТаблицаКолонок Цикл
Если Колонки.Найти(ОписаниеКолонки.NameXML) = Неопределено Тогда
Если ОписаниеКолонки.NameXML = "Данные" ИЛИ ОписаниеКолонки.NameXML = "Data" Тогда
Колонки.Добавить(ОписаниеКолонки.Имя, ЛюбаяСсылка , ОписаниеКолонки.Представление);
Иначе
Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.Тип , ОписаниеКолонки.Представление);
КонецЕсли;
КонецЕсли
КонецЦикла;
Иначе
СтруктураКолонок = Новый Структура(СтрокаКолонок);
Для Каждого ЭлементКолонки Из СтруктураКолонок Цикл
ОписаниеКолонки = ТаблицаКолонок.Найти(ЭлементКолонки.Ключ, "Имя, Name, NameXML");
Если ОписаниеКолонки <> Неопределено Тогда
Если Колонки.Найти(ОписаниеКолонки.NameXML) = Неопределено Тогда
Если ОписаниеКолонки.NameXML = "Данные" ИЛИ ОписаниеКолонки.NameXML = "Data" Тогда
Колонки.Добавить(ОписаниеКолонки.Имя, ЛюбаяСсылка , ОписаниеКолонки.Представление);
Иначе
Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.Тип , ОписаниеКолонки.Представление);
КонецЕсли;
КонецЕсли
КонецЕсли;
КонецЦикла;
КонецЕсли;
ВтСписок = ТПСписок.СкопироватьКолонки();
Состояние("Запрос данных");
ВыгрузитьЖурналРегистрации(ВтСписок, Фильтр, СтрКолонок);
Для Каждого СтрВт Из ВтСписок Цикл
Состояние("Выгрузка данных " + (ВтСписок.Индекс(СтрВт) + 1) + " из " + ВтСписок.Количество());
СтрН = ТПСписок.Добавить();
ЗаполнитьЗначенияСвойств(СтрН, СтрВт);
Если НЕ ТПСписок.Колонки.Найти("Месяц") = Неопределено Тогда
СтрН.Месяц = НачалоМесяца(СтрН.Дата);
КонецЕсли;
Если НЕ ТПСписок.Колонки.Найти("Событие") = Неопределено Тогда
Если СтрН.Событие = "_$Data$_.New" Тогда
СтрН.Событие = "Создан";
КонецЕсли;
Если СтрН.Событие = "_$Data$_.Update" Тогда
СтрН.Событие = "Изменен";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Данные.Количество() > 1 Тогда
Для н = 1 По Данные.Количество() - 1 Цикл
Эл = Данные.Получить(н);
ТекСсылка = Эл.Значение;
Если ТекСсылка = Неопределено ИЛИ НЕ ЗначениеЗаполнено(ТекСсылка) Тогда
Продолжить;
КонецЕсли;
Фильтр.Вставить("Данные", ТекСсылка);
ВтСписок = ТПСписок.СкопироватьКолонки();
Состояние("Запрос данных по док. " + н + " из " + Данные.Количество());
ВыгрузитьЖурналРегистрации(ВтСписок, Фильтр, СтрКолонок);
Для Каждого СтрВт Из ВтСписок Цикл
Состояние("Выгрузка данных по док. " + (ВтСписок.Индекс(СтрВт) + 1) + " из " + ВтСписок.Количество());
СтрН = ТПСписок.Добавить();
ЗаполнитьЗначенияСвойств(СтрН, СтрВт);
Если НЕ ТПСписок.Колонки.Найти("Месяц") = Неопределено Тогда
СтрН.Месяц = НачалоМесяца(СтрН.Дата);
КонецЕсли;
Если НЕ ТПСписок.Колонки.Найти("Событие") = Неопределено Тогда
Если СтрН.Событие = "_$Data$_.New" Тогда
СтрН.Событие = "Создан";
КонецЕсли;
Если СтрН.Событие = "_$Data$_.Update" Тогда
СтрН.Событие = "Изменен";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
ТПСписок.Сортировать("ИмяПользователя,Месяц,Дата");
ЭлементыФормы.ТПСписок.СоздатьКолонки();
КолДан = ЭлементыФормы.ТПСписок.Колонки.Найти("Данные");
Если НЕ КолДан = Неопределено Тогда
КолДан.ЭлементУправления.КнопкаОткрытия = Истина;
КонецЕсли;
КонецПроцедуры // ЗаполнениеТПСписок()