Перем ирПлатформа;
// Параметры:
// КаталогРаспаковки - Строка(0,П)
//
Функция ПолучитьФайлСтруктурыХранилищаОбъектаМетаданных(Знач КаталогРаспаковки = "") Экспорт
RegExp = ирПлатформа.RegExp;
RegExp.Global = Ложь;
RegExp.Pattern = "{2,(" + ирПлатформа.шGUID + "),";
ФайлКорневогоУказателя = Новый Файл(КаталогРаспаковки + "root.data.und");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлКорневогоУказателя.ПолноеИмя);
РезультатыПоиска = RegExp.Execute(ТекстовыйДокумент.ПолучитьТекст());
КорневойИД = РезультатыПоиска.Item(0).Submatches(0);
ФайлСтруктуры = Новый Файл(КаталогРаспаковки + КорневойИД + ".data.und");
Результат = ФайлСтруктуры;
Возврат Результат;
КонецФункции
// Параметры:
// ПолноеИмяФайлаВнешнейОбработки - Строка(0,П)
// ИмяФормы - Строка(0,П) - Если не указана, используется Основая форма, а если основная форма не указана, используется единственная форма. Для быстрого выполнения нужно указывать.
// МассивДобавляемыхРеквизитов - Массив - !Проверка уникальности не выполняется. Ее нужно делать снаружи
// СтарыйТекстМодуля - Строка(0,П)
//
Функция ПроверитьОбновитьМодульИРеквизитыФормыВФайле(Знач ПолноеИмяФайлаВнешнейОбработки = "", Знач ИмяФормы = "", Знач МассивДобавляемыхРеквизитов, НовыйТекстМодуля,
СтарыйТекстМодуля = "") Экспорт
ФайлВнешнейОбработки = Новый Файл(ПолноеИмяФайлаВнешнейОбработки);
Если Не ЗначениеЗаполнено(ИмяФормы) Тогда
ВнешнийОбъект = ВнешниеОбработки.Создать(ФайлВнешнейОбработки.ПолноеИмя);
ОбъектМетаданных = ВнешнийОбъект.Метаданные();
Если ОбъектМетаданных.ОсновнаяФорма <> Неопределено Тогда
ИмяФормы = ОбъектМетаданных.ОсновнаяФорма.Имя;
ИначеЕсли ОбъектМетаданных.Формы.Количество() = 1 Тогда
ИмяФормы = ОбъектМетаданных.Формы[0].Имя;
Иначе
ВызватьИсключение "Невозможно определить форму внешней обработки для обновления";
КонецЕсли;
КонецЕсли;
ИмяКаталогаСборки = "Rebuild";
ИмяКаталогаРаспаковки = ФайлВнешнейОбработки.Путь + ИмяКаталогаСборки;
КаталогРаспаковки = ИмяКаталогаРаспаковки + "\";
УдалитьФайлы(ИмяКаталогаРаспаковки, "*.*");
СоздатьКаталог(ИмяКаталогаРаспаковки);
ирПлатформа.РаспаковатьФайлВнешнейОбработки(ФайлВнешнейОбработки.ПолноеИмя, КаталогРаспаковки);
БылаМодификация = Ложь;
RegExp = ирПлатформа.RegExp;
// Получаем модуль формы и изменяем его, если не соответствует стандарту
//ФайлСпискаФорм = Новый файл(КаталогРаспаковки + "copyinfo.data.und");
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ФайлСпискаФорм.ПолноеИмя);
//RegExp.Global = Ложь;
//RegExp.Pattern = "(" + ирПлатформа.шGUID + "),1,\n\{d5b0e5ed-256d-401c-9c36-f630cafd8a62,""" + ИмяФормы + """";
//РезультатыПоиска = RegExp.Execute(ТекстовыйДокумент.ПолучитьТекст());
//СтарыеТекстыМодулейФорм = Новый Структура;
//ИДФормы = РезультатыПоиска.Item(0).Submatches(0);
ФайлСтруктуры = ПолучитьФайлСтруктурыХранилищаОбъектаМетаданных(КаталогРаспаковки);
ТекстСтруктуры = Новый ТекстовыйДокумент;
ТекстСтруктуры.Прочитать(ФайлСтруктуры.ПолноеИмя);
RegExp.Global = Ложь;
RegExp.Pattern = "\{d5b0e5ed-256d-401c-9c36-f630cafd8a62,\d+((?:," + ирПлатформа.шGUID + ")*)\}";
РезультатыПоиска = RegExp.Execute(ТекстСтруктуры.ПолучитьТекст());
ТекстСпискаИД = РезультатыПоиска.Item(0).Submatches(0);
RegExp.Global = Истина;
RegExp.Pattern = ирПлатформа.шGUID;
РезультатыПоиска = RegExp.Execute(ТекстСпискаИД);
Для Каждого Вхождение Из РезультатыПоиска Цикл
ТекстФайлаФормы = Новый ТекстовыйДокумент;
ТекстФайлаФормы.Прочитать(КаталогРаспаковки + Вхождение.Value + ".data.und");
//RegExp.Global = Ложь;
//RegExp.Pattern = Вхождение.Value + "\},""(" + ирПлатформа.шИмя + ")"";
//РезультатыПоиска2 = RegExp.Execute(ТекстФайлаФормы.ПолучитьТекст());
Маркер = Вхождение.Value + "},""" + ИмяФормы + """";
Если Найти(НРег(ТекстФайлаФормы.ПолучитьТекст()), Нрег(Маркер)) > 0 Тогда
ИДФормы = Вхождение.Value;
Прервать;
КонецЕсли;
КонецЦикла;
Если ИДФормы = Неопределено Тогда
ВызватьИсключение "Не удалось определить внутренний идентификатор формы """ + ИмяФормы + """";
КонецЕсли;
ФайлМодуляФормы = Новый Файл(КаталогРаспаковки + ИДФормы + ".0.data.und.unp\" + "module.data");
СтарыйТекстМодуляФормы = Неопределено;
Результат = Ложь;
ТекстДляПроверки = Новый ТекстовыйДокумент;
ТекстДляПроверки.Прочитать(ФайлМодуляФормы.ПолноеИмя);
ТекстОбразец = Новый ТекстовыйДокумент;
ТекстОбразец.УстановитьТекст(НовыйТекстМодуля);
СтарыйТекстМодуля = ТекстДляПроверки.ПолучитьТекст();
Если ТекстОбразец.ПолучитьТекст() <> СтарыйТекстМодуля Тогда
ТекстОбразец.Записать(ФайлМодуляФормы.ПолноеИмя);
Результат = Истина;
КонецЕсли;
Если Истина
И МассивДобавляемыхРеквизитов <> Неопределено
И МассивДобавляемыхРеквизитов.Количество() > 0
Тогда
ФайлДиалогаФормы = Новый Файл(ФайлМодуляФормы.Путь + "form.data");
ТекстДиалога = Новый ТекстовыйДокумент;
ТекстДиалога.Прочитать(ФайлДиалогаФормы.ПолноеИмя);
КоличествоНовыхРеквизитов = МассивДобавляемыхРеквизитов.Количество();
ОстатокТекста0 = ТекстДиалога.ПолучитьТекст();
RegExp.Global = Ложь;
RegExp.Pattern = "},\d+,\d+,\d+,0,\d+,4,4,\d+},";
Вхождения = RegExp.Execute(ОстатокТекста0);
Если Вхождения.Count = 0 Тогда
Сообщить("При анализе диалога не найден маркер1");
Возврат Неопределено;
ИначеЕсли Вхождения.Count > 1 Тогда
Сообщить("При анализе диалога найдено более одного маркера1");
Возврат Неопределено;
КонецЕсли;
Позиция = Вхождения.Item(0).FirstIndex;
Позиция = Позиция + СтрДлина(Вхождения.Item(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;
ТелоМетода.УстановитьСтроку("");
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс("ЭтаФорма", Форма, ТелоМетода);
ТелоМетода = ТелоМетода.Закрыть();
ТекстМодуля.ЗаписатьБезОбработки("
|Процедура ИнициализироватьФорму_" + ирПлатформа.ПолучитьИдентификаторИзПредставления(ПолноеИмяФормы) + "(ЭтаФорма) Экспорт
|
|" + ТелоМетода + "
|КонецПроцедуры
|");
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Результат =
"//#Область ОбработчикиИнициализацииФорм
|" + ТекстМодуля.Закрыть() + "
|//#КонецОбласти";
Возврат Результат;
КонецФункции
Процедура ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту, Объект, ТелоМетода)
СтруктураТипа = ирПлатформа.ПолучитьСтруктуруТипаИзЗначения(Объект);
ВнутренняяТаблицаСлов = ирПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа);
Для Каждого ВнутренняяСтрокаСлова Из ВнутренняяТаблицаСлов Цикл
Если ВнутренняяСтрокаСлова.ТипСлова = "Свойство" Тогда
ИмяСвойства = ВнутренняяСтрокаСлова.Слово;
Если Ложь
Или ИмяСвойства = "ИсточникДействий"
Или ИмяСвойства = "КонтекстноеМеню"
Тогда
// Защита от длинных путей и зацикливания
Продолжить;
КонецЕсли;
Попытка
Структура = Новый Структура(ИмяСвойства);
Исключение
// "КартинкаКнопкиВыбора#&^@^%&*^#1"
Продолжить;
КонецПопытки;
Попытка
ЗаполнитьЗначенияСвойств(Структура, Объект);
Исключение
// Не всегда доступное свойство
Продолжить;
КонецПопытки;
ЗначениеСвойства = Структура[ИмяСвойства];
Если ТипЗнч(ЗначениеСвойства) = Тип("Картинка") Тогда
Если ЗначениеСвойства.Вид = ВидКартинки.ИзБиблиотеки Тогда
ИмяОбщейКартинки = СериализаторXDTO.записатьXDTO(ЗначениеСвойства).ref.ЛокальноеИмя;
Если Метаданные.ОбщиеКартинки.Найти(ИмяОбщейКартинки) <> Неопределено Тогда
ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирОбщий.ПолучитьОбщуюКартинкуЛкс("""
+ ИмяОбщейКартинки + """);" + Символы.ПС);
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Цвет") Тогда
ИмяЦветаСтиля = СериализаторXDTO.записатьXDTO(ЗначениеСвойства).ЛексическоеЗначение;
ПозицияСкобки = Найти(ИмяЦветаСтиля, "}");
Если ПозицияСкобки > 0 Тогда
ИмяЦветаСтиля = Сред(ИмяЦветаСтиля, ПозицияСкобки + 1);
Если Метаданные.ЭлементыСтиля.Найти(ИмяЦветаСтиля) <> Неопределено Тогда
ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирОбщий.ПолучитьЦветСтиляЛкс("""
+ ИмяЦветаСтиля + """);" + Символы.ПС);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ирПлатформа.мМассивТиповЭлементовУправления.Найти(ТипЗнч(ЗначениеСвойства)) <> Неопределено Тогда
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства, ЗначениеСвойства, ТелоМетода);
КонецЕсли;
Если ирОбщий.ЭтоКоллекцияЛкс(ЗначениеСвойства) Тогда
ЕстьИндексПоИмени = Ложь;
Для Каждого ЭлементКоллекции Из ЗначениеСвойства Цикл
Если Не ЕстьИндексПоИмени Тогда
Попытка
Пустышка = Вычислить("ЗначениеСвойства." + ЭлементКоллекции.Имя);
Исключение
// Если к элементу по имени нельзя обратиться, то он нас не интересует.
Прервать;
КонецПопытки;
КонецЕсли;
ЕстьИндексПоИмени = Истина;
Если Ложь
Или ирПлатформа.мМассивТиповЭлементовУправления.Найти(ТипЗнч(ЭлементКоллекции)) <> Неопределено
Или ТипЗнч(ЭлементКоллекции) = Тип("КнопкаКоманднойПанели")
Тогда
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства + "." + ЭлементКоллекции.Имя, ЭлементКоллекции, ТелоМетода);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОсновныеДействияФормыВыполнить(Кнопка)
ИмяРасширения = "Расширение1";
ТекстЛога = "";
ВерсияРасширения = Метаданные.Версия + "e";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("cfe");
ПолучитьОбщийМакет("ирШаблонРасширения").Записать(ИмяВременногоФайла);
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadCfg """ + ИмяВременногоФайла + """ -Extension """ + ИмяРасширения + """", , ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(ИмяВременногоФайла);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
УдалитьФайлы(ИмяВременногоФайла);
КаталогВыгрузкиРасширения = ПолучитьИмяВременногоФайла();
СоздатьКаталог(КаталогВыгрузкиРасширения);
// Выгружаем расширение в файлы
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(КаталогВыгрузкиРасширения);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
КаталогВыгрузкиКонфигурации = ПолучитьИмяВременногоФайла();
СоздатьКаталог(КаталогВыгрузкиКонфигурации);
ТекстЛога = "";
// Выгружаем конфигурацию в файлы
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиКонфигурации + """ -Format Hierarchical", СтрокаСоединенияИнформационнойБазы(), ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(КаталогВыгрузкиКонфигурации);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
//КаталогВыгрузкиКонфигурации = "Z:\Ир"; // Для отладки
// Скопируем все папки кроме Catalogs и Ext и файла ConfigDumpInfo.xml
Файлы = НайтиФайлы(КаталогВыгрузкиКонфигурации, "*");
Для Каждого Файл Из Файлы Цикл
Если Ложь
Или Файл.Имя = "Catalogs"
Или Файл.Имя = "Ext"
Или Не Файл.ЭтоКаталог()
Тогда
Продолжить;
КонецЕсли;
ФайлПриемник = Новый Файл(КаталогВыгрузкиРасширения + "\" + Файл.Имя);
Если Не ФайлПриемник.Существует() Тогда
СоздатьКаталог(ФайлПриемник.ПолноеИмя);
КонецЕсли;
ирОбщий.СкопироватьФайлыЛкс(КаталогВыгрузкиКонфигурации + "\" + Файл.Имя, КаталогВыгрузкиРасширения + "\" + Файл.Имя);
КонецЦикла;
// Переименуем язык Русский->ирРусский
ИмяФайла = КаталогВыгрузкиРасширения + "\Languages\Русский.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "Русский", "ирРусский");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// Во всех CommonCommands удалить ...
Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\CommonCommands", "*.xml");
Для Каждого Файл Из Файлы Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "", "", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
КонецЦикла;
// Из SubSystems вырезаем фрагменты Catalog.ирОбъектыДляОтладки
Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\SubSystems", "*.xml");
Для Каждого Файл Из Файлы Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "Catalog.ирАлгоритмы", "");
ТекстФайла = СтрЗаменить(ТекстФайла, "Catalog.ирКомандаРедактироватьОбъект", "");
ТекстФайла = СтрЗаменить(ТекстФайла, "Catalog.ирОбъектыДляОтладки", "");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
КонецЦикла;
// У общего модуля ирГлобальный убираем флажок Сервер
ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирГлобальный.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "true", "false");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
//// Скопируем глобальные методы в общий модуль ирОтладка
//ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирГлобальный\Ext\Module.bsl";
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ИмяФайла);
//ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
//ТекстМетодов = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "#Область ГлобальныеПортативныеМетоды", "#КонецОбласти", Ложь, Истина);
//ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирОтладка\Ext\Module.bsl";
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ИмяФайла);
//ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
//ТекстФайла = ТекстФайла + ТекстМетодов;
//ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
//ТекстовыйДокумент.Записать(ИмяФайла);
// У общего модуля ирПривилегированный убираем флажок Привилегированный
ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирПривилегированный.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "true", "false");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// У подсистемы ИнструментыРазработчикаTormozit обновим версию
ИмяФайла = КаталогВыгрузкиРасширения + "\SubSystems\ИнструментыРазработчикаTormozit.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "", "", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "" + ВерсияРасширения + "");
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "Инструменты разработчика ", "", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "Инструменты разработчика " + ВерсияРасширения + "");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// Заменим элемент в файле Configuration.xml
ФайлКонфигурацииИсточника = КаталогВыгрузкиКонфигурации + "\Configuration.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлКонфигурацииИсточника);
ТекстФайлаИсточника = ТекстовыйДокумент.ПолучитьТекст();
ФайлКонфигурацииПриемника = КаталогВыгрузкиРасширения + "\Configuration.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлКонфигурацииПриемника);
ТекстФайлаПриемника = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайлаПриемника, "", "", Ложь, Истина);
НаЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайлаИсточника, "", "", Ложь, Истина);
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, ЧтоЗаменить, НаЧтоЗаменить);
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, "4.00", "" + ВерсияРасширения + "");
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, "Russian", "RussianLanguage.Русский"); // Без этого многоязычные строки все будут пустыми
ТекстовыйДокумент.УстановитьТекст(ТекстФайлаПриемника);
ТекстовыйДокумент.Записать(ФайлКонфигурацииПриемника);
// Загружаем расширение из файлов
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(КаталогВыгрузкиРасширения);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
// Выгружаем расширение
КонечныйФайл = Каталог + "\ИР " + Метаданные.Версия + ".cfe";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("cfe");
ПолучитьОбщийМакет("ирШаблонРасширения").Записать(ИмяВременногоФайла);
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpCfg """ + КонечныйФайл + """ -Extension """ + ИмяРасширения + """", , ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(ИмяВременногоФайла);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
УдалитьФайлы(КаталогВыгрузкиКонфигурации);
УдалитьФайлы(КаталогВыгрузкиРасширения);
КонецПроцедуры
Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
ирОбщий.ВыбратьКаталогВФормеЛкс(Каталог);
КонецПроцедуры
Процедура ПриЗакрытии()
СохранитьЗначение("ирВыпускРасширение.Каталог", Каталог);
КонецПроцедуры
Процедура ПриОткрытии()
Подверсия = "1";
Каталог = ВосстановитьЗначение("ирВыпускРасширение.Каталог");
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ВерсияПлатформы = ирПлатформа.ВерсияПлатформы;
Если ВерсияПлатформы < 803010 Тогда
Сообщить("Поддерживается только платформа 8.3.10 и выше");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
ирПлатформа = ирКэш.Получить();