mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 05:04:11 +00:00
*Исправлена ошибка открытия форм отчетов через контекстное меню
*Ускорена фильтрация по подсистемам
Редактор объекта БД
*Устранен избыточный вызов перезаполнения данных на закладке "Связанные колонки", если тип объекта не менялся
Консоль запросов
*Устранено в некоторых случаях ошибочное применение выборок итогов при выгрузке в дерево
+Над деревом запросов добавлено поле строки поиска
*Исправлено в дерево запроса некорректное определение имени создаваемой временной таблицы при наличии в выбранных полях запроса выражения "<Таблица>.*"
+В контекстном меню дерева запроса добавлена команда "Выполнить запросы пакета (F9)"
+При выполнении пакетного запроса теперь обновляется колонка "Количество строк" в дереве запроса
Конструктор запроса
*Звездочка в предложении ВЫБРАТЬ при сборке текста теперь не вставляется в объединениях
*Исправлено разворачивание звездочки в некоторых случаях
*Исправлено обнаружение параметров в логических выражениях
Контекстная подсказка
*Исправлена ошибка при вычислении свойств виртуальной таблицы с некорректными параметрами
Консоль кода
+Над деревом алгоритмов добавлено поле строки поиска
Динамический список
*Исправлена доступность сортировки по номеру стандартными средствами
Функции режима отладки
+В функции От() добавлен учет уничтожений временных таблиц при поиске использованных в запросе временных таблиц
617 lines
46 KiB
Plaintext
617 lines
46 KiB
Plaintext
Перем ирПлатформа;
|
||
|
||
// Параметры:
|
||
// КаталогРаспаковки - Строка(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").Шрифт = ШрифтЖирный;
|
||
Для Каждого ОбщаяКартинка Из Метаданные.ОбщиеКартинки Цикл
|
||
Если Не Метаданные.Подсистемы.ИнструментыРазработчика.Состав.Содержит(ОбщаяКартинка) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
|
||
Рисунок.Картинка = БиблиотекаКартинок[ОбщаяКартинка.Имя];
|
||
Рисунок.Имя = ОбщаяКартинка.Имя;
|
||
Рисунок.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
|
||
ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы + 1;
|
||
ТабличныйДокумент.Область("R" + XMLСтрока(ВысотаТаблицы) + "C1:R" + XMLСтрока(ВысотаТаблицы) + "C1").Текст = ОбщаяКартинка.Имя;
|
||
Рисунок.Расположить(ТабличныйДокумент.Область("R" + XMLСтрока(ВысотаТаблицы) + "C2:R" + XMLСтрока(ВысотаТаблицы) + "C2"));
|
||
КонецЦикла;
|
||
Возврат ТабличныйДокумент;
|
||
|
||
КонецФункции
|
||
|
||
Функция СгенерироватьМодульИнициализацииФормПодсистемыДляПортативногоРежима() Экспорт
|
||
|
||
ТекстМодуля = Новый ЗаписьXML;
|
||
ТекстМодуля.УстановитьСтроку("");
|
||
//ТекстМодуля.ЗаписатьБезОбработки("
|
||
//|Перем ирОбщий Экспорт;
|
||
//|Перем ирСервер Экспорт;
|
||
//|Перем ирКэш Экспорт;
|
||
//|Перем ирПривилегированный Экспорт;
|
||
//|Перем ирПортативный Экспорт;
|
||
//|
|
||
//|Перем ирПлатформа Экспорт;
|
||
//|");
|
||
ТипыМетаданных = ирПлатформа.ПолучитьТаблицуТиповМетаОбъектов(Истина, Ложь, Ложь);
|
||
ИндикаторТиповМетаданных = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТипыМетаданных.Количество(), "Типы метаданных");
|
||
Для Каждого СтрокаТипаМетаданных Из ТипыМетаданных Цикл
|
||
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТиповМетаданных);
|
||
Если СтрокаТипаМетаданных.Единственное = "Перерасчет" Тогда
|
||
КоллекцияМетаОбъектов = Новый Массив;
|
||
Для Каждого МетаРегистрРасчета Из Метаданные.РегистрыРасчета Цикл
|
||
Для Каждого Перерасчет Из МетаРегистрРасчета.Перерасчеты Цикл
|
||
КоллекцияМетаОбъектов.Добавить(Перерасчет);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Иначе
|
||
КоллекцияМетаОбъектов = Метаданные[СтрокаТипаМетаданных.Множественное];
|
||
КонецЕсли;
|
||
Индикатор2 = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаОбъектов.Количество(), СтрокаТипаМетаданных.Множественное);
|
||
Для Каждого МетаОбъект Из КоллекцияМетаОбъектов Цикл
|
||
Если Не Метаданные.Подсистемы.ИнструментыРазработчика.Состав.Содержит(МетаОбъект) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ирОбщий.ОбработатьИндикаторЛкс(Индикатор2);
|
||
Попытка
|
||
МетаФормы = МетаОбъект.Формы;
|
||
Исключение
|
||
Продолжить;
|
||
КонецПопытки;
|
||
МенеджерОбъектаМетаданных = ирОбщий.ПолучитьМенеджерЛкс(МетаОбъект);
|
||
Индикатор3 = ирОбщий.ПолучитьИндикаторПроцессаЛкс(МетаФормы.Количество(), "Формы");
|
||
Для Каждого МетаФорма Из МетаФормы Цикл
|
||
ирОбщий.ОбработатьИндикаторЛкс(Индикатор3);
|
||
ПолноеИмяФормы = МетаФорма.ПолноеИмя();
|
||
Сообщить(ПолноеИмяФормы);
|
||
//ПолноеИмяФормы = МетаОбъект.ПолноеИмя() + ".Форма." + МетаФорма.Имя;
|
||
Попытка
|
||
//Форма = ПолучитьФорму(ПолноеИмяФормы); // Так исключение не сработает и будет отображен диалог об ошибке. Особенность платформы
|
||
Форма = МенеджерОбъектаМетаданных.ПолучитьФорму(МетаФорма.Имя,,Новый УникальныйИдентификатор());
|
||
Исключение
|
||
Сообщить("Ошибка при получении формы " + ПолноеИмяФормы + ": " + ОписаниеОшибки());
|
||
Продолжить;
|
||
КонецПопытки;
|
||
ТелоМетода = Новый ЗаписьXML;
|
||
ТелоМетода.УстановитьСтроку("");
|
||
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс("ЭтаФорма", Форма, ТелоМетода);
|
||
ТелоМетода = ТелоМетода.Закрыть();
|
||
ТекстМодуля.ЗаписатьБезОбработки("
|
||
|Процедура ИнициализироватьФорму_" + ирПлатформа.ПолучитьИдентификаторИзПредставления(ПолноеИмяФормы) + "(ЭтаФорма) Экспорт
|
||
|
|
||
|" + ТелоМетода + "
|
||
|КонецПроцедуры
|
||
|");
|
||
КонецЦикла;
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
КонецЦикла;
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
КонецЦикла;
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
Результат =
|
||
"//#Область ОбработчикиИнициализацииФорм
|
||
|" + ТекстМодуля.Закрыть() + "
|
||
|//#КонецОбласти";
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту, Объект, ТелоМетода)
|
||
|
||
СтруктураТипа = ирПлатформа.ПолучитьСтруктуруТипаИзЗначения(Объект);
|
||
ВнутренняяТаблицаСлов = ирПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа);
|
||
Для Каждого ВнутренняяСтрокаСлова Из ВнутренняяТаблицаСлов Цикл
|
||
Если ВнутренняяСтрокаСлова.ТипСлова = "Свойство" Тогда
|
||
ИмяСвойства = ВнутренняяСтрокаСлова.Слово;
|
||
Если Ложь
|
||
Или ИмяСвойства = "ИсточникДействий"
|
||
Или ИмяСвойства = "КонтекстноеМеню"
|
||
Тогда
|
||
// Защита от длинных путей и зацикливания
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Попытка
|
||
Структура = Новый Структура(ИмяСвойства);
|
||
Исключение
|
||
// "КартинкаКнопкиВыбора#&^@^%&*^#1"
|
||
Продолжить;
|
||
КонецПопытки;
|
||
Попытка
|
||
ЗаполнитьЗначенияСвойств(Структура, Объект);
|
||
Исключение
|
||
// Не всегда доступное свойство
|
||
Продолжить;
|
||
КонецПопытки;
|
||
ЗначениеСвойства = Структура[ИмяСвойства];
|
||
Если ТипЗнч(ЗначениеСвойства) = Тип("Картинка") Тогда
|
||
Если ЗначениеСвойства.Вид = ВидКартинки.ИзБиблиотеки Тогда
|
||
ИмяОбщейКартинки = СериализаторXDTO.записатьXDTO(ЗначениеСвойства).ref.ЛокальноеИмя;
|
||
Если Метаданные.ОбщиеКартинки.Найти(ИмяОбщейКартинки) <> Неопределено Тогда
|
||
ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирОбщий.ПолучитьОбщуюКартинкуЛкс("""
|
||
+ ИмяОбщейКартинки + """);" + Символы.ПС);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Цвет") Тогда
|
||
ИмяЦветаСтиля = СериализаторXDTO.записатьXDTO(ЗначениеСвойства).ЛексическоеЗначение;
|
||
ПозицияСкобки = Найти(ИмяЦветаСтиля, "}");
|
||
Если ПозицияСкобки > 0 Тогда
|
||
ИмяЦветаСтиля = Сред(ИмяЦветаСтиля, ПозицияСкобки + 1);
|
||
Если Метаданные.ЭлементыСтиля.Найти(ИмяЦветаСтиля) <> Неопределено Тогда
|
||
ТелоМетода.ЗаписатьБезОбработки(Символы.Таб + ПутьКОбъекту + "." + ИмяСвойства + " = ирОбщий.ПолучитьЦветСтиляЛкс("""
|
||
+ ИмяЦветаСтиля + """);" + Символы.ПС);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ирПлатформа.мМассивТиповЭлементовУправления.Найти(ТипЗнч(ЗначениеСвойства)) <> Неопределено Тогда
|
||
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства, ЗначениеСвойства, ТелоМетода);
|
||
КонецЕсли;
|
||
Если ирОбщий.ЭтоКоллекцияЛкс(ЗначениеСвойства) Тогда
|
||
ЕстьИндексПоИмени = Ложь;
|
||
Для Каждого ЭлементКоллекции Из ЗначениеСвойства Цикл
|
||
Если Не ЕстьИндексПоИмени Тогда
|
||
Попытка
|
||
Пустышка = Вычислить("ЗначениеСвойства." + ЭлементКоллекции.Имя);
|
||
Исключение
|
||
// Если к элементу по имени нельзя обратиться, то он нас не интересует.
|
||
Прервать;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
ЕстьИндексПоИмени = Истина;
|
||
Если Ложь
|
||
Или ирПлатформа.мМассивТиповЭлементовУправления.Найти(ТипЗнч(ЭлементКоллекции)) <> Неопределено
|
||
Или ТипЗнч(ЭлементКоллекции) = Тип("КнопкаКоманднойПанели")
|
||
Тогда
|
||
ПроверитьСвойстваОбъектаДляПортативногоРежимаЛкс(ПутьКОбъекту + "." + ИмяСвойства + "." + ЭлементКоллекции.Имя, ЭлементКоллекции, ТелоМетода);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОсновныеДействияФормыВыполнить(Кнопка)
|
||
|
||
КаталогВыгрузкиКонфигурации = ПолучитьИмяВременногоФайла();
|
||
Если ЗначениеЗаполнено(СтрокаСоединенияБазыПодсистемы) Тогда
|
||
СтрокаСоединенияБазыПодсистемыЛ = СтрокаСоединенияБазыПодсистемы;
|
||
Иначе
|
||
СтрокаСоединенияБазыПодсистемыЛ = СтрокаСоединенияИнформационнойБазы();
|
||
КонецЕсли;
|
||
СоздатьКаталог(КаталогВыгрузкиКонфигурации);
|
||
ТекстЛога = "";
|
||
// Выгружаем конфигурацию в файлы
|
||
Если Не ВыполнитьКомандуКонфигуратора("/DumpConfigToFiles """ + КаталогВыгрузкиКонфигурации + """ -Format Hierarchical", СтрокаСоединенияБазыПодсистемыЛ, ТекстЛога) Тогда
|
||
УдалитьФайлы(КаталогВыгрузкиКонфигурации);
|
||
Сообщить(ТекстЛога);
|
||
Возврат;
|
||
КонецЕсли;
|
||
КаталогВерсии = Каталог + "\" + Метаданные.Версия;
|
||
КаталогМодули = Новый Файл(КаталогВерсии + "\Модули");
|
||
Если Не КаталогМодули.Существует() Тогда
|
||
СоздатьКаталог(КаталогМодули);
|
||
КонецЕсли;
|
||
УдалитьФайлы(КаталогВыгрузкиКонфигурации + "\CommonModules\ирПортативный.xml");
|
||
СтрокаВерсии = Метаданные.Версия + "." + Подверсия;
|
||
|
||
// ирПортативный.ОбщиеКартинки
|
||
ТабличныйДокументКартинки = ТабличныйДокументИзОбщихКартинокПодсистемы();
|
||
ИмяфайлаТабличногоДокумента = КаталогВыгрузкиКонфигурации + "\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");
|
||
Если Не ЗначениеЗаполнено(ПреобразоватьВТип) Тогда
|
||
ПреобразоватьВТип = ИмяТипаЕдинственное;
|
||
КонецЕсли;
|
||
Успех = Истина;
|
||
ТекстЛога = "";
|
||
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ФайлыДляОбработки.Количество(), ИмяТипаМножественное);
|
||
Для Каждого Файл Из ФайлыДляОбработки Цикл
|
||
#Если _ Тогда
|
||
Файл = Новый Файл;
|
||
#КонецЕсли
|
||
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
|
||
КаталогВыгрузкиВнешнейОбработки = ПолучитьИмяВременногоФайла();
|
||
СоздатьКаталог(КаталогВыгрузкиВнешнейОбработки);
|
||
ИмяОсновногоФайлаВнешнейОбработки = КаталогВыгрузкиВнешнейОбработки + "\" + Файл.Имя;
|
||
ПодкаталогФайловВнешнейОбработки = КаталогВыгрузкиВнешнейОбработки + "\" + Файл.ИмяБезРасширения;
|
||
СоздатьКаталог(ПодкаталогФайловВнешнейОбработки);
|
||
ирОбщий.СкопироватьФайлыЛкс(Файл.Путь + "\" + Файл.ИмяБезРасширения, ПодкаталогФайловВнешнейОбработки);
|
||
ФайлОбщегоМОдуля = Новый Файл(ПодкаталогФайловВнешнейОбработки + "\Ext\Module.bsl");
|
||
Если ФайлОбщегоМОдуля.Существует() Тогда
|
||
ПереместитьФайл(ФайлОбщегоМОдуля.ПолноеИмя, ПодкаталогФайловВнешнейОбработки + "\Ext\ObjectModule.bsl");
|
||
КонецЕсли;
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
|
||
НовыйТекст = СтрЗаменить(ТекстовыйДокумент.ПолучитьТекст(), ИмяТипаЕдинственное, "External" + ПреобразоватьВТип);
|
||
ЧтениеХмл = Новый ЧтениеXML;
|
||
ПараметрыЧтения = Новый ПараметрыЧтенияXML(,,,,,,,, Ложь);
|
||
ЧтениеХмл.УстановитьСтроку(НовыйТекст, ПараметрыЧтения);
|
||
ПостроительDOM = Новый ПостроительDOM;
|
||
ДокументДом = ПостроительDOM.Прочитать(ЧтениеХмл);
|
||
ЧтениеХмл.Закрыть();
|
||
КорневойУзел = ДокументДом.ПолучитьЭлементыПоИмени("External" + ПреобразоватьВТип);
|
||
КорневойУзел = КорневойУзел[0];
|
||
УзелИдентификации = КорневойУзел.ПолучитьЭлементыПоИмени("InternalInfo");
|
||
Если УзелИдентификации.Количество() = 0 Тогда
|
||
УзелИдентификации = ДокументДом.СоздатьЭлемент("InternalInfo");
|
||
КорневойУзел.ВставитьПеред(УзелИдентификации, КорневойУзел.ПервыйДочерний);
|
||
КонецЕсли;
|
||
УзелИдентификации = КорневойУзел.ПолучитьЭлементыПоИмени("ChildObjects");
|
||
Если УзелИдентификации.Количество() = 0 Тогда
|
||
УзелИдентификации = ДокументДом.СоздатьЭлемент("ChildObjects");
|
||
КорневойУзел.ДобавитьДочерний(УзелИдентификации);
|
||
КонецЕсли;
|
||
ЗаписьXML = Новый ЗаписьXML;
|
||
ЗаписьXML.ОткрытьФайл(ИмяОсновногоФайлаВнешнейОбработки);
|
||
ЗаписьДом = Новый ЗаписьDOM;
|
||
ЗаписьДом.Записать(ДокументДом, ЗаписьXML);
|
||
ЗаписьXML.Закрыть();
|
||
Если ирОбщий.СтрокиРавныЛкс(Файл.ИмяБезРасширения, "ирПортативный") Тогда
|
||
КонечныйФайл = КаталогВерсии + "\";
|
||
Иначе
|
||
КонечныйФайл = КаталогВерсии + "\Модули\";
|
||
КонецЕсли;
|
||
КонечныйФайл = КонечныйФайл + Файл.ИмяБезРасширения + "." + РасширениеФайла;
|
||
Если Не ВыполнитьКомандуКонфигуратора("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяОсновногоФайлаВнешнейОбработки + """ """ + КонечныйФайл + """",
|
||
СтрокаСоединенияБазыПодсистемыЛ, ТекстЛога)
|
||
Тогда
|
||
УдалитьФайлы(КаталогВыгрузкиВнешнейОбработки);
|
||
УдалитьФайлы(КаталогВыгрузкиКонфигурации);
|
||
Сообщить(ТекстЛога);
|
||
Успех = Ложь;
|
||
Прервать;
|
||
КонецЕсли;
|
||
УдалитьФайлы(КаталогВыгрузкиВнешнейОбработки);
|
||
КонецЦикла;
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьКаталогПустойИнфобазы() Экспорт
|
||
|
||
ShellApplication = Новый COMobject("Shell.Application");
|
||
КаталогПустойИнфобазы = ShellApplication.NameSpace(28).Self.Path;
|
||
КаталогПустойИнфобазы = КаталогПустойИнфобазы + "\1C\1Cv8\EmptyDB";
|
||
Возврат КаталогПустойИнфобазы;
|
||
|
||
КонецФункции
|
||
|
||
Функция СоздатьФайловуюБазу1С(Знач КаталогИнфобазы = "", ИмяФайлаКонфигурации = "") Экспорт
|
||
|
||
ФайлПустойИнфобазы = Новый Файл(КаталогИнфобазы + "\1CV8.1CD");
|
||
Если Не ФайлПустойИнфобазы.Существует() Тогда
|
||
СтрокаПараметров = "CREATEINFOBASE File=""" + КаталогИнфобазы + """;";
|
||
|
||
// Антибаг платформы http://partners.v8.1c.ru/forum/thread.jsp?id=1076785#1076785
|
||
СтрокаПараметров = СтрокаПараметров + "Q=Q";
|
||
|
||
Если ЗначениеЗаполнено(ИмяФайлаКонфигурации) Тогда
|
||
СтрокаПараметров = СтрокаПараметров + " /UseTemplate """ + ИмяФайлаКонфигурации + """";
|
||
КонецЕсли;
|
||
//СтрокаПараметров = СтрокаПараметров + " /AddInList ууууу";
|
||
ПолноеИмяИсполняемогоФайла = ПолноеИмяИсполняемогоФайлаКонфигуратора();
|
||
ЗапуститьПриложение("""" + ПолноеИмяИсполняемогоФайла + """ " + СтрокаПараметров,, Истина);;
|
||
КонецЕсли;
|
||
Возврат "";
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолноеИмяИсполняемогоФайлаКонфигуратора()
|
||
|
||
ПолноеИмяИсполняемогоФайла = "" + КаталогПрограммы() + "1cv8.exe";
|
||
Возврат ПолноеИмяИсполняемогоФайла;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСтрокуСКавычкамиДляКоманднойСтроки(Строка) Экспорт
|
||
|
||
Результат = """" + СтрЗаменить(Строка, """", """""") + """";
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВыполнитьКомандуКонфигуратора(Знач КомандаКонфигуратора, Знач СтрокаСоединенияБазы = "", выхТекстЛога = "")
|
||
|
||
Если Не ЗначениеЗаполнено(СтрокаСоединенияБазы) Тогда
|
||
КаталогПустойИнфобазы = ПолучитьКаталогПустойИнфобазы();
|
||
СоздатьФайловуюБазу1С(КаталогПустойИнфобазы);
|
||
СтрокаСоединенияБазы = "File=""" + КаталогПустойИнфобазы + """;";
|
||
КонецЕсли;
|
||
СтрокаСоединенияБазы = "/IBConnectionString" + ПолучитьСтрокуСКавычкамиДляКоманднойСтроки(СтрокаСоединенияБазы);
|
||
КодВозврата = Неопределено;
|
||
ИмяФайлаЛога = ПолучитьИмяВременногоФайла("txt");
|
||
ПолноеИмяИсполняемогоФайла = ПолноеИмяИсполняемогоФайлаКонфигуратора();
|
||
ЗапуститьПриложение("""" + ПолноеИмяИсполняемогоФайла + """ DESIGNER /Out""" + ИмяФайлаЛога + """ " + СтрокаСоединенияБазы + " " + КомандаКонфигуратора,, Истина, КодВозврата);;
|
||
ФайлЛога = Новый Файл(ИмяФайлаЛога);
|
||
Если ФайлЛога.Существует() Тогда
|
||
ТекстовыйДокументЛога = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокументЛога.Прочитать(ФайлЛога.ПолноеИмя);
|
||
выхТекстЛога = ТекстовыйДокументЛога.ПолучитьТекст();
|
||
КонецЕсли;
|
||
Возврат КодВозврата = 0;
|
||
|
||
КонецФункции
|
||
|
||
Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
|
||
|
||
ирОбщий.ВыбратьКаталогВФормеЛкс(Каталог);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПриЗакрытии()
|
||
|
||
СохранитьЗначение("ирВыпускПортативногоВарианта.Каталог", Каталог);
|
||
СохранитьЗначение("ирВыпускПортативногоВарианта.СтрокаСоединенияБазыПодсистемы", СтрокаСоединенияБазыПодсистемы);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПриОткрытии()
|
||
|
||
Подверсия = "1";
|
||
Каталог = ВосстановитьЗначение("ирВыпускПортативногоВарианта.Каталог");
|
||
СтрокаСоединенияБазыПодсистемы = ВосстановитьЗначение("ирВыпускПортативногоВарианта.СтрокаСоединенияБазыПодсистемы");
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
|
||
|
||
ВерсияПлатформы = ирПлатформа.ВерсияПлатформы;
|
||
Если ВерсияПлатформы < 803008 Тогда
|
||
Сообщить("Поддерживается только платформа 8.3.8 и выше");
|
||
Отказ = Истина;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
ирПлатформа = ирКэш.Получить(); |