Отправка уведомлений при сбое синхронизации

03.04.24

Интеграция - Перенос данных 1C

Расширение предназначено для отправки уведомления по электронной почте при ошибках обмена 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отправка уведомлений при сбое синхронизации для БП 3.0
.cfe 16,98Kb ver:1.3
6
6 Скачать (2 SM) Купить за 2 150 руб.
Отправка уведомлений при сбое синхронизации для УТ 11
.cfe 17,05Kb ver:1.3
1
1 Скачать (2 SM) Купить за 2 150 руб.

Расширение предназначено для отправки уведомления по электронной почте при сбое обмена между конфигурациями.

Схема работы: После завершения обмена анализируется журнал регистрации по данному узлу за 1 час и в случае обнаружения ошибки отправляется сообщение на электронную почту.

Также отрабатывается информационное событие "Сообщение обмена было ранее принято". 

Для отправки используется системная запись электронной почты. Адрес куда отправлять храниться в константе "Электронная почта для уведомления" - доступ через "Все функции".

Предназначена для любых конфигураций с БСП.

Тестировалась на БП 3.0.121.25, УТ 11.5.12.256.

Отправка уведомлений сбой синхронизации ошибка обмена сообщение почту

См. также

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141466    798    297    

419

SALE! 10%

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    166426    332    277    

373

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.234.x) и БП 3.0 (3.0.161.x). Правила подходят для версии ПРОФ и КОРП.

35000 31500 руб.

15.12.2021    23985    169    51    

127

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.19.x).

35000 31500 руб.

23.07.2020    51186    228    69    

185

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    36568    94    66    

89

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171155    303    257    

378

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

15300 13005 руб.

18.02.2016    186854    589    509    

526

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    80633    312    250    

264
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Tarlich 116 04.10.22 12:37 Сейчас в теме
Хороша идея .... так можно по любому событию допилить ...
2. Komanda1C 1 14.10.22 14:13 Сейчас в теме
Расширение само генерит ошибку, что вызывает аварийное завершение регламентного задания -

Значение не является значением объектного типа (СобытияЖурнала)
{ув_ОтправкаУведомленийОбОшибкахОбмена ОбщийМодуль.ОбменДаннымиСервер.Модуль(72)}:СобытияЖурнала=СтруктураЗаписейЖурнала.СобытияЖурнала;
{ув_ОтправкаУведомленийОбОшибкахОбмена ОбщийМодуль.ОбменДаннымиСервер.Модуль(10)}:СобытияЖурнала(Тело, УзелИнформационнойБазы);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(15318)}:ПослеВыполненияОбменов(Выборка.УзелИнформационнойБазы, ОтказПоСтрокеСценария);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(15371)}:ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Ложь, Выборка.Ссылка);
3. sevarm 64 14.10.22 17:58 Сейчас в теме
(2) А релиз и конфигурация у Вас какие?
4. Komanda1C 1 15.10.22 08:26 Сейчас в теме
(3)
Управление холдингом, редакция 3.1 (3.1.17.13)
Платформа 8.3.20.1613
5. sevarm 64 15.10.22 22:25 Сейчас в теме
(4) К сожалению нет у меня такой конфигурации и достать не удалось. На бухгалтерии все работает четко.
Я добавил процедуры работы с журналами прямо в расширение. Попробуйте скачать новую версию (должно бесплатно дать скачать) и проверить как будет у Вас работать.
6. Komanda1C 1 17.10.22 11:28 Сейчас в теме
(5)в УХ точно такая же БСП как и в БП. Новое расширение ничем не отличается от старого ))
7. sevarm 64 17.10.22 14:59 Сейчас в теме
(6) Отличается. Я не знаю как дает скачивать файл инфостарт если обновлялось. Можете сами дописать в расшиерение:
В строке 67 модуля "ОбменДаннымиСервер" расширения текст "ЖурналРегистрации.ПрочитатьСобытияЖурналаРегистрации" заменен на "ув_ЖурналРегистрации.ПрочитатьСобытияЖурналаРегистрации"

Добавлен общий модуль ув_ЖурналРегистрации :

#Область СлужебныйПрограммныйИнтерфейс

// Выполняет чтение событий журнала регистрации в соответствии с установленным отбором.
//
// Параметры:
//
//     ПараметрыОтчета - Структура - содержит параметры для чтения событий журнала регистрации. Содержит поля:
//      *  Журнал                  - ТаблицаЗначений         - содержит записи журнала регистрации.
//      *  ОтборЖурналаРегистрации   - Структура             - настройки отбора для чтения записей журнала регистрации:
//          ** ДатаНачала - Дата - дата начала событий (опционально).
//          ** ДатаОкончания - Дата - дата окончания событий (опционально).
//      *  КоличествоСобытий       - Число                   - ограничение числа считываемых событий журнала.
//      *  УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы.
//      *  МенеджерВладельца       - Произвольный            - менеджер объекта, в форме которого отображается журнал
//                                                             регистрации, необходим для обратного вызова функций
//                                                             оформления.
//      *  ДобавлятьДополнительныеКолонки - Булево           - определяет необходимость обратного вызова для добавления
//                                                             дополнительных колонок.
//     АдресХранилища - Строка
//                    - УникальныйИдентификатор - адрес временного хранилища для результата.
//
// Результат представляет собой структуру с полями:
//     СобытияЖурнала - ТаблицаЗначений - Отобранные события.
//
Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт
	
	ОтборЖурналаНаКлиенте          = ПараметрыОтчета.ОтборЖурналаРегистрации;
	КоличествоСобытий              = ПараметрыОтчета.КоличествоПоказываемыхСобытий;
	МенеджерВладельца              = ПараметрыОтчета.МенеджерВладельца;
	ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки;
	
	// Проверяем параметры на корректность.
	ДатаНачала    = Неопределено;
	ДатаОкончания = Неопределено;
	ДатыОтбораУказаны = ОтборЖурналаНаКлиенте.Свойство("ДатаНачала", ДатаНачала) И ОтборЖурналаНаКлиенте.Свойство("ДатаОкончания", ДатаОкончания)
		И ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ОтборЖурналаНаКлиенте.ДатаОкончания);
		
	Если ДатыОтбораУказаны И ДатаНачала > ДатаОкончания Тогда
		ВызватьИсключение НСтр("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 <Удален>'"), СобытиеЖурнала.ИмяПользователя);
		КонецЕсли;
		
		Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
			Если ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь) = Неопределено Тогда
				ПсевдонимПользователя = МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(СобытиеЖурнала.Пользователь);
				ПсевдонимыПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимПользователя);
			Иначе
				ПсевдонимПользователя = ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь);
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ПсевдонимПользователя) Тогда
				СобытиеЖурнала.ИмяПользователя = ПсевдонимПользователя;
			КонецЕсли;
		КонецЕсли;
		
		// Преобразование идентификатора в имя для использования в дальнейшем при установке отборе.
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь);
		Если ПользовательИБ <> Неопределено Тогда
			СобытиеЖурнала.Пользователь = ПользовательИБ.Имя;
		КонецЕсли;
		УстановитьПривилегированныйРежим(Ложь);
	КонецЦикла;
	
	// Успешное завершение
	Результат = Новый Структура;
	Результат.Вставить("СобытияЖурнала", СобытияЖурнала);
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры

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

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

// Определяет смещение времени сервера относительно времени программы.
//
// Возвращаемое значение:
//   Число - смещение времени в секундах.
//       Может использоваться для приведения фильтров, применяемых к журналу, к дате сервера,
//       а также для приведения дат, полученных из журнала, к датам программы.
//
Функция СмещениеВремениСервера() Экспорт
	
	СмещениеВремениСервера = ТекущаяДата() - ТекущаяДатаСеанса(); // АПК:143 Требуется дата компьютера
	Если СмещениеВремениСервера >= -1 И СмещениеВремениСервера <= 1 Тогда
		СмещениеВремениСервера = 0;
	КонецЕсли;
	Возврат СмещениеВремениСервера;
	
КонецФункции

#КонецОбласти  

#Область СлужебныеПроцедурыИФункции

// Преобразование отбора.
//
// Параметры:
//  Отбор - Отбор - передаваемый отбор.
//
Процедура ПреобразованиеОтбора(Отбор, СмещениеВремениСервера)
	
	Для Каждого ЭлементОтбора Из Отбор Цикл
		Если ТипЗнч(ЭлементОтбора.Значение) = Тип("СписокЗначений") Тогда
			ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора);
		ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("Транзакция") Тогда
			Если СтрНайти(ЭлементОтбора.Значение, "(") = 0 Тогда
				Отбор.Вставить(ЭлементОтбора.Ключ, "(" + ЭлементОтбора.Значение);
			КонецЕсли;
		ИначеЕсли СмещениеВремениСервера <> 0
			И (ВРег(ЭлементОтбора.Ключ) = ВРег("ДатаНачала") Или ВРег(ЭлементОтбора.Ключ) = ВРег("ДатаОкончания")) Тогда
			Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение + СмещениеВремениСервера);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

// Добавить ограничение в представление отбора.
//
// Параметры:
//  ОтборЖурналаРегистрации - Отбор - отбор журнала регистрации.
//  ПредставлениеОтбора - Строка - представление отбора.
//  ИмяОграничения - Строка - имя ограничения.
//  ОтборЖурналаРегистрацииПоУмолчанию - Отбор - отбор журнала регистрации по умолчанию.
//
Процедура ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, ИмяОграничения,
	ОтборЖурналаРегистрацииПоУмолчанию = Неопределено)
	
	Если Не ОтборЖурналаРегистрации.Свойство(ИмяОграничения) Тогда
		Возврат;
	КонецЕсли;
	
	СписокОграничений = ОтборЖурналаРегистрации[ИмяОграничения];
	Ограничение       = "";
	
	// Не формируем представление отбора, если его значение соответствует значению отбора по умолчанию.
	Если ОтборЖурналаРегистрацииПоУмолчанию <> Неопределено Тогда
		СписокОграниченийПоУмолчанию = "";
		Если ОтборЖурналаРегистрацииПоУмолчанию.Свойство(ИмяОграничения, СписокОграниченийПоУмолчанию) Тогда
			Если СписокОграниченийПоУмолчанию.Количество() = СписокОграничений.Количество() Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ИмяОграничения = "Событие" И СписокОграничений.Количество() > 5 Тогда
		
		Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'События (%1)'"), СписокОграничений.Количество());
		
	ИначеЕсли ИмяОграничения = "Сеанс" И СписокОграничений.Количество() > 3 Тогда
		
		Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сеансы (%1)'"), СписокОграничений.Количество());
		
	Иначе
		
		Для Каждого ЭлементСписка Из СписокОграничений Цикл
			Если Не ПустаяСтрока(Ограничение) Тогда
				Ограничение = Ограничение + ", ";
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда
				ЗначениеОграничения = ЭлементСписка.Значение;
			Иначе
				ЗначениеОграничения = ЭлементСписка.Представление;
			КонецЕсли;
			
			Если (ВРег(ИмяОграничения) = ВРег("Сеанс")
				ИЛИ ВРег(ИмяОграничения) = ВРег("Уровень"))
				И ПустаяСтрока(Ограничение) Тогда
				
				Если ИмяОграничения = "Сеанс" Тогда
					ПредставлениеОграничения = НСтр("ru = 'Сеанс'");
				Иначе
					ПредставлениеОграничения = НСтр("ru = 'Уровень'");
				КонецЕсли;
				
				Ограничение = НСтр("ru = '%1: %2'");
				Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Ограничение, ПредставлениеОграничения, ЗначениеОграничения);
			Иначе
				Ограничение = Ограничение + ЗначениеОграничения;
			КонецЕсли;
		КонецЦикла;
		
	КонецЕсли;
	
	Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда 
		ПредставлениеОтбора = ПредставлениеОтбора + "; ";
	КонецЕсли;
	
	ПредставлениеОтбора = ПредставлениеОтбора + Ограничение;
	
КонецПроцедуры

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

////////////////////////////////////////////////////////////­////////////////////
// Вспомогательные процедуры и функции.

// Только для внутреннего использования.
//
Процедура УстановитьСтрокуАдресаДанных(СобытиеЖурнала)
	
	ЗаписьXML = Новый ЗаписьXML();
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СобытиеЖурнала.Данные); 
	СобытиеЖурнала.АдресДанных = ЗаписьXML.Закрыть();
	
КонецПроцедуры

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

#КонецОбласти

Показать
8. PANovikov 14 03.04.24 13:41 Сейчас в теме
Добрый день! приобрели у Вас данное расширение, но в УТ11 выдет ошибку:
Значение не является значением объектного типа (СобытияЖурнала)
{ув_ОтправкаУведомленийОбОшибкахОбмена ОбщийМодуль.ОбменДаннымиСервер.Модуль(72)}:СобытияЖурнала=СтруктураЗаписейЖурнала.СобытияЖурнала;
{ув_ОтправкаУведомленийОбОшибкахОбмена ОбщийМодуль.ОбменДаннымиСервер.Модуль(10)}:СобытияЖурнала(Тело, УзелИнформационнойБазы);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(9342)}:ПослеВыполненияОбменов(УзелИнформационнойБазы, Отказ);
{Обработка.ВыполнениеОбменаДанными.МодульМенеджера(41)}:ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
{(1)}:Обработки.ВыполнениеОбменаДанными.ВыполнитьЗапускОбменаДанными(Параметры[0],Параметры[1])
{ОбщийМодуль.ОбщегоНазначения.Модуль(5315)}:Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{ОбщийМодуль.ДлительныеОперации.Модуль(1413)}:ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
{ОбщийМодуль.ДлительныеОперации.Модуль(1390)}:ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
Направьте на путь истинный.
9. sevarm 64 03.04.24 17:26 Сейчас в теме
(8) Здравствуйте! Какой у Вас релиз УТ11?
10. PANovikov 14 03.04.24 18:20 Сейчас в теме
11. sevarm 64 03.04.24 22:43 Сейчас в теме
(10) Проверьте настройки системной учетной записи электронной почты. Там должны быть рабочие данные, т.к. отправка идет через нее.
Условие при котором возможна такая ошибка добавил в новую версию.
Прикрепленные файлы:
13. PANovikov 14 09.04.24 14:00 Сейчас в теме
(11)Добрый день! Не сбрасывали?
12. пользователь 04.04.24 08:13
Сообщение было скрыто модератором.
...
Оставьте свое сообщение