RDT1C/CommonForms/ирВыпускВариантаРасширение/Ext/Form/Module.bsl
Администратор 267ba16b22 Добавлен новый вариант выпуска Расширение
платформа 8.3.10.2375+
        режим совместимости конфигурации 8.3.9+
    Общее
        *Исправлена ошибка установки управляемых блокировок в режиме автоматических блокировок
        +Реализован новый метод выполнения скрытых команд системы через Native внешнюю компоненту
        +Во всех обычных формах подсистемы возвращен старый стиль отрисовки шапки табличного поля (с выделением текущей колонки)
        +Доработано низкоуровневое получение описаний объектов для работы на существующих и на будущих версиях 8.2 и 8.3
    Редактор объекта БД
        +При записи ссылочного объекта реализован мягкий контроль версии данных (мягкая оптимистичная блокировка)
    Редактор пользователей
        +В форму запуска под пользователем добавлен флажок "От имени администратора"
    Управление службами 1С
        +Реализована поддержка каталогов исполняемых файлов платформы без указания версии
    Динамический список
        *Исправлена редкая ошибка обработки оповещения
2017-06-12 18:18:41 +03:00

601 lines
44 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Перем ирПлатформа;
// Параметры:
// КаталогРаспаковки - Строка(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";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<Name>Русский</Name>", "<Name>ирРусский</Name>");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// Во всех CommonCommands удалить <CommandParameterType>...</CommandParameterType>
Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\CommonCommands", "*.xml");
Для Каждого Файл Из Файлы Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "<CommandParameterType>", "</CommandParameterType>", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
КонецЦикла;
// Из SubSystems вырезаем фрагменты <xr:Item xsi:type="xr:MDObjectRef">Catalog.ирОбъектыДляОтладки</xr:Item>
Файлы = НайтиФайлы(КаталогВыгрузкиРасширения + "\SubSystems", "*.xml");
Для Каждого Файл Из Файлы Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Catalog.ирАлгоритмы</xr:Item>", "");
ТекстФайла = СтрЗаменить(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Catalog.ирКомандаРедактироватьОбъект</xr:Item>", "");
ТекстФайла = СтрЗаменить(ТекстФайла, "<xr:Item xsi:type=""xr:MDObjectRef"">Catalog.ирОбъектыДляОтладки</xr:Item>", "");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(Файл.ПолноеИмя);
КонецЦикла;
// У общего модуля ирГлобальный убираем флажок Сервер
ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирГлобальный.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<Server>true</Server>", "<Server>false</Server>");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
//// Скопируем глобальные методы в общий модуль ирОтладка
//ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирГлобальный\Ext\Module.bsl";
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ИмяФайла);
//ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
//ТекстМетодов = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "#Область ГлобальныеПортативныеМетоды", "#КонецОбласти", Ложь, Истина);
//ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирОтладка\Ext\Module.bsl";
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ИмяФайла);
//ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
//ТекстФайла = ТекстФайла + ТекстМетодов;
//ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
//ТекстовыйДокумент.Записать(ИмяФайла);
// У общего модуля ирПривилегированный убираем флажок Привилегированный
ИмяФайла = КаталогВыгрузкиРасширения + "\CommonModules\ирПривилегированный.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<Privileged>true</Privileged>", "<Privileged>false</Privileged>");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// У подсистемы ИнструментыРазработчикаTormozit обновим версию
ИмяФайла = КаталогВыгрузкиРасширения + "\SubSystems\ИнструментыРазработчикаTormozit.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "<Comment>", "</Comment>", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "<Comment>" + ВерсияРасширения + "</Comment>");
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайла, "<v8:content>Инструменты разработчика ", "</v8:content>", Ложь, Истина);
ТекстФайла = СтрЗаменить(ТекстФайла, ЧтоЗаменить, "<v8:content>Инструменты разработчика " + ВерсияРасширения + "</v8:content>");
ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
ТекстовыйДокумент.Записать(ИмяФайла);
// Заменим элемент <ChildObjects> в файле Configuration.xml
ФайлКонфигурацииИсточника = КаталогВыгрузкиКонфигурации + "\Configuration.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлКонфигурацииИсточника);
ТекстФайлаИсточника = ТекстовыйДокумент.ПолучитьТекст();
ФайлКонфигурацииПриемника = КаталогВыгрузкиРасширения + "\Configuration.xml";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлКонфигурацииПриемника);
ТекстФайлаПриемника = ТекстовыйДокумент.ПолучитьТекст();
ЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайлаПриемника, "<ChildObjects>", "</ChildObjects>", Ложь, Истина);
НаЧтоЗаменить = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(ТекстФайлаИсточника, "<ChildObjects>", "</ChildObjects>", Ложь, Истина);
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, ЧтоЗаменить, НаЧтоЗаменить);
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, "<Version>4.00</Version>", "<Version>" + ВерсияРасширения + "</Version>");
ТекстФайлаПриемника = СтрЗаменить(ТекстФайлаПриемника, "<ScriptVariant>Russian</ScriptVariant>", "<ScriptVariant>Russian</ScriptVariant><DefaultLanguage>Language.Русский</DefaultLanguage>"); // Без этого многоязычные строки все будут пустыми
ТекстовыйДокумент.УстановитьТекст(ТекстФайлаПриемника);
ТекстовыйДокумент.Записать(ФайлКонфигурацииПриемника);
// Загружаем расширение из файлов
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
УдалитьФайлы(КаталогВыгрузкиРасширения);
Если Не Успех Тогда
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
//// Выгружаем расширение в файлы
//Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpConfigToFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
//Если Не Успех Тогда
// УдалитьФайлы(КаталогВыгрузкиРасширения);
// Сообщить(ТекстЛога);
// Возврат;
//КонецЕсли;
//ФайлКонфигурацииИсточника = КаталогВыгрузкиРасширения + "\Configuration.xml";
//ТекстовыйДокумент = Новый ТекстовыйДокумент;
//ТекстовыйДокумент.Прочитать(ФайлКонфигурацииИсточника);
//ТекстФайлаИсточника = ТекстовыйДокумент.ПолучитьТекст();
//Предупреждение(1);
//ТекстФайлаИсточника = СтрЗаменить(ТекстФайлаИсточника, "<DefaultLanguage>Language.ирРусский</DefaultLanguage>", ""); // На первом проходе в 8.3.10 невозможно сделать
//ТекстовыйДокумент.УстановитьТекст(ТекстФайлаИсточника);
//ТекстовыйДокумент.Записать(ФайлКонфигурацииИсточника);
//
//// Загружаем расширение из файлов
//Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadConfigFromFiles """ + КаталогВыгрузкиРасширения + """ -Extension """ + ИмяРасширения + """ -Format Hierarchical", , ТекстЛога);
//Если Не Успех Тогда
// УдалитьФайлы(КаталогВыгрузкиРасширения);
// Сообщить(ТекстЛога);
// Возврат;
//КонецЕсли;
// Выгружаем расширение
КонечныйФайл = Каталог + "\ИР " + Метаданные.Версия + ".cfe";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("cfe");
ПолучитьОбщийМакет("ирШаблонРасширения").Записать(ИмяВременногоФайла);
Успех = ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpCfg """ + КонечныйФайл + """ -Extension """ + ИмяРасширения + """", , ТекстЛога);
Если Не Успех Тогда
УдалитьФайлы(ИмяВременногоФайла);
Сообщить(ТекстЛога);
Возврат;
КонецЕсли;
УдалитьФайлы(КаталогВыгрузкиКонфигурации);
УдалитьФайлы(КаталогВыгрузкиРасширения);
Предупреждение("Не забудь вручную убрать флажок ""Проверять значения языка"" у расширения!");
КонецПроцедуры
Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
ирОбщий.ВыбратьКаталогВФормеЛкс(Каталог);
КонецПроцедуры
Процедура ПриЗакрытии()
СохранитьЗначение("ирВыпускВариантаРасширение.Каталог", Каталог);
КонецПроцедуры
Процедура ПриОткрытии()
Подверсия = "1";
Каталог = ВосстановитьЗначение("ирВыпускВариантаРасширение.Каталог");
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ВерсияПлатформы = ирПлатформа.ВерсияПлатформы;
Если ВерсияПлатформы < 803010 Тогда
Сообщить("Поддерживается только платформа 8.3.10 и выше");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
ирПлатформа = ирКэш.Получить();