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

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С при помощи БСП

 

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

См. также

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

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

9000 руб.

28.08.2019    33950    22    21    

74

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

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

5000 руб.

28.11.2018    20747    17    6    

42

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотеке стандартных подсистем. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП.

1800 руб.

21.11.2024    158    1    0    

2

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

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4125    John_d    10    

52

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5379    PROSTO-1C    12    

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

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


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

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

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

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

ПараметрыОтчета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
18. morozoffdn 03.09.24 16:30 Сейчас в теме
(16) Если это форма, то УникальныйИдентификатор это стандартный реквизит формы.
user1899316; +1 Ответить
17. ufedor 58 03.06.23 21:43 Сейчас в теме
Знаете чего я не нашел в функционале ЖР?
Работу с внешним файлом журнала. Платформа позволяет открывать файл журнала используя встроенные возможности толстого клиента и конфигуратора. Но почему бы не дать открывать внешний файл через обработку в БСП? Было бы логично.
Может быть кто-то добавлял такой функционал?
19. WeterSoft 118 28.10.24 15:56 Сейчас в теме
Без БСП на сервере
ЗаписьЖурналаРегистрации("Очистка план наряда",
		УровеньЖурналаРегистрации.Предупреждение,
		Метаданные.РегистрыСведений.ПланНаряд,
		ИмяПользователя(),
		СтрШаблон("Очистка: ПланНаряд от %1", ДатаФормирования));
20. StasN 11.11.24 15:15 Сейчас в теме
Не нашел функционала временного программного отключения записи в ЖР, вот допустим записываю программно в справочник или регистр триллион записей, ну вот зачем забивать мне ЖР логами о том что элемент записан...было бы удобно отключать запись на время выполнения процедуры
Оставьте свое сообщение