gifts2017

Примеры скриптов на OneScript

Опубликовал Алексей (Drak0n) в раздел Администрирование - Системное

В своей работе нам часто приходится заниматься рутинными операциями. При небольшом их объеме "ручное" выполнение еще допустимо, но с ростом их числа все мы задумываемся об автоматизации. Вот тут нам на помощь и приходят скрипты. На этом сайте уже выложено немало примеров различных скриптов, вот и я решил внести свою лепту.

Не претендую на какую-либо уникальность, но надеюсь мой опыт окажется полезным. Для запуска скриптов используется http://oscript.io/.

  1. Автоматическое обновление
  2. Очистка кэша
  3. Перенос файлов
  4. От автора

Автоматическое обновление информационных баз

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

При написание скрипта использовался код из http://infostart.ru/public/519499/.

Порядок действий скрипта:

  1. Загружает файл со списком обновлений с сервера проверки обновлений для конфигурации;
  2. Анализирует полученный файл, собирает сведения о версиях;
  3. Получает текущую версию и признак изменения конфигурации;
  4. Ищет в каталоге файлов обновлений версию доступную для обновления;
  5. Если доступных для обновления версий не найдено - скачивает обновление с сервера обновлений;
  6. Завершает работу пользователей и устанавливает запрет на подключение новых соединений (только для конфигураций на БСП);
  7. Создает резервную копию информационной базы;
  8. Выполняет отложенные обработчики обновления (только для конфигураций на БСП);
  9. Загружает файл обновления в информационную базу;
  10. Обновляет конфигурации информационной базы;
  11. Выполняет тестирование и исправление;
  12. Принимает обновления в информационной базе (только для конфигураций на БСП);
  13. В случае ошибки пытается восстановиться из резервной копии (для файловых баз);
  14. Повторяет все с п.2 пока не обновится на последнюю доступную версию;
  15. Разрешает подключение новых соединений (только для конфигураций на БСП). 
#Использовать logos
#Использовать v8runner

Перем Лог;
Перем СтруктураКаталогов;

Функция Инициализировать()
	
	РодительскийКаталог = "\\server\---\---";
	СтруктураКаталогов = Новый Структура();
	СтруктураКаталогов.Вставить("КаталогФайловОбновления", 	ОбъединитьПути(РодительскийКаталог, "1C")); 
	СтруктураКаталогов.Вставить("КаталогВременныхФайлов", 	ОбъединитьПути(РодительскийКаталог, "1Cv8Update"));
	СтруктураКаталогов.Вставить("КаталогФайловДампа", 		ОбъединитьПути(СтруктураКаталогов.КаталогВременныхФайлов, "DumpIB"));
	Для Каждого Каталог Из СтруктураКаталогов Цикл
		Если НЕ ОбеспечитьКаталог(Каталог.Значение) Тогда 
			ВызватьИсключение НСтр("ru = 'Выполнение обработки прервано.'"); 
		КонецЕсли;
	КонецЦикла;			
	
	// Бухгалтерия предприятия 3.0
	Параметры = Новый Структура();
	Параметры.Вставить("Пользователь", "---");
	Параметры.Вставить("Пароль", 	   "---");
	Параметры.Вставить("ТипКонфигурации", "Accounting");
	Параметры.Вставить("ВерсияРелиза", 	  "30");
	ПараметрыОбновленияКонфигурации = ОбработкаКонфигурации(Параметры);
	Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда
		
		Параметры = Новый Структура();
		Параметры.Вставить("КаталогИнформационнойБазы", "\\server\---\---\---");
		Параметры.Вставить("ИмяПользователя", 	  		"Администратор");
		Параметры.Вставить("ПарольПользователя", 	  	"---");
		ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, Параметры);
		
		Параметры = Новый Структура();
		Параметры.Вставить("КаталогИнформационнойБазы", "\\server\---\---\---");
		Параметры.Вставить("ИмяПользователя", 	  		"Администратор");
		Параметры.Вставить("ПарольПользователя", 	  	"---");
		ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, Параметры);
		
	КонецЕсли;
	
	// Бухгалтерия предприятия 2.0
	Параметры = Новый Структура();
	Параметры.Вставить("Пользователь", "---");
	Параметры.Вставить("Пароль", 	   "---");
	Параметры.Вставить("ТипКонфигурации", "Accounting");
	Параметры.Вставить("ВерсияРелиза", 	  "20");
	ПараметрыОбновленияКонфигурации = ОбработкаКонфигурации(Параметры);
	Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда
		
	КонецЕсли;
	
КонецФункции


// Обрабатывает конфигурацию.
//
// Параметры:
//  ДополнительныеПараметры - Структура - Параметры обновления конфигурации.
//    * Пользователь 					- Строка - Имя пользователя для загрузки обновлений;
//    * Пароль 							- Строка - Пароль пользователя для загрузки обновлений;
//    * СерверПроверкиОбновлений 		- Строка - Адрес сервера для проверки наличия обновлений (открытая часть);
//    * ПутьКФайлуПроверкиОбновлений 	- Строка - Путь к файлу проверки обновлений на сервере;
//    * СерверОбновлений 				- Строка - Адрес сервера обновлений (закрытая часть);
//    * ПутьКФайлуОбновлений 			- Строка - Путь к файлу обновлений на сервере;
//    * ТипКонфигурации 				- Строка - Краткое наименование конфигурации (Accounting - бухгалтерия, HRM - ЗУП ...);
//    * ВерсияРелиза    				- Строка - Версия релиза;
//    * ВерсияПлатформы 				- Строка - Версия платформы (82, 83).
//
// Возвращаемое значение:
//  Структура, Неопределено - Параметры обновления конкретной конфигурации, неопределено в случае ошибки.
//
Функция ОбработкаКонфигурации(ДополнительныеПараметры)
	
	ПараметрыОбновленияКонфигурации = Новый Структура();
	
	// Значения пользователя и пароля можно задать по умолчанию, чтобы не указывать для каждой конфигурации
	ПараметрыОбновленияКонфигурации.Вставить("Пользователь", "");
	ПараметрыОбновленияКонфигурации.Вставить("Пароль",       "");
	
	ПараметрыОбновленияКонфигурации.Вставить("СерверПроверкиОбновлений",	 "downloads.1c.ru");
	ПараметрыОбновленияКонфигурации.Вставить("ПутьКФайлуПроверкиОбновлений", "/ipp/ITSREPV/V8Update/Configs");
	ПараметрыОбновленияКонфигурации.Вставить("СерверОбновлений",			 "downloads.v8.1c.ru");
	ПараметрыОбновленияКонфигурации.Вставить("ПутьКФайлуОбновлений",		 "/tmplts");
	
	ПараметрыОбновленияКонфигурации.Вставить("ТипКонфигурации",	"");
	ПараметрыОбновленияКонфигурации.Вставить("ВерсияРелиза",	"");
	ПараметрыОбновленияКонфигурации.Вставить("ВерсияПлатформы",	"83");
	
	ЗаполнитьЗначенияСвойств(ПараметрыОбновленияКонфигурации, ДополнительныеПараметры);
	
	Лог.Информация("======================================================================");
	Лог.Информация(СтрШаблон(НСтр("ru = 'Конфигурация %1, релиз %2, платформа %3.'"), 
		ПараметрыОбновленияКонфигурации.ТипКонфигурации,  ПараметрыОбновленияКонфигурации.ВерсияРелиза,  ПараметрыОбновленияКонфигурации.ВерсияПлатформы));     
	Лог.Информация("======================================================================");
	
	ТекстОтладки = "";
	Для Каждого ПараметрОбновленияКонфигурации Из ПараметрыОбновленияКонфигурации Цикл 
		ТекстОтладки = ТекстОтладки + ?(ПустаяСтрока(ТекстОтладки), "", Символы.ПС)
			+ СтрШаблон("%1 - %2", ПараметрОбновленияКонфигурации.Ключ, ПараметрОбновленияКонфигурации.Значение);
	КонецЦикла;
	Лог.Отладка(СтрШаблон(НСтр("ru = 'Параметры обновления конфигурации:
		|%1'"), ТекстОтладки));
	
	РезультатВыполнения = ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации);
	Если Не РезультатВыполнения Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	РезультатВыполнения = ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации);
	Если Не РезультатВыполнения Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	МассивОбновлений = ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации);
	Если МассивОбновлений = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	ПараметрыОбновленияКонфигурации.Вставить("МассивОбновлений", МассивОбновлений); 
	
	Возврат ПараметрыОбновленияКонфигурации;
	
КонецФункции	

// Осуществляет проверку корректности заполнения параметров конфигурации
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации)
	
	Лог.Информация(НСтр("ru = 'Проверка корректности параметров обновления конфигурации.'"));     
	
	ТекстСообщения = ""; 
	ОшибкаПроверкиЗаполнения = Ложь;
	
	Для Каждого ПараметрОбновленияКонфигурации Из ПараметрыОбновленияКонфигурации Цикл 
		
		Если ПустаяСтрока(ПараметрОбновленияКонфигурации.Значение) Тогда
			ТекстСообщения = ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) 
				+ СтрШаблон(НСтр("ru = 'Не задан параметр обновления конфигурации: ""%1"".'"), ПараметрОбновленияКонфигурации.Ключ);
			ОшибкаПроверкиЗаполнения = Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ОшибкаПроверкиЗаполнения Тогда
		Лог.Ошибка(ТекстСообщения);
		Возврат Ложь;
	КонецЕсли;
	
	Лог.Отладка(НСтр("ru = 'Проверка корректности параметров обновления конфигурации завершена.'"));     
	
	Возврат Истина;
	
КонецФункции	

// Получает файл со списком обновления из Интернета
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ПолучитьСпискиОбновленияКонфигурациии(ПараметрыОбновленияКонфигурации)
	
	Лог.Информация(НСтр("ru = 'Получение списков обновления.'"));   
	
	ZipФайлСпискаШаблонов = ОбъединитьПути(СтруктураКаталогов.КаталогВременныхФайлов, "v8upd11.zip"); 
	ФайлСпискаШаблонов = ОбъединитьПути(СтруктураКаталогов.КаталогВременныхФайлов, "v8cscdsc.xml");
	
	// Получаем сам файл из Интернета.
	Попытка
		Соединение = Новый HTTPСоединение(ПараметрыОбновленияКонфигурации.СерверПроверкиОбновлений, , ПараметрыОбновленияКонфигурации.Пользователь, ПараметрыОбновленияКонфигурации.Пароль,);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1:
			|%2'"), ПараметрыОбновленияКонфигурации.СерверПроверкиОбновлений, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	АдресРесурса = СтрШаблон("%1/%2/%3/%4/v8upd11.zip", 
	ПараметрыОбновленияКонфигурации.ПутьКФайлуПроверкиОбновлений, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыОбновленияКонфигурации.ВерсияРелиза, ПараметрыОбновленияКонфигурации.ВерсияПлатформы); 
	Попытка
		HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
		Соединение.Получить(HTTPЗапрос, ZipФайлСпискаШаблонов);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1:
			|%2'"), ПараметрыОбновленияКонфигурации.СерверПроверкиОбновлений, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	// Распаковываем файл
	Попытка
		ФайлZip = Новый ЧтениеZipФайла(ZipФайлСпискаШаблонов); 
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
			|%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	ФайлZip.ИзвлечьВсе(СтруктураКаталогов.КаталогВременныхФайлов);
	ФайлZip.Закрыть();
	
	// Очищаем устаревшие файлы
	Попытка
		УдалитьФайлы(ZipФайлСпискаШаблонов);    
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
			|%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Получение списков обновления завершено.'"));
	
	Возврат Истина;
	
КонецФункции	

// Анализирует файл списка обновлений конфигурации 
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
//
// Возвращаемое значение:
//  Массив, Неопределено - Массив с структурой обновлений конфигурации, неопределено в случае неудачи.
//
Функция ПроанализироватьСпискиОбновленияКонфигурации(ПараметрыОбновленияКонфигурации)
	
	Лог.Информация(НСтр("ru = 'Анализ списков обновления.'"));
	
	ФайлСпискаШаблонов = ОбъединитьПути(СтруктураКаталогов.КаталогВременныхФайлов, "v8cscdsc.xml"); 
	ФайлСпискаШаблоновОбъект = Новый Файл(ФайлСпискаШаблонов);
	Если НЕ ФайлСпискаШаблоновОбъект.Существует() Тогда    
		Лог.Ошибка(НСтр("ru = 'XML файл списка шаблонов не найден в каталоге.'"));
		Возврат Неопределено;
	КонецЕсли;
	
	МассивОбновлений = Новый Массив;
	
	// Структура страницы: 
	// <?xml version="1.0" encoding="UTF-8" ?> 
	// <v8u:updateList xmlns:v8u="http://v8.1c.ru/configuration-updates" version="1.1">
	// 		<v8u:date>... Дата выпуска ...</v8u:date> 
	// 		<v8u:update configuration="... Название конфигурации ...">
	// 			<v8u:vendor>... Поставщик ...</v8u:vendor> 
	// 			<v8u:file>... Путь к файлу обновления ...</v8u:file> 
	// 			<v8u:size>... Размер файла обновления ...</v8u:size> 
	// 			<v8u:version>... Версия ...</v8u:version> 
	// 			<v8u:target>... Версия для обновления ...</v8u:target> 
	// 			<v8u:target>... Версия для обновления ...</v8u:target> 
	// 		</v8u:update>
	// </v8u:updateList>
	
	Попытка
		
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.ОткрытьФайл(ФайлСпискаШаблонов);
		ЧтениеXML.ПерейтиКСодержимому();
		
		Пока ЧтениеXML.Прочитать() Цикл
			
			Если ЧтениеXML.ЛокальноеИмя = "update" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
				
				ПараметрыВерсии = Новый Структура();
				ВерсииДляОбновления = Новый Массив;
				
				Пока ЧтениеXML.Прочитать() Цикл
					Если ЧтениеXML.ЛокальноеИмя = "update" Тогда
						Прервать; // Дошли до конца блока					
					КонецЕсли;
					
					Если ЧтениеXML.ЛокальноеИмя  = "vendor" Тогда
						ЧтениеXML.Прочитать();
						ПараметрыВерсии.Вставить("Поставщик", ЧтениеXML.Значение);                            
					ИначеЕсли ЧтениеXML.ЛокальноеИмя  = "version" Тогда
						ЧтениеXML.Прочитать();
						ПараметрыВерсии.Вставить("Версия", СтрЗаменить(ЧтениеXML.Значение, ".", "_"));
					ИначеЕсли ЧтениеXML.ЛокальноеИмя  = "file" Тогда
						ЧтениеXML.Прочитать();
						ПараметрыВерсии.Вставить("ПутьКФайлуОбновления", ЧтениеXML.Значение);
					ИначеЕсли ЧтениеXML.ЛокальноеИмя  = "size" Тогда
						ЧтениеXML.Прочитать();
						ПараметрыВерсии.Вставить("РазмерФайлаОбновления", ЧтениеXML.Значение);
					ИначеЕсли ЧтениеXML.ЛокальноеИмя  = "target" Тогда
						ЧтениеXML.Прочитать();
						ВерсииДляОбновления.Добавить(СтрЗаменить(ЧтениеXML.Значение, ".", "_"));	
					КонецЕсли;
					ЧтениеXML.Прочитать(); // в конец элемента
				КонецЦикла;
				
				ПараметрыВерсии.Вставить("ВерсииДляОбновления", ВерсииДляОбновления);
				МассивОбновлений.Добавить(ПараметрыВерсии);
				
			КонецЕсли;
			
		КонецЦикла;
		
	Исключение
		
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при чтении файла списка обновлений.
			|%1'"), ИнформацияОбОшибке()));
		ЧтениеXML.Закрыть();
		
		Возврат Неопределено;
		
	КонецПопытки;
	
	ЧтениеXML.Закрыть();	
	
	Попытка
		УдалитьФайлы(ФайлСпискаШаблонов);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
			|%2'"), ФайлСпискаШаблонов, ИнформацияОбОшибке()));
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Анализ списков обновления завершен.'"));
	
	Возврат МассивОбновлений;
	
КонецФункции


// Обновляет информационную базу.
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации	- Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()).
//  ДополнительныеПараметры			- Структура - Параметры подключения к информационной базе.
//    * ВерсияПлатформы 							- Строка 	- Версия платформы (82, 83).
//	  * ВариантРаботыИнформационнойБазы             - Число  	- Вариант работы информационной базы: 0 - файловый; 1 -
//                                                                клиент-серверный;
//    * КаталогИнформационнойБазы                   - Строка 	- Каталог информационной базы для файлового режима работы;
//    * ИмяСервера1СПредприятия                     - Строка 	- Имя сервера1С:Предприятия;
//    * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка 	- Имя информационной базы на сервере1С:Предприятия;
//    * АутентификацияОперационнойСистемы           - Булево 	- Признак аутентификации операционной системы при создании
//                                                                внешнего подключения к информационной базе;
//    * ИмяПользователя                             - Строка 	- Имя пользователя информационной базы;
//    * ПарольПользователя                          - Строка 	- Пароль пользователя информационной базы.
// 
Процедура ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ДополнительныеПараметры)
	
	ПараметрыПодключения = Новый Структура();
	
	ПараметрыПодключения.Вставить("ВерсияПлатформы", "83");
	
	ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", 			 0);
	ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", 					 "");
	ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", 					 "");
	ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", "");
	
	ПараметрыПодключения.Вставить("АутентификацияОперационнойСистемы", Ложь);
	ПараметрыПодключения.Вставить("ИмяПользователя", 				   "");
	ПараметрыПодключения.Вставить("ПарольПользователя", 			   "");
	
	ЗаполнитьЗначенияСвойств(ПараметрыПодключения, ДополнительныеПараметры);
	
	Лог.Информация("----------------------------------------------------------------------");
	Лог.Информация(СтрШаблон(НСтр("ru = 'Информационная база %1.'"), 
		?(ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0, ПараметрыПодключения.КаталогИнформационнойБазы, ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия)));
	Лог.Информация("----------------------------------------------------------------------");
		
	ТекстОтладки = "";
	Для Каждого ПараметрПодключения Из ПараметрыПодключения Цикл 
		ТекстОтладки = ТекстОтладки + ?(ПустаяСтрока(ТекстОтладки), "", Символы.ПС)
			+ СтрШаблон("%1 - %2", ПараметрПодключения.Ключ, ПараметрПодключения.Значение);
	КонецЦикла;
	Лог.Отладка(СтрШаблон(НСтр("ru = 'Параметры подключения:
		|%1'"), ТекстОтладки));

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

// Осуществляет проверку корректности заполнения параметров подключения
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ПроверитьКорректностьПараметровПодключения(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Проверка корректности параметров подключения.'"));
	
	ТекстСообщения = ""; 
	ОшибкаПроверкиЗаполнения = Ложь;
	
	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
	
	Если ФайловыйВариантРаботы Тогда
		Если ПустаяСтрока(ПараметрыПодключения.КаталогИнформационнойБазы) Тогда
			ТекстСообщения = НСтр("ru = 'Не задано месторасположение каталога информационной базы.'");
			ОшибкаПроверкиЗаполнения = Истина;
		КонецЕсли;
	Иначе
		Если ПустаяСтрока(ПараметрыПодключения.ИмяСервера1СПредприятия) Или ПустаяСтрока(ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия) Тогда
			ТекстСообщения = НСтр("ru = 'Не заданы обязательные параметры подключения: ""Имя сервера""; ""Имя информационной базы на сервере"".'");
			ОшибкаПроверкиЗаполнения = Истина;
		КонецЕсли;
	КонецЕсли;
	
	Если ОшибкаПроверкиЗаполнения Тогда
		Лог.Ошибка(ТекстСообщения);
		Возврат Ложь;
	КонецЕсли;
	
	Лог.Отладка(НСтр("ru = 'Проверка корректности параметров подключения завершена.'"));     
	
	Возврат Истина;
	
КонецФункции	

// Проверяет наличие обновлений для информационной базы
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации	- Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()).
//  ПараметрыПодключения 			- Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу());
//
// Возвращаемое значение:
//  Структура, Строка, Неопределено - Параметры версии для обновления, "КонфигурацияИзменена", "ОбновленийНеТребуется", неопределено в случае неудачи.
//
Функция ПроверитьНаличиеОбновлений(ПараметрыОбновленияКонфигурации, ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Проверка наличия обновлений.'"));
	
	// Получение параметров информационной базы
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;     
	
	ТекущаяВерсия = СтрЗаменить(Соединение.Метаданные.Версия, ".", "_");
	Лог.Информация(СтрШаблон(НСтр("ru = 'Текущая версия конфигурации информационной базы: %1.'"), ТекущаяВерсия));
		
	КонфигурацияИзменена = Соединение.КонфигурацияИзменена();
	
	Соединение = Неопределено;
	
	Если КонфигурацияИзменена Тогда
		Лог.Информация(НСтр("ru = 'Основная конфигурация отличается от конфигурации базы данных.'"));
		Возврат "КонфигурацияИзменена";
	КонецЕсли;
	
	// Прверка наличия обновлений
	ВерсияДляОбновления = Неопределено;        
	ЗагруженноеОбновлениеНайдено = Ложь;
	МассивОбновлений = ПараметрыОбновленияКонфигурации.МассивОбновлений;
	
	КоличествоОбновлений = МассивОбновлений.Количество(); 
	Для Сч = 1 По КоличествоОбновлений Цикл
		
		ПараметрыВерсии = МассивОбновлений[КоличествоОбновлений - Сч]; 
		МассивВерсийДляОбновления = ПараметрыВерсии.ВерсииДляОбновления.Найти(ТекущаяВерсия); 
		Если МассивВерсийДляОбновления = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		КаталогФайлаОбновленияВерсии = ОбъединитьПути(СтруктураКаталогов.КаталогФайловОбновления, ПараметрыОбновленияКонфигурации.ТипКонфигурации, ПараметрыВерсии.Версия); 
		ФайлОбновленияВерсии = ОбъединитьПути(КаталогФайлаОбновленияВерсии, "1cv8.cfu");
		
		ФайлОбновленияВерсииОбъект = Новый Файл(ФайлОбновленияВерсии);
		Если ФайлОбновленияВерсииОбъект.Существует() Тогда
			ЗагруженноеОбновлениеНайдено = Истина;
			ВерсияДляОбновления = ПараметрыВерсии;
			ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии);
			Лог.Информация(СтрШаблон(НСтр("ru = 'Загружена и доступна для обновления версия: %1.'"), ПараметрыВерсии.Версия));
			Прервать;
		КонецЕсли;
		
		Если ВерсияДляОбновления = Неопределено Тогда 
			ВерсияДляОбновления = ПараметрыВерсии;
			ВерсияДляОбновления.Вставить("Каталог", КаталогФайлаОбновленияВерсии);
		КонецЕсли;
		
	КонецЦикла;
	
	Если ВерсияДляОбновления = Неопределено Тогда
		Лог.Информация(НСтр("ru = 'Установлена последняя версия. Обновление не требуется.'"));
		Возврат "ОбновленийНеТребуется";
	КонецЕсли;
	
	// Загрузка файлов обновления
	Если Не ЗагруженноеОбновлениеНайдено Тогда
		
		Лог.Информация(СтрШаблон(НСтр("ru = 'Доступна для загрузки версия: %1 (Поставщик %2, размер %3).'"), 
			ВерсияДляОбновления.Версия, ВерсияДляОбновления.Поставщик, ВерсияДляОбновления.РазмерФайлаОбновления));
		
		Если НЕ ПолучитьФайлыОбновлений(ПараметрыОбновленияКонфигурации, ВерсияДляОбновления) Тогда
			Возврат Неопределено;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ВерсияДляОбновления;
	
КонецФункции	

// Скачивает из Интернета файлы обновлений.
//
// Параметры:
//  ПараметрыОбновленияКонфигурации	- Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()).
//  ВерсияДляОбновления 			- Структура - Структура с параметрами версии для обновления.
//    * Поставщик             - Строка - Поставщик;
//    * Версия                - Строка - Версия;
//    * ПутьКФайлуОбновления  - Строка - Путь к файлу обновления;
//    * РазмерФайлаОбновления - Строка - Размер файла обновления в байтах.
//
// Возвращаемое значение:
//  Булево - признак успешного получения.
//
Функция ПолучитьФайлыОбновлений(ПараметрыОбновленияКонфигурации, ВерсияДляОбновления) 
	
	Лог.Информация(СтрШаблон(НСтр("ru = 'Получение файлов обновления версии %1.'"), ВерсияДляОбновления.Версия));
	
	Если НЕ ОбеспечитьКаталог(ВерсияДляОбновления.Каталог) Тогда 
		Возврат Ложь; 
	КонецЕсли;
	
	ZipФайлОбновления = ОбъединитьПути(СтруктураКаталогов.КаталогВременныхФайлов, "1cv8.zip"); 
	
	// Получаем сам файл из Интернета.
	Попытка
		Соединение = Новый HTTPСоединение(ПараметрыОбновленияКонфигурации.СерверОбновлений, , ПараметрыОбновленияКонфигурации.Пользователь, ПараметрыОбновленияКонфигурации.Пароль,);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1:
			|%2'"), ПараметрыОбновленияКонфигурации.СерверОбновлений, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	АдресРесурса = СтрШаблон("%1/%2", ПараметрыОбновленияКонфигурации.ПутьКФайлуОбновлений, ВерсияДляОбновления.ПутьКФайлуОбновления); 
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("User-Agent", "1C+Enterprise/8.3");
	Попытка
		HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
		Соединение.Получить(HTTPЗапрос, ZipФайлОбновления);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера %1:
			|%2'"), ПараметрыОбновленияКонфигурации.СерверОбновлений, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	// Распаковываем файл
	Попытка
		ФайлZip = Новый ЧтениеZipФайла(ZipФайлОбновления); 
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
			|%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	ФайлZip.ИзвлечьВсе(ВерсияДляОбновления.Каталог);
	ФайлZip.Закрыть();
	
	// Очищаем устаревшие файлы
	Попытка
		УдалитьФайлы(ZipФайлОбновления);    
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
			|%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Файлы обновления успешно получены.'"));
	
	Возврат Истина;
	
КонецФункции 

// Завершение работы пользователей и запрет на подключение новых соединений
//
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в УстановитьБлокировкуСоединений()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция УстановитьБлокировкуСоединений(ПараметрыПодключения)	
		
	Лог.Информация(НСтр("ru = 'Завершение работы пользователей и установка запрета на подключение новых соединений.'"));
	
	// Получение параметров информационной базы
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;     
		
	Попытка
		WScript = Новый COMОбъект("WScript.Shell");
	Исключение
		Лог.Отладка(СтрШаблон(НСтр("ru = 'Не удалось подключить WScript:
			|%1'"), ИнформацияОбОшибке()));
		WScript = Неопределено;
	КонецПопытки; 

	Попытка

		Соединение.СоединенияИБ.УстановитьБлокировкуСоединений(
			НСтр("ru = 'в связи с необходимостью обновления конфигурации.'"), "ПакетноеОбновлениеКонфигурацииИБ");
		Интервал   = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000;
		ДатаСтарта = Соединение.СоединенияИБ.ПараметрыБлокировкиСеансов().Начало;
		
		Если Соединение.ЗначениеЗаполнено(ДатаСтарта) Тогда
				
			Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл 
				
				Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений() 
				   ИЛИ Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда
					Прервать;
				КонецЕсли;
				
				Если WScript <> Неопределено Тогда
					WScript.Sleep(18 * 1000); // Ждем 18 секунд до следующей проверки.
				КонецЕсли;

			КонецЦикла;
					
			Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта));

		КонецЕсли;
					
		WScript = Неопределено;

		Если НЕ Соединение.СоединенияИБ.УстановленаБлокировкаСоединений() Тогда
			Лог.Ошибка(НСтр("ru = 'Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.'"));
			Соединение = Неопределено;
			Возврат Ложь;
		КонецЕсли;
				
		Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) <= 1 Тогда
			Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена.
				|Все пользователи завершили работу.'"));
			Соединение = Неопределено;
			Возврат Истина;
		КонецЕсли;
			
		Лог.Отладка(НСтр("ru = 'Принудительное прерывание соединений пользователей.'"));

		// после начала блокировки сеансы всех пользователей должны быть отключены	
		// если этого не произошло пробуем принудительно прервать соединение.
		ПараметрыАдминистрирования = Соединение.СтандартныеПодсистемыСервер.ПараметрыАдминистрирования();
		ПараметрыАдминистрирования.ПарольАдминистратораИнформационнойБазы = ПараметрыПодключения.ПарольПользователя;
		ПараметрыАдминистрирования.ПарольАдминистратораКластера = ПараметрыПодключения.ПарольПользователя;
		Соединение.СоединенияИБКлиентСервер.УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования);
				
		Если Соединение.СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) > 1 Тогда 
			Соединение.СоединенияИБ.РазрешитьРаботуПользователей();
			Лог.Ошибка(Соединение.СоединенияИБ.СообщениеОНеотключенныхСеансах());
			Соединение = Неопределено;
			Возврат Ложь;
		КонецЕсли;
	
	Исключение
		// К сожалению, OneScript не поддерживает динамическое выполнение кода функцией Выполнить.
		// Поэтому, в случае если реализация функции в Вашей конфигурации отличается от принятого 
		// в БСП, альтернативную реализацию необходимо прописать вручную.
		// Например через "Если ПараметрыОбновления.ТипКонфигурации = МояКонфигурация Тогда". 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при установке запрета на подключение новых соединений.
			|%1'"), ИнформацияОбОшибке()));
		Соединение = Неопределено;
		Возврат Ложь;
	КонецПопытки;
			
	Соединение = Неопределено;

	Лог.Отладка(НСтр("ru = 'Установка запрета на подключение новых соединений выполнена.
		|Работа всех пользователей прервана.'"));
	
	Возврат Истина;
		
КонецФункции

// Создает резервную копию информационной базы
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  ФайлРезервнойКопии, Неопределено - Полный путь к файлу резервной копии неопределено в случае неудачи.
//
Функция СоздатьРезервнуюКопию(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Создание резервной копии информационной базы.'"));
	
	ИмяФайла = "Base" + Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс");        
	
	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
	
	Если ФайловыйВариантРаботы Тогда  
		
		ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD"));
		Если ФайлНаличияСоединений.Существует() Тогда
			ИмяФайла = ИмяФайла + "-online";
		КонецЕсли;
		
		ПолноеИмяФайла = ОбъединитьПути(СтруктураКаталогов.КаталогФайловДампа, ИмяФайла + ".zip"); 
		Лог.Информация(СтрШаблон(НСтр("ru = 'Файл архива %1.'"), ПолноеИмяФайла));
		
		ФайлZip = Новый ЗаписьZipФайла(ПолноеИмяФайла);
		ФайлZip.Добавить(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8.1CD"));
		
		Попытка
			ФайлZip.Записать();
		Исключение
			Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при записи файла информационной базы в архив.
				|%1'"), ИнформацияОбОшибке()));
			Возврат Неопределено;
		КонецПопытки;
		
	Иначе
		
		ПолноеИмяФайла = ОбъединитьПути(СтруктураКаталогов.КаталогФайловДампа, ИмяФайла + ".dt"); 
		Лог.Информация(СтрШаблон(НСтр("ru = 'Файл дампа %1.'"), ПолноеИмяФайла));
	
		УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
		ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска();
		ПараметрыЗапуска.Добавить(СтрШаблон("/DumpIB ""%1""", ПолноеИмяФайла));
		
		Попытка
			УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска);
		Исключение
			Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при создании файла дампа информационной базы.
				|%1'"), УправлениеКонфигуратором.ВыводКоманды()));
			Возврат Неопределено;
		КонецПопытки
		
	КонецЕсли;	
	
	ФайлОбъект = Новый Файл(ПолноеИмяФайла);
	Если НЕ ФайлОбъект.Существует() Тогда
		Лог.Ошибка(НСтр("ru = 'Файл резервной копии не найден в каталоге.'"));
		Возврат Неопределено;
	КонецЕсли;
		
	Лог.Отладка(НСтр("ru = 'Создание резервной копии информационной базы завершено.'"));
	
	Возврат ПолноеИмяФайла; 
	
КонецФункции

// Выполняет все процедуры отложенного обновления информационной базы
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ВыполнитьОтложенныеОбработчикиОбновления(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Выполнение отложенных обработчиков обновления.'"));
	
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;     
	
	Попытка
		Соединение.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас();
	Исключение
		// К сожалению, OneScript не поддерживает динамическое выполнение кода функцией Выполнить.
		// Поэтому, в случае если реализация функции в Вашей конфигурации отличается от принятого 
		// в БСП, альтернативную реализацию необходимо прописать вручную.
		// Например через "Если ПараметрыОбновления.ТипКонфигурации = МояКонфигурация Тогда". 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при выполнении отложенных обработчиков обновления.
			|%1'"),ИнформацияОбОшибке()));
	КонецПопытки;
	
	Соединение = Неопределено;
	
	Лог.Отладка(НСтр("ru = 'Выполнение отложенных обработчиков обновления завершено.'"));
	
	Возврат Истина;
	
КонецФункции

// Загружает файл обновления в информационную базу
// 
// Параметры:
//  ПараметрыОбновленияКонфигурации	- Структура - Параметры обновления текущей конфигурации (см. в ОбработкаКонфигурации()).
//  ПараметрыПодключения 			- Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу());
//	ВерсияДляОбновления  			- Строка	- Версия для обновления.
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ЗагрузитьФайлОбновленияВИнформационнуюБазу(ПараметрыПодключения, ВерсияДляОбновления)
	
	Лог.Информация(НСтр("ru = 'Загрузка файла обновления в информационную базу.'"));
			
	УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
	
	Попытка
		УправлениеКонфигуратором.ОбновитьКонфигурацию(ВерсияДляОбновления.Каталог, Ложь);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при загрузке файла обновления в информационную базу.
			|%1'"), УправлениеКонфигуратором.ВыводКоманды()));
		Возврат Ложь;
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Загрузка файла обновления в информационную базу завершена.'"));
	
	Возврат Истина;
	
КонецФункции

// Выполняет обновление конфигурации информационной базы
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ВыполнитьОбновлениеКонфигурацииИнформационнойБазы(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Обновление конфигурации информационной базы.'"));
	
	УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
	
	Попытка
		УправлениеКонфигуратором.ОбновитьКонфигурациюБазыДанных();
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при обновлении конфигурации информационной базы.
			|%1'"), УправлениеКонфигуратором.ВыводКоманды()));
		Возврат Ложь;
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Обновление конфигурации информационной базы завершено.'"));
	
	Возврат Истина;
	
КонецФункции

// Выполняет тестирование и исправление
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ВыполнитьТестированиеИИсправление(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Тестирование и исправление информационной базы.'"));
	
	УправлениеКонфигуратором = УстановитьУправлениеКонфигуратором(ПараметрыПодключения);
	ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска();
	ПараметрыЗапуска.Добавить("/IBCheckAndRepair -IBCompression");
	
	Попытка
		УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при тестировании и исправлении информационной базы.
			|%1'"), УправлениеКонфигуратором.ВыводКоманды()));
		Возврат Ложь;
	КонецПопытки;
	
	Лог.Отладка(НСтр("ru = 'Тестирование и исправление информационной базы завершено.'"));
	
	Возврат Истина;
	
КонецФункции

// Выполняет неинтерактивное обновление данных информационной базы
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ПринятьОбновленияВИнформационнойБазе(ПараметрыПодключения)
	
	Лог.Информация(НСтр("ru = 'Принятие обновлений в информационной базе.'"));
	
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;     
	
	Попытка
		Результат = Соединение.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(Ложь);
	Исключение
		// К сожалению, OneScript не поддерживает динамическое выполнение кода функцией Выполнить.
		// Поэтому, в случае если реализация функции в Вашей конфигурации отличается от принятого 
		// в БСП, альтернативную реализацию необходимо прописать вручную.
		// Например через "Если ПараметрыОбновления.ТипКонфигурации = МояКонфигурация Тогда". 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при принятии изменений в информационной базе.
			|%1'"), ИнформацияОбОшибке()));
	КонецПопытки;
	
	Соединение = Неопределено;
	
	Если Результат = "Успешно" Тогда 
		Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе завершено.'"));
		Возврат Истина;
	ИначеЕсли Результат = "НеТребуется" Тогда 
		Лог.Отладка(НСтр("ru = 'Принятие обновлений в информационной базе не требуется.'"));
		Возврат Истина;
	Иначе 
		Лог.Ошибка(НСтр("ru = 'Ошибка установки монопольного режима.'"));
		Возврат Ложь;
	КонецЕсли;
		
КонецФункции

// Восстанавливает информационную базу из резервной копии
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу());
//  ФайлРезервнойКопии 	 - Строка 	 - Полный путь к файлу резервной копии.
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция ВосстановитьИзРезервнойКопии(ПараметрыПодключения, ФайлРезервнойКопии)
	
	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
	Если Не ФайловыйВариантРаботы Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Лог.Информация(НСтр("ru = 'Восстановление информационной базы из резервной копии.'"));

	Попытка
		ФайлZip = Новый ЧтениеZipФайла(ФайлРезервнойКопии); 
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
			|%2'"), ФайлРезервнойКопии, ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	ФайлZip.ИзвлечьВсе(ПараметрыПодключения.КаталогИнформационнойБазы);
	ФайлZip.Закрыть();
	
	Лог.Отладка(НСтр("ru = 'Восстановление информационной базы из резервной копии завершено.'"));

	Возврат Истина;

КонецФункции

// Разрешение подключений новых соединений
//
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в УстановитьБлокировкуСоединений()).
//
// Возвращаемое значение:
//  Булево - Признак успешного выполнения.
//
Функция РазрешитьПодключение(ПараметрыПодключения)	
		
	Лог.Информация(НСтр("ru = 'Разрешение подключений новых соединений.'"));
	
	// Получение параметров информационной базы
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;     

	Попытка
		Соединение.СоединенияИБ.РазрешитьРаботуПользователей();
	Исключение
		// К сожалению, OneScript не поддерживает динамическое выполнение кода функцией Выполнить.
		// Поэтому, в случае если реализация функции в Вашей конфигурации отличается от принятого 
		// в БСП, альтернативную реализацию необходимо прописать вручную.
		// Например через "Если ПараметрыОбновления.ТипКонфигурации = МояКонфигурация Тогда". 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Ошибка при разрешении подключений новых соединений.
			|%1'"), ИнформацияОбОшибке()));
		Соединение = Неопределено;
		Возврат Ложь;
	КонецПопытки;
	
	Соединение = Неопределено;

	Лог.Отладка(НСтр("ru = 'Разрешение подключений новых соединений завершено.'"));
	
	Возврат Истина;
		
КонецФункции


// Проверяет наличия каталога и в случае его отсутствия создает новый.
//
// Параметры:
//  Каталог - Строка - Путь к каталогу, существование которого нужно проверить.
//
// Возвращаемое значение:
//  Булево - признак существования каталога.
//
Функция ОбеспечитьКаталог(Знач Каталог)
	
	Файл = Новый Файл(Каталог);
	Если Не Файл.Существует() Тогда
		Попытка 
			СоздатьКаталог(Каталог);
		Исключение
			Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.
				|%2'"), Каталог, ИнформацияОбОшибке()));
			Возврат Ложь;
		КонецПопытки;
	ИначеЕсли Не Файл.ЭтоКаталог() Тогда 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог));
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

// Ожидает завершения подключений к информационной базе.
//
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
//
Процедура ОжидатьЗавершения(Знач ПараметрыПодключения)
			
	// Несмотря на установку "Соединение = Неопределено;", на медленных компьютерах Com соединения не успевает 
	// отваливаться до вызова следующей функции. Это приводит к невозможности установить монопольный доступ и ошибке. 
	// Для обхода ошибки реализована задержка.

	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;

	Если ФайловыйВариантРаботы Тогда 	
		
		ФайлНаличияСоединений = Новый Файл(ОбъединитьПути(ПараметрыПодключения.КаталогИнформационнойБазы, "1Cv8tmp.1CD"));
		Если Не ФайлНаличияСоединений.Существует() Тогда
			Возврат;
		КонецЕсли;
		
		ДатаСтарта = ТекущаяДата();
		Интервал = 5; // Не ждем более 5 секунд.
		
		Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл 
			Если Не ФайлНаличияСоединений.Существует() Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
						
		Лог.Отладка(СтрШаблон(НСтр("ru = 'Задержка: %1 сек'"), ТекущаяДата() - ДатаСтарта));
		
	Иначе
	
		Попытка
			WScript = Новый COMОбъект("WScript.Shell");
		Исключение
			Лог.Отладка(СтрШаблон(НСтр("ru = 'Не удалось подключить WScript:
				|%1'"), ИнформацияОбОшибке()));
			Возврат;
		КонецПопытки; 
		
		WScript.Sleep(1000 * 2); // Ждем 2 секунды.
		WScript = Неопределено;
		
		Лог.Отладка(НСтр("ru = 'Задержка: 2 сек'"));

	КонецЕсли;		

КонецПроцедуры

// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель
// на это соединение.
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
// 
// Возвращаемое значение:
//  COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в случае ошибки;
//
Функция УстановитьВнешнееСоединениеСБазой(Знач ПараметрыПодключения) 
	
	ИмяCOMСоединителя = "V" + ПараметрыПодключения.ВерсияПлатформы + ".COMConnector";
	Попытка
		COMОбъект = Новый COMОбъект(ИмяCOMСоединителя);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
			|%1'"), ИнформацияОбОшибке()));
		Возврат Неопределено;
	КонецПопытки; 
	
	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
	
	// Формирование строки соединения.
	ШаблонСтрокиСоединения = "[СтрокаБазы][СтрокаАутентификации];UC=ПакетноеОбновлениеКонфигурацииИБ";
	
	Если ФайловыйВариантРаботы Тогда
		СтрокаБазы = "File = ""&КаталогИнформационнойБазы""";
		СтрокаБазы = СтрЗаменить(СтрокаБазы, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
	Иначе
		СтрокаБазы = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""";
		СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяСервера1СПредприятия",                     ПараметрыПодключения.ИмяСервера1СПредприятия);
		СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
	КонецЕсли;
	
	Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
		СтрокаАутентификации = "";
	Иначе
		
		Если СтрНайти(ПараметрыПодключения.ИмяПользователя, """") Тогда
			ПараметрыПодключения.ИмяПользователя = СтрЗаменить(ПараметрыПодключения.ИмяПользователя, """", """""");
		КонецЕсли;
		
		Если СтрНайти(ПараметрыПодключения.ПарольПользователя, """") Тогда
			ПараметрыПодключения.ПарольПользователя = СтрЗаменить(ПараметрыПодключения.ПарольПользователя, """", """""");
		КонецЕсли;
		
		СтрокаАутентификации = "; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя""";
		СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ИмяПользователя",    ПараметрыПодключения.ИмяПользователя);
		СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ПарольПользователя", ПараметрыПодключения.ПарольПользователя);
	КонецЕсли;
	
	СтрокаСоединения = СтрЗаменить(ШаблонСтрокиСоединения, "[СтрокаБазы]", СтрокаБазы);
	СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаАутентификации]", СтрокаАутентификации);
	
	Попытка
		Соединение = COMОбъект.Connect(СтрокаСоединения);
	Исключение
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
			|%1'"), ИнформацияОбОшибке()));
		Возврат Неопределено;
	КонецПопытки;
	
	Возврат Соединение;
	
КонецФункции

// Устанавливает контекст библиотеки v8runner и возвращиет указатель на объект.
// 
// Параметры:
//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
// 
// Возвращаемое значение:
//  УправлениеКонфигуратором - объект библиотеки v8runner;
//
Функция УстановитьУправлениеКонфигуратором(Знач ПараметрыПодключения) 
	
	УправлениеКонфигуратором = Новый УправлениеКонфигуратором();
	
	ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
	
	Если ФайловыйВариантРаботы Тогда
		СтрокаСоединения = "/F""&КаталогИнформационнойБазы""";
		СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
	Иначе
		СтрокаСоединения = "/IBConnectionString""Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""""";
		СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяСервера1СПредприятия",                     ПараметрыПодключения.ИмяСервера1СПредприятия);
		СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
	КонецЕсли;
	
	Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
		ПараметрыПодключения.ИмяПользователя = "";
		ПараметрыПодключения.ПарольПользователя = "";
	КонецЕсли;
	
	УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, ПараметрыПодключения.ИмяПользователя, ПараметрыПодключения.ПарольПользователя);
	УправлениеКонфигуратором.УстановитьКлючРазрешенияЗапуска("ПакетноеОбновлениеКонфигурацииИБ");
	
	УправлениеКонфигуратором.КаталогСборки(СтруктураКаталогов.КаталогВременныхФайлов);
	
	Возврат УправлениеКонфигуратором;
	
КонецФункции

Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт

    Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);

КонецФункции

Лог = Логирование.ПолучитьЛог("oscript.app.update");
Лог.УстановитьРаскладку(ЭтотОбъект);
Лог.УстановитьУровень(УровниЛога.Информация);

Инициализировать();

Очистка кэша 1С

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

Порядок действий скрипта:

  1. Получает путь к каталогу пользователя;
  2. Проверяет наличие каталога с кэшем 1С;
  3. Удаляет кэш с учетом прописанных исключений.
#Использовать logos

Перем Лог;

Функция Инициализировать()
	
	МассивИсключений = Новый Массив;
	МассивИсключений.Добавить("ExtCompT");

	КаталогиКэша = Новый Массив;
	КаталогиКэша.Добавить("%USERPROFILE%\Local Settings\Application Data\1C\1Cv8");
	КаталогиКэша.Добавить("%USERPROFILE%\Application Data\1C\1Cv8");
	КаталогиКэша.Добавить("%USERPROFILE%\Local Settings\Application Data\1C\1Cv82");
	КаталогиКэша.Добавить("%USERPROFILE%\Application Data\1C\1Cv82");

	ОчиститьКэш(КаталогиКэша, МассивИсключений);

КонецФункции

// Перемещаят найденные по маскам файлы в каталог резервных копий.
//
// Параметры:
//  КаталогиКэша 	 - Массив - Пути к каталогам кэша для очистки;
//  МассивИсключений - Массив - Имена каталогов, пропускаемых при очистке.
//
Процедура ОчиститьКэш(КаталогиКэша, МассивИсключений)
 	
	СистемнаяИнформация = Новый СистемнаяИнформация();
	ИмяПапкиПользователя = СистемнаяИнформация.ПолучитьПеременнуюСреды("USERPROFILE");

	Для Каждого КаталогКэша Из КаталогиКэша Цикл
		
		Путь = СтрЗаменить(КаталогКэша, "%USERPROFILE%", ИмяПапкиПользователя);
		
		Лог.Информация("----------------------------------------------------------------------");
		Лог.Информация(СтрШаблон(НСтр("ru = 'Обработка каталога %1.'"), Путь));
		Лог.Информация("----------------------------------------------------------------------");

		КаталогОбъект = Новый Файл(Путь);
		Если НЕ КаталогОбъект.Существует() Тогда
			Лог.Ошибка(НСтр("ru = 'Каталог не найден.'"));
			Продолжить;
		КонецЕсли;

		МассивФайлов = НайтиФайлы(Путь, "*", Ложь); 
		Для Каждого НайденныйФайл Из МассивФайлов Цикл
			Если НайденныйФайл.ЭтоКаталог() 
			   И МассивИсключений.Найти(НайденныйФайл.Имя) = Неопределено Тогда
				Попытка
					УдалитьФайлы(НайденныйФайл.ПолноеИмя);
				Исключение
					Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось удалить каталог %1:
						|%2'"), НайденныйФайл.Имя, ИнформацияОбОшибке()));
					Продолжить;
				КонецПопытки;
			КонецЕсли;
		КонецЦикла;
			
	КонецЦикла;
	
КонецПроцедуры

Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт

    Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);

КонецФункции

Лог = Логирование.ПолучитьЛог("oscript.app.cleaner");
Лог.УстановитьРаскладку(ЭтотОбъект);
Лог.УстановитьУровень(УровниЛога.Информация);

Инициализировать();

Перенос файлов

Все мы создаем бекапы наших информационных баз. Кто-то делает это ежедневно, кто-то - реже. Естественно мы храним некоторое их количество для возможности отката на определенный момент времени. Каталоги с бекапами под час занимают места в десятки раз больше чем сами информационные базы. А представьте что мы имеем дело с десятком или сотней баз... В попытках уменьшить размер бекапов файловых информационных баз было замечено что в каталоги с базой пользователи часто кидаю посторонние файлы - будь то выгрузки, различные архиви и т.п. Для искоренения подобной практике было принято решение перемещать весь мусор из каталогов с информационными базами в отдельный специально созданный каталог. В скрипте необходимо указать каталоги поиска и каталог для "мусора", отдельно задаются маски для поиска перемещаемых файлов.

Порядок действий скрипта:

  1. По маске находит файл для переноса;
  2. Дублирует путь к файлу в каталоге с "мусором";
  3. Если файл с таким же наименованием уже есть в каталоге - добавляет к имени текущее время;
  4. Переносит файл.
#Использовать logos

Перем Лог;

Функция Инициализировать()
	
	РодительскийКаталог = "\\server\---";

	КаталогРезервныеКопии = ОбъединитьПути(РодительскийКаталог, "---"); 
	Если НЕ ОбеспечитьКаталог(КаталогРезервныеКопии) Тогда 
		ВызватьИсключение НСтр("ru = 'Выполнение обработки прервано.'"); 
	КонецЕсли;
		
	КаталогиПоиска = Новый Массив;
	КаталогиПоиска.Добавить(ОбъединитьПути(РодительскийКаталог, "---"));
	КаталогиПоиска.Добавить(ОбъединитьПути(РодительскийКаталог, "---"));
		
	МассивМасок = Новый Массив;
	МассивМасок.Добавить("*.dt");
	МассивМасок.Добавить("*.zip");
	МассивМасок.Добавить("*.rar");
	МассивМасок.Добавить("*.7z");

	ПереместитьФайлыВКаталог(КаталогРезервныеКопии, КаталогиПоиска, МассивМасок);	

КонецФункции

// Перемещаят найденные по маскам файлы с сохранением пути.
//
// Параметры:
//  КаталогРезервныеКопии - Строка - Путь к каталогу в который переносятся файлы;
//  КаталогиПоиска 		  - Массив - Пути к каталогам в которых осуществляется поиск файлов;
//  МассивМасок 		  - Массив - Маски, по которым осуществляется поиск файлов.
//
Процедура ПереместитьФайлыВКаталог(КаталогРезервныеКопии, КаталогиПоиска, МассивМасок)
 	
 	Для Каждого КаталогПоиска Из КаталогиПоиска Цикл
					
		Лог.Информация("----------------------------------------------------------------------");
		Лог.Информация(СтрШаблон(НСтр("ru = 'Обработка каталога %1.'"), КаталогПоиска));
		Лог.Информация("----------------------------------------------------------------------");

		КаталогПоискаОбъект = Новый Файл(КаталогПоиска);
		Если НЕ КаталогПоискаОбъект.Существует() Тогда
			Лог.Ошибка(НСтр("ru = 'Каталог не найден.'"));
			Продолжить;
		КонецЕсли;
		
		Для Каждого Маска Из МассивМасок Цикл
		
			МассивФайлов = НайтиФайлы(КаталогПоиска, Маска, Истина); 
			Для Каждого НайденныйФайл Из МассивФайлов Цикл
				
				Лог.Информация(СтрШаблон(НСтр("ru = 'Перемещение файла %1.'"), НайденныйФайл.ПолноеИмя));
	
				НовыйПуть = СтрЗаменить(НайденныйФайл.Путь, КаталогПоиска, КаталогРезервныеКопии);
				НовоеИмя = НайденныйФайл.Имя; 			
				
				Если НЕ ОбеспечитьКаталог(НовыйПуть) Тогда 
					Продолжить; 
				КонецЕсли;
	
				ФайлНаДиске = Новый Файл(ОбъединитьПути(НовыйПуть, НовоеИмя));
			    Если ФайлНаДиске.Существует() Тогда
					НовоеИмя = Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс") + " " + НовоеИмя; 			
			    КонецЕсли;
				
				Попытка
					ПереместитьФайл(НайденныйФайл.ПолноеИмя, ОбъединитьПути(НовыйПуть, НовоеИмя));
				Исключение
					Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось переместить файл:
						|%1'"), ИнформацияОбОшибке()));
					Продолжить;
				КонецПопытки;
								
				ФайлНаДиске = Новый Файл(ОбъединитьПути(НовыйПуть, НовоеИмя));
			    Если НЕ ФайлНаДиске.Существует() Тогда
					Лог.Ошибка(НСтр("ru = 'Не удалось корректно переместить файл.'"));
					Продолжить;
			    КонецЕсли;
					
				Лог.Отладка(НСтр("ru = 'Файл перемещен.'"));

			КонецЦикла;	
		
		КонецЦикла;	

  	КонецЦикла;	

КонецПроцедуры

// Проверяет наличия каталога и в случае его отсутствия создает новый.
//
// Параметры:
//  Каталог - Строка - Путь к каталогу, существование которого нужно проверить.
//
// Возвращаемое значение:
//  Булево - признак существования каталога.
//
Функция ОбеспечитьКаталог(Знач Каталог)
	
	Файл = Новый Файл(Каталог);
	Если Не Файл.Существует() Тогда
		Попытка 
			СоздатьКаталог(Каталог);
		Исключение
			Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.
				|%2'"), Каталог, ИнформацияОбОшибке()));
			Возврат Ложь;
		КонецПопытки;
	ИначеЕсли Не Файл.ЭтоКаталог() Тогда 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог));
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт

    Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);

КонецФункции

Лог = Логирование.ПолучитьЛог("oscript.app.copy");
Лог.УстановитьРаскладку(ЭтотОбъект);
Лог.УстановитьУровень(УровниЛога.Информация);

Инициализировать();

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Скрипты
.zip 12,29Kb
14.07.16
15
.zip 1.3 12,29Kb 15 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей Овсянкин (Evil Beaver) 14.07.16 14:02
было замечено что в каталоги с базой пользователи часто кидаю посторонние файлы - будь то выгрузки, различные архиви и т.п.

А можно вопрос - почему они вообще имеют доступ в каталоги бэкапов? А ну как поудаляют их к чертям?
2. Артур Аюханов (artbear) 14.07.16 14:14
(0) В исходной ветке тобой указано про текущий код обновления
Обновление идет на максимально возможный уже скачанный релиз, если такового не найдено - на максимально возможный в пределах скачка (загружается с сайта). Такая необходимость возникла в связи с тем что была куча баз с различными релизами и вместо того чтобы качать цепочку "максимальных" релизов для каждой все релизы обновлялись на уже скачанный и далее по одной цепочке до финального.
Обработчики в режиме Предприятия не запускаются. Тут принципиальная позиция - соглашение на клиентском компьютере принимает пользователь. Через чур старых ИБ не обновляется - поэтому проблем нет).


Эта информация верна?
ИМХО запуск обработок в режиме Предприятия очень важен, миграция данных идет именно в них.
3. Артур Аюханов (artbear) 14.07.16 14:15
ИМХО в статье перепутан код скриптов очистки кеша и переноса файлов :(
4. Юрий Былинкин (ardn) 14.07.16 14:16
(1) Evil Beaver,
Я так понял, что в каталог с базой кидают свои файлы, из-за этого большой размер бекапа получается
5. Артур Аюханов (artbear) 14.07.16 14:21
(0) Вместо кода с использованием COM-объекта
COMОбъект = Новый COMОбъект("Wscript.Shell");
ИмяПапкиПользователя = COMОбъект.ExpandEnvironmentStrings("%USERPROFILE%");


можно юзать встроенный класс
ПеременныеСреды / EnvironmentVariables()
Возвращает соответствие переменных среды. Ключом является имя переменной, а значением - значение переменной

Пример:

СИ = Новый СистемнаяИнформация();
Для Каждого Переменная Из СИ.ПеременныеСреды() Цикл
Сообщить(Переменная.Ключ + " = " + Переменная.Значение);
КонецЦикла;
Возвращаемое значение

Соответствие

УстановитьПеременнуюСреды / SetEnvironmentVariable()
Позволяет установить переменную среды. Переменная устанавливается в области видимости процесса и очищается после его завершения.

Параметры

varName: Имя переменной

value: Значение переменной

ПолучитьПеременнуюСреды / GetEnvironmentVariable()
Получить значение переменной среды.

Параметры

varName: Имя переменной
Возвращаемое значение

Строка. Значение переменной


http://oscript.io/syntax/page/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D0­%B0%D1%8F%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0­%B8%D1%8F
6. Алексей (Drak0n) 14.07.16 14:54
(1) Evil Beaver, сотрудники имеют доступ только к каталогам с информационными базами. Специфика деятельности такова, что достаточно часто клиенты приносят выгрузки (или архивы с ИБ),которые нужно загрузить или наоборот нужно выгрузить базу клиенту... В общем весь этот мусор сотрудниками копировался и выгружался в папку с ИБ и соответственно с ней же бекапился... От чего размер ежедневных архивов раздувался просто неимоверно).
(2) artbear, ни коем образом не умоляю важность принятия изменений в режиме Предприятия, однако как уже говорил, у нас принято что бы сам сотрудник, работающий с базой, принимал эти обновления. Но, соглашусь, добавить в код такую возможность надо... Как-нибудь позже...
(3) artbear, каюсь, исправил (уж очень неудобный редактор текста статьи на инфостарте).
(5) artbear, спасибо, учту.
7. Алексей (Drak0n) 15.07.16 12:56
Обновил текст скриптов.
Автоматическое обновление теперь умеет:
- Выполнять отложенные обработчики обновления (только для конфигураций на БСП);
- Выполнять тестирование и исправление;
- Принимать обновления в информационной базе (только для конфигураций на БСП).

Очистка кэша больше не использует COM объекты.
8. Евгений Мартыненков (JohnyDeath) 15.07.16 23:56
Не хотите положить скрипты в модный github?
Вот, кстати, еще одна реализация обновлятора баз: https://github.com/ret-Phoenix/autoupdatecfg
bforce; artbear; +2 Ответить
9. Никита Грызлов (nixel) 16.07.16 16:47
Удивлен, что в скриптах есть работа с конфигуратором, но нет использования библиотеки v8runner :)
sorb; artbear; ret-Phoenix; ardn; JohnyDeath; +5 Ответить 1
10. 1 1 (zampollitr) 19.07.16 15:08
В скрипте Очистка кэша выдает ошибку:
{Модуль <string> / Ошибка в строке: 21 / Неизвестный символ: ПолучитьПеременнуюСреды}
ИмяПапкиПользователя = ПолучитьПеременнуюСреды("USERPROFILE");
11. Артур Аюханов (artbear) 19.07.16 18:08
(7) Drak0n,
- Принимать обновления в информационной базе (только для конфигураций на БСП).


Не совсем понял текст.
Здесь говорится об обновлении в режиме Предприятие или о чем-то другом ?
12. Алексей (Drak0n) 20.07.16 09:35
(9) nixel, пока только присматриваюсь к возможностям библиотек...

(10) zampollitr, исправился:
	ИмяПапкиПользователя = СистемнаяИнформация.ПолучитьПеременнуюСреды("USERPROFILE");


(11) artbear, выполняется неинтерактивное обновление данных ИБ.
13. Alexandr Kuritsyn (hibico) 20.07.16 14:56
Возможен случай, когда конфигурация базы данных отличается от основной конфигурации. А в "Соединение.Метаданные.Версия" возвращается версия конфигурации ИБ.
В моей конфигурации сначала проверяется "Соединений.КонфигурацияИзменена()" и если изменена, то производится сначала обновление конфигурации ИБ.

Не понял, а зачем выполняется
"Соединение.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас()"
перед обновлением основной конфигурации?
14. Алексей (Drak0n) 20.07.16 16:54
(13) hibico,
Соединение.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(Ложь);
В функцию передается параметр отключающий отложенные обработчики обновления (для более быстрого обновления). Соответственно если в информационную базу никто после предыдущего обновления не заходил - эти обработчики будут невыполненными.
15. Alexandr Kuritsyn (hibico) 21.07.16 10:14
(14) Drak0n,
Я не про
Соединение.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(Ложь);

А про строку:
Соединение.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас();

Насколько понимаю, она вызывает запуск отложенных заданий. Если в ней смысл перед обновлением конфигурации?
16. Алексей (Drak0n) 21.07.16 12:53
(15) hibico, риск пропустить какое-нибудь критическое изменение конечно минимален, но, при пакетном обновлении с накатыванием сразу кучи релизов, он присутствует. Да и типовой 1Совский скрипт эту процедуру запускает. Так что лишним не будет.
17. Алексей (Drak0n) 22.07.16 11:15
Новое обновление.
Автоматическое обновление теперь:
- Завершает работу пользователей и устанавливает запрет на подключение новых соединений (только для конфигураций на БСП);
- В случае ошибки пытается восстановиться из резервной копии (для файловых баз);
- Разрешает подключение новых соединений (только для конфигураций на БСП).
Теперь корректно отрабатываются ситуации, когда основная конфигурация отличается от конфигурации базы данных.

Добавлен пример скрипта для работы с файлом списка информационных баз (ibases.v8i).

Интеграция в скрипты работы с библиотеками logos, v8runner.
18. Сергей (ret-Phoenix) 22.07.16 12:54
(17) Чем не устраивает parserv8i из библиотек к 1script (https://github.com/oscript-library/parserV8i)? там есть и чтение и запись и работа с кешем.
https://github.com/ret-Phoenix/autoupdatecfg здесь есть функционал по получению последнего релиза, гораздо более простой, скачка файла обновления и запуск конфигуратора с принятием изменений. Запуск в пользовательском режиме при желании можно взять из приведенных Вами скриптов. Опять же там несколько вариантов создания копии баз, прозрачный API.

https://github.com/ret-Phoenix/scripts здесь на основе выше приведенных реп поиск файловых баз с мертвыми путями и простое архивирование 1cd, вариант с использованием внешнего архиватора.

Не понимаю, зачем создавать все с нуля, когда есть готовое и можно его улучшить, тем более код там простой, и покрыт тестами.
JohnyDeath; +1 Ответить 1
19. Алексей (Drak0n) 22.07.16 13:38
(18) ret-Phoenix, parserv8i полностью устроил, спасибо за ссылку.
20. Alexandr Kuritsyn (hibico) 22.07.16 15:02
(17) Drak0n,
		Пока ТекущаяДата() - Интервал <= ДатаСтарта Цикл 
			Если Не ФайлНаличияСоединений.Существует() Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
...Показать Скрыть
- сюда лучше вставить задержку, например также через "WScript.Shell". А то это ненужная нагрузка на процессор.

Ну а так осталось, похоже, только отправка сообщения (или лога) по почте.
21. Евгений Сосна (pumbaE) 22.07.16 15:05
(20) hibico, в oscript в отличии от 1с есть sleep(1000) = 1 секунда поспать.
JohnyDeath; artbear; +2 Ответить 2
22. Артур Аюханов (artbear) 22.07.16 15:47
(21) pumbaE, Дополню: в 1скрипт для русского кода реализован Приостановить
23. Alexandr Kuritsyn (hibico) 22.07.16 16:44
(21) pumbaE,
Честно сознаюсь, о 1Скрипт узнал только случайно попав на эту публикацию. Был приятно удивлен.
Сейчас времени нету, но после отпуска обязательно познакомлюсь поближе. Уже есть идеи использования.
24. Роман Сюзев (sorb) 26.07.16 08:10
(23) hibico, обязательно поделитесь открытием со своими коллегами, и заходите сюда: https://github.com/EvilBeaver/oscript-library - там уже много идей реализовано :)
25. Татьяна Лозинская (TatiLoz) 01.12.16 22:34
(17) Алексей, можете подсказать в чем возможна проблема?
При загрузке версии релиза возникает ошибка "403 Forbidden". Браузер тоже выдает эту ошибку при попытке загрузки по урл = "http://downloads.v8.1c.ru/get/Info/StateAccounting/1_0_43_5/updsetup.exe".
Но с n-ой попытки загрузка через браузер срабатывает и после этого начинает работать программная загрузка. Код использую следующий:
Соединение = Новый HTTPСоединение("downloads.v8.1c.ru",,Пользователь,Пароль);		
HTTPЗапрос = Новый HTTPЗапрос("/get/Info/" + ИмяКонфигурации + "/" + СтрЗаменить(НомерВерсии, ".", "_") + "/updsetup.exe",Заголовки);
Ответ = Соединение.Получить(HTTPЗапрос, мФайл.ПолноеИмя);
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа