Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "Форма.Каталог, Форма.ИсполняемыйФайлПлатформы, Форма.ИмяПользователя, Форма.ПарольПользователя, Форма.СтрокаСоединенияБазыПодсистемы, Форма.СобратьРасширение, Форма.СобратьПортативный, Форма.Токен, Форма.Автор, Форма.Репозиторий, Форма.БезРусскогоЯзыка, Форма.ФайлСпискаЗадачCSV";
КонецФункции

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
КонецПроцедуры

// Параметры:
//   КаталогРаспаковки - Строка(0,П)
//
Функция ПолучитьФайлСтруктурыХранилищаОбъектаМетаданных(Знач КаталогРаспаковки = "") Экспорт
	мРегВыражение = ирПлатформа.мРегВыражение;
	мРегВыражение.Global = Ложь;
	мРегВыражение.Pattern = "{2,(" + ирПлатформа.шGUID + "),";
	ФайлКорневогоУказателя = Новый Файл(КаталогРаспаковки + "root.data.und");
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ФайлКорневогоУказателя.ПолноеИмя);
	РезультатыПоиска = мРегВыражение.НайтиВхождения(ТекстовыйДокумент.ПолучитьТекст());
	КорневойИД = РезультатыПоиска[0].SubMatches(0);
	ФайлСтруктуры = Новый Файл(КаталогРаспаковки + КорневойИД + ".data.und");
	Результат = ФайлСтруктуры;
	Возврат Результат;
КонецФункции

// Параметры:
//   ПолноеИмяФайлаВнешнейОбработки - Строка(0,П)
//   ИмяФормы - Строка(0,П) - Если не указана, используется Основая форма, а если основная форма не указана, используется единственная форма. Для быстрого выполнения нужно указывать.
//   МассивДобавляемыхРеквизитов - Массив - !Проверка уникальности не выполняется. Ее нужно делать снаружи
//   СтарыйТекстМодуля - Строка(0,П)
//
Функция ПроверитьОбновитьМодульИРеквизитыФормыВФайле(Знач ПолноеИмяФайлаВнешнейОбработки = "", Знач ИмяФормы = "", Знач МассивДобавляемыхРеквизитов, НовыйТекстМодуля,
	СтарыйТекстМодуля = "") Экспорт
	
	ФайлВнешнейОбработки = Новый Файл(ПолноеИмяФайлаВнешнейОбработки);
	Если Не ЗначениеЗаполнено(ИмяФормы) Тогда
		ВнешнийОбъект = ВнешниеОбработки.Создать(ФайлВнешнейОбработки.ПолноеИмя);
		ОбъектМетаданных = ВнешнийОбъект.Метаданные();
		Если ОбъектМетаданных.ОсновнаяФорма <> Неопределено Тогда
			ИмяФормы = ОбъектМетаданных.ОсновнаяФорма.Имя;
		ИначеЕсли ОбъектМетаданных.Формы.Количество() = 1 Тогда
			ИмяФормы = ОбъектМетаданных.Формы[0].Имя;
		Иначе
			ВызватьИсключение "Невозможно определить форму внешней обработки для обновления";
		КонецЕсли;
	КонецЕсли;
	ИмяКаталогаСборки = "Rebuild";
	ИмяКаталогаРаспаковки = ФайлВнешнейОбработки.Путь + ИмяКаталогаСборки;
	КаталогРаспаковки = ИмяКаталогаРаспаковки + "\";
	УдалитьФайлы(ИмяКаталогаРаспаковки, "*.*");
	СоздатьКаталог(ИмяКаталогаРаспаковки);
	ирПлатформа.РаспаковатьФайлВнешнейОбработки(ФайлВнешнейОбработки.ПолноеИмя, КаталогРаспаковки);
	БылаМодификация = Ложь;
	мРегВыражение = ирПлатформа.мРегВыражение;
	
	// Получаем модуль формы и изменяем его, если не соответствует стандарту
	
	//ФайлСпискаФорм = Новый файл(КаталогРаспаковки + "copyinfo.data.und");
	//ТекстовыйДокумент = Новый ТекстовыйДокумент;
	//ТекстовыйДокумент.Прочитать(ФайлСпискаФорм.ПолноеИмя);
	//мРегВыражение.Global = Ложь;
	//мРегВыражение.Pattern = "(" + ирПлатформа.шGUID + "),1,\n\{d5b0e5ed-256d-401c-9c36-f630cafd8a62,""" + ИмяФормы + """";
	//РезультатыПоиска = мРегВыражение.НайтиВхождения(ТекстовыйДокумент.ПолучитьТекст());
	//СтарыеТекстыМодулейФорм = Новый Структура;
	//ИДФормы = РезультатыПоиска[0].SubMatches(0);
	
	ФайлСтруктуры = ПолучитьФайлСтруктурыХранилищаОбъектаМетаданных(КаталогРаспаковки);
	ТекстСтруктуры = Новый ТекстовыйДокумент;
	ТекстСтруктуры.Прочитать(ФайлСтруктуры.ПолноеИмя);
	мРегВыражение.Global = Ложь;
	мРегВыражение.Pattern = "\{d5b0e5ed-256d-401c-9c36-f630cafd8a62,\d+((?:," + ирПлатформа.шGUID + ")*)\}";
	РезультатыПоиска = мРегВыражение.НайтиВхождения(ТекстСтруктуры.ПолучитьТекст());
	ТекстСпискаИД = РезультатыПоиска[0].SubMatches(0);
	мРегВыражение.Global = Истина;
	мРегВыражение.Pattern = ирПлатформа.шGUID;
	РезультатыПоиска = мРегВыражение.НайтиВхождения(ТекстСпискаИД);
	Для Каждого Вхождение Из РезультатыПоиска Цикл
		ТекстФайлаФормы = Новый ТекстовыйДокумент;
		ТекстФайлаФормы.Прочитать(КаталогРаспаковки + Вхождение.Value + ".data.und");
		//мРегВыражение.Global = Ложь;
		//мРегВыражение.Pattern = Вхождение.Value + "\},""(" + ирПлатформа.шИмя + ")"";
		//РезультатыПоиска2 = мРегВыражение.НайтиВхождения(ТекстФайлаФормы.ПолучитьТекст());
		Маркер = Вхождение.Value + "},""" + ИмяФормы + """";
		Если Найти(НРег(ТекстФайлаФормы.ПолучитьТекст()), Нрег(Маркер)) > 0 Тогда
			ИДФормы = Вхождение.Value;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если ИДФормы = Неопределено Тогда
		ВызватьИсключение "Не удалось определить внутренний идентификатор формы """ + ИмяФормы + """";
	КонецЕсли;
	
	ФайлМодуляФормы = Новый Файл(КаталогРаспаковки + ИДФормы + ".0.data.und.unp\" + "module.data");
	СтарыйТекстМодуляФормы = Неопределено;
	
	Результат = Ложь;
	ТекстДляПроверки = Новый ТекстовыйДокумент;
	ТекстДляПроверки.Прочитать(ФайлМодуляФормы.ПолноеИмя);
	ТекстОбразец = Новый ТекстовыйДокумент;
	ТекстОбразец.УстановитьТекст(НовыйТекстМодуля);
	СтарыйТекстМодуля = ТекстДляПроверки.ПолучитьТекст();
	Если ТекстОбразец.ПолучитьТекст() <> СтарыйТекстМодуля Тогда
		ТекстОбразец.Записать(ФайлМодуляФормы.ПолноеИмя);
		Результат = Истина;
	КонецЕсли;
	
	Если Истина
		И МассивДобавляемыхРеквизитов <> Неопределено
		И МассивДобавляемыхРеквизитов.Количество() > 0
	Тогда
		ФайлДиалогаФормы = Новый Файл(ФайлМодуляФормы.Путь + "form.data");
		ТекстДиалога = Новый ТекстовыйДокумент;
		ТекстДиалога.Прочитать(ФайлДиалогаФормы.ПолноеИмя);
		КоличествоНовыхРеквизитов = МассивДобавляемыхРеквизитов.Количество();
		ОстатокТекста0 = ТекстДиалога.ПолучитьТекст();
	
		мРегВыражение.Global = Ложь;
		мРегВыражение.Pattern = "},\d+,\d+,\d+,0,\d+,4,4,\d+},";
		Вхождения = мРегВыражение.НайтиВхождения(ОстатокТекста0);
		Если Вхождения.Количество() = 0 Тогда
			Сообщить("При анализе диалога не найден маркер1");
			Возврат Неопределено;
		ИначеЕсли Вхождения.Количество() > 1 Тогда
			Сообщить("При анализе диалога найдено более одного маркера1");
			Возврат Неопределено;
		КонецЕсли;
		Позиция = Вхождения[0].FirstIndex;
		Позиция = Позиция + СтрДлина(Вхождения[0].Value);
		Фрагмент1 = Лев(ОстатокТекста0, Позиция);
		ОстатокТекста1 = Сред(ОстатокТекста0, Позиция + 1);
	
		//Маркер = "},";
		//Позиция = Найти(ОстатокТекста1, Маркер);
		//Фрагмент2 = Лев(ОстатокТекста1, Позиция + СтрДлина(Маркер));
		Фрагмент2 = "";
		ОстатокТекста2 = Сред(ОстатокТекста1, СтрДлина(Фрагмент2) + 1);
	
		Маркер = ",
		|{";
		Позиция = Найти(ОстатокТекста2, Маркер);
		Если Позиция = 0 Тогда
			Сообщить("Не найден маркер2");
			Возврат Неопределено;
		КонецЕсли;
		Позиция = Позиция + СтрДлина(Маркер) - 1;
		Фрагмент3 = Лев(ОстатокТекста2, Позиция);
		ОстатокТекста3 = Сред(ОстатокТекста2, СтрДлина(Фрагмент3) + 1);
	
		Позиция = Найти(ОстатокТекста3, "}");
		Позиция2 = Найти(ОстатокТекста3, ",");
		Если Позиция2 > 0 Тогда
			Позиция = Мин(Позиция, Позиция2);
		КонецЕсли;
		Фрагмент4 = Лев(ОстатокТекста3, Позиция - 1);
		ОстатокТекста4 = Сред(ОстатокТекста3, СтрДлина(Фрагмент4) + 1);
		Число = Число(Фрагмент4);
		Число = Число + КоличествоНовыхРеквизитов;
		Фрагмент4 = Формат(Число, "ЧГ=");
	
		Разделитель = ",";
		СтрокаРеквизитов = "";
		Счетчик = 1;
		
		// Если у формы нет ни одного реквизита, то может получиться ошибка формата потока
		Строка1 = ирОбщий.ТекстМеждуМаркерамиЛкс(ОстатокТекста4, "},", ",""");
		Если Ложь
			Или Не ЗначениеЗаполнено(Строка1)
			Или СтрДлина(Строка1) > 5
		Тогда
			//// у формы нет ни одного реквизита
			//Если ирКэш.НомерИзданияПлатформыЛкс() = "81" Тогда
			//	Строка1 = "0,1";
			//ИначеЕсли ирКэш.НомерИзданияПлатформыЛкс() >= "82" Тогда
				// Здесь может быть нужно и "0,1" использовать, если в конфигураторе форму ни разу не сохраняли еще, а только конвертировали через ConvertFiles
				// Если такое случается, то при попытке открыть такую внешнюю обработку платформа будет падать
				Строка1 = "1,0,1";
			//КонецЕсли;
		КонецЕсли;
	
		Для Каждого ИмяРеквизита Из МассивДобавляемыхРеквизитов Цикл
			СтрокаРеквизитов = СтрокаРеквизитов + Разделитель + "
			|{
			|{" + Формат(1000 + Счетчик, "ЧГ=") + "}," + Строка1 + ",""" + ИмяРеквизита + """,
			|{""Pattern""}
			|}";
			Счетчик = Счетчик + 1;
		КонецЦикла;
		НовыйТекст = Фрагмент1 + Фрагмент2 + Фрагмент3 + Фрагмент4 + СтрокаРеквизитов + ОстатокТекста4;
		ТекстДиалога.УстановитьТекст(НовыйТекст);
		ТекстДиалога.Записать(ФайлДиалогаФормы.ПолноеИмя);
		Результат = Истина;
	КонецЕсли;
	
	Если Результат Тогда
		// Здесь часто возникает ошибка 
		//{Обработка.ирПлатформа.МодульОбъекта(5 163)}: 
		//Ошибка при вызове метода контекста (Записать)
		//	ПолучитьМакет("v8unpack").Записать(Каталог + "\" + ИмяФайлаПакера);
		//Ошибка совместного доступа к файлу 'D:\Users\Сергей\AppData\Local\1C\1Cv82\File__D__1C_v82_DB_2iSРазработка__\b\Rebuild\v8unpack.exe'
		//						ВызватьИсключение Ошибка;//#Служебное
		ирПлатформа.УпаковатьФайлВнешнейОбработки(КаталогРаспаковки, ФайлВнешнейОбработки.ПолноеИмя);
	КонецЕсли;
	Возврат Результат;
КонецФункции

Функция ТабличныйДокументИзОбщихКартинокПодсистемы() Экспорт
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ШрифтЖирный = Новый Шрифт(,,Истина);
	ТабличныйДокумент.Область("R1C1:R1C1").Текст = "Имя";
	ТабличныйДокумент.Область("R1C2:R1C2").Текст = "Картинка";
	ТабличныйДокумент.Область("R1C1:R1C2").Шрифт = ШрифтЖирный;
	Для Каждого ОбщаяКартинка Из Метаданные.ОбщиеКартинки Цикл
		Если Не Метаданные.Подсистемы.ИнструментыРазработчикаTormozit.Состав.Содержит(ОбщаяКартинка) Тогда
			Продолжить;
		КонецЕсли;
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Картинка = БиблиотекаКартинок[ОбщаяКартинка.Имя];
		Рисунок.Имя = ОбщаяКартинка.Имя;
		Рисунок.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
		ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы + 1;
		ТабличныйДокумент.Область("R" + XMLСтрока(ВысотаТаблицы) + "C1:R" + XMLСтрока(ВысотаТаблицы) + "C1").Текст = ОбщаяКартинка.Имя;
		Рисунок.Расположить(ТабличныйДокумент.Область("R" + XMLСтрока(ВысотаТаблицы) + "C2:R" + XMLСтрока(ВысотаТаблицы) + "C2"));
	КонецЦикла;
	Возврат ТабличныйДокумент;
	
КонецФункции

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

Процедура ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту, Объект, ТелоМетода)

	#Если Сервер И Не Сервер Тогда
		ирПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	СтруктураТипа = ирПлатформа.СтруктураТипаИзЗначения(Объект);
	ПараметрыЗаполнения = ирПлатформа.НовыеПараметрыЗаполненияСлов("Свойство",,,,, Ложь); 
	ТаблицаСлов = ирПлатформа.ТаблицаСловИзСтруктурыТипа(СтруктураТипа, ПараметрыЗаполнения);
	Для Каждого ВнутренняяСтрокаСлова Из ТаблицаСлов Цикл
		ИмяСвойства = ВнутренняяСтрокаСлова.Слово;
		Если Ложь
			Или ИмяСвойства = "ИсточникДействий" 
			Или ИмяСвойства = "КонтекстноеМеню" 
		Тогда
			// Защита от длинных путей и зацикливания
			Продолжить;
		КонецЕсли; 
		Попытка
			ЗначениеСвойства = Объект[ИмяСвойства];
		Исключение
			Продолжить;
		КонецПопытки;
		Если ТипЗнч(ЗначениеСвойства) = Тип("Картинка") Тогда
			Если ЗначениеСвойства.Вид = ВидКартинки.ИзБиблиотеки Тогда
				ИмяОбщейКартинки = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства).ref.ЛокальноеИмя;
				Если Метаданные.ОбщиеКартинки.Найти(ИмяОбщейКартинки) <> Неопределено Тогда
					ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирКэш.КартинкаПоИмениЛкс("""
						+ ИмяОбщейКартинки + """);" + Символы.ПС);
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Цвет") Тогда
			ИмяЦветаСтиля = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства).ЛексическоеЗначение;
			ПозицияСкобки = Найти(ИмяЦветаСтиля, "}");
			Если ПозицияСкобки > 0 Тогда
				ИмяЦветаСтиля = Сред(ИмяЦветаСтиля, ПозицияСкобки + 1);
				Если Метаданные.ЭлементыСтиля.Найти(ИмяЦветаСтиля) <> Неопределено Тогда
					ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирОбщий.ЦветСтиляЛкс("""
						+ ИмяЦветаСтиля + """);" + Символы.ПС);
				КонецЕсли;
			КонецЕсли; 
		КонецЕсли;
		Если ирПлатформа.мМассивТиповЭлементовОбычнойФормы.Найти(ТипЗнч(ЗначениеСвойства)) <> Неопределено Тогда
			ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства, ЗначениеСвойства, ТелоМетода);
		КонецЕсли; 
		Если ирОбщий.ЛиКоллекцияЛкс(ЗначениеСвойства) Тогда
			ЕстьИндексПоИмени = Ложь;
			Для Каждого ЭлементКоллекции Из ЗначениеСвойства Цикл
				Если Не ЕстьИндексПоИмени Тогда
					Попытка
						Пустышка = Вычислить("ЗначениеСвойства." + ЭлементКоллекции.Имя);
					Исключение
						// Если к элементу по имени нельзя обратиться, то он нас не интересует.
						Прервать;
					КонецПопытки;
				КонецЕсли; 
				ЕстьИндексПоИмени = Истина;
				Если Ложь
					Или ирПлатформа.мМассивТиповЭлементовОбычнойФормы.Найти(ТипЗнч(ЭлементКоллекции)) <> Неопределено
					Или ТипЗнч(ЭлементКоллекции) = Тип("КнопкаКоманднойПанели")
				Тогда
					ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства + "." + ЭлементКоллекции.Имя, ЭлементКоллекции, ТелоМетода);
				КонецЕсли; 
			КонецЦикла; 
		КонецЕсли; 
	КонецЦикла;

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

Функция ТекстФайлаНастроек()
	Возврат "<?xml version=""1.0"" encoding=""UTF-8""?>
	|<Settings xmlns=""http://v8.1c.ru/8.3/config/merge/settings"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" version=""1.2"" platformVersion=""8.3.11"">
	|	<Parameters>
	|		<AllowMainConfigurationObjectDeletion>true</AllowMainConfigurationObjectDeletion>
	|	</Parameters>
	|</Settings>
	|";
КонецФункции

Процедура СобратьПортативный()

	Если ЗначениеЗаполнено(СтрокаСоединенияБазыПодсистемы) Тогда
		СтрокаСоединенияБазыПодсистемыЛ = СтрокаСоединенияБазыПодсистемы;
	Иначе
		СтрокаСоединенияБазыПодсистемыЛ = СтрокаСоединенияИнформационнойБазы();
	КонецЕсли; 
	ТекстЛога = "";
	ИмяФайлаКонфигурации = Каталог + "\Конфигурация\" + НомерВерсии + "\1Cv8.cf";
	ИмяФайлаНастроек = ПолучитьИмяВременногоФайла("xml");
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(ТекстФайлаНастроек());
	ТекстовыйДокумент.Записать(ИмяФайлаНастроек);
	Если Истина
		// Без ключа -Settings будет ошибка https://forum.infostart.ru/forum86/topic276267/message3167190/
		И Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/MergeCfg """ + ИмяФайлаКонфигурации + """ -Settings """ + ИмяФайлаНастроек + """ -DisableSupport", СтрокаСоединенияБазыПодсистемыЛ, ТекстЛога,, "Обновление конфигурации из файла") 
	Тогда 
		Сообщить(ТекстЛога);
		Возврат;
	КонецЕсли;
	КаталогВыгрузкиКонфигурации = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(КаталогВыгрузкиКонфигурации);
	ТекстЛога = "";
	// Выгружаем конфигурацию в файлы
	Если Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиКонфигурации + """ -Format Hierarchical", СтрокаСоединенияБазыПодсистемыЛ, ТекстЛога,, "Выгрузка конфигурации в файлы") 
	Тогда 
		УдалитьФайлы(КаталогВыгрузкиКонфигурации);
		Сообщить(ТекстЛога);
		Возврат;
	КонецЕсли;
	ЧтоЗаменять = "//ирПортативный ";
	НаЧтоЗаменять = "";
	Для Каждого Файл Из НайтиФайлы(КаталогВыгрузкиКонфигурации, "*.bsl", Истина) Цикл
		#Если Сервер И Не Сервер Тогда
			Файл = Новый Файл;
		#КонецЕсли
		ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
		ТекстовыйДокумент.УстановитьТекст(СтрЗаменить(ТекстовыйДокумент.ПолучитьТекст(), ЧтоЗаменять, НаЧтоЗаменять));
		ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
	КонецЦикла;
	КаталогВерсии = Каталог + "\Портативный\" + НомерВерсии;
	КаталогМодули = Новый Файл(КаталогВерсии + "\Модули");
	Если Не КаталогМодули.Существует() Тогда
		СоздатьКаталог(КаталогМодули.ПолноеИмя);
	КонецЕсли; 
	УдалитьФайлы(КаталогВыгрузкиКонфигурации + "\CommonModules\ирПортативный.xml");
	УдалитьФайлы(КаталогВыгрузкиКонфигурации + "\CommonModules\ирИнтерфейс.xml");
	УдалитьФайлы(КаталогВыгрузкиКонфигурации + "\CommonModules\ирИнтерфейсОбъявление.xml");
	СтрокаВерсии = НомерВерсии + "p";
	
	// ирПортативный.ОбщиеКартинки
	ТабличныйДокументКартинки = ТабличныйДокументИзОбщихКартинокПодсистемы();
	ИмяфайлаТабличногоДокумента = КаталогВыгрузкиКонфигурации + "\DataProcessors\ирПортативный\Templates\ОбщиеКартинки\Ext\Template.xml";
	ирОбщий.СохранитьЗначениеВФайлЛкс(ТабличныйДокументКартинки, ИмяфайлаТабличногоДокумента);
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяфайлаТабличногоДокумента);
	ТекстМодуля = ТекстовыйДокумент.ПолучитьТекст();
	// Антибаг платформы 8.3.9 Без этого текст теряется при загрузке внешней обработки из файлов
	ТекстМодуля = СтрЗаменить(ТекстМодуля, "<v8:lang>#</v8:lang>", "<v8:lang></v8:lang>");
	ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
	ТекстовыйДокумент.Записать(ИмяфайлаТабличногоДокумента);

	// ирПортативный.Модуль
	ИмяфайлаМодуля = КаталогВыгрузкиКонфигурации + "\DataProcessors\ирПортативный\Ext\ObjectModule.bsl";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяфайлаМодуля);
	ТекстМодуля = ТекстовыйДокумент.ПолучитьТекст();
	ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстМодуля, "#Область ОбработчикиИнициализацииФорм", "#КонецОбласти", Ложь, Истина);
	НаЧтоЗаменить = СгенерироватьМодульИнициализацииФормПодсистемыДляПортативногоРежима();
	ТекстМодуля = СтрЗаменить(ТекстМодуля, ЧтоЗаменить, НаЧтоЗаменить);
	ИмяфайлаГлобальногоМодуля = КаталогВыгрузкиКонфигурации + "\CommonModules\ирГлобальный\Ext\Module.bsl";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяфайлаГлобальногоМодуля);
	ТекстГлобальногоМодуля = ТекстовыйДокумент.ПолучитьТекст();
	ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстМодуля, "#Область ГлобальныеПортативныеМетоды", "#КонецОбласти", Ложь, Истина);
	НаЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстГлобальногоМодуля, "#Область ГлобальныеПортативныеМетоды", "#КонецОбласти", Ложь, Истина);
	ТекстМодуля = СтрЗаменить(ТекстМодуля, ЧтоЗаменить, НаЧтоЗаменить);
	ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстМодуля,  "мВерсия = ", ";", Ложь, Истина);
	НаЧтоЗаменить = "мВерсия = """ + СтрокаВерсии + """;";
	ТекстМодуля = СтрЗаменить(ТекстМодуля, ЧтоЗаменить, НаЧтоЗаменить);
	ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
	ТекстовыйДокумент.Записать(ИмяфайлаМодуля);
	УдалитьФайлы(ИмяфайлаГлобальногоМодуля);
	
	// ирПортативныйСервер
	ИмяфайлаМодуля = КаталогВыгрузкиКонфигурации + "\DataProcessors\ирПортативныйСервер\Ext\ObjectModule.bsl";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяфайлаМодуля);
	ТекстМодуля = ТекстовыйДокумент.ПолучитьТекст();
	ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстМодуля,  "(""Версия"",", ");", Ложь, Истина);
	НаЧтоЗаменить = "(""Версия"", """ + СтрокаВерсии + """);";
	ТекстМодуля = СтрЗаменить(ТекстМодуля, ЧтоЗаменить, НаЧтоЗаменить);
	ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
	ТекстовыйДокумент.Записать(ИмяфайлаМодуля);
	
	ПреобразоватьОбъектыМетаданныхПоТипу(КаталогВерсии, "CommonModule", "CommonModules", "epf", КаталогВыгрузкиКонфигурации, СтрокаСоединенияБазыПодсистемыЛ, "DataProcessor");
	ПреобразоватьОбъектыМетаданныхПоТипу(КаталогВерсии, "Report", "Reports", "erf", КаталогВыгрузкиКонфигурации, СтрокаСоединенияБазыПодсистемыЛ);
	ПреобразоватьОбъектыМетаданныхПоТипу(КаталогВерсии, "DataProcessor", "DataProcessors", "epf", КаталогВыгрузкиКонфигурации, СтрокаСоединенияБазыПодсистемыЛ);
	УдалитьФайлы(КаталогВыгрузкиКонфигурации);
	
КонецПроцедуры

Процедура ПреобразоватьОбъектыМетаданныхПоТипу(КаталогВерсии, Знач ИмяТипаЕдинственное, Знач ИмяТипаМножественное, Знач РасширениеФайла, Знач КаталогВыгрузкиКонфигурации,
	Знач СтрокаСоединенияБазыПодсистемыЛ, Знач ПреобразоватьВТип = "")
	
	ФайлыДляОбработки = НайтиФайлы(КаталогВыгрузкиКонфигурации + "\" + ИмяТипаМножественное, "*.xml");
	Если Не ЗначениеЗаполнено(ПреобразоватьВТип) Тогда
		ПреобразоватьВТип = ИмяТипаЕдинственное;
	КонецЕсли; 
	Успех = Истина;
	ИменаЛишнихСвойствОбщегоМодуля = Новый Массив;
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("Global");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("ClientManagedApplication");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("Server");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("ExternalConnection");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("ClientOrdinaryApplication");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("ServerCall");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("Privileged");
	ИменаЛишнихСвойствОбщегоМодуля.Добавить("ReturnValuesReuse");
	ТекстЛога = "";
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ФайлыДляОбработки.Количество(), ИмяТипаМножественное);
	Для Каждого Файл Из ФайлыДляОбработки Цикл
		#Если _ Тогда
			Файл = Новый Файл;
		#КонецЕсли
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		КаталогВыгрузкиВнешнейОбработки = ПолучитьИмяВременногоФайла();
		СоздатьКаталог(КаталогВыгрузкиВнешнейОбработки);
		ИмяОсновногоФайлаВнешнейОбработки = КаталогВыгрузкиВнешнейОбработки + "\" + Файл.Имя;
		ПодкаталогФайловВнешнейОбработки = КаталогВыгрузкиВнешнейОбработки + "\" + Файл.ИмяБезРасширения;
		СоздатьКаталог(ПодкаталогФайловВнешнейОбработки);
		ирОбщий.СкопироватьФайлыЛкс(Файл.Путь + "\" + Файл.ИмяБезРасширения, ПодкаталогФайловВнешнейОбработки);
		ФайлОбщегоМОдуля = Новый Файл(ПодкаталогФайловВнешнейОбработки + "\Ext\Module.bsl");
		Если ФайлОбщегоМОдуля.Существует() Тогда
			ПереместитьФайл(ФайлОбщегоМОдуля.ПолноеИмя, ПодкаталогФайловВнешнейОбработки + "\Ext\ObjectModule.bsl");
		КонецЕсли; 
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
		НовыйТекст = СтрЗаменить(ТекстовыйДокумент.ПолучитьТекст(), ИмяТипаЕдинственное, "External" + ПреобразоватьВТип);
		ЧтениеХмл = Новый ЧтениеXML;
		ПараметрыЧтения = Новый ПараметрыЧтенияXML(,,,,,,,, Ложь);
		ЧтениеХмл.УстановитьСтроку(НовыйТекст, ПараметрыЧтения);
		ПостроительDOM = Новый ПостроительDOM;
		ДокументДом = ПостроительDOM.Прочитать(ЧтениеХмл);
		ЧтениеХмл.Закрыть();
		КорневойУзел = ДокументДом.ПолучитьЭлементыПоИмени("External" + ПреобразоватьВТип);
		КорневойУзел = КорневойУзел[0];
		
		// Удаляем управляемые формы 
		УзлыДопФормы = КорневойУзел.ПолучитьЭлементыПоИмени("AuxiliaryForm");
		Для Каждого УзелДопФормы Из УзлыДопФормы Цикл
			Если Найти(УзелДопФормы.ТекстовоеСодержимое + "#", "Упр#") > 0 Тогда
				УзелДопФормы.РодительскийУзел.УдалитьДочерний(УзелДопФормы);
			КонецЕсли; 
		КонецЦикла; 
		УзлыФорм = КорневойУзел.ПолучитьЭлементыПоИмени("Form");
		Для Каждого УзелФормы Из УзлыФорм Цикл
			Если Найти(УзелФормы.ТекстовоеСодержимое + "#", "Упр#") > 0 Тогда
				УзелФормы.РодительскийУзел.УдалитьДочерний(УзелФормы);
			КонецЕсли; 
		КонецЦикла;
		
		// Удаляем свойства общего модуля
		Для Каждого ИмяУдаляемогоСвойства Из ИменаЛишнихСвойствОбщегоМодуля Цикл
			УзлыСвойства = КорневойУзел.ПолучитьЭлементыПоИмени(ИмяУдаляемогоСвойства);
			Для Каждого УзелСвойства Из УзлыСвойства Цикл
				УзелСвойства.РодительскийУзел.УдалитьДочерний(УзелСвойства);
			КонецЦикла;
		КонецЦикла;
		
		УзелВнутрИнфо = КорневойУзел.ПолучитьЭлементыПоИмени("InternalInfo");
		Если УзелВнутрИнфо.Количество() = 0 Тогда 
			УзелВнутрИнфо = ДокументДом.СоздатьЭлемент("InternalInfo");
			КорневойУзел.ВставитьПеред(УзелВнутрИнфо, КорневойУзел.ПервыйДочерний);
			УзелОбъекта = ДокументДом.СоздатьЭлемент("xr:ContainedObject");
			УзелКласса = ДокументДом.СоздатьЭлемент("xr:ClassId");
			УзелКласса.ТекстовоеСодержимое = "c3831ec8-d8d5-4f93-8a22-f9bfae07327f"; // внешняя обработка
			УзелОбъекта.ДобавитьДочерний(УзелКласса);
			УзелИД = ДокументДом.СоздатьЭлемент("xr:ObjectId");
			УзелИД.ТекстовоеСодержимое = "" + Новый УникальныйИдентификатор; 
			УзелОбъекта.ДобавитьДочерний(УзелИД);
			УзелВнутрИнфо.ДобавитьДочерний(УзелОбъекта);
		КонецЕсли; 
		УзелИдентификации = КорневойУзел.ПолучитьЭлементыПоИмени("ChildObjects");
		Если УзелИдентификации.Количество() = 0 Тогда 
			УзелИдентификации = ДокументДом.СоздатьЭлемент("ChildObjects");
			КорневойУзел.ДобавитьДочерний(УзелИдентификации);
		КонецЕсли; 
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.ОткрытьФайл(ИмяОсновногоФайлаВнешнейОбработки);
		ЗаписьДом = Новый ЗаписьDOM;
		ЗаписьДом.Записать(ДокументДом, ЗаписьXML); 
		ЗаписьXML.Закрыть();
		Если ирОбщий.СтрокиРавныЛкс(Файл.ИмяБезРасширения, "ирПортативный") Тогда
			КонечныйФайл = КаталогВерсии + "\";
		Иначе
			КонечныйФайл = КаталогВерсии + "\Модули\";
		КонецЕсли; 
		КонечныйФайл = КонечныйФайл + Файл.ИмяБезРасширения + "." + РасширениеФайла;
		Если Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяОсновногоФайлаВнешнейОбработки + """ """ + КонечныйФайл + """",
			СтрокаСоединенияБазыПодсистемыЛ, ТекстЛога) 
		Тогда 
			УдалитьФайлы(КаталогВыгрузкиВнешнейОбработки);
			УдалитьФайлы(КаталогВыгрузкиКонфигурации);
			Сообщить(ТекстЛога);
			Успех = Ложь;
			Прервать;
		КонецЕсли; 
		УдалитьФайлы(КаталогВыгрузкиВнешнейОбработки);
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();

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

Процедура ОсновныеДействияФормыВыполнить(Кнопка)

	Если ЭлементыФормы.Панель1.ТекущаяСтраница = ЭлементыФормы.Панель1.Страницы.Сборка Тогда
		Если СобратьРасширение Тогда
			СобратьРасширение()
		КонецЕсли;
		Если СобратьПортативный Тогда
			СобратьПортативный();
		КонецЕсли;
	Иначе
		Если ЗначениеЗаполнено(ФайлСпискаЗадачCSV) Тогда
			//Ответ = ирОбщий.ЗапроситьХТТПЛкс("https://www.hostedredmine.com/projects/devtool1c/issues.csv?query_id=10523"); // Нужна авторизация
			//ТекстСРазделителем = Ответ.ПолучитьТелоКакСтроку();
			
			ТекстСРазделителем = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ФайлСпискаЗадачCSV);
			СыраяТаблица = ирОбщий.ТаблицаИзТекстаСРазделителемЛкс(ТекстСРазделителем, ";",, Истина);
			СыраяТаблица.Колонки[0].Имя = "Номер";
			СыраяТаблица.Колонки.Веха.Имя = "ВерсияПодсистемы";
			СыраяТаблица.Колонки.Тема.Имя = "Заголовок";
			СыраяТаблица.Колонки.Трекер.Имя = "Тип";
			СыраяТаблица.Колонки.Добавить("ВерсияЧисло", Новый ОписаниеТипов("Число"));
			Для Каждого СыраяЭлемент Из СыраяТаблица Цикл
				СыраяЭлемент.Обновлено = ирОбщий.СтрокаВДатуЛкс(СыраяЭлемент.Обновлено);
				ВерсияПодсистемы = СыраяЭлемент.ВерсияПодсистемы;
				Если СтрЧислоВхождений(ВерсияПодсистемы, ".") = 1 Тогда
					ВерсияПодсистемы = ВерсияПодсистемы + ".1";
				КонецЕсли;
				Попытка
					ВерсияЧисло = Число(СтрЗаменить(ВерсияПодсистемы, ".", ""));
				Исключение
					Продолжить;
				КонецПопытки;
				СыраяЭлемент.ВерсияЧисло = ВерсияЧисло;
			КонецЦикла;
			ФайлСпискаЗадачГотовый = Каталог + "\СписокЗадач.zip";
			ирОбщий.СохранитьЗначениеВФайлЛкс(СыраяТаблица, ФайлСпискаЗадачГотовый, Истина,, "Внутр");
			ирОбщий.СообщитьЛкс(ФайлСпискаЗадачГотовый); 
		КонецЕсли;
		Публиковать();  
	КонецЕсли;
	
КонецПроцедуры

Процедура Публиковать() Экспорт
	ВариантыПоставки = ирОбщий.ВариантыПоставкиПодсистемыЛкс();
	Для Каждого КлючИЗначение Из ВариантыПоставки Цикл
		НазваниеВарианта = КлючИЗначение.Ключ;
		СсылкаНаСтраницуСкачивания = "";
		ВерсияВарианта = ирОбщий.АктуальнаяВерсияПодсистемыЛкс(НазваниеВарианта, СсылкаНаСтраницуСкачивания);
		Если Не ирОбщий.СтрНачинаетсяСЛкс(ВерсияВарианта, АктуальнаяВерсия) Тогда
			Продолжить;
		КонецЕсли;
		ДвоичныеДанные = ирОбщий.СкачатьФайлАктуальнойВерсииПодсистемыЛкс(СсылкаНаСтраницуСкачивания);
		Файл = Новый Файл(КаталогВременныхФайлов() + "ir-" + ВерсияВарианта + "." + КлючИЗначение.Значение);
		ДвоичныеДанные.Записать(Файл.ПолноеИмя);
		Соединение = Новый HTTPСоединение("api.github.com", 443,, ,, 3, новый ЗащищенноеСоединениеOpenSSL);
		Заголовки = Новый Соответствие;
		Заголовки.Вставить("Authorization", "Bearer " + Токен);     
		Заголовки.Вставить("User-Agent", "1C_Release_Uploader");
		Заголовки.Вставить("Accept", "application/vnd.github.v3+json");
		ДанныеРелиза = Новый Соответствие;
		ДанныеРелиза.Вставить("tag_name", АктуальнаяВерсия);
		ДанныеРелиза.Вставить("name", АктуальнаяВерсия); //представление релиза
		//ДанныеРелиза.Вставить("body", "Описание релиза");
		АдресРелизовПроекта = "/repos/" + Автор + "/" + Репозиторий + "/releases";
		ХТТПЗапрос = Новый HTTPЗапрос(АдресРелизовПроекта, Заголовки);
		ХТТПЗапрос.УстановитьТелоИзСтроки(ирОбщий.ОбъектВТекстЖСОНЛкс(ДанныеРелиза),, ИспользованиеByteOrderMark.НеИспользовать);
		Ответ = Соединение.ОтправитьДляОбработки(ХТТПЗапрос);
		Если Ответ.КодСостояния = 422 Тогда
			// Релиз уже существует
			ХТТПЗапрос = Новый HTTPЗапрос(АдресРелизовПроекта + "/tags/" + АктуальнаяВерсия, Заголовки);
			Ответ = Соединение.Получить(ХТТПЗапрос);
			Если Ответ.КодСостояния <> 200 Тогда
				ВызватьИсключение "Ошибка получения адреса загрузки в существующий релиз: " + Ответ.ПолучитьТелоКакСтроку();
			КонецЕсли;
		ИначеЕсли Ответ.КодСостояния <> 201 Тогда
			ВызватьИсключение "Ошибка создания релиза: " + Ответ.ПолучитьТелоКакСтроку();
		КонецЕсли;
		ОтветРелизаСтрока = Ответ.ПолучитьТелоКакСтроку();
		ОтветРелизаОбъект = ирОбщий.ОбъектИзТекстаЖСОНЛкс(ОтветРелизаСтрока);
		АдресЗагрузкиФайла = ирОбщий.ПервыйФрагментЛкс(ирОбщий.СтруктураURIЛкс(ОтветРелизаОбъект["upload_url"]).ПутьНаСервере, "{?");
		ИмяФайлаДляСервера = ирОбщий.ТранслитероватьТекстЛкс(Файл.Имя);
		РанееЗагруженныйФайл = ирОбщий.НайтиЭлементКоллекцииЛкс(ОтветРелизаОбъект.assets, "name", ИмяФайлаДляСервера);
		Если РанееЗагруженныйФайл <> Неопределено Тогда 
			// Файл уже существует. Удалим его.
			ХТТПЗапрос = Новый HTTPЗапрос(АдресРелизовПроекта + "/assets/" + XMLСтрока(РанееЗагруженныйФайл.id), Заголовки);
			ОтветУдаления = Соединение.Удалить(ХТТПЗапрос);
		КонецЕсли;
		АдресЗагрузкиФайла = АдресЗагрузкиФайла + "?name=" + ИмяФайлаДляСервера;
		ФайлДанные = Новый ДвоичныеДанные(Файл.ПолноеИмя);
		СоединениеЗагрузки = Новый HTTPСоединение("uploads.github.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
		ХТТПЗапрос = Новый HTTPЗапрос(АдресЗагрузкиФайла, Заголовки);
		ХТТПЗапрос.УстановитьТелоИзДвоичныхДанных(ФайлДанные);
		ОтветЗагрузка = СоединениеЗагрузки.ОтправитьДляОбработки(ХТТПЗапрос);
		Если ОтветЗагрузка.КодСостояния <> 201 Тогда
			ВызватьИсключение "Ошибка загрузки файла : " + ОтветЗагрузка.КодСостояния + " " + ОтветЗагрузка.ПолучитьТелоКакСтроку();
		Иначе
			Сообщить("Файл """ + файл.Имя + """ опубликован");
			УдалитьФайлы(Файл.ПолноеИмя);
		КонецЕсли;
	КонецЦикла;

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

Функция СобратьРасширение() Экспорт
	// Если указать ИсполняемыйФайлПлатформы, то будет ошибка при загрузке расширения из файлов
	// Неизвестная версия формата 2.6 загружаемого файла
	ЭтаФорма.ИсполняемыйФайлПлатформы = "";
	КаталогВыгрузкиКонфигурации = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(КаталогВыгрузкиКонфигурации);
	ТекстЛога = "";
	// Выгружаем конфигурацию в файлы
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиКонфигурации + """ -Format Hierarchical", СтрокаСоединенияИнформационнойБазы(), ТекстЛога,,
			"Выгрузка конфигурации в файлы",,,, ИмяПользователя, ПарольПользователя,,,,,, Истина);
	Если Не Успех Тогда
		УдалитьФайлы(КаталогВыгрузкиКонфигурации);
		Сообщить(ТекстЛога);
		Возврат Ложь;
	КонецЕсли;
	//КаталогВыгрузкиКонфигурации = "Z:\Ир"; // Для отладки
	Результат = СоздатьРасширение("e", КаталогВыгрузкиКонфигурации);
	УдалитьФайлы(КаталогВыгрузкиКонфигурации);
	Сообщить(Результат);
	//Предупреждение("Не забудь вручную убрать флажок ""Проверять значения языка"" у расширения!");
	Возврат Истина;
КонецФункции

Функция СоздатьРасширение(Знач СуффиксВерсии, Знач КаталогВыгрузкиКонфигурации)
	
	ВерсияРасширения = НомерВерсии + СуффиксВерсии;
	
	ИмяРасширения = "Расширение1";
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("cfe");
	ПолучитьОбщийМакет("ирШаблонРасширения").Записать(ИмяВременногоФайла);
	ТекстЛога = "";
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadCfg """ + ИмяВременногоФайла + """ -Extension """ + ИмяРасширения + """", , ТекстЛога,,, Истина, ИсполняемыйФайлПлатформы);
	Если Не Успех Тогда 
		УдалитьФайлы(ИмяВременногоФайла);
		Сообщить(ТекстЛога);
		Возврат Неопределено;
	КонецЕсли;
	УдалитьФайлы(ИмяВременногоФайла);
	
	ТекстЛога = "";
	КаталогВыгрузкиРасширения = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(КаталогВыгрузкиРасширения);
	// Выгрузка расширения в файлы
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога,,
		"Выгрузка расширения в файлы",, ИсполняемыйФайлПлатформы);
	Если Не Успех Тогда 
		УдалитьФайлы(КаталогВыгрузкиРасширения);
		Сообщить(ТекстЛога);
		Возврат Неопределено;
	КонецЕсли;
	
	//Предупреждение(1);
	мРегВыражение = ирКэш.РегВыражениеЛкс();
	мРегВыражение.Global = Истина;
	
	// Скопируем все папки кроме Catalogs и Ext и файла ConfigDumpInfo.xml
	Файлы = НайтиФайлы(КаталогВыгрузкиКонфигурации, "*");
	Для Каждого Файл Из Файлы Цикл
		Если Ложь
			Или Файл.Имя = "Catalogs"
			Или Файл.Имя = "Ext"
			Или Не Файл.ЭтоКаталог()
		Тогда
			Продолжить;
		КонецЕсли; 
		ФайлПриемник = Новый Файл(КаталогВыгрузкиРасширения + "\" + Файл.Имя); 
		Если Не ФайлПриемник.Существует() Тогда
			СоздатьКаталог(ФайлПриемник.ПолноеИмя);
		КонецЕсли; 
		ирОбщий.СкопироватьФайлыЛкс(КаталогВыгрузкиКонфигурации + "\" + Файл.Имя, КаталогВыгрузкиРасширения + "\" + Файл.Имя);
	КонецЦикла;
	
	// Во всех CommonCommands удалить <CommandParameterType>...</CommandParameterType>
	Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\CommonCommands", "*.xml");
	Для Каждого Файл Из Файлы Цикл
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
		ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
		ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайла, "<CommandParameterType>", "</CommandParameterType>", Ложь, Истина);
		ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
		ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
		ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
	КонецЦикла;
	
	// Очищаем ссылки в подсистемах
	Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\SubSystems", "*.xml", Истина);
	Для Каждого Файл Из Файлы Цикл
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
		ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
		//ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">CommonCommand.ирОткрытьНастройкиАлгоритмов</xr:Item>", "");
		Пока Истина Цикл
			ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Catalog.", "</xr:Item>", Ложь, Истина);
			Если Не ЗначениеЗаполнено(ЧтоЗаменить) Тогда
				Прервать;
			КонецЕсли; 
			ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
		КонецЦикла; 
		Пока Истина Цикл
			ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайла, "<Command name=""Catalog.", "</Command>", Ложь, Истина);
			Если Не ЗначениеЗаполнено(ЧтоЗаменить) Тогда
				Прервать;
			КонецЕсли; 
			ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
		КонецЦикла; 
		ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
		ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
	КонецЦикла;
	
	// Очищаем ссылки в ролях
	Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\Roles", "*.xml", Истина);
	Для Каждого Файл Из Файлы Цикл
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
		ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
		Пока Истина Цикл
			ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайла, 
			"	<object>
			|		<name>Catalog.", "</object>", Ложь, Истина);
			Если Не ЗначениеЗаполнено(ЧтоЗаменить) Тогда
				Прервать;
			КонецЕсли; 
			ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
		КонецЦикла; 
		ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
		ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
	КонецЦикла;
	
	// У общего модуля ирГлобальный убираем флажок Сервер, т.к. в расширении такие общие модули недопустимы
	ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирГлобальный.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяФайла);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "<Server>true</Server>", "<Server>false</Server>");
	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ИмяФайла);
	
	// У подсистемы ИнструментыРазработчикаTormozit обновим версию
	ИмяФайла = КаталогВыгрузкиРасширения + "\SubSystems\ИнструментыРазработчикаTormozit.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяФайла);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	мРегВыражение.Pattern = "(<Comment)>(\S)+?(</Comment>)";
	ТекстФайла = мРегВыражение.Заменить(ТекстФайла, "$1>" + ВерсияРасширения + "$3"); // После номера группы обязательно делать не цифру
	мРегВыражение.Pattern = "(<v8:content>Инструменты разработчика\s*) (\S)+?(\s*</v8:content>)";
	ТекстФайла = мРегВыражение.Заменить(ТекстФайла, "$1 " + ВерсияРасширения + "$3"); // После номера группы обязательно делать не цифру. Замена делается для каждого языка
	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ИмяФайла);
	
	ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирИнтерфейсДляВстраивания\Ext\Module.bsl";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяФайла);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "// Версия модуля X.XX", "// Версия модуля " + НомерВерсии);
	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ИмяФайла);
	
	ИмяФайла = КаталогВыгрузкиРасширения + "\Languages\Русский.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяФайла);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "<Name>Русский</Name>", "<Name>Русский</Name><ObjectBelonging>Adopted</ObjectBelonging>");
	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ИмяФайла);
	
	ИмяФайла = КаталогВыгрузкиРасширения + "\Subsystems\ИнструментыРазработчикаTormozit.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяФайла);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Style.ирОсновной</xr:Item>", "");
	ТекстФайла = ирОбщий.СтрЗаменитьЛкс(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Interface.ирРазработчик</xr:Item>", "");
	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ИмяФайла);
	
	// Заменим элемент <ChildObjects> в файле Configuration.xml
	ФайлКонфигурацииИсточника = КаталогВыгрузкиКонфигурации + "\Configuration.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ФайлКонфигурацииИсточника);
	ТекстФайлаИсточника = ТекстовыйДокумент.ПолучитьТекст();
	ФайлКонфигурацииПриемника = КаталогВыгрузкиРасширения + "\Configuration.xml";
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ФайлКонфигурацииПриемника);
	ТекстФайлаПриемника = ТекстовыйДокумент.ПолучитьТекст();
	ЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайлаПриемника, "<ChildObjects>", "</ChildObjects>", Ложь, Истина);
	НаЧтоЗаменить = ирОбщий.ТекстМеждуМаркерамиЛкс(ТекстФайлаИсточника, "<ChildObjects>", "</ChildObjects>", Ложь, Истина);
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, ЧтоЗаменить, НаЧтоЗаменить);
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Version>4.00</Version>", "<Version>" + ВерсияРасширения + "</Version>");
	Если БезРусскогоЯзыка Тогда
		ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Language>Русский</Language>", "");
	КонецЕсли;
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Language>Английский</Language>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Language>Украинский</Language>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Interface>ирРазработчик</Interface>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Style>ирОсновной</Style>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Catalog>ирАлгоритмы</Catalog>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Catalog>ирКомандаРедактироватьОбъект</Catalog>", "");
	ТекстФайлаПриемника = ирОбщий.СтрЗаменитьЛкс(ТекстФайлаПриемника, "<Catalog>ирОбъектыДляОтладки</Catalog>", "");
	ТекстовыйДокумент.УстановитьТекст(ТекстФайлаПриемника);
	ТекстовыйДокумент.Записать(ФайлКонфигурацииПриемника);
	
	// Загрузка расширения из файлов
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога,,
		"Загрузка расширения из файлов",, ИсполняемыйФайлПлатформы);
	УдалитьФайлы(КаталогВыгрузкиРасширения); // Закомментировано для отладки
	Если Не Успех Тогда 
		Сообщить(ТекстЛога);
		Возврат Неопределено;
	КонецЕсли;
	
	//// Выгружаем расширение в файлы
	//Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
	//Если Не Успех Тогда 
	//	УдалитьФайлы(КаталогВыгрузкиРасширения);
	//	Сообщить(ТекстЛога);
	//	Возврат;
	//КонецЕсли;
	//ФайлКонфигурацииИсточника = КаталогВыгрузкиРасширения + "\Configuration.xml";
	//ТекстовыйДокумент = Новый ТекстовыйДокумент;
	//ТекстовыйДокумент.Прочитать(ФайлКонфигурацииИсточника);
	//ТекстФайлаИсточника = ТекстовыйДокумент.ПолучитьТекст();
	//Предупреждение(1);
	//ТекстФайлаИсточника = СтрЗаменить(ТекстФайлаИсточника, "<DefaultLanguage>Language.ирРусский</DefaultLanguage>", ""); // На первом проходе в 8.3.10 невозможно сделать
	//ТекстовыйДокумент.УстановитьТекст(ТекстФайлаИсточника);
	//ТекстовыйДокумент.Записать(ФайлКонфигурацииИсточника);
	//
	//// Загружаем расширение из файлов
	//Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
	//Если Не Успех Тогда 
	//	УдалитьФайлы(КаталогВыгрузкиРасширения);
	//	Сообщить(ТекстЛога);
	//	Возврат;
	//КонецЕсли;
	
	// Выгружаем расширение 
	КонечныйФайл = Каталог + "\Расширение\ИР " + ВерсияРасширения + ".cfe";
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpCfg """ + КонечныйФайл + """ -Extension """ + ИмяРасширения + """", , ТекстЛога,,,, ИсполняемыйФайлПлатформы);
	Если Не Успех Тогда 
		Сообщить(ТекстЛога);
		Возврат Неопределено;
	КонецЕсли;

	Если ирКэш.НомерВерсииПлатформыЛкс() < 803013 Тогда
		// https://partners.v8.1c.ru/forum/t/1713417/m/1713417
		Сообщить("Выполните изменение свойства ""Режим совместимости"" расширения, оставив его выключенным");
		ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("",,,,,,, Ложь);
	КонецЕсли;
	Возврат КонечныйФайл;

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

Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ПолеФайловогоКаталога_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
КонецПроцедуры

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирОбщий.ЗаполнитьСписокАдминистраторовБазыЛкс(ЭлементыФормы.ИмяПользователя.СписокВыбора);
	ЭтаФорма.ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
	ЭтаФорма.НомерВерсии = Метаданные.Подсистемы.ИнструментыРазработчикаTormozit.Комментарий;
	
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	
	Если ирКэш.НомерВерсииПлатформыЛкс() < 803010 Тогда
		Сообщить("Поддерживается только платформа 8.3.10 и выше");
		Отказ = Истина;
	КонецЕсли; 
	
КонецПроцедуры

Процедура ИсполняемыйФайлПлатформыНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	РезультатВыбора = ирКлиент.ВыбратьФайлЛкс(, "exe",, Элемент.Значение);
	Если ЗначениеЗаполнено(РезультатВыбора) Тогда
		Элемент.Значение = РезультатВыбора;
	КонецЕсли;  
	
КонецПроцедуры

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
КонецПроцедуры

Процедура Панель1ПриСменеСтраницы(Элемент, ТекущаяСтраница)
	Если Элемент.ТекущаяСтраница = Элемент.Страницы.Публикация Тогда
		ЭтаФорма.АктуальнаяВерсия = ирОбщий.СтрокаБезКонцаЛкс(ирОбщий.АктуальнаяВерсияПодсистемыЛкс("Расширение"));
	КонецЕсли;
КонецПроцедуры

Процедура ОсновныеДействияФормыОбновитьЯзыкиМакетов(Кнопка)
	Ответ = Вопрос("Скопировать русский язык табличных документов конфигурации во все языки? Потребуется модификация конфигурации.", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	ОбъектыПодсистемы = Метаданные.Подсистемы.ИнструментыРазработчикаTormozit.Состав;
	ИсправленныеМакеты = Новый Массив;
	Для Каждого ОбъектМД Из Метаданные.Обработки Цикл
		Если ОбъектыПодсистемы.Содержит(ОбъектМД) Тогда
			ОбработатьМакетыОбъектаМД(ИсправленныеМакеты, ОбъектМД);
		КонецЕсли;
	КонецЦикла;
	Для Каждого ОбъектМД Из Метаданные.Отчеты Цикл
		Если ОбъектыПодсистемы.Содержит(ОбъектМД) Тогда
			ОбработатьМакетыОбъектаМД(ИсправленныеМакеты, ОбъектМД);
		КонецЕсли;
	КонецЦикла;
	Если ИсправленныеМакеты.Количество() = 0 Тогда
		Сообщить("Все языки в табличных документах совпадают. Обновление не требуется.");
		Возврат;
	КонецЕсли;
	ТекстСпискаОбъектовКонфигурации = "";
	Для Каждого ИсправленныйМакет Из ИсправленныеМакеты Цикл
		ТекстСпискаОбъектовКонфигурации = ТекстСпискаОбъектовКонфигурации + ИсправленныйМакет.ПолноеИмя + Символы.ПС;
	КонецЦикла; 
	КаталогВыгрузкиКонфигурации = ПолучитьИмяВременногоФайла();
	Успех = ирОбщий.ВыгрузитьОбъектыМетаданныхЛкс(ТекстСпискаОбъектовКонфигурации, КаталогВыгрузкиКонфигурации);
	Если Не Успех Тогда
		УдалитьФайлы(КаталогВыгрузкиКонфигурации);
		Возврат;
	КонецЕсли; 
	РасширениеФайла = "Template.xml";
	Для Каждого ИсправленныйМакет Из ИсправленныеМакеты Цикл
		НайденныеФайлы = НайтиФайлы(КаталогВыгрузкиКонфигурации, "*." + Метаданные.НайтиПоПолномуИмени(ИсправленныйМакет.ПолноеИмя).Родитель().Имя + ".*." + РасширениеФайла);
		Если НайденныеФайлы.Количество() > 1 Тогда
			ВызватьИсключение "Найдено более 1 файла для макета " + ИсправленныйМакет.ПолноеИмя;
		ИначеЕсли НайденныеФайлы.Количество() = 0 Тогда
			ВызватьИсключение "Не найдено файлов для макета " + ИсправленныйМакет.ПолноеИмя;
		КонецЕсли; 
		Макет = ПолучитьИзВременногоХранилища(ИсправленныйМакет.Макет);
		ФайлМакета = НайденныеФайлы[0];
		ЗаписьXMl = Новый ЗаписьXMl;
		ЗаписьXMl.ОткрытьФайл(ФайлМакета.ПолноеИмя);
		СериализаторXDTO.ЗаписатьXML(ЗаписьXMl, Макет);
		ЗаписьXMl.Закрыть();
	КонецЦикла;
	//Предупреждение("Для отладки");
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ФайлыДляЗагрузки = НайтиФайлы(КаталогВыгрузкиКонфигурации, "*.xml");
	ТекстовыйДокумент.Очистить();
	Для Каждого Файл Из ФайлыДляЗагрузки Цикл
		ТекстовыйДокумент.ДобавитьСтроку(Файл.ПолноеИмя);
	КонецЦикла;
	ИмяФайлаСпискаФайлов = ПолучитьИмяВременногоФайла("txt");
	ТекстовыйДокумент.Записать(ИмяФайлаСпискаФайлов);
	ТекстЛога = "";
	Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиКонфигурации + """ -listFile """ + ИмяФайлаСпискаФайлов + """ -Format Plain", 
		СтрокаСоединенияИнформационнойБазы(), ТекстЛога,, "Загрузка конфигурации из файлов");
	УдалитьФайлы(ИмяФайлаСпискаФайлов);
	УдалитьФайлы(КаталогВыгрузкиКонфигурации);
	Если Не Успех Тогда 
		Сообщить(ТекстЛога);
	Иначе
		Сообщить("Языки в табличных документах обновлены. Теперь выполните обновление конфигурации БД.");
	КонецЕсли;
КонецПроцедуры

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

Функция ПроверитьМакет(Знач ОбъектМД, Знач ИмяМакета)
	НеПереводимыеКолонки = Неопределено; 
	ПереводимыеКолонки = Новый Массив;
	ТабличныйДок = Новый ТабличныйДокумент;
	Менеджер = ирОбщий.ПолучитьМенеджерЛкс(ОбъектМД.ПолноеИмя());
	МакетРус = Менеджер.ПолучитьМакет(ИмяМакета);
	Если ТипЗнч(МакетРус) <> Тип("ТабличныйДокумент") Тогда
		Возврат Неопределено;
	КонецЕсли;
	МакетЯзыка = Менеджер.ПолучитьМакет(ИмяМакета);
	ЕстьРазличия = Ложь;
	ЗаполнитьНеПереводимыеКолонки(МакетРус, НеПереводимыеКолонки, ПереводимыеКолонки);
	ПроверитьСтрокуТабличногоДокумента(ЕстьРазличия, МакетРус, МакетЯзыка, НеПереводимыеКолонки, ОбъектМД, 1);
	Для СчСтрок = 2 По МакетРус.ВысотаТаблицы Цикл
		ТекстЯчейки = МакетРус.Область(СчСтрок, 1).Текст;
		Если ирОбщий.СтрНачинаетсяСЛкс(ТекстЯчейки, "<") Тогда
			Если ТекстЯчейки = "<Перевод>" Тогда
				Для НомерКолонки = 2 По МакетРус.ШиринаТаблицы Цикл 
					Если ирОбщий.СтрокиРавныЛкс(МакетРус.Область(СчСтрок, НомерКолонки).Текст, "да") Тогда 
						ПереводимыеКолонки.Добавить(НомерКолонки);
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			ПроверитьСтрокуТабличногоДокумента(ЕстьРазличия, МакетРус, МакетЯзыка, НеПереводимыеКолонки, ОбъектМД, СчСтрок);
			НеПереводимыеКолонки = Неопределено;
			Продолжить;
		КонецЕсли;
		Если НеПереводимыеКолонки = Неопределено Тогда
			ЗаполнитьНеПереводимыеКолонки(МакетРус, НеПереводимыеКолонки, ПереводимыеКолонки);
		КонецЕсли;
		ПроверитьСтрокуТабличногоДокумента(ЕстьРазличия, МакетРус, МакетЯзыка, НеПереводимыеКолонки, ОбъектМД, СчСтрок);
	КонецЦикла;
	Если Не ЕстьРазличия Тогда
		МакетЯзыка = Неопределено;
	КонецЕсли; 
	Возврат МакетЯзыка;
КонецФункции 

Процедура ЗаполнитьНеПереводимыеКолонки(Знач МакетРус, НеПереводимыеКолонки, Знач ПереводимыеКолонки)
	НеПереводимыеКолонки = Новый Массив; 
	Для НомерКолонки = 1 По МакетРус.ШиринаТаблицы Цикл 
		Если ПереводимыеКолонки.Найти(НомерКолонки) = Неопределено Тогда 
			НеПереводимыеКолонки.Добавить(НомерКолонки);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Процедура ПроверитьСтрокуТабличногоДокумента(ЕстьРазличия, Знач МакетРус, Знач МакетЯзыка, Знач НеПереводимыеКолонки = Неопределено, Знач ОбъектМД, СчСтрок)
	
	КодыЯзыков = Новый Массив;
	КодыЯзыков.Добавить("en");
	КодыЯзыков.Добавить("uk");
	СтрокаРус = МакетРус.ПолучитьОбласть("R" + XMLСтрока(СчСтрок));
	Для Каждого КодЯзыка Из КодыЯзыков Цикл
		МакетЯзыка.КодЯзыкаМакета = КодЯзыка;
		СтрокаЯзыка = МакетЯзыка.ПолучитьОбласть("R" + XMLСтрока(СчСтрок));
		Если НеПереводимыеКолонки = Неопределено Тогда
			НеПереводимыеКолонки = Новый Массив;
			Для Счетчик = 1 По МакетРус.ШиринаТаблицы Цикл
				НеПереводимыеКолонки.Добавить(Счетчик);
			КонецЦикла;
		КонецЕсли;
		Для Каждого НомерКолонки Из НеПереводимыеКолонки Цикл 
			ТекстРус = СтрокаРус.Область("R1C" + XMLСтрока(НомерКолонки)).Текст;
			ОбластьЯзыка = МакетЯзыка.Область(СчСтрок, НомерКолонки);
			Если Ложь
				Или ТипЗнч(ОбластьЯзыка) = Тип("РисунокТабличногоДокумента") 
				Или ОбластьЯзыка.СодержитЗначение
			Тогда
				Продолжить;
			КонецЕсли;
			Если ОбластьЯзыка.Текст <> ТекстРус Тогда 
				ОбластьЯзыка.Текст = ТекстРус;
				//СтрокаРус.Область(1, НомерКолонки).ЦветТекста = Новый Цвет(255, 0, 0);
				//СтрокаЯзыка.Область(1, НомерКолонки).ЦветТекста = Новый Цвет(255, 0, 0);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	МакетЯзыка.КодЯзыкаМакета = Неопределено;
КонецПроцедуры

Процедура ФайлСпискаЗадачCSVНачалоВыбора(Элемент, СтандартнаяОбработка)
	РезультатВыбора = ирКлиент.ВыбратьФайлЛкс(, "csv", "", Элемент.Значение, Каталог, , Заголовок);
	Если РезультатВыбора <> Неопределено Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(Элемент, РезультатВыбора);
	КонецЕсли; 
КонецПроцедуры

Процедура ФайлСпискаЗадачCSVНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

Процедура ФайлСпискаЗадачCSVПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирПлатформа.Форма.ВыпускСборка");
