Журнал регистрации - основные методы работы через БСП

11.11.21

База данных - Журнал регистрации

В данной небольшой статье я привожу практические примеры работы с журналом регистрации средствами и методами библиотеки стандартных подсистем.

 

Введение

Всем доброго времени суток!

В данной статье я предлагаю рассмотреть практические примеры возможностей актуальной библиотеки стандартных подсистем (БСП) в области функционала работы с "Журналом регистрации конфигурации". На момент написания статьи - я использую БСП версии 3.1.5.208. Все практические примеры статьи были реализованы на указанной версии БСП, использую платформу 1с 8.3.19.1264.

Публикация будет полезна всем разработчикам- программистам и администраторам баз данных, ну а так же любым пользователям, желающим познакомиться с основным функционалом журнал регистрации и методами записи и получения информации из него в типовых современных конфигурациях (работающих на БСП).

Примеры статьи актуальны для серверных и файловых баз.

Материал статьи я разделил на две части - в первой части описаны методы записи в журнал, а во второй - получение данных из журнала посредством методов библиотеки стандартных подсистем.

Итак, перейдем к первой части - методам записи в журнал регистрации:

 

Часть 1. Методы записи в журнал регистрации.

Самый простой метод регистрации в журнале возможен при выполнении такой процедуры

Процедура ДобавитьСообщениеДляЖурналаРегистрации(Знач ИмяСобытия, Знач ПредставлениеУровня = "Информация", Знач Комментарий = "", Знач ДатаСобытия = "", Знач ЗаписатьСобытия = Ложь) Экспорт

 

код исполнения выглядит вот так:

 
 ДобавитьСообщениеДляЖурналаРегистрации

 

&НаКлиенте
Процедура ВыполнитьЗаписьНаКлиенте()
	
	ИмяСобытия = "Событие тестовое строкой на клиенте";
		
	ПредставлениеУровня = "Ошибка";   //представление уровня записи - "Информация", "Ошибка", "Предупреждение", "Примечание".
	Комментарий = "Комментарий к записи на клиенте"; 
	//	ДатаСобытия = ТекущаяДата();
		
	ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, ПредставлениеУровня, Комментарий,,Истина);	
	
КонецПроцедуры	

 

Результат исполнения процедуры записи выглядит вот так:

 

Рис.1. Данная запись создана процедурой ДобавитьСообщениеДляЖурналаРегистрации.

 

Рассмотрим еще один способ пакетной записи в журнал регистрации через структуру с помощью процедуры ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт.

 

код исполнения выглядит вот так:

 
 ЗаписатьСобытияВЖурналРегистрации

 

&НаСервере
Процедура ВыполнитьНаСервере()

	
		СтруктураСобытий = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий,ДатаСобытия");
		
		СтруктураСобытий.ИмяСобытия 		 = "Тестовая запись в журнал";
		
		СтруктураСобытий.ПредставлениеУровня = "Предупреждение";	//"Информация", "Ошибка", "Предупреждение", "Примечание".
		СтруктураСобытий.Комментарий 		 = "Комментарий к событию";
		//СтруктураСобытий.ДатаСобытия 		 = ТекущаяДата();
		
		СобытияДляЖурналаРегистрации = Новый СписокЗначений();
		СобытияДляЖурналаРегистрации.Добавить(СтруктураСобытий);
		
		ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации);
	
КонецПроцедуры

 

 

Убедимся, что работает. Результат исполнения данной процедуры аналогичен предыдущей - запись появилась.

 

Рис.2. Данная запись создана процедурой ЗаписатьСобытияВЖурналРегистрации.

 

С методами записи в журнал считаю, что достаточно. Предлагаю перейти ко второй части статью - методам получения информации  из журнала регистрации.

 

Часть 2. Методы получения информации из журнала регистрации.

Для начала рассмотрим самый простой способ получения информации по отбору в форме самого журнала. Для этого воспользуемся процедурой ОткрытьЖурналРегистрации(Знач Отбор = Неопределено, Владелец = Неопределено) Экспорт

 

Код с отбором выглядит вот так:

 
 Открытие формы журнала регистрации с отбором

 

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

 

 

Результат выполнения кода вот такой:

 

Рис.3. Программное открытие формы журнала регистрации с заданным отбором.

 

Здесь все просто - программно открывается форма журнала и мы видим все события по заданному отбору. Далее, давайте рассмотрим более сложный метод получения информации из технологического журнала - в структуру.

Для этого воспользуемся стандартной процедурой БСП ПрочитатьСобытияЖурналаРегистрации, которая вернет нам структуру записей журнала. Да-Да, именно вернет.

Данная типовая процедура помещает результат выполнения (в данном случае - это структура записей журнала регистрации) в хранилище. Код этой типовой процедуры выглядит вот так:

 
 ПрочитатьСобытияЖурналаРегистрации (БСП)

 

Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт
	
	ОтборЖурналаНаКлиенте          = ПараметрыОтчета.ОтборЖурналаРегистрации;
	КоличествоСобытий              = ПараметрыОтчета.КоличествоПоказываемыхСобытий;
	МенеджерВладельца              = ПараметрыОтчета.МенеджерВладельца;
	ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки;
	
	// Проверяем параметры на корректность.
	ДатаНачала    = Неопределено;
	ДатаОкончания = Неопределено;
	ДатыОтбораУказаны = ОтборЖурналаНаКлиенте.Свойство("ДатаНачала", ДатаНачала) И ОтборЖурналаНаКлиенте.Свойство("ДатаОкончания", ДатаОкончания)
		И ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ОтборЖурналаНаКлиенте.ДатаОкончания);
		
	Если ДатыОтбораУказаны И ДатаНачала > ДатаОкончания Тогда
		ВызватьИсключение НСтр("ru = 'Некорректно заданы условия отбора журнала регистрации. Дата начала больше даты окончания.'");
	КонецЕсли;
	СмещениеВремениСервера = СмещениеВремениСервера();
	
	// Подготовка отбора
	Отбор = Новый Структура;
	Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл
		Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
	КонецЦикла;
	ПреобразованиеОтбора(Отбор, СмещениеВремениСервера);
	
	// Выгрузка отбираемых событий и формирование структуры таблицы.
	СобытияЖурнала = Новый ТаблицаЗначений;
	ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоСобытий);
	
	СобытияЖурнала.Колонки.Дата.Имя = "ДатаНаСервере";
	СобытияЖурнала.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
	
	СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число"));
	СобытияЖурнала.Колонки.Добавить("АдресДанных",  Новый ОписаниеТипов("Строка"));
	
	Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		СобытияЖурнала.Колонки.Добавить("РазделениеДанныхСеанса", Новый ОписаниеТипов("Строка"));
		СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка"));
	КонецЕсли;
	
	Если ДобавлятьДополнительныеКолонки Тогда
		МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала);
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено()
	   И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()
	   И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
		
		МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
		ПсевдонимыПользователей    = Новый Соответствие();
	Иначе
		МодульРаботаВМоделиСервиса = Неопределено;
		ПсевдонимыПользователей    = Неопределено;
	КонецЕсли;
	
	Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл
		СобытиеЖурнала.Дата = СобытиеЖурнала.ДатаНаСервере - СмещениеВремениСервера;
		
		// Заполнение номеров картинок строк.
		МенеджерВладельца.УстановитьНомерРисунка(СобытиеЖурнала);
		
		Если ДобавлятьДополнительныеКолонки Тогда
			// Заполнение дополнительных полей, определенных только у владельца.
			МенеджерВладельца.ЗаполнитьДополнительныеКолонкиСобытия(СобытиеЖурнала);
		КонецЕсли;
		
		// Преобразование массива метаданных в список значений.
		СписокПредставленийМетаданных = Новый СписокЗначений;
		Если ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив") Тогда
			СписокПредставленийМетаданных.ЗагрузитьЗначения(СобытиеЖурнала.ПредставлениеМетаданных);
			СобытиеЖурнала.ПредставлениеМетаданных = СписокПредставленийМетаданных;
		Иначе
			СобытиеЖурнала.ПредставлениеМетаданных = Строка(СобытиеЖурнала.ПредставлениеМетаданных);
		КонецЕсли;
		
		// Преобразование массива "ПредставлениеРазделенияДанныхСеанса" в список значений.
		Если ОбщегоНазначения.РазделениеВключено()
			И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
			ПолноеПредставлениеРазделенияДанныхСеанса = "";
			
			РазделениеДанныхСеанса = СобытиеЖурнала.РазделениеДанныхСеанса;
			СписокРеквизитовРазделенияДанных = Новый СписокЗначений;
			Для Каждого РазделительСеанса Из РазделениеДанныхСеанса Цикл
				ПредставлениеРазделителя = Метаданные.ОбщиеРеквизиты.Найти(РазделительСеанса.Ключ).Синоним;
				ПредставлениеРазделителя = ПредставлениеРазделителя + " = " + РазделительСеанса.Значение;
				ЗначениеРазделителя = РазделительСеанса.Ключ + "=" + РазделительСеанса.Значение;
				СписокРеквизитовРазделенияДанных.Добавить(ЗначениеРазделителя, ПредставлениеРазделителя);
				ПолноеПредставлениеРазделенияДанныхСеанса = ?(Не ПустаяСтрока(ПолноеПредставлениеРазделенияДанныхСеанса),
				                                            ПолноеПредставлениеРазделенияДанныхСеанса + "; ", "")
				                                            + ПредставлениеРазделителя;
			КонецЦикла;
			СобытиеЖурнала.РазделениеДанныхСеанса = СписокРеквизитовРазделенияДанных;
			СобытиеЖурнала.ПредставлениеРазделенияДанныхСеанса = ПолноеПредставлениеРазделенияДанныхСеанса;
		КонецЕсли;
		
		// Обработка данных специальных событий.
		Если СобытиеЖурнала.Событие = "_$Access$_.Access" Тогда
			УстановитьСтрокуАдресаДанных(СобытиеЖурнала);
			
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				СобытиеЖурнала.Данные = ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", "...");
			КонецЕсли;
			
		ИначеЕсли СобытиеЖурнала.Событие = "_$Access$_.AccessDenied" Тогда
			УстановитьСтрокуАдресаДанных(СобытиеЖурнала);
			
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				Если СобытиеЖурнала.Данные.Свойство("Право") Тогда
					СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Право: %1'"), 
						СобытиеЖурнала.Данные.Право);
				Иначе
					ДанныеЖурнала = СобытиеЖурнала.Данные; // Структура
					СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Действие: %1%2'"), 
						ДанныеЖурнала.Действие, ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...") );
				КонецЕсли;
			КонецЕсли;
			
		ИначеЕсли СобытиеЖурнала.Событие = "_$Session$_.Authentication"
		      Или СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда
			
			УстановитьСтрокуАдресаДанных(СобытиеЖурнала);
			
			СобытиеЖурналаДанные = "";
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				Для Каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл
					Если ЗначениеЗаполнено(СобытиеЖурналаДанные) Тогда
						СобытиеЖурналаДанные = СобытиеЖурналаДанные + ", ...";
						Прервать;
					КонецЕсли;
					СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;
				КонецЦикла;
			КонецЕсли;
			СобытиеЖурнала.Данные = СобытиеЖурналаДанные;
			
		ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.Delete" Тогда
			УстановитьСтрокуАдресаДанных(СобытиеЖурнала);
			
			СобытиеЖурналаДанные = "";
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				Для каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл
					СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;
					Прервать;
				КонецЦикла;
			КонецЕсли;
			СобытиеЖурнала.Данные = СобытиеЖурналаДанные;
			
		ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.New"
		      ИЛИ СобытиеЖурнала.Событие = "_$User$_.Update" Тогда
			УстановитьСтрокуАдресаДанных(СобытиеЖурнала);
			
			ИмяПользователяИБ = "";
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				СобытиеЖурнала.Данные.Свойство("Имя", ИмяПользователяИБ);
			КонецЕсли;
			СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Имя: %1, ...'"), ИмяПользователяИБ);
			
		КонецЕсли;
		
		УстановитьПривилегированныйРежим(Истина);
		// Уточнение имени пользователя.
		Если СобытиеЖурнала.Пользователь = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
			СобытиеЖурнала.ИмяПользователя = НСтр("ru = '<Неопределен>'");
			
		ИначеЕсли СобытиеЖурнала.ИмяПользователя = "" Тогда
			СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя();
			
		ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда
			СобытиеЖурнала.ИмяПользователя = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 <Удален>'"), СобытиеЖурнала.ИмяПользователя);
		КонецЕсли;
		
		Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
			Если ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь) = Неопределено Тогда
				ПсевдонимПользователя = МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(СобытиеЖурнала.Пользователь);
				ПсевдонимыПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимПользователя);
			Иначе
				ПсевдонимПользователя = ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь);
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ПсевдонимПользователя) Тогда
				СобытиеЖурнала.ИмяПользователя = ПсевдонимПользователя;
			КонецЕсли;
		КонецЕсли;
		
		// Преобразование идентификатора в имя для использования в дальнейшем при установке отборе.
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь);
		Если ПользовательИБ <> Неопределено Тогда
			СобытиеЖурнала.Пользователь = ПользовательИБ.Имя;
		КонецЕсли;
		УстановитьПривилегированныйРежим(Ложь);
	КонецЦикла;
	
	// Успешное завершение
	Результат = Новый Структура;
	Результат.Вставить("СобытияЖурнала", СобытияЖурнала);
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	
КонецПроцедуры

 

 

Чтобы получить результат, воспользуемся возможностями БСП - ДлительныеОперации. Общий код получения выглядит вот так:

Структура

 

&НаСервере
Функция ПараметрыОтчета() // конструктор отбора для выполнения процедуры
	
	ОтборЖурналаРегистрации = Новый Структура("ДатаНачала, ДатаОкончания");
	
	ОтборЖурналаРегистрации.ДатаНачала 	  = НачалоДня(ТекущаяДата());
	ОтборЖурналаРегистрации.ДатаОкончания = КонецДня(ТекущаяДата());
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("ОтборЖурналаРегистрации", ОтборЖурналаРегистрации);
	ПараметрыОтчета.Вставить("КоличествоПоказываемыхСобытий", 1000);
	ПараметрыОтчета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	ПараметрыОтчета.Вставить("МенеджерВладельца", Обработки.ЖурналРегистрации);
	ПараметрыОтчета.Вставить("ДобавлятьДополнительныеКолонки", Ложь);
	//ПараметрыОтчета.Вставить("Журнал", РеквизитФормыВЗначение("Журнал"));

	Возврат ПараметрыОтчета;
	
КонецФункции

&НаСервере
Процедура СобытияЖурнала()
	
	ПараметрыОтчета = ПараметрыОтчета();
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.ОжидатьЗавершение = 0;
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление журнала регистрации'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне("ЖурналРегистрации.ПрочитатьСобытияЖурналаРегистрации", ПараметрыОтчета, ПараметрыВыполнения);
	
	СтруктураЗаписейЖурнала = ПолучитьИЗВременногоХранилища(РезультатВыполнения.АдресРезультата);
	
		
КонецПроцедуры

 

 

Результат, который мы получим (вернули структуру с записями журнала):

 

Рис.4. Структура записей событий журнала.

 

В данной части мы рассмотрели два способа получения информации из журнала регистрации - по форме отбора и через структуру по средству функционала ДлительнойОперации. Теперь, перейдем заключению и выводам.

 

Заключение и выводы

В данной статье я рассмотрел основные возможности методов работы библиотеки стандартных подсистем с журналом регистрации в конфигурации. Примеры методов вы можете использовать в любой стандартной конфигурации 1С, основой которой является БСП.

Так же в статье затронута еще одна подсистема конфигурации - ДлительныеОперации. О ДлительныхОперациях вы можете прочитать мои статьи. Список полезных статей приведен в конце статьи.

Все эксперименты для написания этой статьи проводились на платформе 1С - 8.3.19.1264 и "чистой конфигурации" БСП 3.1.5.208.

Спасибо за прочтение данного материала. Если статья вам понравилась - прошу поддержать ее.

 

Другие мои материалы по подсистемам БСП

Также прошу ознакомиться с другими моими статьями по функционалу библиотеки стандартных подсистем и типовым конфигурациям по разделам:

 

Длительные операции:

Запуск почти любых процедур и функции конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 2]

БСП - рабочие примеры асинхронного запуска функций и процедур

 

Работа со штрихкодами и печатными макетами:

Генерация штрихкодов с помощью БСП для программистов

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Печать макета MS Word в любом документе с помощью БСП

 

Администрирование баз с помощью БСП:

Базовые приемы работы с кластером 1С при помощи БСП

 

журнал регистрации бсп запись чтение типовые конфигурации

См. также

Архивирование (backup) Журнал регистрации Поиск данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал регистрации изменений документов в 1С для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма «История изменений». Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

21600 руб.

15.05.2017    43097    12    24    

40

Журнал регистрации Мониторинг Системный администратор Программист Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Платные (руб)

В сферу обязанностей при работе с клиентами входит контроль работы баз данных и серверов 1С. Нужно понимать что происходит в базах, есть ли ошибки, зависания у пользователей и фоновых задач, блокировки или какое-то необычное поведение системы, получение информации о причинах возникновения проблем и их оперативное устранение и т.д. В качестве источников информации использую консоль кластеров 1С, технологический журнал 1С, журналы регистрации базы 1С. Для автоматизации части операций мониторинга и анализа создал инструмент на основе 1С.

9000 руб.

28.08.2019    32228    18    21    

70

Журнал регистрации Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

5000 руб.

28.11.2018    20074    14    6    

37

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    3451    YA_418728146    11    

52
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. retr0 11.11.21 10:50 Сейчас в теме
Не очень понял прикола использовать БСПшную запись в ЖР. Смысл данной обертки вообще не понятен.
Gendelf; qvazare; zqzq; +3 Ответить
2. AnryMc 849 11.11.21 11:08 Сейчас в теме
(1)
Не очень понял прикола использовать БСПшную запись в ЖР. Смысл данной обертки вообще не понятен.


Да и получить запись ЖР, если написать "свой" будет в разы короче...
Meverix; Gendelf; qvazare; +3 Ответить
9. vaskomain 07.12.21 08:34 Сейчас в теме
(1) Это чтобы с клиента вызывать и свои обертки не писать
Tolpinski; +1 Ответить
10. retr0 07.12.21 08:41 Сейчас в теме
(9) Ну звучит логично. Спасибо, не подумал, просто в целом за все время никогда не приходилось на клиенте писать в ЖР что-либо..
3. vld1973 88 11.11.21 11:26 Сейчас в теме
Спасибо за то, что пишете статьи про функции БСП, хотя и использовал эти функции, но добавлю статью в избранное, чтобы быстро находить в случае необходимости.
LeXXeR; Tolpinski; user616816_Romeo8044; Serg O.; Lem0n; quazare; aximo; davdykin; +8 Ответить
4. davdykin 25 11.11.21 11:46 Сейчас в теме
Так же поддерживаю описание различных возможностей БСП, не скажу, что я от нее в восторге, но что имеем то имеем и знание как можно использовать этот механизм - будет весьма полезна.
Meverix; user616816_Romeo8044; aximo; +3 Ответить
5. aleksey2 87 11.11.21 14:57 Сейчас в теме
До кучи надо сделать сохранение этого журнала в Эксель и отправка на почту.
Процедура СобытияЖурнала()
	ПараметрыОтчета = ПараметрыОтчета();
	АдресВХ = ПоместитьВоВременноеХранилище( неопределено, новый УникальныйИдентификатор() );
	ЖурналРегистрации.ПрочитатьСобытияЖурналаРегистрации( ПараметрыОтчета, АдресВХ );
	Рез = ПолучитьИЗВременногоХранилища( АдресВХ );
	ТЗ = Рез.СобытияЖурнала;
	ТабДок = Новый ТабличныйДокумент;
	Построитель = Новый ПостроительОтчета();
        Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных( ТЗ );
        Построитель.Вывести( ТабДок );
        ИмяФайла = "C:\Temp\"+прав(Константы.ЗаголовокСистемы.Получить(),4)+"_ЖурналРегистрации.xls";    
        ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS );
КонецПроцедуры
Показать
triviumfan; quazare; +2 Ответить
6. quazare 3728 11.11.21 15:01 Сейчас в теме
Есть метод получения технического файла в xml файл - если интересно - опишу его
user1564146; +1 Ответить
7. quazare 3728 12.11.21 09:52 Сейчас в теме
вот вам товарищи, интересная процедура, которая запишет выборку журнала в xml файл и поместит его в хранилище.

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


если вам интересно - могу дать рабочий пример
8. quazare 3728 12.11.21 10:14 Сейчас в теме
11. RustIG 1720 26.05.22 12:08 Сейчас в теме
(0) спасибо - пригодилось!
12. RustIG 1720 26.05.22 12:15 Сейчас в теме
Журнал регистрации например в КА 2.4 не дает выбрать для поиска упаковки.

Поскольку открывается форма выбора единиц измерения - см. скрин.

в 1с КА 2.4 две формы для выбора - одна для выбора ед.изм, вторая для выбора упаковок - на самом деле форм выбора еще больше - например из документа или из других форм
вот так сложно устроили выбор...

Получилось вытащить сведения из ЖР только программно (открытие журнала программно - воспользовался данной статьей-подсказкой)... При этом совершенно невозможно получить ссылку на упаковку другими способами как только программно... То есть нельзя интерактивно указать упаковку - поскольку надо опять-таки перепрограммировать форму выбора...
Прикрепленные файлы:
13. Светлый ум 407 26.07.22 10:49 Сейчас в теме
14. sevarm 62 02.10.22 14:25 Сейчас в теме
+1. Очень помогла статья для анализа и отправки уведомлений при ошибках в обмене данными.
15. Gendelf 27.10.22 16:56 Сейчас в теме
Я так и не понял, почему адрес хранилища не передаётся в исполняемую функцию?
16. KuroiKagE 24.05.23 15:34 Сейчас в теме
Подскажите, пожалуйста, что нужно передать в реквизит УникальныйИдентификатор в последнем примере:

ПараметрыОтчета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
17. ufedor 58 03.06.23 21:43 Сейчас в теме
Знаете чего я не нашел в функционале ЖР?
Работу с внешним файлом журнала. Платформа позволяет открывать файл журнала используя встроенные возможности толстого клиента и конфигуратора. Но почему бы не дать открывать внешний файл через обработку в БСП? Было бы логично.
Может быть кто-то добавлял такой функционал?
Оставьте свое сообщение