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

Публикация № 537028

Разработка - Языки и среды - OneScript

скрипт script 1script onescript update обновление автообновление

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

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

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

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

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

На основании скрипта создана библиотека https://github.com/BlackDrak0n/oscript-AutoUpdateIB.  На странице проекта доступна исчерпывающая дукументация по процедурам и функциям. Настоятельно рекомендую к скачиванию и подключению к OneScript.

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

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

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

Перем Лог;
Перем Каталоги;
Перем НастройкиПодключения;
Перем Аутентификация;
Перем ИнтервалыОжидания;

//////////////////////////////////////////////////////////////////////////////////////
// Инициализация

// Инициализация параметров
Функция Инициализировать()
	
	СистемнаяИнформация = Новый СистемнаяИнформация();
	КаталогTEMP = СистемнаяИнформация.ПолучитьПеременнуюСреды("TEMP");
	КаталогAPPDATA = СистемнаяИнформация.ПолучитьПеременнуюСреды("APPDATA");

	Каталоги = Новый Структура();
	Каталоги.Вставить("КаталогФайловОбновления", ОбъединитьПути(КаталогAPPDATA, "1C\1Cv8\tmplts\1c")); // Каталог с файлами обновления конфигураций. 
	Каталоги.Вставить("КаталогВременныхФайлов",  ОбъединитьПути(КаталогTEMP, "AutoUpdateIB")); // Каталог для хранения временных файлов.
	Каталоги.Вставить("КаталогРезервныхКопий", 	 ОбъединитьПути(КаталогTEMP, "AutoUpdateIB\DumpIB")); // Каталог для хранения резевных копий и файлов дампа.
	
	НастройкиПодключения = Новый Структура();
	НастройкиПодключения.Вставить("СерверПроверкиОбновлений", 	  "downloads.1c.ru"); // Адрес сервера для проверки наличия обновлений (открытая часть).
	НастройкиПодключения.Вставить("ПутьКФайлуПроверкиОбновлений", "/ipp/ITSREPV/V8Update/Configs"); // Путь к файлу проверки обновлений на сервере.
	НастройкиПодключения.Вставить("СерверОбновлений", 			  "downloads.v8.1c.ru"); //Адрес сервера обновлений (закрытая часть).
	НастройкиПодключения.Вставить("ПутьКФайлуОбновлений", 		  "/tmplts"); // Путь к файлу обновлений на сервере.
	
	Аутентификация = Новый Структура();
	Аутентификация.Вставить("Пользователь", ""); // Имя пользователя для загрузки обновлений.
	Аутентификация.Вставить("Пароль", 		""); // Пароль пользователя для загрузки обновлений.

	ИнтервалыОжидания = Новый Структура();
	ИнтервалыОжидания.Вставить("ЗавершениеРаботыПользователей", 900); // Максимальный интервал ожидания завершения сеансов пользователей. 
	ИнтервалыОжидания.Вставить("ЗавершениеСеансовФайловойИБ", 	60); // Максимальный интервал ожидания завершения сеанса файловой информационной базы.
	ИнтервалыОжидания.Вставить("ЗавершениеСеансовСервернойИБ", 	2); // Интервал ожидания завершения сеанса клиент-серверной информационной базы.
	

	//////////////////////////////////////////////////////////////////////////////////////
	// Пример

	// Бухгалтерия предприятия, редакция 3.0
	ПараметрыОбновленияКонфигурации = ПолучитьПараметрыОбновленияКонфигурации();  
	Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда  

	    ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (Accounting 3.0)",,,,"Иванов И.И.","Password");
	    ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);  

	    ПараметрыПодключения = ПолучитьПараметрыПодключения(,,"Server","Base1C");
	    ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);  

	КонецЕсли;

	// Зарплата и управление персоналом, редакция 3.0
	ПараметрыОбновленияКонфигурации = ПолучитьПараметрыОбновленияКонфигурации("HRM", "3.0");  
	Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда  

	    ПараметрыПодключения = ПолучитьПараметрыПодключения(,"\\server\1C base\InfoBase 8.3 (HRM 3.0)",,,,"Иванов И.И.","Password");
	    ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения);  

	КонецЕсли;

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


///////////////////////////////////////////////////////////////////////////////
// Получение параметров конфигурации

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

// Осуществляет проверку корректности заполнения параметров конфигурации
	// 
	// Параметры:
	//  ПараметрыОбновленияКонфигурации - Структура - Параметры обновления конфигурации (см. в ПолучитьПараметрыОбновленияКонфигурации()).
	//
	// Возвращаемое значение:
	//  Булево - Признак успешного выполнения.
	//
Функция ПроверитьКорректностьПараметровОбновленияКонфигурациия(ПараметрыОбновленияКонфигурации)
	
	Лог.Информация(НСтр("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 = 'Анализ списков обновления завершен.'"));
	
	Возврат МассивОбновлений;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////
// Обновление инфорационной базы

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

	Лог.Информация("----------------------------------------------------------------------");
	Лог.Информация(СтрШаблон(НСтр("ru = 'Информационная база %1.'"), 
		?(ВариантРаботыИнформационнойБазы = 0, КаталогИнформационнойБазы, ИмяИнформационнойБазыНаСервере1СПредприятия)));
	Лог.Информация("----------------------------------------------------------------------");
	
	ПараметрыПодключения = Новый Структура();
	
	ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", 			 ВариантРаботыИнформационнойБазы);
	ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", 					 КаталогИнформационнойБазы);
	ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", 					 ИмяСервера1СПредприятия);
	ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", ИмяИнформационнойБазыНаСервере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 = 'Завершение работы пользователей и установка запрета на подключение новых соединений.'"));
	
	// Получение параметров информационной базы
	Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
	Если Соединение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;     
		
	Попытка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//////////////////////////////////////////////////////////////////////////////////////
// Служебные процедуры и функции

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

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

	ИначеЕсли Не Файл.ЭтоКаталог() Тогда 
		Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог));
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

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

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

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

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

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

// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель
	// на это соединение.
	// 
	// Параметры:
	//  ПараметрыПодключения - Структура - Параметры подключения к информационной базе (см. в ОбновитьИнформационнуюБазу()).
	// 
	// Возвращаемое значение:
	//  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СПредприятия);
	КонецЕсли;
	
	Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
		ПараметрыПодключения.ИмяПользователя = "";
		ПараметрыПодключения.ПарольПользователя = "";
	КонецЕсли;
	
	УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, ПараметрыПодключения.ИмяПользователя, ПараметрыПодключения.ПарольПользователя);
	УправлениеКонфигуратором.УстановитьКлючРазрешенияЗапуска("ПакетноеОбновлениеКонфигурацииИБ");
	
	УправлениеКонфигуратором.КаталогСборки(Каталоги.КаталогВременныхФайлов);
	
	Возврат УправлениеКонфигуратором;
	
КонецФункции

Лог = Логирование.ПолучитьЛог("oscript.app.AutoUpdateIB");
Инициализировать();

Очистка кэша 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'"), НайденныйФайл.Имя, ИнформацияОбОшибке()));
					Продолжить;
				КонецПопытки;
			КонецЕсли;
		КонецЦикла;
			
	КонецЦикла;
	
КонецПроцедуры

Лог = Логирование.ПолучитьЛог("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 не является каталогом.'"), Каталог));
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

Лог = Логирование.ПолучитьЛог("oscript.app.copy");
Инициализировать();

От автора

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

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

Наименование Файл Версия Размер
Скрипты

.zip 12,45Kb
22.12.16
43
.zip 1.4 12,45Kb 43 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Evil Beaver 6753 14.07.16 14:02 Сейчас в теме
было замечено что в каталоги с базой пользователи часто кидаю посторонние файлы - будь то выгрузки, различные архиви и т.п.

А можно вопрос - почему они вообще имеют доступ в каталоги бэкапов? А ну как поудаляют их к чертям?
4. ardn 100 14.07.16 14:16 Сейчас в теме
(1) Evil Beaver,
Я так понял, что в каталог с базой кидают свои файлы, из-за этого большой размер бекапа получается
6. Drak0n 170 14.07.16 14:54 Сейчас в теме
(1) Evil Beaver, сотрудники имеют доступ только к каталогам с информационными базами. Специфика деятельности такова, что достаточно часто клиенты приносят выгрузки (или архивы с ИБ),которые нужно загрузить или наоборот нужно выгрузить базу клиенту... В общем весь этот мусор сотрудниками копировался и выгружался в папку с ИБ и соответственно с ней же бекапился... От чего размер ежедневных архивов раздувался просто неимоверно).
(2) artbear, ни коем образом не умоляю важность принятия изменений в режиме Предприятия, однако как уже говорил, у нас принято что бы сам сотрудник, работающий с базой, принимал эти обновления. Но, соглашусь, добавить в код такую возможность надо... Как-нибудь позже...
(3) artbear, каюсь, исправил (уж очень неудобный редактор текста статьи на инфостарте).
(5) artbear, спасибо, учту.
2. artbear 1184 14.07.16 14:14 Сейчас в теме
(0) В исходной ветке тобой указано про текущий код обновления
Обновление идет на максимально возможный уже скачанный релиз, если такового не найдено - на максимально возможный в пределах скачка (загружается с сайта). Такая необходимость возникла в связи с тем что была куча баз с различными релизами и вместо того чтобы качать цепочку "максимальных" релизов для каждой все релизы обновлялись на уже скачанный и далее по одной цепочке до финального.
Обработчики в режиме Предприятия не запускаются. Тут принципиальная позиция - соглашение на клиентском компьютере принимает пользователь. Через чур старых ИБ не обновляется - поэтому проблем нет).


Эта информация верна?
ИМХО запуск обработок в режиме Предприятия очень важен, миграция данных идет именно в них.
3. artbear 1184 14.07.16 14:15 Сейчас в теме
ИМХО в статье перепутан код скриптов очистки кеша и переноса файлов :(
5. artbear 1184 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
7. Drak0n 170 15.07.16 12:56 Сейчас в теме
Обновил текст скриптов.
Автоматическое обновление теперь умеет:
- Выполнять отложенные обработчики обновления (только для конфигураций на БСП);
- Выполнять тестирование и исправление;
- Принимать обновления в информационной базе (только для конфигураций на БСП).

Очистка кэша больше не использует COM объекты.
11. artbear 1184 19.07.16 18:08 Сейчас в теме
(7)
- Принимать обновления в информационной базе (только для конфигураций на БСП).


Не совсем понял текст.
Здесь говорится об обновлении в режиме Предприятие или о чем-то другом ?
8. JohnyDeath 297 15.07.16 23:56 Сейчас в теме
Не хотите положить скрипты в модный github?
Вот, кстати, еще одна реализация обновлятора баз: https://github.com/ret-Phoenix/autoupdatecfg
bforce; artbear; +2 Ответить
9. nixel 903 16.07.16 16:47 Сейчас в теме
Удивлен, что в скриптах есть работа с конфигуратором, но нет использования библиотеки v8runner :)
sorb; artbear; ret-Phoenix; ardn; JohnyDeath; +5 Ответить
12. Drak0n 170 20.07.16 09:35 Сейчас в теме
(9) nixel, пока только присматриваюсь к возможностям библиотек...

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


(11) artbear, выполняется неинтерактивное обновление данных ИБ.
10. zampollitr 19.07.16 15:08 Сейчас в теме
В скрипте Очистка кэша выдает ошибку:
{Модуль <string> / Ошибка в строке: 21 / Неизвестный символ: ПолучитьПеременнуюСреды}
ИмяПапкиПользователя = ПолучитьПеременнуюСреды("USERPROFILE");
13. hibico 255 20.07.16 14:56 Сейчас в теме
Возможен случай, когда конфигурация базы данных отличается от основной конфигурации. А в "Соединение.Метаданные.Версия" возвращается версия конфигурации ИБ.
В моей конфигурации сначала проверяется "Соединений.КонфигурацияИзменена()" и если изменена, то производится сначала обновление конфигурации ИБ.

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

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

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

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

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

Ну а так осталось, похоже, только отправка сообщения (или лога) по почте.
21. pumbaE 634 22.07.16 15:05 Сейчас в теме
(20) hibico, в oscript в отличии от 1с есть sleep(1000) = 1 секунда поспать.
JohnyDeath; artbear; +2 Ответить
22. artbear 1184 22.07.16 15:47 Сейчас в теме
(21) pumbaE, Дополню: в 1скрипт для русского кода реализован Приостановить
23. hibico 255 22.07.16 16:44 Сейчас в теме
(21) pumbaE,
Честно сознаюсь, о 1Скрипт узнал только случайно попав на эту публикацию. Был приятно удивлен.
Сейчас времени нету, но после отпуска обязательно познакомлюсь поближе. Уже есть идеи использования.
24. sorb 26.07.16 08:10 Сейчас в теме
(23) hibico, обязательно поделитесь открытием со своими коллегами, и заходите сюда: https://github.com/EvilBeaver/oscript-library - там уже много идей реализовано :)
Evil Beaver; JohnyDeath; +2 Ответить
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Запрос, мФайл.ПолноеИмя);
26. biz-intel 721 05.01.17 01:07 Сейчас в теме
Пытаюсь выполнить резевное копирование серверной ИБ. Пример скрипта ниже.

#Использовать AutoUpdateIB

Обновлятор = Новый Обновлятор();

Обновлятор.УстановитьКаталог("КаталогРезервныхКопий", "D:\");

ПараметрыПодключения = Обновлятор.ПолучитьПараметрыПодключения(1,,"server","base",,"user","passwd",);

Обновлятор.СоздатьРезервнуюКопию(ПараметрыПодключения);
Показать


Получаю исключение от платформы. На скриншоте видно, что платформа пытается работать с временным файлом по несуществующему пути.
Прикрепленные файлы:
27. JohnyDeath 297 05.01.17 10:47 Сейчас в теме
(26) Случайно не ConEmu (или cmder) для запуска используете?
28. biz-intel 721 05.01.17 12:09 Сейчас в теме
(27) нет не использую. Исключение обошёл переопределением переменной temp. Но теперь борюсь с ошибкой "Информационная база не определена". Вообще скрипт нормально работает с файловыми базами, но с серверными лично у меня много проблем, а хочется чтобы скрипты именно с серверными базами помогали
29. JohnyDeath 297 05.01.17 15:17 Сейчас в теме
31. biz-intel 721 05.01.17 20:03 Сейчас в теме
(29) спасибо, но я уже там:) Интересный проект, уверен что это прорыв для нас.
30. Drak0n 170 05.01.17 19:19 Сейчас в теме
Это как раз ошибка создания/доступа к файлу лога, создаваемое скриптом библиотеки v8runner (она используется в моей библиотеке для указания параметров запуска конфигуратора). Попробуйте обновить v8runner или свяжитесь с разработчиками. Ссылка выше.
32. biz-intel 721 05.01.17 20:14 Сейчас в теме
(30) у меня последняя версия стоит, у вас в скрипте есть метод "УстановитьКаталог" с аргументом "КаталогВременныхФайлов". Если переопределить путь лог создается, но дальше возникает не особо обработанное исключение (см. скриншот). Я понимаю что это не в коде скрипта, сейчас как раз смотрю v8runner
Прикрепленные файлы:
33. 4iga-buga 18.09.18 09:40 Сейчас в теме
Помогите пожалуйста, как лог скрипта обновления конфигураций сохранить в файл?
34. 4iga-buga 18.09.18 10:19 Сейчас в теме
35. mirco 74 27.12.18 23:02 Сейчас в теме
Помогите. Почему выдает ошибку
package-loader.os / Ошибка в строке 184 /неверное значение аргумента
Библиотека лежит в C:\OS\lib\AutoUpdateIB

в oscript.cfg
lib.additional = C:\OS\lib\AutoUpdateIB;
36. Niki_Pro 23.01.19 10:10 Сейчас в теме
(35)
Проверь корректность наименований в папке "Классы". Аналогичная ошибка была, потому что скачал архив с github, и все русские буквы в наименовании стали крокозябрами. Я их переименовал, но допустил ошибку. Обнаружил ее, и ошибка ушла.
37. dis_2015 13 05.03.19 00:33 Сейчас в теме
При запуске обновления серверной базы получаю вот такую ошибку (см. скрин). Подскажите как побороть?
Прикрепленные файлы:
38. Drak0n 170 05.03.19 12:56 Сейчас в теме
В папке со временными файлами есть логи - попробуйте посмотреть там более детальную информацию.
Скорее всего что-то напутал с кавычками или заменой в функции УстановитьУправлениеКонфигуратором в строке
СтрокаСоединения = "/IBConnectionString""Srvr = """"&ИмяСервера1СПредприятия""""; Ref = """"&ИмяИнформационнойБазыНаСервере1СПредприятия""""""";

Сейчас негде проверить. Попробуйте заменить на
СтрокаСоединения = "/IBConnectionString""Srvr = '&ИмяСервера1СПредприятия'; Ref = '&ИмяИнформационнойБазыНаСервере1СПредприятия'""";
39. dis_2015 13 05.03.19 15:48 Сейчас в теме
40. dis_2015 13 05.03.19 20:24 Сейчас в теме
Серверные базы с Бухгалтерией обновились. А с зарплатой получаю не очень понятную ошибку. Как это побороть?
ПараметрыОбновленияКонфигурации = ПолучитьПараметрыОбновленияКонфигурации("HRM", "3.0");  
	Если ПараметрыОбновленияКонфигурации <> Неопределено Тогда  

	    ПараметрыПодключения = ПолучитьПараметрыПодключения(1,,"server1","zp3_base");
	    ОбновитьИнформационнуюБазу(ПараметрыОбновленияКонфигурации, ПараметрыПодключения,,Ложь,,Ложь,Ложь);  
		
	
	КонецЕсли;
Показать


Релиз зупа 3.1. Вставлять "HRM", "3.1" я тоже пробовал. Без результатов.
Ошибка на скрине
Прикрепленные файлы:
41. Drak0n 170 06.03.19 09:35 Сейчас в теме
Откройте архив на который ссылается ошибка - там текстовый файл с описанием проблемы. Скорее всего по указанному логину и паролю нет доступа к конфигурации.
Так же для Базовой, проф и корп версии разные дистрибутивы. Уверены что, например, не HRMBase?
42. dis_2015 13 06.03.19 10:09 Сейчас в теме
(41) Архив при попытке его извлечь падает с ошибкой. Но при попытке открыть его блокнотом он оказывается html такого содержания:
<ht ml>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.12.1</center>
</body>
</html>
Показать

По логину и паролю доступ к обновлениям точно есть. Но зуп у нас корп и я попробовал "HRMCorp" и "HRMCorp30","HRM30" результат одинаковый
43. dis_2015 13 06.03.19 11:57 Сейчас в теме
(42)
Разобрался правильно в моем случае "HRM", "31"
Оставьте свое сообщение

См. также

GGraphics - внешняя компонента для работы с картинками jpg (jpeg), png, bmp, gif, tif Промо

Разработка внешних компонент v8 1cv8.cf Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

2000 руб.

02.09.2010    54354    62    207    

Интеграция "Библиотеки интеграции МДЛП 1.1.2.7" с типовой конфигурацией

Интеграция Конфигурирование 1С v8 Здравоохранение, медицина, стоматология Россия Бесплатно (free)

Инструкция для интеграции “Библиотеки интеграции МДЛП 1.1.2.7” в типовые конфигурации, на примере конфигурации “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”.

02.03.2020    4380    0    RPGrigorev    3    

Универсальные инструменты 1С

Универсальные обработки Прочие инструменты разработчика v8 1cv8.cf Бесплатно (free)

Свободно распространяемый набор универсальных обработок и отчетов в виде расширения для разработки и поддержки, которое работает во ВСЕХ видах клиентских приложений и во всех операционных системах, которые поддерживает платформа 1С:Предприятие, кроме мобильных. Консоль запросов - консоль отчетов - консоль кода - редактор объектов базы данных - удаление помеченных объектов - поиск и удаление дублей - редактор констант - консоль заданий - групповая обработка справочников и документов - динамический список - поиск ссылок на объект - регистрация изменений для обмена данными - структура хранения базы - консоль HTTP запросов-консоль вебсервисов- консоль сравнения данных- информация о лицензиях- загрузка из табличного документа-файловый менеджер-все функции- навигатор по конфигурации-конструктор регулярных выражений-Выгрузка загрузка XML с фильтрами

21.01.2020    21400    295    cprit    94    

Хранение файлов - как уменьшить размер базы данных

Чистка базы Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Бесплатно (free)

Хранение файлов в базе 1С можно оптимизировать для уменьшения размера хранимых данных.

09.09.2019    7957    0    2tvad    17    

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 Промо

Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки v8 1cv8.cf Платные (руб)

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

2000 руб.

31.01.2019    45723    327    156    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    26444    77    Evil Beaver    119    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    26566    0    Eret1k    23    

Немного о графических файлах. Сжатие. Распознавание текста

Инструментарий разработчика v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

06.05.2019    6720    10    tusv    6    

Регулярные выражения без внешних компонент? Легко! Промо

Практика программирования Обмен через XML v8 Бесплатно (free)

Сложный способ организовать проверку строки с помощью регулярного выражения в 1С. При этом ни одна внешняя компонента не пострадала. Ну и от платформы (Linux, MustDie) - не зависит.

04.03.2016    60335    0    starik-2005    99    

Практика перехода на Linux и Postgres в небольшой компании (10 пользователей)

Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Почему я решил поставить давнему клиенту Linux + Postgres вместо Windows + MS SQL? Что меня останавливало раньше?

22.04.2019    27852    0    starik-2005    169    

HTML-клиент у конфигурации 1С

WEB v8 Бесплатно (free)

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    16934    0    Smaylukk    119    

Уменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск

WEB v8 1cv8.cf Абонемент ($m)

Обработка демонстрирует отправку тела HTTP запроса со сжатием gzip (метод deflate) средствами платформы 1С. Демонстрация происходит на примере отправки текста или файла на Яндекс.Диск.

1 стартмани

03.09.2018    5853    29    uno-c    0    

Инструменты бухгалтера: Виджеты рабочего стола Промо

Универсальные обработки Рабочее место v8 v8::БУ БП3.0 Абонемент ($m)

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

2 стартмани

28.08.2017    35394    170    Bazil    28    

Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза

WEB v8 1cv8.cf Абонемент ($m)

В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие. Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК. Друзья, хватит. Вот вам решение.

1 стартмани

08.06.2018    13654    69    Malfarion    16    

Создание подключаемой обработки табличной части с диалогом запроса параметров заполнения (управляемые формы)

Обработка документов Обработка справочников Практика программирования v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

03.05.2018    45014    116    Mirage78    16    

Обработка печатной формы WORD клиент-сервер УФ

Универсальные печатные формы v8::УФ 1cv8.cf Абонемент ($m)

Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно. Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.

2 стартмани

14.03.2018    23819    83    LeoKeyn    41    

Gant 1C 2.* - диаграмма Ганта с таблицей + Планировщик + Отчет (8.1, на управляемой форме/Такси 8.2, 8.3) Промо

Рабочее место Универсальные обработки Управление проектом Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени v8 1cv8.cf УУ Абонемент ($m)

Внешняя обработка, аналог MS Project в 1Се для работы с задачами: параллельный ввод данных по задачам и график Ганта, дополнительный режим в виде календаря (планировщик), связывание задач и пересчет длительности и дат с учетом выходных, видов связей и запаздываний, расчет затрат, сохранение/открытие проектов в файл на диск или файл ИБ, импорт/экспорт документов Microsoft Project.

1 стартмани

02.12.2011    136020    1068    rare-avis    210    

“Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

Сканер штрих-кода Учет ТМЦ Учет ТМЦ v8 1cv8.cf Абонемент ($m)

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

1 стартмани

10.01.2018    40817    100    vadnevzorov    70    

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена)

Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML v8 КД Бесплатно (free)

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    182290    0    MaxS    285    

Зачем 1С-нику NoSQL и CRDT

WEB Интеграция Бесплатно (free)

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

12.08.2017    22767    0    unpete    27    

Маркировка: 2D Android Штрихкод сканер + драйвер устройства для 1С Промо

Сканер штрих-кода Розничная торговля Розничная торговля v7.7 v8 1cv8.cf 1cv7.md Абонемент ($m)

Драйвер торгового оборудования и приложение для Android, телефон или планшет в качестве стандартного штрихкод сканера для платформы 1С.

3 стартмани

29.11.2016    44090    176    dreamadv    110    

Как я стал одинэсником и переехал из провинции в Москву

О жизни Россия Бесплатно (free)

История покорения Москвы.

29.07.2017    16834    0    DmitryKSL    132    

54 ФЗ своими руками

ККМ Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 Розница Розничная и сетевая торговля (FMCG) Россия УУ Бесплатно (free)

Практический опыт внедрения изменений в 54ФЗ в розничной сети, работающей на 1С. Если вы не хотите платить каким-либо подрядчикам, которые "всё сделают и настроят за вас", то статься может оказаться крайне полезной.

17.04.2017    57633    0    comol    124    

Формирование штрихкода EAN-13 в SVG с помощью XDTO

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

В версии платформы 8.3.9 было объявлено о поддержке изображений в формате SVG. Данная обработка демонстрирует работу с данным форматом, а именно его формированием (рисованием). Ну а так как самой популярной картинкой в 1С, наверное, является картинка штрихкода EAN - ее я и решил рисовать.

1 стартмани

24.03.2017    11960    53    kot-stas    19    

Удаление организации из 1С. Чистка базы 1С. Удаление "не удаляемых" объектов Промо

Чистка базы v8 1cv8.cf Абонемент ($m)

Удалить все документы, чтобы в базе осталась только одна организация со своими документами? Удалить всю информацию в регистрах, не связанную с указанной фирмой? Удалить "неудаляемую" номенклатуру? Легко! Используйте эту обработку.

10 стартмани

02.10.2015    51122    309    spy-83    84    

План обмена в формате "EnterpriseData" для 1С 7.7

Обмен через XML 1С7.7<->1C7.7 v7.7 1С7:ТиС Абонемент ($m)

Пример организации надёжной синхронизации данных через универсальный формат "EnterpriseData" между конфигурациями на базе 1С 7.7 и произвольными приложениями.

1 стартмани

07.01.2017    21906    24    binex    23    

"Распределение в запросе" или "избавляемся от перебора"

Математика и алгоритмы Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

16.12.2016    32799    0    alexandersh    48    

Разбираемся с механизмом Дополнительные отчеты и обработки в БСП

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Чуть более комплексное описание, чем на других ресурсах

1 стартмани

30.10.2016    140881    954    json    66    

Монитор журнала регистрации Промо

Журнал регистрации Администрирование данных 1С WEB v8 1cv8.cf Абонемент ($m)

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

2 стартмани

29.06.2015    39887    106    andy23    49    

Редактирование табличной части объекта с помощью СКД

Инструментарий разработчика Практика программирования v8::СКД 1cv8.cf Россия Абонемент ($m)

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

2 стартмани

16.09.2016    24497    96    Hatson    27    

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

OneScript Россия Абонемент ($m)

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

1 стартмани

14.07.2016    28604    41    Drak0n    43    

Набор данных Объект в СКД для решения задач сортировки, нумерации и вывода в отчет произвольных наборов данных

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

Использование набора данных Объект в СКД, может добавить вашему отчету новые интересные возможности. В этой статье я покажу, как я использовал набор данных Объект при решении одной задачи.

04.07.2016    44757    0    lopatin    12    

Опыт оптимизации и контроля производительности в БД с 3000 пользователей Промо

Производительность и оптимизация (HighLoad) Бесплатно (free)

Данная статья написана по материалам доклада, прочитанного на Конференции Инфостарта IE 2014 29-31 октября 2014 года. Меня зовут Сергей, являюсь руководителем отдела оптимизации и производительности систем в компании "Деловые линии". Цель этого доклада – поделиться информацией о нашем опыте работы с большой базой на платформе 1С, с чем пришлось столкнуться, как удалось обеспечить работоспособность. Уверен, что вам будет интересно, так как подобной информацией мало кто делится, да и про само существование таких систем их владельцы стараются не рассказывать, максимум про это «краем глаза» упоминают участвовавшие в проекте вендоры. **update от 04.03.2016 по вопросам из комментариев

05.08.2015    60368    0    Sergey.Noskov    119    

Учет путевых листов

Обработка документов Печатные формы документов Учет рабочего времени Учет ТМЦ Учет рабочего времени Учет ТМЦ v8 v8::УФ 1cv8.cf БУ УУ Абонемент ($m)

Внешняя обработка по учету путевых листов для управляемых форм. Позволяет сохранять во внешнем файле данные об автомобилях, водителях и путевых листах. Позволяет печатать формы №3 и №4-П. Позволяет вести учет задолженностей водителей за бензин и сравнивать расход по норме (по показаниям спидометра) и фактический расход бензина.

3 стартмани

27.06.2016    14128    79    DrugOn    10    

Google Analytics API, Oauth2.0 и 1c8

Практика программирования WEB v8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

Обращение к Google Analytics API, Протокол Oauth 2.0 и запросы от 1С:8 без авторизации пользователя

02.05.2016    25627    0    Ольга_tmp    18    

УПД для документа "Поступление товаров и услуг" (БП 3.0) за поставщика

Печатные формы документов Оптовая торговля Производство готовой продукции (работ, услуг) Оптовая торговля Производство готовой продукции (работ, услуг) v8 v8::БУ БП3.0 Россия БУ Абонемент ($m)

Внешняя печатная форма для документа "Поступление товаров и услуг" позволяет печатать "Универсальный передаточный документ (УПД)" за поставщика в ред. постановления Правительства РФ 1137, 625 и 981

1 стартмани

20.12.2015    22004    273    romanco    18    

Автоматический REST-сервис в «1С:Предприятии». OData. Пример работы из Jscript/AJAX Промо

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Небольшой обзор REST-сервиса в «1С:Предприятии». Рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения - веб-страницы с использованием языка JavaScript и технологии AJAX.

1 стартмани

08.10.2014    76666    75    vano-ekt    48    

Автозаполнение адресов в 1С (API Google autocomplete place)

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье вы увидите пример, как можно с помощью API Google autocomplete place делать подсказки при заполнении адреса

19.10.2015    12913    0    d.alexandr    26    

Использование встроенных отчетов для создания анализа корректности данных при исчислении НДС с авансов полученных

Бухгалтерский учет v8 БП2.0 Россия БУ НДС Бесплатно (free)

На Инфостарте много выложено внешних отчетов, направленных на контроль правильности исчисления НДС с авансов полученных. Хочу поделиться своим опытом использования встроенного отчета (для Бухгалтерия предприятия.Редакция 3.0) и порядка создания настроек отчета для процедур контроля за исчислением НДС с авансовых платежей покупателей, особенно в случаях применения различных налоговых ставок НДС

1 стартмани

22.07.2015    8781    0    lvk74    3    

Дополнительные отчеты и обработки для конфигураций, основанных на БСП. Часть 1. Заполнение объектов.

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

08.01.2015    35070    72    acrk    23    

Создание внешних печатных форм под управляемым приложением с нуля Промо

Печатные формы документов v8 v8::УФ 1cv8.cf Абонемент ($m)

Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"

1 стартмани

05.06.2014    263812    391    signum2009    127    

Настройка ТСД chiperLab 8001 для УТ 11

Терминал сбора данных Учет ТМЦ Учет ТМЦ v8 УТ10 УУ Абонемент ($m)

Расширяем функционал ТСД chiperLab 8001 и загружаем сразу 10 документов Сканируйте 10 накладных за один раз!!!

1 стартмани

23.10.2014    24528    21    antonlinux    4    

Работа с принтером чеков Posiflex PP 6000, 7000, 8000

POS терминал Россия Абонемент ($m)

Некоторые варианты для работы с принтером чеков POSIFLEX AURA 6000, 7000, 8000.

1 стартмани

18.08.2014    64700    146    MrFlanker    24    

Подписываем файлы с помощью ЭЦП средствами 1с Промо

Универсальные обработки Защита и шифрование v8 1cv8.cf Абонемент ($m)

Обработка для подписи с помощью сертификата (ЭЦП) произвольных файлов, только средствами платформы 1с. Работает на всех конфигурациях, но только на последних платформах 8.2 и 8.3, где есть менеджер криптографии.

1 стартмани

05.09.2013    60642    255    anig99    25    

1С Бухгалтерия 8. Часть 1: Настройка параметров учета Промо

Управленческий учет (прочее) v8 БП2.0 Россия БУ Бесплатно (free)

Залогом правильного ведения бухгалтерского и налогового учета в программе 1С Бухгалтерия 8 является правильная настройка параметров учета и учетной политики. Разработчики 1С постарались, чтобы эти настройки были простыми и понятными. Тем не менее, есть ряд подводных камней, о которые могут спотыкаться даже опытные пользователи.

05.11.2011    223363    0    vdi1950    124