Пятница - лучший день для аншлагов по 1С. У Лены он начался с того, что у одного нашего московского клиента рухнула база по банальной причине: у бухгалтера завелся какой-то местный программист, который поставил автосохранение в 5 утра, но не учел, что менеджеры в этой компании оставляют не закрытыми свои сессии (хотя их, между тем, много раз предупреждали). В результате, автосохранение этого программиста поступило как-то очень хардкорно: оно просто молча вырубило все открытые сессии и добросовестно сделало свое дело. И база рухнула...
Вот тогда-то и возникла эта до гениальности простая идея: набросать регламентное задание, призванное положить конец менеджерским вольностям. Оно просто каждую ночь будет формировать и направлять на почту ИТ-директору этой компании в xls-файле список всех пользователей, у которых висят незакрытые сессии. А он уже знает, что с этими менеджерами делать...
У нашей Лены всегда хорошее настроение, а в пятницу - просто отличное, потому она посчитала, что кому-то из коллег это фишка может пригодиться, и решила ее дать... ;)
А вот и сам модуль, кому качать лень.
РЕГЛАМЕНТНОЕ ЗАДАНИЕ НА РАССЫЛКУ
Процедура ОПланет_РассылкаАктивныхПользователей() Экспорт
ТабДок =Новый ТабличныйДокумент;
Макет = ПолучитьОбщийМакет("АктивныеПользователи");
Шапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Шапка);
Строка = Макет.ПолучитьОбласть("Строка");
//ПолучаемДанные
СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
Строка.Параметры.Пользователь=Соединение.Пользователь.Имя;
Строка.Параметры.Приложение=ПредставлениеПриложения(Соединение.ИмяПриложения);
Строка.Параметры.НачалоРаботы=Соединение.НачалоСеанса;
Строка.Параметры.Компьютер=Соединение.ИмяКомпьютера;
Строка.Параметры.Соединение=Соединение.НомерСоединения;
ТабДок.Вывести(Строка);
КонецЦикла;
ИмяФ = "Polzovateli.xls";
ИмяВремФайла = ""+КаталогВременныхФайлов()+ИмяФ;
Попытка
ТабДок.Записать(ИмяВремФайла, ТипФайлаТабличногоДокумента.XLS);
Исключение
Возврат;
КонецПопытки;
МассивФайловДляОтправки = Новый Массив;
МассивФайловДляОтправки.Добавить(Новый Структура ("ПутьВложения,ИмяФайлаВложения,НаименованиеВложения", ИмяВремФайла, ИмяФ, ИмяФ));
АдресаДляОтправкиНаСклад = Строка("_______@list.ru"); // тут можно через константу указать
МассивАдресов = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(АдресаДляОтправкиНаСклад, ",");
ЭлАдреса = Новый СписокЗначений;
Для каждого ЭлАдрес из МассивАдресов Цикл
ЭлАдреса.Добавить(ЭлАдрес, ЭлАдрес);
КонецЦикла;
Тема = "Пользователи базы";
ТекстПисьма = "Пользователи базы";
СтруктураПисьма = СформироватьПисьмоНовая(Тема, МассивФайловДляОтправки, ТекстПисьма, ЭлАдреса, Ложь);
УчетныеЗаписи = Новый Массив;
УчетныеЗаписи.Добавить(СтруктураПисьма.ПисьмоСсылка.УчетнаяЗапись);
Письма = Новый Соответствие;
Об = СтруктураПисьма.ПисьмоСсылка.ПолучитьОбъект();
Об.СтатусПисьма = Перечисления.СтатусыПисем.Исходящее;
Об.Записать();
Письма.Вставить(Об.Ссылка, Об);
УправлениеЭлектроннойПочтой.ПолучениеОтправкаПисем(глЗначениеПеременной("глСоответствиеТекстовЭлектронныхПисем"), глЗначениеПеременной("глТекущийПользователь"), УчетныеЗаписи, Письма, Истина);
КонецПроцедуры
Функция СформироватьПисьмоНовая(Тема, МассивСтруктурФайловВложений = Неопределено, ТекстПисьма, Адрес = Неопределено, Открывать = ЛОЖЬ)
ЕстьВложение = (ТипЗнч(МассивСтруктурФайловВложений) = Тип("Массив")) И (МассивСтруктурФайловВложений.Количество() > 0);
Если ЕстьВложение Тогда
СтруктураВложений = Новый СписокЗначений;
Для каждого ТекФайл из МассивСтруктурФайловВложений Цикл
Вложение = Новый Структура("Наименование, ИмяФайла, Хранилище", ТекФайл.НаименованиеВложения, ТекФайл.ИмяФайлаВложения, "");
Вложение.Хранилище = Новый ДвоичныеДанные(ТекФайл.ПутьВложения);
СтруктураВложений.Добавить(Вложение);
КонецЦикла;
КонецЕсли;
Если ТипЗнч(Адрес) = Тип("СписокЗначений") Тогда
СписокАдресов = Адрес;
Иначе
СписокАдресов = Новый СписокЗначений;
Если НЕ Адрес = Неопределено Тогда
СписокАдресов.Добавить(Адрес, Адрес);
КонецЕсли;
КонецЕсли;
ТекстПисьмаHTML = "<HTML><HEAD><META http-equiv=Content-Type content=""text/html; charset=utf-8""><META content=""MSHTML 6.00.2800.1476"" name=GENERATOR></HEAD><BODY><P>";
ТекстПисьмаHTML = ТекстПисьмаHTML + СтрЗаменить(ТекстПисьма, Символы.ПС, "</P><P>");
ТекстПисьмаHTML = ТекстПисьмаHTML + "</P></BODY></HTML>";
СтруктураНовогоПисьма = Новый Структура("Тело, Тема, СписокФайловВложений, Кому");
СтруктураНовогоПисьма.Тело = ТекстПисьмаHTML;
Если ЕстьВложение Тогда
СтруктураНовогоПисьма.СписокФайловВложений = СтруктураВложений;
КонецЕсли;
СтруктураНовогоПисьма.Тема = Тема;
СтруктураНовогоПисьма.Кому = СписокАдресов;
СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма, , , , , , , ЛОЖЬ);
Получатели_ = "";
Для каждого Адрес из СписокАдресов Цикл
Получатели_ = Получатели_ + Адрес.Значение + "; ";
КонецЦикла;
Возврат СтруктураПисьма;
КонецФункции
Но качать все равно придется!
... или самим лепить общий макет "АктивныеПользователи" ;)