mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 05:04:11 +00:00
8188 lines
563 KiB
Plaintext
8188 lines
563 KiB
Plaintext
//ирПортативный Перем ирПортативный Экспорт;
|
||
//ирПортативный Перем ирОбщий Экспорт;
|
||
//ирПортативный Перем ирСервер Экспорт;
|
||
//ирПортативный Перем ирКэш Экспорт;
|
||
//ирПортативный Перем ирПривилегированный Экспорт;
|
||
|
||
Перем ЧистыйКонтекст;
|
||
Перем ФиксироватьВнешниеИсключенияАлгоритмов Экспорт;
|
||
Перем ВерсияПлатформы Экспорт;
|
||
Перем ЭтоФайловаяБаза Экспорт;
|
||
Перем мМетаданные Экспорт;
|
||
Перем Это2iS Экспорт;
|
||
Перем ЭтоИнтеграция Экспорт;
|
||
Перем СоответствиеВидовСравнения Экспорт;
|
||
Перем МаркерНачалаАлгоритма Экспорт;
|
||
Перем МаркерКонцаАлгоритма Экспорт;
|
||
Перем МакетыКомпонент Экспорт;
|
||
Перем мКэшПустыхЗначений Экспорт;
|
||
Перем ВложенностьИндикации Экспорт;
|
||
Перем КэшОбъектов Экспорт;
|
||
Перем ВремяОбъект Экспорт;
|
||
Перем СловарьПеревода Экспорт;
|
||
Перем АрхитектураПроцессора Экспорт;
|
||
Перем ИсполнительСкрытыхКомандСистемы;
|
||
Перем СодержанияАрхивовСправки Экспорт;
|
||
Перем ВыполнятьАлгоритмыЧерезВнешниеОбработки Экспорт;
|
||
Перем ВнешняяОбработкаСервисы Экспорт;
|
||
Перем ФайловыйКэшАлгоритмовДопускаетРедактирование Экспорт;
|
||
Перем ФормаПустышка Экспорт;
|
||
//Перем ТекстПотокаСИменемВнешнейОбработки;
|
||
//Перем ТекстПотокаСИменемВнешнейОбработкиСМакетом;
|
||
//Перем ФайлСИменемВнешнейОбработки;
|
||
//Перем ФайлСИменемВнешнейОбработкиСМакетом;
|
||
////Перем КешВнешнихОбработокАлгоритмов;
|
||
Перем КешАлгоритмов;
|
||
Перем СубПутьКФайлуПотокаМодуляВнешнейОбработки;
|
||
Перем СубПутьКФайлуПотокаМакетаВнешнейОбработки;
|
||
Перем СубПутьКФайлуПотокаЗаголовкаВнешнейОбработки;
|
||
Перем СубПутьККонтрольномуФайлуВнешнейОбработки;
|
||
Перем ПутьККаталогуСлужебныхВременныхФайлов;
|
||
Перем мЕстьАдминистративныеПраваУУчетнойЗаписиОС;
|
||
Перем СообщениеОНеобходимостиОбновитьКэшМодулейВыводилось;
|
||
//Перем ФайлЗамокШаблона;
|
||
//Перем ФайлЗамокШаблонаСМакетом;
|
||
Перем ПапкаКешаВнешнихОбработокАлгоритмов Экспорт;
|
||
Перем ПапкаКешаВнешнихОбработокАрхива Экспорт;
|
||
Перем ПапкаВнешнихКомпонент Экспорт;
|
||
Перем ПапкаКэшаМодулей Экспорт;
|
||
Перем ПапкаКэшаСинтаксПомощника Экспорт;
|
||
Перем КаталогФайловогоКэша Экспорт;
|
||
Перем СтруктураПодкаталоговФайловогоКэша Экспорт;
|
||
Перем ИмяФайлаПакера Экспорт;
|
||
Перем ШаблоныВнешнейОбработки;
|
||
Перем ШаблоныВнешнейОбработкиСМакетом;
|
||
Перем ФайлРегистратораКомпонентCU;
|
||
Перем ФайлРегистратораNetКомпонент;
|
||
Перем МассивСравненияТекстов Экспорт;
|
||
Перем мВопросОтключенияПроверкиМодальностиЗадавался Экспорт;
|
||
Перем мПроверкаСовместимостиКонфигурацииВыполнялась Экспорт;
|
||
Перем мПроверкаЗащитыОтОпасныхДействийВыполнялась Экспорт;
|
||
Перем мПроверкаСоединенияADOЭтойБДВыполнялась Экспорт;
|
||
Перем мПерехватКлавиатуры;
|
||
Перем АсинхронностьЗапрещена Экспорт;
|
||
|
||
Перем WshShell Экспорт;
|
||
Перем WinAPI Экспорт;
|
||
Перем ИМЯ_КЛАССА_DynamicWrapperX Экспорт;
|
||
Перем RegExp Экспорт;
|
||
Перем RegExp2 Экспорт;
|
||
Перем VBRegExp;
|
||
|
||
Перем шБуква Экспорт;
|
||
Перем шИмя Экспорт;
|
||
Перем шЧисло Экспорт;
|
||
Перем шИндекс Экспорт;
|
||
Перем шСкобки Экспорт;
|
||
Перем шGUID Экспорт;
|
||
Перем шКомментарий Экспорт;
|
||
Перем шРазделитель Экспорт;
|
||
Перем шИмяВременнойТаблицы Экспорт;
|
||
|
||
Перем МаркерОбъектаМетаданных;
|
||
Перем МаркерКоллекцииОбъектовМетаданных;
|
||
|
||
//#Если Клиент Или ВнешнееСоединение Тогда
|
||
Перем ИдентификаторПроцессаОС Экспорт;
|
||
Перем VBScript Экспорт;
|
||
Перем JavaScript Экспорт;
|
||
Перем ДеревоТипов Экспорт;
|
||
Перем ТаблицаОбщихТипов Экспорт;
|
||
Перем ТаблицаИменЭлементовКоллекций Экспорт;
|
||
Перем ТаблицаКонтекстов Экспорт;
|
||
Перем ТаблицаРасширенийТипов Экспорт;
|
||
Перем ТаблицаШаблоновКонтекстов Экспорт;
|
||
Перем ТаблицаТиповМетаОбъектов Экспорт;
|
||
Перем ТаблицаПараметров Экспорт;
|
||
Перем СлужебноеПолеТекстовогоДокумента Экспорт;
|
||
//Перем СлужебноеПолеHtmlДокумента Экспорт;
|
||
Перем МассивОбычныхЭлементовУправления Экспорт;
|
||
Перем МассивУправляемыхЭлементовУправления Экспорт;
|
||
Перем мМассивТиповЭлементовУправления Экспорт;
|
||
Перем ТаблицаСтатистикиВыбора Экспорт;
|
||
Перем мМассивТиповВключающихМетаданные Экспорт;
|
||
Перем мТаблицаСтруктурТипа; // Образец таблицы структур типа
|
||
Перем мТаблицаСоответствияВидов;
|
||
Перем мТаблицаЗамеров Экспорт;
|
||
Перем мТаблицаИндикаторов Экспорт;
|
||
Перем мИменаОсновныхКлассовБиблиотекCOM; // Кэш имен классов, например Exel - Application
|
||
Перем мОбразцыCOMОбъектов; // Для вычисления свойств
|
||
Перем мADOUtils; // GameWithFire.ADOUtils
|
||
Перем мКэшСловГлобальногоКонтекста;
|
||
|
||
Перем СлужебнаяФорма;
|
||
Перем COMНавигатор Экспорт;
|
||
Перем ТаблицаШаблоновТекста Экспорт;
|
||
Перем КартинкиТипов;
|
||
Перем МассивИсключенийИменКоллекций;
|
||
|
||
Перем ФайлЗапаковщика1С Экспорт;
|
||
Перем ФайлБиблиотекиЗапаковщика;
|
||
Перем ФайлОткрывателя1С Экспорт;
|
||
Перем ФайлРаспаковщикаZIP Экспорт;
|
||
Перем ФайлСтилейСинтаксПомощника Экспорт;
|
||
Перем АрхивСинтаксПомощника Экспорт;
|
||
Перем Парсеры Экспорт;
|
||
Перем БуферыСравнения Экспорт;
|
||
Перем ПараметрыОбработчикаОжидания Экспорт;
|
||
Перем БазовыйФайлРедактораJSON;
|
||
Перем мМаркерИмениЗапросаПакета Экспорт;
|
||
Перем мМаркерИмениЧастиОбъединения Экспорт;
|
||
|
||
Перем ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов Экспорт;
|
||
Перем СинтаксическийКонтрольПередЗаписью Экспорт;
|
||
Перем ОтложенноеОткрытиеИсточникаОшибки Экспорт;
|
||
Перем АвторегистрацияComКомпонент Экспорт;
|
||
Перем ЛиКомпонентаFormsTextBoxДоступна;
|
||
Перем СчетчикМодальныхФорм Экспорт;
|
||
Перем МодулиМетаданных Экспорт;
|
||
Перем ОткрытыеФормы Экспорт;
|
||
Перем ПерехватКлавиатурногоВводаВОбычномПриложении Экспорт;
|
||
Перем ОтмененныеФоновыеЗадания Экспорт;
|
||
|
||
// Инициализирует, если необходимо, большие таблицы платформы.
|
||
// К ним относятся таблицы методов и свойств.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
Процедура ИнициализацияОписанияМетодовИСвойств() Экспорт
|
||
|
||
Если ТипЗнч(ТаблицаКонтекстов) = Тип("ТаблицаЗначений") Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
#Если Клиент Тогда
|
||
Состояние("Инициализация таблицы методов и свойств...");
|
||
#КонецЕсли
|
||
МассивТаблиц = ЗначениеИзСтрокиВнутр(ПолучитьМакет("ТаблицаМетодовИСвойств").ПолучитьТекст());
|
||
ТаблицаКонтекстов = МассивТаблиц.ТаблицаКонтекстов;
|
||
ТаблицаКонтекстов.Индексы.Добавить("ТипКонтекста");
|
||
ТаблицаКонтекстов.Индексы.Добавить("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка");
|
||
ТаблицаКонтекстов.Индексы.Добавить("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка, ТипСлова");
|
||
ТаблицаКонтекстов.Индексы.Добавить("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка, ТипСлова, НСлово");
|
||
ТаблицаШаблоновКонтекстов = МассивТаблиц.ТаблицаШаблоновКонтекстов;
|
||
ТаблицаШаблоновКонтекстов.Индексы.Добавить("ТипКонтекста");
|
||
ТаблицаШаблоновКонтекстов.Индексы.Добавить("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка");
|
||
ТаблицаПараметров = МассивТаблиц.ТаблицаПараметров;
|
||
ТаблицаПараметров.Индексы.Добавить("ТипКонтекста, ЯзыкПрограммы, Слово, Номер");
|
||
#Если Клиент Тогда
|
||
Состояние("");
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
// Инициализирует, если необходимо, малые таблицы платформы.
|
||
// К ним относятся таблицы типов и коллекций.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
Процедура ИнициализацияОписанияОбщихТипов() Экспорт
|
||
|
||
Если ТипЗнч(ТаблицаОбщихТипов) = Тип("ТаблицаЗначений") Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
МассивТаблиц = ЗначениеИзСтрокиВнутр(ПолучитьМакет("ТаблицаИменЭлементовКоллекций").ПолучитьТекст());
|
||
ТаблицаИменЭлементовКоллекций = МассивТаблиц.ТаблицаИменЭлементовКоллекций;
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаИменЭлементовКоллекций = НОвый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
ТаблицаИменЭлементовКоллекций.Индексы.Добавить("ИмяКоллекции");
|
||
ТаблицаИменЭлементовКоллекций.Индексы.Добавить("ИмяЭлементаКоллекции");
|
||
ТаблицаИменЭлементовКоллекций.Индексы.Добавить("ИмяОбщегоТипа, ИмяЭлементаКоллекции");
|
||
ТаблицаРасширенийТипов = МассивТаблиц.ТаблицаРасширений;
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаРасширенийТипов = НОвый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
ТаблицаРасширенийТипов.Индексы.Добавить("Расширение");
|
||
МассивТаблиц = ЗначениеИзСтрокиВнутр(ПолучитьМакет("ТаблицаОбщихТипов").ПолучитьТекст());
|
||
ТаблицаОбщихТипов = МассивТаблиц.ТаблицаОбщихТипов;
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаОбщихТипов = НОвый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
ТаблицаОбщихТипов.Индексы.Добавить("Слово, ЯзыкПрограммы");
|
||
ТаблицаОбщихТипов.Индексы.Добавить("Слово, ТипТипа");
|
||
//ТаблицаОбщихТипов.Индексы.Добавить("Слово, ЯзыкПрограммы, ТипТипа");
|
||
ТаблицаОбщихТипов.Индексы.Добавить("НСлово, ЯзыкПрограммы, ЕстьКонструктор");
|
||
ТаблицаОбщихТипов.Индексы.Добавить("Представление, ТипТипа");
|
||
ТаблицаОбщихТипов.Индексы.Добавить("ИД, ТипТипа");
|
||
|
||
КонецПроцедуры
|
||
|
||
// Добавляет дополнительные Свойства для типов контекстов платформы.
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура ДобавитьСловоВОписаниеТипаКонтекста(ТипКонтекста, Слово, ТипСлова, ТипЗначения) Экспорт
|
||
|
||
ИнициализацияОписанияМетодовИСвойств();
|
||
НоваяСтрока = ТаблицаКонтекстов.Добавить();
|
||
НоваяСтрока.ТипКонтекста = ТипКонтекста;
|
||
НоваяСтрока.Слово = Слово;
|
||
НоваяСтрока.НСлово = НРег(Слово);
|
||
НоваяСтрока.ТипСлова = ТипСлова;
|
||
НоваяСтрока.ТипЗначения = ТипЗначения;
|
||
|
||
КонецПроцедуры // ДобавитьСловоВОписаниеТипаКонтекста()
|
||
|
||
// Добавляет в список значений коллекцию объектов метаданных.
|
||
//
|
||
// Параметры:
|
||
// пСписокМетаданных – СписокЗначений – куда добавляем объекты;
|
||
// пИмяМетаданных – Строка – имя коллекции объектов метаданных или имя корневого типа;
|
||
// *ЛиПолноеИмя - Булево, *Истина - добавлять полные имена, иначе краткие;
|
||
// *ЛиДобавлятьКартинки - Булево, *Истина - добавлять картинки;
|
||
// *ОтборПоПраву - Строка, *Неопределено - проверять перед добавлением право текущего пользователя.
|
||
//
|
||
Процедура ДобавитьВСписокКоллекциюМетаданных(пСписокМетаданных, пИмяМетаданных, ЛиПолноеИмя = Истина, ЛиДобавлятьКартинки = Истина, ОтборПоПраву = Неопределено) Экспорт
|
||
|
||
Картинка = Неопределено;
|
||
СтрокаКорневогоТипа = ПолучитьСтрокуТипаМетаОбъектов(пИмяМетаданных, , 0);
|
||
Если СтрокаКорневогоТипа <> Неопределено Тогда
|
||
ИмяКоллекцииМетаданных = СтрокаКорневогоТипа.Множественное;
|
||
#Если Клиент Тогда
|
||
Если ЛиДобавлятьКартинки Тогда
|
||
КорневойТип = пИмяМетаданных;
|
||
Картинка = ирОбщий.КартинкаКорневогоТипаМДЛкс(КорневойТип);
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
Иначе
|
||
ИмяКоллекцииМетаданных = пИмяМетаданных;
|
||
#Если Клиент Тогда
|
||
Если ЛиДобавлятьКартинки Тогда
|
||
КорневойТип = ПолучитьСтрокуТипаМетаОбъектов(, пИмяМетаданных, 0).Единственное;
|
||
Картинка = ирОбщий.КартинкаКорневогоТипаМДЛкс(КорневойТип);
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
Для Каждого Объект ИЗ мМетаданные[ИмяКоллекцииМетаданных] Цикл
|
||
Если Истина
|
||
И ОтборПоПраву <> Неопределено
|
||
И Не ПравоДоступа(ОтборПоПраву, Объект)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ЛиПолноеИмя Тогда
|
||
ИмяМетаОбъекта = Объект.ПолноеИмя();
|
||
Иначе
|
||
ИмяМетаОбъекта = Объект.Имя;
|
||
КонецЕсли;
|
||
пСписокМетаданных.Добавить(ИмяМетаОбъекта, Объект.Представление(), , Картинка);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Получает список ключевых слов языка запросов.
|
||
//
|
||
// Параметры:
|
||
// *Расширение - Тип, *Неопределено - для определения расширения языка запросов.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СписокЗначений - где значение содержит слово.
|
||
//
|
||
Функция ПолучитьСписокКлючевыхСловЯзыкаЗапросов(РежимКомпоновкиДанных = Ложь, Русские = Истина, Английские = Ложь) Экспорт
|
||
|
||
Список = Новый СписокЗначений;
|
||
|
||
Если Русские Тогда
|
||
Список.Добавить("АВТОУПОРЯДОЧИВАНИЕ");
|
||
Список.Добавить("ВНУТРЕННЕЕ");
|
||
Список.Добавить("ВОЗР");
|
||
Список.Добавить("ВСЕ");
|
||
Список.Добавить("ВЫБРАТЬ");
|
||
Список.Добавить("ГДЕ");
|
||
Список.Добавить("ДЛЯ");
|
||
Список.Добавить("ИЗ");
|
||
Список.Добавить("ИЗМЕНЕНИЯ");
|
||
Список.Добавить("ИМЕЮЩИЕ");
|
||
Список.Добавить("ИНДЕКСИРОВАТЬ");
|
||
Список.Добавить("ИТОГИ");
|
||
Список.Добавить("КАК");
|
||
Список.Добавить("ЛЕВОЕ");
|
||
Список.Добавить("ОБЩИЕ");
|
||
Список.Добавить("ОБЪЕДИНИТЬ");
|
||
Список.Добавить("ПЕРВЫЕ");
|
||
Список.Добавить("ПО");
|
||
Список.Добавить("ПОЛНОЕ");
|
||
Список.Добавить("ПОМЕСТИТЬ");
|
||
Список.Добавить("ПРАВОЕ");
|
||
Список.Добавить("РАЗЛИЧНЫЕ");
|
||
Список.Добавить("РАЗРЕШЕННЫЕ");
|
||
Список.Добавить("СГРУППИРОВАТЬ");
|
||
Список.Добавить("СОЕДИНЕНИЕ");
|
||
Список.Добавить("УБЫВ");
|
||
Список.Добавить("УНИЧТОЖИТЬ");
|
||
Список.Добавить("УПОРЯДОЧИТЬ");
|
||
|
||
Список.Добавить("НЕ");
|
||
Список.Добавить("И");
|
||
Список.Добавить("ИЛИ");
|
||
Список.Добавить("ВЫБОР");
|
||
Список.Добавить("КОГДА");
|
||
Список.Добавить("ТОГДА");
|
||
Список.Добавить("ИНАЧЕ");
|
||
Список.Добавить("КОНЕЦ");
|
||
Список.Добавить("ЕСТЬ");
|
||
Список.Добавить("NULL");
|
||
Список.Добавить("МЕЖДУ");
|
||
Список.Добавить("В");
|
||
Список.Добавить("ПОДОБНО");
|
||
Список.Добавить("СПЕЦСИМВОЛ");
|
||
Список.Добавить("ИЕРАРХИЯ");
|
||
Список.Добавить("ИЕРАРХИИ");
|
||
Список.Добавить("ССЫЛКА");
|
||
|
||
Если РежимКомпоновкиДанных Тогда
|
||
// Видимо это устаревшие слова
|
||
Список.Добавить("ЗНАЧЕНИЕ");
|
||
Список.Добавить("ЗНАЧЕНИЯ");
|
||
Список.Добавить("ИДЕНТИФИКАТОР");
|
||
Список.Добавить("ИМЯ");
|
||
Список.Добавить("ОБЪЕКТ");
|
||
Список.Добавить("СПИСОК");
|
||
Список.Добавить("ТИПЗНАЧЕНИЯ");
|
||
Список.Добавить("ХАРАКТЕРИСТИКА");
|
||
// Это новые слова
|
||
Список.Добавить("ЗНАЧЕНИЯХАРАКТЕРИСТИК");
|
||
Список.Добавить("ПОЛЕИМЕНИ");
|
||
Список.Добавить("ПОЛЕКЛЮЧА");
|
||
Список.Добавить("ПОЛЕЗНАЧЕНИЯ");
|
||
Список.Добавить("ПОЛЕВИДА");
|
||
Список.Добавить("ПОЛЕТИПАЗНАЧЕНИЯ");
|
||
Список.Добавить("ПОЛЕОБЪЕКТА");
|
||
Список.Добавить("ВИДЫХАРАКТЕРИСТИК");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Английские Тогда
|
||
Список.Добавить("AUTOORDER");
|
||
Список.Добавить("INNER");
|
||
Список.Добавить("ASC");
|
||
Список.Добавить("ALL");
|
||
Список.Добавить("SELECT");
|
||
Список.Добавить("WHERE");
|
||
Список.Добавить("FOR");
|
||
Список.Добавить("FROM");
|
||
Список.Добавить("UPDATE");
|
||
Список.Добавить("HAVING");
|
||
Список.Добавить("INDEX");
|
||
Список.Добавить("TOTALS");
|
||
Список.Добавить("AS");
|
||
Список.Добавить("LEFT");
|
||
//Список.Добавить("ОБЩИЕ"); // ЗАБЫЛ перевод
|
||
Список.Добавить("UNION");
|
||
Список.Добавить("FIRST");
|
||
Список.Добавить("BY");
|
||
Список.Добавить("ON");
|
||
Список.Добавить("FULL");
|
||
Список.Добавить("INTO");
|
||
Список.Добавить("RIGHT");
|
||
Список.Добавить("DISTINCT");
|
||
Список.Добавить("ALLOWED");
|
||
Список.Добавить("GROUP");
|
||
Список.Добавить("JOIN");
|
||
Список.Добавить("DESC");
|
||
Список.Добавить("DROP");
|
||
Список.Добавить("ORDER");
|
||
|
||
Список.Добавить("NOT");
|
||
Список.Добавить("AND");
|
||
Список.Добавить("OR");
|
||
Список.Добавить("CASE");
|
||
Список.Добавить("WHEN");
|
||
Список.Добавить("THEN");
|
||
Список.Добавить("ELSE");
|
||
Список.Добавить("END");
|
||
Список.Добавить("IS");
|
||
Список.Добавить("NULL");
|
||
Список.Добавить("BETWEEN");
|
||
Список.Добавить("IN");
|
||
Список.Добавить("LIKE");
|
||
Список.Добавить("СПЕЦСИМВОЛ");
|
||
Список.Добавить("HIERARCHY");
|
||
Список.Добавить("REFS");
|
||
|
||
//Если РежимКомпоновкиДанных Тогда
|
||
// // Видимо это устаревшие слова
|
||
// Список.Добавить("VALUE");
|
||
// Список.Добавить("VALUES");
|
||
// Список.Добавить("IDENTIFICATOR");
|
||
// Список.Добавить("NAME");
|
||
// Список.Добавить("OBJECT");
|
||
// Список.Добавить("LIST");
|
||
// Список.Добавить("VALUETYPE");
|
||
// Список.Добавить("CHARACTERISTIC");
|
||
// // Это новые слова
|
||
// Список.Добавить("ЗНАЧЕНИЯХАРАКТЕРИСТИК");
|
||
// Список.Добавить("ПОЛЕИМЕНИ");
|
||
// Список.Добавить("ПОЛЕКЛЮЧА");
|
||
// Список.Добавить("ПОЛЕЗНАЧЕНИЯ");
|
||
// Список.Добавить("ПОЛЕВИДА");
|
||
// Список.Добавить("ПОЛЕТИПАЗНАЧЕНИЯ");
|
||
// Список.Добавить("ПОЛЕОБЪЕКТА");
|
||
// Список.Добавить("ВИДЫХАРАКТЕРИСТИК");
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Список;
|
||
|
||
КонецФункции // ПолучитьСписокСловЯзыкаЗапросов()
|
||
|
||
// Получает список ключевых встроенного языка.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СписокЗначений - где значение содержит слово.
|
||
//
|
||
Функция ПолучитьСписокКлючевыхСловВстроенногоЯзыка() Экспорт
|
||
|
||
Список = Новый СписокЗначений;
|
||
Список.Добавить("Возврат");
|
||
Список.Добавить("Return");
|
||
Список.Добавить("ВызватьИсключение");
|
||
Список.Добавить("Raise");
|
||
Список.Добавить("Выполнить");
|
||
Список.Добавить("Execute");
|
||
Список.Добавить("Для");
|
||
Список.Добавить("For");
|
||
Список.Добавить("Если");
|
||
Список.Добавить("If");
|
||
Список.Добавить("И");
|
||
Список.Добавить("And");
|
||
Список.Добавить("Из");
|
||
Список.Добавить("In"); // аналог В (запрос) и ИЗ (встроенный)
|
||
Список.Добавить("Или");
|
||
Список.Добавить("Or");
|
||
Список.Добавить("Иначе");
|
||
Список.Добавить("Else");
|
||
Список.Добавить("ИначеЕсли");
|
||
Список.Добавить("ElsIf");
|
||
Список.Добавить("Исключение");
|
||
Список.Добавить("Except");
|
||
Список.Добавить("Каждого");
|
||
Список.Добавить("Each");
|
||
Список.Добавить("КонецЕсли");
|
||
Список.Добавить("EndIf");
|
||
Список.Добавить("КонецПопытки");
|
||
Список.Добавить("EndTry");
|
||
Список.Добавить("КонецПроцедуры");
|
||
Список.Добавить("EndProcedure");
|
||
Список.Добавить("КонецФункции");
|
||
Список.Добавить("EndFunction");
|
||
Список.Добавить("КонецЦикла");
|
||
Список.Добавить("EndDo");
|
||
Список.Добавить("Не");
|
||
Список.Добавить("Not");
|
||
Список.Добавить("Новый");
|
||
Список.Добавить("New");
|
||
Список.Добавить("Перейти");
|
||
Список.Добавить("Goto");
|
||
Список.Добавить("Перем");
|
||
Список.Добавить("Var");
|
||
Список.Добавить("По");
|
||
Список.Добавить("To");
|
||
Список.Добавить("Пока");
|
||
Список.Добавить("While");
|
||
Список.Добавить("Попытка");
|
||
Список.Добавить("Try");
|
||
Список.Добавить("Прервать");
|
||
Список.Добавить("Break");
|
||
Список.Добавить("Продолжить");
|
||
Список.Добавить("Continue");
|
||
Список.Добавить("Процедура");
|
||
Список.Добавить("Procedure");
|
||
Список.Добавить("Тогда");
|
||
Список.Добавить("Then");
|
||
Список.Добавить("Функция");
|
||
Список.Добавить("Function");
|
||
Список.Добавить("Цикл");
|
||
Список.Добавить("Do");
|
||
Список.Добавить("Экспорт");
|
||
Список.Добавить("Export");
|
||
|
||
//// Инструкции препроцессора. Добавлено 28.01.2012
|
||
//// Здесь им не место, т.к. по этому списку проверяется валидность имен переменных
|
||
//Список.Добавить("Клиент");
|
||
//Список.Добавить("Сервер");
|
||
//Список.Добавить("ВнешнееСоединение");
|
||
//Список.Добавить("ТолстыйКлиентУправляемоеПриложение");
|
||
//Список.Добавить("ТолстыйКлиентОбычноеПриложение");
|
||
//Список.Добавить("ТонкийКлиент");
|
||
//Список.Добавить("ВебКлиент");
|
||
|
||
Список.Добавить("Истина");
|
||
Список.Добавить("True");
|
||
Список.Добавить("Ложь");
|
||
Список.Добавить("False");
|
||
Список.Добавить("Неопределено");
|
||
Список.Добавить("Undefined");
|
||
Список.Добавить("Null");
|
||
Возврат Список;
|
||
|
||
КонецФункции // ПолучитьСписокСловЯзыкаЗапросов()
|
||
|
||
// Размаскирует обращения к временным таблицам в тексте запроса.
|
||
//
|
||
// Параметры:
|
||
// ТекстЗапроса – Строка;
|
||
// МассивВременныхТаблиц – Массив – элементами являются имена временных таблиц, замаскированных ранее.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - новые текст запроса.
|
||
//
|
||
Функция РазмаскироватьВременныеТаблицы(ТекстЗапроса, МассивВременныхТаблиц, выхВсеРазмаскировано = Ложь) Экспорт
|
||
|
||
Если МассивВременныхТаблиц.Количество() = 0 Тогда
|
||
Возврат ТекстЗапроса;
|
||
КонецЕсли;
|
||
// Допустимы 2 уровня скобок внутри имитатора временной таблицы.
|
||
RegExp.Global = Истина;
|
||
RegExp.MultiLine = Истина;
|
||
RegExp.IgnoreCase = Истина;
|
||
ИмяВременнойТаблицы = "";
|
||
Для Каждого ПодмененнаяВременнаяТаблица Из МассивВременныхТаблиц Цикл
|
||
ИмяВременнойТаблицы = ИмяВременнойТаблицы + "|" + ПодмененнаяВременнаяТаблица;
|
||
КонецЦикла;
|
||
ИмяВременнойТаблицы = Сред(ИмяВременнойТаблицы, 2);
|
||
НовыйТекстЗапроса = ТекстЗапроса;
|
||
|
||
// Сначала делаем красивые замены - подзапрос на имя временной таблицы
|
||
//RegExp.Pattern = "\(ВЫБРАТЬ(?:" + шСкобки + "|[^$\(\)])*?""ВременнаяТаблица"" = ""(" + ИмяВременнойТаблицы + ")""\)";
|
||
RegExp.Pattern = "\(ВЫБРАТЬ(?:[^\(\)]*(?:" + шСкобки + "[^\(\)]*)*)""ВременнаяТаблица"" = ""("
|
||
+ ИмяВременнойТаблицы + ")""\s*\)";
|
||
НовыйТекстЗапроса = RegExp.Replace(НовыйТекстЗапроса, "$2");
|
||
выхВсеРазмаскировано = Найти(НовыйТекстЗапроса, """ВременнаяТаблица"" = """) = 0;
|
||
Если Не выхВсеРазмаскировано Тогда
|
||
// А теперь делаем некрасивые замены - оставляем подзапросы но заменяем в них имена полей и временной таблицы
|
||
RegExp.Pattern = "\(ВЫБРАТЬ(?:[^\(\)]*(?:" + шСкобки + "[^\(\)]*)*)""ВременнаяТаблица"" = ""("
|
||
+ ИмяВременнойТаблицы + ")""";
|
||
НовыйТекстЗапроса = RegExp.Replace(НовыйТекстЗапроса, "(ВЫБРАТЬ Т.* ИЗ $2 КАК Т ГДЕ ИСТИНА");
|
||
// и0ие90цаун787
|
||
RegExp.Pattern = "ВЫБОР\s+КОГДА\s+""!ИмяПоля!""\s+=\s+""(.+?)""\s+ТОГДА\s+.+?\n\s*(?:КОГДА\s+ЛОЖЬ\s+ТОГДА\s+.+?\n)*\s*КОНЕЦ";
|
||
НовыйТекстЗапроса = RegExp.Replace(НовыйТекстЗапроса, "Т.$1");
|
||
выхВсеРазмаскировано = Найти(НовыйТекстЗапроса, """ВременнаяТаблица"" = """) = 0;
|
||
КонецЕсли;
|
||
Если Не выхВсеРазмаскировано Тогда
|
||
ВызватьИсключение "Не удалось размаскировать временные таблицы в тексте запроса. Возможно на них был наложен несовместимый с маскировкой отбор компоновки.";
|
||
КонецЕсли;
|
||
Возврат НовыйТекстЗапроса;
|
||
|
||
КонецФункции // РазмаскироватьВременныеТаблицы()
|
||
|
||
// Получает текст запроса, где каждая временная таблица заменена своим имитатором.
|
||
//
|
||
// Параметры:
|
||
// ОбъектЗапроса – Запрос;
|
||
// *ТекстЗапроса – Строка, *Неопределено;
|
||
// *МассивВременныхТаблиц - Массив, *Неопределено - все подменяемые таблицы заносятся сюда.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - новый текст запроса.
|
||
//
|
||
Функция ЗамаскироватьВременныеТаблицы(ОбъектЗапроса, Знач ТекстЗапроса = Неопределено,
|
||
МассивВременныхТаблиц = Неопределено) Экспорт
|
||
|
||
Если ТекстЗапроса = Неопределено Тогда
|
||
ТекстЗапроса = ОбъектЗапроса.Текст;
|
||
КонецЕсли;
|
||
ВременныйЗапрос = Новый Запрос;
|
||
ВременныйЗапрос.МенеджерВременныхТаблиц = ОбъектЗапроса.МенеджерВременныхТаблиц;
|
||
ПроверочныйЗапрос = Новый ПостроительЗапроса;
|
||
|
||
//// Исключительная ситуация должна быть обработана сверху
|
||
//ПараметрыЗапроса = ВременныйЗапрос.НайтиПараметры();
|
||
|
||
Если ТипЗнч(МассивВременныхТаблиц) <> Тип("Массив") Тогда
|
||
МассивВременныхТаблиц = Новый Массив;
|
||
КонецЕсли;
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст(ТекстЗапроса);
|
||
Пока Истина Цикл
|
||
Попытка
|
||
ПроверочныйЗапрос.Текст = ТекстЗапроса;
|
||
//ПроверочныйЗапрос.НайтиПараметры();
|
||
Прервать;
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
//ИмяВременнойТаблицы = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИнформацияОбОшибке.Причина.Описание, """", """");
|
||
ИмяВременнойТаблицы = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИнформацияОбОшибке.Причина.Описание, "Таблица не найдена """, """", Ложь);
|
||
Если ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда
|
||
ВременныйЗапрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы;
|
||
Попытка
|
||
КолонкиВременнойТаблицы = ВременныйЗапрос.Выполнить().Колонки;
|
||
Исключение
|
||
Прервать;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
// В 8.2.15 такой прием лишен смысла, т.к. движок запросов потом не сможет обработать обращения к дочерним полям
|
||
//Если Не ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда
|
||
// ИмяВременнойТаблицы = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИнформацияОбОшибке.Причина.Описание, "Неверные параметры """, """", Ложь);
|
||
// Если ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда
|
||
// Попытка
|
||
// КолонкиВременнойТаблицы = ОбъектЗапроса.Параметры[ИмяВременнойТаблицы].Колонки;
|
||
// Исключение
|
||
// Попытка
|
||
// КолонкиВременнойТаблицы = ВременныйЗапрос.Выполнить().Колонки;
|
||
// Исключение
|
||
// Прервать;
|
||
// КонецПопытки;
|
||
// КонецПопытки;
|
||
// ИмяВременнойТаблицы = "&" + ИмяВременнойТаблицы;
|
||
// КонецЕсли;
|
||
//КонецЕсли;
|
||
Если Не ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
ИмитаторВременнойТаблицы = ирОбщий.ПолучитьЗапросИмитаторКоллекцииПолейЛкс(КолонкиВременнойТаблицы)
|
||
+ " ГДЕ ""ВременнаяТаблица"" = """ + ИмяВременнойТаблицы + """";
|
||
КоординатыОбращения = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИнформацияОбОшибке.Причина.Описание, "{(", ")}");
|
||
НомерСтроки = Число(ирОбщий.ПервыйФрагментЛкс(КоординатыОбращения, ", "));
|
||
НомерКолонки = Число(ирОбщий.ПоследнийФрагментЛкс(КоординатыОбращения, ","));
|
||
СтрокаЗапроса = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки);
|
||
ТекстПосле = Сред(СтрокаЗапроса, НомерКолонки + СтрДлина(ИмяВременнойТаблицы));
|
||
СтрокаКАК = "КАК";
|
||
Если Не ирОбщий.СтрокиРавныЛкс(Лев(СокрЛ(ТекстПосле), СтрДлина(СтрокаКАК)), СтрокаКАК) Тогда
|
||
ТекстПосле = " КАК " + ИмяВременнойТаблицы + " " + ТекстПосле;
|
||
КонецЕсли;
|
||
НоваяСтрока = Лев(СтрокаЗапроса, НомерКолонки - 1) + "(" + ИмитаторВременнойТаблицы + ")" + ТекстПосле;
|
||
ТекстовыйДокумент.ЗаменитьСтроку(НомерСтроки, НоваяСтрока);
|
||
ТекстЗапроса = ТекстовыйДокумент.ПолучитьТекст();
|
||
МассивВременныхТаблиц.Добавить(ИмяВременнойТаблицы);
|
||
КонецПопытки;
|
||
КонецЦикла;
|
||
Возврат ТекстЗапроса;
|
||
|
||
КонецФункции // ЗамаскироватьВременныеТаблицы()
|
||
|
||
// Результат - Массив
|
||
Функция НайтиВозможныеИменаВременныхТаблиц(ТекстЗапроса, ЛиДиалект1С = Истина) Экспорт
|
||
|
||
Имена = Новый Соответствие;
|
||
RegExp.Global = Истина;
|
||
RegExp.pattern = "(?:ИЗ|СОЕДИНЕНИЕ|УНИЧТОЖИТЬ|,)\s+(" + шИмяВременнойТаблицы + ")(?:\s|$|[^\(\._\d" + шБуква + "])";
|
||
РезультатПоиска = RegExp.Execute(ТекстЗапроса);
|
||
Для Каждого Вхождение Из РезультатПоиска Цикл
|
||
Имена.Вставить(Нрег(Вхождение.SubMatches(0)), Вхождение.SubMatches(0));
|
||
КонецЦикла;
|
||
Результат = Новый Массив();
|
||
Для Каждого КлючИЗначение Из Имена Цикл
|
||
Если Истина
|
||
И ЛиДиалект1С
|
||
И (Ложь
|
||
Или ирОбщий.СтрокиРавныЛкс(КлючИЗначение.Значение, "Константы")
|
||
Или Найти(КлючИЗначение.Значение, ".") > 0)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Результат.Добавить(КлючИЗначение.Значение);
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция РазбитьГрубоТекстПакетногоЗапросаНаТекстыЗапросов(ТекстПакета) Экспорт
|
||
|
||
МассивТекстовЗапросов = Новый Массив;
|
||
шСтрокаЗапроса = """(?:(?:"""")|[^""\n])*(?:" + шРазделитель + "*(?:(?:"""")|[^""\n])*)*(?:""|$)";
|
||
|
||
RegExp.Global = Истина;
|
||
ШаблонЗапроса = "(?:" + шСтрокаЗапроса + ")|" + шКомментарий + "|;|$";
|
||
RegExp.Pattern = ШаблонЗапроса;
|
||
|
||
Результат = RegExp.Execute(ТекстПакета);
|
||
НачалоЗапроса = 1;
|
||
ОстальнойТекст = ТекстПакета;
|
||
МассивТаблиц = Новый Массив;
|
||
ДлинаТекстаПакета = СтрДлина(ТекстПакета);
|
||
Для Каждого Match Из Результат Цикл
|
||
Если Истина
|
||
И Match.Value <> ";"
|
||
И Match.FirstIndex <> ДлинаТекстаПакета
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяВременнойТаблицы = "";
|
||
ДлинаТекстаЗапроса = Match.FirstIndex + Match.Length;
|
||
ТекстЗапроса = Сред(ТекстПакета, НачалоЗапроса, ДлинаТекстаЗапроса - НачалоЗапроса + 1);
|
||
Если ПустаяСтрока(ТекстЗапроса) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
//Если ТекстЗапроса = ";" Тогда
|
||
// Продолжить;
|
||
//КонецЕсли;
|
||
ОстальнойТекст = Сред(ОстальнойТекст, ДлинаТекстаЗапроса + 1);
|
||
НачалоЗапроса = НачалоЗапроса + СтрДлина(ТекстЗапроса);
|
||
МассивТекстовЗапросов.Добавить(ТекстЗапроса);
|
||
КонецЦикла;
|
||
|
||
Возврат МассивТекстовЗапросов;
|
||
|
||
КонецФункции // РазбитьГрубоТекстПакетногоЗапросаНаТекстыЗапросов()
|
||
|
||
Функция ПолучитьСтруктуруРезультатаПакетногоЗапроса(ТекстПакета, ПрефиксКомментария = "//") Экспорт
|
||
|
||
МассивТекстовЗапросов = РазбитьГрубоТекстПакетногоЗапросаНаТекстыЗапросов(ТекстПакета);
|
||
RegExp.Global = Ложь;
|
||
RegExp.Multiline = Истина;
|
||
RegExp.Pattern = ПрефиксКомментария + мМаркерИмениЗапросаПакета + "(" + шИмя + ")(?: |\n|\r)";
|
||
Индекс = -1;
|
||
Результат = Новый Структура;
|
||
Для Каждого ТекстЗапроса Из МассивТекстовЗапросов Цикл
|
||
Индекс = Индекс + 1;
|
||
Вхождения = RegExp.Execute(ТекстЗапроса);
|
||
Если Вхождения.Count = 0 Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяЗапроса = Вхождения.Item(0).SubMatches(0);
|
||
Если ирОбщий.ЛиИмяПеременнойЛкс(ИмяЗапроса) Тогда
|
||
Результат.Вставить(ИмяЗапроса, Индекс);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПреобразоватьЗапросВПодзапрос(Текст, ТекстВыбранныхПолей = "*", ПсевдонимВложенногоЗапроса = "ВложенныйЗапрос",
|
||
ОбрезатьНачинаяСУпорядочивания = Ложь, ЭтоРусскийЯзык = Истина, Знач Смещение = "") Экспорт
|
||
|
||
//ЭтоРусскийЯзык = ЭтоРусскийВариантТекстаЗапроса(ТекстЗапроса);
|
||
RegExp.Pattern = "^(?:\s|(" + шКомментарий + "))*((?:ВЫБРАТЬ|SELECT)\s+((?:РАЗРЕШЕННЫЕ|ALLOWED)\s+)?)((?:(?:.|\r|\n)*\s((?:УПОРЯДОЧИТЬ|ORDER)\s+(?:ПО|BY)\s+" + шИмя
|
||
+ "(?:\s*,\s*" + шИмя + ")*(?:\s+(?:АВТОУПОРЯДОЧИВАНИЕ|AUTOORDER))?|(?:АВТОУПОРЯДОЧИВАНИЕ|AUTOORDER)))*)((?:.|\r|\n)*)$";
|
||
РезультатПоиска = RegExp.Execute(Текст).Item(0);
|
||
Если ЭтоРусскийЯзык Тогда
|
||
Результат = "ВЫБРАТЬ";
|
||
Иначе
|
||
Результат = "SELECT";
|
||
КонецЕсли;
|
||
Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(РезультатПоиска.SubMatches(2)) Тогда
|
||
Если ЭтоРусскийЯзык Тогда
|
||
Результат = Результат + " РАЗРЕШЕННЫЕ";
|
||
Иначе
|
||
Результат = Результат + " ALLOWED";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Смещение = Смещение + Символы.Таб;
|
||
Если ЭтоРусскийЯзык Тогда
|
||
Результат = Результат + " " + ТекстВыбранныхПолей + " ИЗ (";
|
||
Иначе
|
||
Результат = Результат + " " + ТекстВыбранныхПолей + " FROM (";
|
||
КонецЕсли;
|
||
НачальныйКомментарий = РезультатПоиска.SubMatches(0);
|
||
Если ЗначениеЗаполнено(НачальныйКомментарий) Тогда
|
||
Результат = Результат + Символы.ПС + Смещение + НачальныйКомментарий;
|
||
Иначе
|
||
Результат = Результат + Символы.ПС;
|
||
КонецЕсли;
|
||
Если ЭтоРусскийЯзык Тогда
|
||
Результат = Результат + Смещение + "ВЫБРАТЬ ";
|
||
Иначе
|
||
Результат = Результат + Смещение + "SELECT ";
|
||
КонецЕсли;
|
||
ТекстДоПоследнегоУПОРЯДОЧИТЬ = РезультатПоиска.SubMatches(3);
|
||
Если ЗначениеЗаполнено(ТекстДоПоследнегоУПОРЯДОЧИТЬ) Тогда
|
||
ТекстДоПоследнегоУПОРЯДОЧИТЬ = ирОбщий.СтрокаБезКонцаЛкс(ТекстДоПоследнегоУПОРЯДОЧИТЬ, СтрДлина(РезультатПоиска.SubMatches(4)));
|
||
ирОбщий.ДобавитьМногострочнуюСтрокуВТекстЛкс(Результат, ТекстДоПоследнегоУПОРЯДОЧИТЬ, Смещение);
|
||
Иначе
|
||
ирОбщий.ДобавитьМногострочнуюСтрокуВТекстЛкс(Результат, РезультатПоиска.SubMatches(5), Смещение);
|
||
КонецЕсли;
|
||
Если ЭтоРусскийЯзык Тогда
|
||
Результат = Результат + ") КАК ";
|
||
Иначе
|
||
Результат = Результат + ") AS ";
|
||
КонецЕсли;
|
||
Результат = Результат + ПсевдонимВложенногоЗапроса;
|
||
Если Истина
|
||
//И ТекстДоПоследнегоУПОРЯДОЧИТЬ <> Неопределено
|
||
И Не ПустаяСтрока(ТекстДоПоследнегоУПОРЯДОЧИТЬ)
|
||
И Не ОбрезатьНачинаяСУпорядочивания
|
||
Тогда
|
||
Результат = Результат + Символы.ПС + РезультатПоиска.SubMatches(4) + РезультатПоиска.SubMatches(5);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьТекстЗапросаДоУпорядочивания()
|
||
|
||
// Получает имя создаваемой временной таблицы из текста запроса.
|
||
// Это неточный метод, основанный на regexp.
|
||
//
|
||
// Параметры:
|
||
// ТекстЗапроса – Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка, Неопределено.
|
||
//
|
||
Функция ПолучитьМассивСоздаваемыхВременныхТаблицПакета(ТекстПакета, ТолькоТребующиеУничтоженияНаВходе = Ложь) Экспорт
|
||
|
||
МассивТекстовЗапросов = РазбитьГрубоТекстПакетногоЗапросаНаТекстыЗапросов(ТекстПакета);
|
||
RegExp2.Global = Истина;
|
||
// Ищем в очередном запросе предложение ПОМЕСТИТЬ
|
||
шСтрокаЗапроса = """(?:(?:"""")|[^""\n])*(?:" + шРазделитель + "*(?:(?:"""")|[^""\n])*)*(?:""|$)";
|
||
ШаблонПОМЕСТИТЬИЗ = "(?:" + шСтрокаЗапроса + ")|(?:" + шРазделитель + "(?:(ПОМЕСТИТЬ|INTO\s+TABLE|INTO)|(УНИЧТОЖИТЬ|DROP|DROP\s+TABLE))" + шРазделитель
|
||
+ "+(" + шИмяВременнойТаблицы + ")(" + шРазделитель + "|;)|(?:" + шРазделитель + "))";
|
||
RegExp2.Pattern = ШаблонПОМЕСТИТЬИЗ;
|
||
СозданныеТаблицы = Новый Массив;
|
||
СозданныеТаблицыНрег = Новый Массив;
|
||
СначалаУничтоженныеТаблицы = Новый Массив;
|
||
Для Каждого ТекстЗапроса Из МассивТекстовЗапросов Цикл
|
||
Результат2 = RegExp2.Execute(ТекстЗапроса);
|
||
ИмяСозданнойВременнойТаблицы = Неопределено;
|
||
Для Каждого Match2 Из Результат2 Цикл
|
||
Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(Match2.SubMatches(0)) Тогда
|
||
ИмяВременнойТаблицы = Match2.SubMatches(2);
|
||
Если Ложь
|
||
Или Не ТолькоТребующиеУничтоженияНаВходе
|
||
Или СначалаУничтоженныеТаблицы.Найти(НРег(ИмяВременнойТаблицы)) = Неопределено
|
||
Тогда
|
||
ИмяСозданнойВременнойТаблицы = ИмяВременнойТаблицы;
|
||
КонецЕсли;
|
||
Прервать;
|
||
ИначеЕсли Истина
|
||
И ТолькоТребующиеУничтоженияНаВходе
|
||
И Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(Match2.SubMatches(1))
|
||
Тогда
|
||
ИмяВременнойТаблицы = Нрег(Match2.SubMatches(2));
|
||
Если СозданныеТаблицыНрег.Найти(ИмяВременнойТаблицы) = Неопределено Тогда
|
||
СначалаУничтоженныеТаблицы.Добавить(ИмяВременнойТаблицы);
|
||
КонецЕсли;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
СозданныеТаблицы.Добавить(ИмяСозданнойВременнойТаблицы);
|
||
Если ИмяСозданнойВременнойТаблицы <> Неопределено Тогда
|
||
СозданныеТаблицыНрег.Добавить(НРег(ИмяСозданнойВременнойТаблицы));
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат СозданныеТаблицы;
|
||
|
||
КонецФункции
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// РАБОТА С ТИПАМИ
|
||
|
||
// Получает чистую внутреннюю таблицу предопределенных слов.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений – с колонками "Слово", "ТипСлова", "ТаблицаСтруктурТипов".
|
||
//
|
||
Функция ПолучитьНовуюВнутреннююТаблицуСлов()
|
||
|
||
ВнутренняяТаблицаСлов = Новый ТаблицаЗначений;
|
||
ВнутренняяТаблицаСлов.Колонки.Добавить("Слово");
|
||
ВнутренняяТаблицаСлов.Колонки.Добавить("ТипСлова");
|
||
ВнутренняяТаблицаСлов.Колонки.Добавить("ТаблицаСтруктурТипов");
|
||
ВнутренняяТаблицаСлов.Колонки.Добавить("ТипЗначения");
|
||
ВнутренняяТаблицаСлов.Индексы.Добавить("Слово, ТипСлова");
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
|
||
КонецФункции // ПолучитьНовуюВнутреннююТаблицуСлов()
|
||
|
||
// Функция - Подобрать вариант синтаксиса метода
|
||
//
|
||
// Параметры:
|
||
// ТаблицаВариантов - - содержимое будет утеряно!
|
||
//
|
||
// Возвращаемое значение:
|
||
// строка - название варианта синтаксиса
|
||
//
|
||
Функция ПодобратьВариантСинтаксисаМетода(Знач ТаблицаВариантов, КоличествоФактПараметровМетода, ТекущийВариант = "", ТекущийВариантУстановленВручную = Ложь) Экспорт
|
||
|
||
ТаблицаВариантов.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
|
||
ТаблицаВариантов.ЗаполнитьЗначения(1, "Количество");
|
||
ТаблицаВариантов.Свернуть("ВариантСинтаксиса", "Количество");
|
||
ТаблицаВариантов.Сортировать("Количество");
|
||
НовыйТекущийВариант = "";
|
||
Если ТаблицаВариантов.Количество() > 0 Тогда
|
||
Для Каждого СтрокаВарианта Из ТаблицаВариантов Цикл
|
||
Если СтрокаВарианта.Количество >= КоличествоФактПараметровМетода Тогда
|
||
НовыйТекущийВариант = СтрокаВарианта.ВариантСинтаксиса;
|
||
Если Ложь
|
||
Или Не ТекущийВариантУстановленВручную
|
||
Или ТекущийВариантУстановленВручную И НовыйТекущийВариант = ТекущийВариант
|
||
Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если СтрокаВарианта.Количество < КоличествоФактПараметровМетода Тогда
|
||
НовыйТекущийВариант = СтрокаВарианта.ВариантСинтаксиса;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат НовыйТекущийВариант;
|
||
|
||
КонецФункции
|
||
|
||
Функция ДоступныеЗначенияТипа(Знач ИмяТипаЗначения) Экспорт
|
||
|
||
мПлатформа = ирКэш.Получить();
|
||
#Если Сервер И Не Сервер Тогда
|
||
мПлатформа = Обработки.ирПлатформа.Создать();
|
||
#КонецЕсли
|
||
мПлатформа.ИнициализацияОписанияМетодовИСвойств();
|
||
СтрокиЗначений = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ТипКонтекста, ТипСлова", ИмяТипаЗначения, "Свойство"));
|
||
Если СтрокиЗначений.Количество() > 0 Тогда
|
||
Попытка
|
||
Пустышка = Вычислить("Метаданные.СвойстваОбъектов." + ИмяТипаЗначения);
|
||
Исключение
|
||
//Продолжить;
|
||
КонецПопытки;
|
||
Иначе
|
||
СтрокиЗначений = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ТипКонтекста, ТипСлова", "Перечисление" + ИмяТипаЗначения, "Свойство"));
|
||
Если СтрокиЗначений.Количество() = 0 Тогда
|
||
//Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтрокиЗначений = мПлатформа.ТаблицаКонтекстов.Скопировать(СтрокиЗначений);
|
||
СписокЗначений = Новый СписокЗначений;
|
||
СписокЗначений.ЗагрузитьЗначения(СтрокиЗначений.ВыгрузитьКолонку("Слово"));
|
||
Возврат СписокЗначений;
|
||
|
||
КонецФункции
|
||
|
||
#Если Клиент Тогда
|
||
|
||
// Позволяет пользователю выбрать один из возможных вариантов описания слова.
|
||
//
|
||
// Параметры:
|
||
// СтруктураЦикла – Соответствие – где ключи - имена ветвей дерева, а значения - таблицы структур типов;
|
||
// *ВключатьПутьКОписаниюТипаЗначения - Булево, *Неопределено - признак добавления в список выбора тип значения слова.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СтрокаТаблицыЗначений, Структура - описание слова.
|
||
//
|
||
Функция ВыбратьСтрокуОписанияИзМассиваСтруктурТипов(СтруктураЦикла, ВключатьПутьКОписаниюТипаЗначения = Ложь, ВладелецФормы = Неопределено, Слово = "",
|
||
НомерПараметраМетода = 0, БезусловнаяАктивизацияРезультатов = Истина, выхФормаВыбора = Неопределено, КоличествоФактПараметровМетода = 0) Экспорт
|
||
|
||
ДеревоВыбора = Новый ДеревоЗначений;
|
||
ДеревоВыбора.Колонки.Добавить("Ключ");
|
||
ДеревоВыбора.Колонки.Добавить("Представление");
|
||
ДеревоВыбора.Колонки.Добавить("ТипСлова");
|
||
СчетчикСтрокВторогоУровня = 0;
|
||
НачальнаяСтрокаВыбора = Неопределено;
|
||
Для Каждого ЭлементЦикла Из СтруктураЦикла Цикл
|
||
СтрокаЭлементаЦикла = ДеревоВыбора.Строки.Добавить();
|
||
СтрокаЭлементаЦикла.Представление = ЭлементЦикла.Ключ;
|
||
КонецЦикла;
|
||
ДеревоВыбора.Строки.Сортировать("Представление");
|
||
Для Каждого СтрокаЭлементаЦикла Из ДеревоВыбора.Строки Цикл
|
||
Для Каждого СтруктураТипаКонтекста Из СтруктураЦикла[СтрокаЭлементаЦикла.Представление] Цикл
|
||
//Если СтруктураТипаКонтекста.СтрокаОписания = Неопределено Тогда
|
||
// Продолжить;
|
||
//КонецЕсли;
|
||
Если СтруктураТипаКонтекста.ИмяОбщегоТипа = "Неизвестный контекст" Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СтрокаОписания = СтруктураТипаКонтекста.СтрокаОписания;
|
||
|
||
// Ранее среди параметров были: ПутьКСлову = "", ТекущееСлово = "",
|
||
//// Добавим строку описания слова
|
||
//ЭтоИмяТипа = Ложь;
|
||
//Попытка
|
||
// Если СтрокаОписания.ТипЯзыка = "ИмяТипа" Тогда
|
||
// ЭтоИмяТипа = Истина;
|
||
// КонецЕсли;
|
||
//Исключение
|
||
//КонецПопытки;
|
||
//
|
||
//Если ЭтоИмяТипа Тогда
|
||
//
|
||
// Если Прав(ПутьКСлову, 1) = "(" Тогда
|
||
// ЧистыйПутьКСлову = Лев(ПутьКСлову, СтрДлина(ПутьКСлову) - 1);
|
||
// Иначе
|
||
// ЧистыйПутьКСлову = ТекущееСлово;
|
||
// КонецЕсли;
|
||
//
|
||
// БазовыйТип = ирОбщий.ПервыйФрагментЛкс(ЧистыйПутьКСлову);
|
||
// Если БазовыйТип = "" Тогда
|
||
// // Неизвестный контекст
|
||
// СтрокаОписания = Неопределено;
|
||
// Иначе
|
||
// СтрокаОписания = ТаблицаОбщихТипов.Найти(БазовыйТип, "БазовыйТип");
|
||
// КонецЕсли;
|
||
//КонецЕсли;
|
||
|
||
Если Истина
|
||
И СтрокаОписания <> Неопределено
|
||
И ТипЗнч(СтрокаОписания) <> Тип("COMОбъект")
|
||
И СтрокаЭлементаЦикла.Строки.Найти(СтрокаОписания, "Ключ") = Неопределено
|
||
И СтрокаОписания.Владелец().Колонки.Найти("ЛиЭкспорт") = Неопределено
|
||
И (Ложь
|
||
Или СтрокаОписания.Владелец().Колонки.Найти("ТипЯзыка") = Неопределено
|
||
Или СтрокаОписания.ТипЯзыка <> "ИмяТипа")
|
||
Тогда
|
||
ПредставлениеТипа = СтрокаОписания.Слово;
|
||
Если Истина
|
||
И СтрокаОписания.Владелец().Колонки.Найти("ТипКонтекста") <> Неопределено
|
||
И ЗначениеЗаполнено(СтрокаОписания.ТипКонтекста)
|
||
Тогда
|
||
ПредставлениеТипа = СтрокаОписания.ТипКонтекста + "." + ПредставлениеТипа;
|
||
КонецЕсли;
|
||
СтрокаДереваВыбора = СтрокаЭлементаЦикла.Строки.Добавить();
|
||
СтрокаДереваВыбора.Ключ = СтрокаОписания;
|
||
Попытка
|
||
СтрокаДереваВыбора.ТипСлова = СтрокаОписания.ТипСлова;
|
||
Исключение
|
||
СтрокаДереваВыбора.ТипСлова = "Тип";
|
||
КонецПопытки;
|
||
СтрокаДереваВыбора.Представление = ПредставлениеТипа;
|
||
КонецЕсли;
|
||
|
||
Если ВключатьПутьКОписаниюТипаЗначения Тогда
|
||
// Добавим строку описания типа значения
|
||
СтрокаОписанияТипаЗначения = ТаблицаОбщихТипов.Найти(НРег(СтруктураТипаКонтекста.ИмяОбщегоТипа), "НСлово");
|
||
Если СтрокаОписанияТипаЗначения <> Неопределено Тогда
|
||
Если СтрокаЭлементаЦикла.Строки.Найти(СтрокаОписанияТипаЗначения, "Ключ") = Неопределено Тогда
|
||
ПредставлениеТипа = СтрокаОписанияТипаЗначения.Слово;
|
||
СтрокаДереваВыбора = СтрокаЭлементаЦикла.Строки.Добавить();
|
||
СтрокаДереваВыбора.Ключ = СтрокаОписанияТипаЗначения;
|
||
СтрокаДереваВыбора.ТипСлова = "Тип";
|
||
СтрокаДереваВыбора.Представление = ПредставлениеТипа;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецЦикла;
|
||
СчетчикСтрокВторогоУровня = СчетчикСтрокВторогоУровня + СтрокаЭлементаЦикла.Строки.Количество();
|
||
Если Истина
|
||
И НачальнаяСтрокаВыбора = Неопределено
|
||
И СтрокаЭлементаЦикла.Строки.Количество() > 0
|
||
Тогда
|
||
Если СтрокаДереваВыбора.ТипСлова = "Конструктор" Тогда
|
||
Отбор = Новый Структура;
|
||
Отбор.Вставить("ТипКонтекста", СтрокаОписания.ТипКонтекста);
|
||
Отбор.Вставить("Слово", "<Новый>");
|
||
Отбор.Вставить("ЯзыкПрограммы", 0);
|
||
ТаблицаВариантов = ТаблицаПараметров.Скопировать(Отбор);
|
||
НовыйТекущийВариант = ПодобратьВариантСинтаксисаМетода(ТаблицаВариантов, КоличествоФактПараметровМетода);
|
||
Для Каждого СтрокаВарианта Из СтрокаЭлементаЦикла.Строки Цикл
|
||
Если НовыйТекущийВариант = СтрокаВарианта.Ключ.Слово Тогда
|
||
НачальнаяСтрокаВыбора = СтрокаВарианта;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Иначе
|
||
НачальнаяСтрокаВыбора = СтрокаЭлементаЦикла.Строки[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтрокаЭлементаЦикла.Строки.Сортировать("Представление");
|
||
КонецЦикла;
|
||
выхФормаВыбора = ирОбщий.ПолучитьФормуЛкс("Обработка.ирСинтаксПомощник.Форма");
|
||
Если СчетчикСтрокВторогоУровня > 0 Или выхФормаВыбора.Открыта() Тогда
|
||
выхФормаВыбора.ДеревоТиповСлова = ДеревоВыбора;
|
||
выхФормаВыбора.ИскомоеСлово = Слово;
|
||
выхФормаВыбора.ПоискСУчетомТипаСлова = Истина;
|
||
выхФормаВыбора.НомерИскомогоПараметра = НомерПараметраМетода;
|
||
выхФормаВыбора.ВладелецФормы = ВладелецФормы;
|
||
Если НачальнаяСтрокаВыбора <> Неопределено Тогда
|
||
выхФормаВыбора.ВыбратьИскомуюСтроку(НачальнаяСтрокаВыбора, БезусловнаяАктивизацияРезультатов);
|
||
КонецЕсли;
|
||
выхФормаВыбора.ВладелецФормы = Неопределено; // Перенес в саму форму
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или СчетчикСтрокВторогоУровня = 1
|
||
Или (Истина
|
||
И СчетчикСтрокВторогоУровня = 2
|
||
И ДеревоВыбора.Строки[0].Строки.Количество() = 1
|
||
И НачальнаяСтрокаВыбора.Ключ = ДеревоВыбора.Строки[1].Строки[0].Ключ)
|
||
Тогда
|
||
ВыбранныйЭлементТипа = НачальнаяСтрокаВыбора;
|
||
ИначеЕсли СчетчикСтрокВторогоУровня > 1 Тогда
|
||
//ФормаВыбора = ПолучитьФорму("ФормаВыбораСправкиПоСлову");
|
||
//ФормаВыбора.ДеревоТиповСлова = ДеревоВыбора;
|
||
//ФормаВыбора.НачальноеЗначениеВыбора = НачальнаяСтрокаВыбора;
|
||
//ВыбранныйЭлементТипа = ФормаВыбора.ОткрытьМодально();
|
||
ВыбранныйЭлементТипа = НачальнаяСтрокаВыбора;
|
||
Иначе
|
||
ВыбранныйЭлементТипа = Неопределено;
|
||
КонецЕсли;
|
||
Если ВыбранныйЭлементТипа = Неопределено Тогда
|
||
СтрокаОписания = Неопределено;
|
||
Иначе
|
||
СтрокаОписания = ВыбранныйЭлементТипа.Ключ;
|
||
КонецЕсли;
|
||
|
||
Возврат СтрокаОписания;
|
||
|
||
КонецФункции
|
||
|
||
#КонецЕсли
|
||
|
||
// Формирует построитель запроса по структуре типа.
|
||
//
|
||
// Параметры:
|
||
// СтруктураТипа – Структура - описатель типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ПостроительЗапроса.
|
||
//
|
||
Функция ПолучитьПостроительЗапросаПоСтруктуреТипа(СтрокаОбщегоТипа, ВиртуальнаяТаблица = Неопределено)
|
||
|
||
МетаданныеРодителя = СтрокаОбщегоТипа.Метаданные;
|
||
ТипМетаданныхРодителя = ТипЗнч(МетаданныеРодителя);
|
||
Если ТипМетаданныхРодителя = Тип("ОбъектМетаданных") Тогда
|
||
ПолноеИмя = МетаданныеРодителя.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(КэшОбъект(МетаданныеРодителя).ПолноеИмя);
|
||
КонецЕсли;
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(ПолноеИмя);
|
||
КорневойТипРодителя = МассивФрагментов[0];
|
||
ПостроительЗапроса = Новый ПостроительЗапроса;
|
||
Если ПолучитьСтрокуТипаМетаОбъектов(КорневойТипРодителя, , 0) <> Неопределено Тогда
|
||
Если Ложь
|
||
Или (Истина
|
||
И МассивФрагментов.Количество() = 2
|
||
И МассивФрагментов[0] <> "ВнешнийИсточникДанных")
|
||
Или (Истина
|
||
И МассивФрагментов.Количество() = 4
|
||
И МассивФрагментов[2] = "ТабличнаяЧасть")
|
||
Тогда
|
||
Если ТипМетаданныхРодителя = Тип("ОбъектМетаданных") Тогда
|
||
//Если КорневойТипРодителя = "Константа" Тогда
|
||
Если СтрокаОбщегоТипа.ИмяОбщегоТипа = "Константы.<Имя константы>" Тогда
|
||
ОпределениеТаблицы = "ВЫБРАТЬ Константы." + МассивФрагментов[1];
|
||
Иначе
|
||
//ИмяТаблицы = КорневойТипРодителя + "." + МассивФрагментов[1];
|
||
//Если МассивФрагментов.Количество() > 2 Тогда
|
||
// ИмяТаблицы = ИмяТаблицы + "." + МассивФрагментов[3];
|
||
//КонецЕсли;
|
||
ИмяТаблицы = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмя, Ложь, ВиртуальнаяТаблица = Неопределено); // Добавлено 14.04.2012
|
||
|
||
УникальноеИмяТаблицы = "______________________";
|
||
ОпределениеТаблицы = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы ;
|
||
Если ВиртуальнаяТаблица <> Неопределено Тогда
|
||
ОпределениеТаблицы = ОпределениеТаблицы + ВиртуальнаяТаблица.Выражение;
|
||
КонецЕсли;
|
||
ОпределениеТаблицы = ОпределениеТаблицы + " КАК " + УникальноеИмяТаблицы;
|
||
КонецЕсли;
|
||
Попытка
|
||
// Тормоз
|
||
ПостроительЗапроса.Текст = ОпределениеТаблицы;
|
||
Исключение
|
||
Успех = Ложь;
|
||
Если ВиртуальнаяТаблица <> Неопределено Тогда
|
||
ПозицияСкобки = Найти(ВиртуальнаяТаблица.Выражение, "(");
|
||
Если ПозицияСкобки > 0 Тогда
|
||
ОпределениеТаблицы = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы ;
|
||
ОпределениеТаблицы = ОпределениеТаблицы + Лев(ВиртуальнаяТаблица.Выражение, ПозицияСкобки - 1);
|
||
ОпределениеТаблицы = ОпределениеТаблицы + " КАК " + УникальноеИмяТаблицы;
|
||
Попытка
|
||
ПостроительЗапроса.Текст = ОпределениеТаблицы;
|
||
Успех = Истина;
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Не Успех Тогда
|
||
ВызватьИсключение "ОшибкаВычисленияВиртуальнойТаблицы";
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
// Тормоз
|
||
ПостроительЗапроса.ЗаполнитьНастройки();
|
||
Иначе
|
||
ЗапросРеквизитов = Новый Запрос("ВЫБРАТЬ Имя, ТипыСтрокой ИЗ Справочник.СвойстваМетаданных ГДЕ Владелец = &СсылкаМД");
|
||
ЗапросРеквизитов.УстановитьПараметр("СсылкаМД", МетаданныеРодителя);
|
||
ТаблицаРеквизитов = ЗапросРеквизитов.Выполнить().Выгрузить();
|
||
Для Каждого СтрокаРеквизита Из ТаблицаРеквизитов Цикл
|
||
ДоступноеПоле = ПостроительЗапроса.ДоступныеПоля.Добавить(СтрокаРеквизита.Имя);
|
||
Для Каждого СтрокаТипа Из СтрокаРеквизита.Типы Цикл
|
||
МассивТипов = Новый Массив;
|
||
ОбъектМД = КэшОбъект(СтрокаТипа.Объект);
|
||
МассивТипов.Добавить(Тип(ОбъектМД.Наименование));
|
||
КонецЦикла;
|
||
ДоступноеПоле.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Возврат ПостроительЗапроса;
|
||
|
||
КонецФункции // ПолучитьПостроительЗапросаПоСтруктуреТипа()
|
||
|
||
// Получает массив общих типов, дополняя исходный тип расширениями.
|
||
//
|
||
// Параметры:
|
||
// СтруктураТипа – Структура.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Массив - структур типа.
|
||
//
|
||
Функция ПолучитьТаблицуОбщихТиповСтруктурыТипа(СтруктураТипа) Экспорт
|
||
|
||
МассивОбщихТипов = ПолучитьНовуюТаблицуДополнительныхТипов();
|
||
ЗаполнитьЗначенияСвойств(МассивОбщихТипов.Добавить(), СтруктураТипа);
|
||
Если Найти(СтруктураТипа.ИмяОбщегоТипа, "ТабличнаяЧасть.") > 0 Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Табличная часть";
|
||
ИначеЕсли Найти(СтруктураТипа.ИмяОбщегоТипа, "ТабличнаяЧастьСтрока.") > 0 Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Строка табличной части";
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "ПолеТекстовогоДокумента" Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "ТекстовыйДокумент";
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "ПолеГрафическойСхемы" Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "ГрафическаяСхема";
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "ПолеТабличногоДокумента" Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "ТабличныйДокумент";
|
||
//ИначеЕсли Найти(СтруктураТипа.ИмяОбщегоТипа, "Расширение формы") > 0 Тогда
|
||
// НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
// ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
// НоваяСтрока.ИмяОбщегоТипа = "Форма";
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "Локальный" Тогда
|
||
Если ТипЗнч(СтруктураТипа.Метаданные) <> Тип("COMОбъект") Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Глобальный";
|
||
// Этот раздел был в 8.2. Но в каком то релизе 8.3 убрали
|
||
//НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
//ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
//НоваяСтрока.ИмяОбщегоТипа = "Общее";
|
||
КонецЕсли;
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "Automation сервер" Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Глобальный";
|
||
ИначеЕсли СтруктураТипа.ИмяОбщегоТипа = "Внешнее соединение" Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Глобальный";
|
||
Иначе
|
||
ОбщийТипМетаданных = ирОбщий.СтрокаМеждуМаркерамиЛкс(СтруктураТипа.ИмяОбщегоТипа, , ": ", Ложь);
|
||
//Если ОбщийТипМетаданных <> "" Тогда
|
||
Если ЗначениеЗаполнено(ОбщийТипМетаданных) Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = ОбщийТипМетаданных;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
// Расширения, образованные элементом управления и типом связанных с ним данных
|
||
СтрокаРасширения = ТаблицаРасширенийТипов.Найти(СтруктураТипа.ИмяОбщегоТипа, "Расширение");
|
||
Если СтрокаРасширения <> Неопределено Тогда
|
||
Если Истина
|
||
И СтрокаРасширения.ОсновнойТип = "Форма"
|
||
И СтруктураТипа.ДополнительныеТипы = Неопределено
|
||
Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = СтрокаРасширения.РасширяющийТип;
|
||
//НоваяСтрока.НеВключатьМетоды = Истина; // Закомментировал 30.09.2010
|
||
#Если Клиент Тогда
|
||
Если ТипЗнч(СтруктураТипа.Метаданные) = Тип("Форма") Тогда
|
||
ОсновнойРеквизитФормы = ПолучитьИмяОсновногоРеквизитаФормы(СтруктураТипа.Метаданные);
|
||
НоваяСтрока.Метаданные = ирОбщий.ПолучитьМетаданныеЛкс(СтруктураТипа.Метаданные[ОсновнойРеквизитФормы]);
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = СтрокаРасширения.ОсновнойТип;
|
||
КонецЕсли;
|
||
|
||
// Общие расширения элементов управления
|
||
лИмяОбщегоТипа = МассивОбщихТипов[МассивОбщихТипов.Количество() - 1].ИмяОбщегоТипа;
|
||
Если МассивОбычныхЭлементовУправления.Найти(лИмяОбщегоТипа) <> Неопределено Тогда
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
НоваяСтрока.ИмяОбщегоТипа = "Расширение элементов управления, расположенных в форме";
|
||
НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
// Эту синтаксическую ошибку исправили только в 13-м релизе.
|
||
//НоваяСтрока.ИмяОбщегоТипа = "Расширение элементов управления, расположенных на панели";
|
||
НоваяСтрока.ИмяОбщегоТипа = "Расширение элементов управления расположенных на панели";
|
||
//ИначеЕсли МассивУправляемыхЭлементовУправления.Найти(лИмяОбщегоТипа) <> Неопределено Тогда
|
||
// // http://www.hostedredmine.com/issues/882998
|
||
// НоваяСтрока = МассивОбщихТипов.Добавить();
|
||
// ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураТипа);
|
||
// НоваяСтрока.ИмяОбщегоТипа = "Расширение элементов управления, расположенных в форме";
|
||
КонецЕсли;
|
||
|
||
Если СтруктураТипа.ДополнительныеТипы <> Неопределено Тогда
|
||
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(СтруктураТипа.ДополнительныеТипы, МассивОбщихТипов);
|
||
КонецЕсли;
|
||
Возврат МассивОбщихТипов;
|
||
|
||
КонецФункции // ПолучитьТаблицуОбщихТиповСтруктурыТипа()
|
||
|
||
// Получает внутреннюю таблицу метаданных слов заданного родительского типа.
|
||
//
|
||
// Параметры:
|
||
// РодительскаяСтруктураТипа – Структура;
|
||
// *Слово – Строка, *Неопределено – для отбора;
|
||
// *ТипСлова – Строка, *Неопределено – для отбора;
|
||
// *ВиртуальнаяТаблица - Структура, *Неопределено - описание виртуальной таблицы;
|
||
// *ЯзыкПрограммы - *Число, 0;
|
||
// *ТекущийИндекс - Строка - выражение в квадратных скобках.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений – с колонками "Слово", "ТипСлова", "ТаблицаСтруктурТипов".
|
||
//
|
||
Функция ПолучитьВнутреннююТаблицуМетаданныхСлов(Знач РодительскаяСтруктураТипа, Знач Слово = Неопределено, Знач ТипСлова = Неопределено, Знач ВиртуальнаяТаблица = Неопределено, Знач ЯзыкПрограммы = 0,
|
||
Знач ТекущийИндекс = Неопределено, Знач ВнешниеФункцииКомпоновкиДанных = Истина, Знач ВычислятьТипы = Истина, Знач ЛиСерверныйКонтекст = Ложь, Знач МодульМетаданных = Неопределено) Экспорт
|
||
|
||
ВнутренняяТаблицаСлов = ПолучитьНовуюВнутреннююТаблицуСлов();
|
||
ЭтоМетаданныеТабличнойЧастиВнешнейОбработки = ирОбщий.ПервыйФрагментЛкс("" + РодительскаяСтруктураТипа.Метаданные) = "ВнешняяОбработкаТабличнаяЧасть";
|
||
Если Не ЭтоМетаданныеТабличнойЧастиВнешнейОбработки Тогда
|
||
КонкретныйТип = ИмяТипаИзСтруктурыТипа(РодительскаяСтруктураТипа);
|
||
Если Найти(КонкретныйТип, "<") > 0 Тогда
|
||
// Такой конкретный тип не разрешен
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
ТаблицуОбщихТиповСтруктурыТипа = ПолучитьТаблицуОбщихТиповСтруктурыТипа(РодительскаяСтруктураТипа);
|
||
|
||
Если Истина
|
||
И Слово <> Неопределено
|
||
И ТекущийИндекс <> Неопределено
|
||
Тогда
|
||
RegExp.Global = Ложь;
|
||
RegExp.Pattern = "^""(" + шИмя + ")""$";
|
||
РезультатСтроковойКонстанты = RegExp.Execute(Слово);
|
||
Если РезультатСтроковойКонстанты.Count > 0 Тогда
|
||
Слово = РезультатСтроковойКонстанты.Item(0).SubMatches(0);
|
||
КонецЕсли;
|
||
RegExp.Pattern = "^(" + шИмя + ")$";
|
||
ЛиСловоИдентификатор = RegExp.Test(Слово);
|
||
Если Не ЛиСловоИдентификатор Тогда
|
||
// Это элемент универсальной коллекции
|
||
СтруктураКлюча = Новый Структура("Слово, ЯзыкПрограммы", РодительскаяСтруктураТипа.ИмяОбщегоТипа, ЯзыкПрограммы);
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
ТипыЭлементовКоллекции = ирОбщий.СтрРазделитьЛкс(НайденныеСтроки[0].ТипЭлементаКоллекции, ",", Истина, Ложь);
|
||
Для Каждого ТипЭлементаКоллекции Из ТипыЭлементовКоллекции Цикл
|
||
СтруктураКлюча = Новый Структура("БазовыйТип, ЯзыкПрограммы", ТипЭлементаКоллекции, ЯзыкПрограммы);
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
СтрокаТипа = НайденныеСтроки[0];
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.СтрокаОписания = СтрокаТипа;
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрокаТипа.Слово;
|
||
СтруктураТипа.Метаданные = РодительскаяСтруктураТипа.Метаданные;
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, СтрокаТипа.Слово, "Свойство", ТаблицаСтруктурТипов);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
НомерВерсииПлатформы = ирКэш.НомерВерсииПлатформыЛкс();
|
||
Для Каждого СтрокаОбщегоТипа Из ТаблицуОбщихТиповСтруктурыТипа Цикл
|
||
ИмяОбщегоТипа = СтрокаОбщегоТипа.ИмяОбщегоТипа;
|
||
Если ирОбщий.СтрокиРавныЛкс(ИмяОбщегоТипа, "ISWbemObject {WbemScripting.SwbemLocator}") Тогда
|
||
Если ТипЗнч(СтрокаОбщегоТипа.Метаданные) = Тип("COMОбъект") Тогда
|
||
СтруктураЦикла = Новый Структура();
|
||
Попытка
|
||
СтруктураЦикла.Вставить("Свойство", СтрокаОбщегоТипа.Метаданные.Properties_);
|
||
СтруктураЦикла.Вставить("Метод", СтрокаОбщегоТипа.Метаданные.Methods_);
|
||
Исключение
|
||
КонецПопытки;
|
||
Для Каждого КлючИЗначение Из СтруктураЦикла Цикл
|
||
КоллекцияСвойств = КлючИЗначение.Значение;
|
||
лТипСлова = КлючИЗначение.Ключ;
|
||
Если Истина
|
||
И ТипСлова <> Неопределено
|
||
И Не ирОбщий.СтрокиРавныЛкс(лТипСлова, ТипСлова)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Для Каждого Свойство Из КоллекцияСвойств Цикл
|
||
ИмяСвойства = Свойство.Name;
|
||
Если Истина
|
||
И Слово <> Неопределено
|
||
И Не ирОбщий.СтрокиРавныЛкс(ИмяСвойства, Слово)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
СтруктураТипа = ТаблицаСтруктурТипов.Добавить();
|
||
СтруктураТипа.СтрокаОписания = Свойство;
|
||
СтруктураТипа.ИмяОбщегоТипа = ирОбщий.ПолучитьИмяТипаИзКвалификаторовWMIЛкс(Свойство);
|
||
СтруктураТипа.Метаданные = РодительскаяСтруктураТипа.Метаданные;
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, ИмяСвойства, лТипСлова, ТаблицаСтруктурТипов);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
МетаданныеРодителя = СтрокаОбщегоТипа.Метаданные;
|
||
КорневойТипРодителя = Неопределено;
|
||
ПостроительЗапросаРодителя = Неопределено;
|
||
Если РодительскаяСтруктураТипа.ТипЯзыка <> "ИмяТипа" Тогда
|
||
ТипМетаданныхРодителя = ТипЗнч(МетаданныеРодителя);
|
||
Если Ложь
|
||
Или ТипМетаданныхРодителя = Тип("ОбъектМетаданных")
|
||
Или (Истина
|
||
И Это2iS
|
||
И (Ложь
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.ОбъектыМетаданных2iS")
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.СвойстваМетаданных2iS")))
|
||
Или (Истина
|
||
И ЭтоИнтеграция
|
||
И (Ложь
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.МетаданныеИис")
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.СвойстваМетаданныхИис")))
|
||
Тогда
|
||
Если ТипМетаданныхРодителя = Тип("ОбъектМетаданных") Тогда
|
||
КорневойТипРодителя = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(МетаданныеРодителя);
|
||
Иначе
|
||
КорневойТипРодителя = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(КэшОбъект(МетаданныеРодителя).ПолноеИмя);
|
||
КонецЕсли;
|
||
ПостроительЗапросаРодителя = ПолучитьПостроительЗапросаПоСтруктуреТипа(СтрокаОбщегоТипа, РодительскаяСтруктураТипа.ВиртуальнаяТаблица);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ЯзыкПрограммы = 2
|
||
И ВнешниеФункцииКомпоновкиДанных
|
||
Тогда
|
||
СтруктураКлюча = Новый Структура("ТипКонтекста, Слово, ЯзыкПрограммы, ТипЯзыка", ИмяОбщегоТипа, "<Имя общего модуля>", 0, РодительскаяСтруктураТипа.ТипЯзыка);
|
||
Иначе
|
||
СтруктураКлюча = Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка", ИмяОбщегоТипа, ЯзыкПрограммы, РодительскаяСтруктураТипа.ТипЯзыка);
|
||
КонецЕсли;
|
||
Если ТипСлова <> Неопределено Тогда
|
||
СтруктураКлюча.Вставить("ТипСлова", ТипСлова);
|
||
КонецЕсли;
|
||
НайденныеСтроки = ТаблицаШаблоновКонтекстов.НайтиСтроки(СтруктураКлюча);
|
||
|
||
Для Каждого СтрокаВида Из НайденныеСтроки Цикл
|
||
Если СтрокаВида.НомерВерсииПлатформы > НомерВерсииПлатформы Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СхемаКоллекции = Новый Соответствие;
|
||
МетаданныеЭлементов = Новый Соответствие;
|
||
КоллекцияЗначений = Неопределено;
|
||
ИмяЭлементаКоллекции = ирОбщий.СтрокаМеждуМаркерамиЛкс(СтрокаВида.Слово, "<", ">", Ложь, Истина);
|
||
|
||
КлючПоиска = Новый Структура("ИмяОбщегоТипа, ИмяЭлементаКоллекции", ИмяОбщегоТипа, ИмяЭлементаКоллекции);
|
||
СтрокаОписанияВида = Неопределено;
|
||
НайденныеСтрокиКоллекций = ТаблицаИменЭлементовКоллекций.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтрокиКоллекций.Количество() > 0 Тогда
|
||
СтрокаОписанияВида = НайденныеСтрокиКоллекций[0];
|
||
КонецЕсли;
|
||
Если СтрокаОписанияВида = Неопределено Тогда
|
||
КлючПоиска.Удалить("ИмяОбщегоТипа");
|
||
НайденныеСтрокиКоллекций = ТаблицаИменЭлементовКоллекций.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтрокиКоллекций.Количество() > 0 Тогда
|
||
СтрокаОписанияВида = НайденныеСтрокиКоллекций[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
//// Исправление кривоты платформенной справки (неуникальные имена шаблона элемента коллекции между разными типами коллекций)
|
||
//Если ИмяЭлементаКоллекции = "<Имя элемента управления>" Тогда
|
||
// СтруктураОтбора = Новый Структура("ИмяЭлементаКоллекции, ИмяКоллекции", ИмяЭлементаКоллекции);
|
||
// Если ИмяОбщегоТипа = "ВсеЭлементыФормы" Тогда
|
||
// СтруктураОтбора.ИмяКоллекции = "Элементы";
|
||
// Иначе//Если ИмяОбщегоТипа = "ЭлементыФормы" Тогда
|
||
// СтруктураОтбора.ИмяКоллекции = "ЭлементыФормы";
|
||
// КонецЕсли;
|
||
// СтрокаОписанияВида = ТаблицаИменЭлементовКоллекций.НайтиСтроки(СтруктураОтбора)[0];
|
||
//ИначеЕсли ИмяЭлементаКоллекции = "<Имя колонки>" Тогда
|
||
// СтруктураОтбора = Новый Структура("ИмяЭлементаКоллекции, ИмяКоллекции", ИмяЭлементаКоллекции);
|
||
// Если ИмяОбщегоТипа = "Ячейки" Тогда
|
||
// СтруктураОтбора.ИмяКоллекции = "ОформленияЯчеек";
|
||
// Иначе//Если ИмяОбщегоТипа = "СтрокаТаблицыЗначений" Тогда
|
||
// СтруктураОтбора.ИмяКоллекции = "Колонки";
|
||
// КонецЕсли;
|
||
// СтрокаОписанияВида = ТаблицаИменЭлементовКоллекций.НайтиСтроки(СтруктураОтбора)[0];
|
||
//КонецЕсли;
|
||
Если Слово <> Неопределено Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(СтрокаВида.Слово, ИмяЭлементаКоллекции);
|
||
НачалоТекущегоСлова = Лев(Слово, СтрДлина(МассивФрагментов[0]));
|
||
КонецТекущегоСлова = Прав(Слово, СтрДлина(МассивФрагментов[1]));
|
||
ИмяТекущегоСлова = Сред(Слово, СтрДлина(НачалоТекущегоСлова) + 1,
|
||
СтрДлина(Слово) - СтрДлина(КонецТекущегоСлова));
|
||
Если НачалоТекущегоСлова + ИмяЭлементаКоллекции + КонецТекущегоСлова <> СтрокаВида.Слово Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если СтрокаОписанияВида = Неопределено Тогда
|
||
// Имя элемента коллекции не внесено в служебную таблицу
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Предопределенные"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных") //
|
||
Тогда
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст = "ВЫБРАТЬ Таблица.Ссылка ИЗ " + МетаданныеРодителя.ПолноеИмя() + " КАК Таблица
|
||
|ГДЕ Таблица.Предопределенный
|
||
|";
|
||
Результат = Запрос.Выполнить().Выгрузить();
|
||
МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаданныеРодителя);
|
||
Для Каждого СтрокаРезультата Из Результат Цикл
|
||
СхемаКоллекции.Вставить(МенеджерТипа.ПолучитьИмяПредопределенного(СтрокаРезультата.Ссылка), Новый ОписаниеТипов(ирОбщий.БыстрыйМассивЛкс(ТипЗнч(СтрокаРезультата.Ссылка))));
|
||
КонецЦикла;
|
||
ИначеЕсли Ложь
|
||
Или (Истина
|
||
И (Ложь
|
||
Или СтрокаОписанияВида.ИмяКоллекции = "Колонки"
|
||
Или СтрокаОписанияВида.ИмяКоллекции = "Поля")
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("РезультатЗапроса")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ТаблицаЗначений")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ДеревоЗначений")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ВыборкаИзРезультатаЗапроса")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СтрокаТаблицыЗначений")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СтрокаДереваЗначений")
|
||
))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Колонки"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ТабличноеПоле"))
|
||
Тогда
|
||
// %%%% Некрасиво, но работает.
|
||
Если Найти(ИмяОбщегоТипа, "Колон") = 0 Тогда
|
||
Если СтрокаОписанияВида.ИмяЭлементаКоллекции = "<Имя колонки списка>" Тогда
|
||
ДинамическийСписок = МетаданныеРодителя.Значение;
|
||
ПостроительСписка = ПолучитьПостроительЗапросаПоСтруктуреТипа(СтруктураТипаИзЗначения(ДинамическийСписок));
|
||
КоллекцияКолонок = ДинамическийСписок.Колонки;
|
||
Для Каждого Колонка Из КоллекцияКолонок Цикл
|
||
Если Колонка.Имя = "" Тогда
|
||
// Антибаг платформы 8.2.16 Замечено на форме списка РС.ООП_ВаучерыТез
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СхемаКоллекции.Вставить(Колонка.Имя, ПостроительСписка.ДоступныеПоля[Колонка.Имя].ТипЗначения);
|
||
КонецЦикла;
|
||
Иначе
|
||
Если Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ВыборкаИзРезультатаЗапроса")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СтрокаТаблицыЗначений")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СтрокаДереваЗначений")
|
||
Тогда
|
||
Для Каждого Колонка Из МетаданныеРодителя.Владелец().Колонки Цикл
|
||
Если Колонка.Имя = "" Тогда
|
||
// Строка таблицы/дерева при перетаскивании имеет такую колонку (вероятно ошибка платформы)
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СхемаКоллекции.Вставить(Колонка.Имя, МетаданныеРодителя[Колонка.Имя]);
|
||
КонецЦикла;
|
||
Иначе
|
||
Для Каждого Колонка Из МетаданныеРодителя.Колонки Цикл
|
||
СхемаКоллекции.Вставить(Колонка.Имя, Колонка.ТипЗначения);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
КоллекцияЗначений = МетаданныеРодителя.Колонки;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Колонки"
|
||
И ЭтоМетаданныеТабличнойЧастиВнешнейОбработки
|
||
Тогда
|
||
Для Каждого Колонка Из МетаданныеРодителя.ВыгрузитьКолонки().Колонки Цикл
|
||
Если Колонка.Имя = "НомерСтроки" Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СхемаКоллекции.Вставить(Колонка.Имя, Колонка.ТипЗначения);
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ПостроительЗапроса")
|
||
И (Ложь
|
||
Или СтрокаОписанияВида.ИмяКоллекции = "Поля"
|
||
Или СтрокаОписанияВида.ИмяКоллекции = "Колонки")
|
||
Тогда
|
||
Для Каждого ВыбранноеПоле Из МетаданныеРодителя.ВыбранныеПоля Цикл
|
||
лДоступноеПоле = МетаданныеРодителя.ДоступныеПоля.Найти(ВыбранноеПоле.Имя);
|
||
СхемаКоллекции.Вставить(ВыбранноеПоле.Имя, лДоступноеПоле.ТипЗначения);
|
||
КонецЦикла;
|
||
ИначеЕсли Ложь
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Структура"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Структура"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ФиксированнаяСтруктура"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ФиксированнаяСтруктура"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "НастройкаОформления"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("НастройкаОформления"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Отбор"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Отбор"))
|
||
Тогда
|
||
КоллекцияЗначений = МетаданныеРодителя;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Структура"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Форма")
|
||
Тогда
|
||
КоллекцияЗначений = МетаданныеРодителя[РодительскаяСтруктураТипа.СтрокаОписания.Слово];
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Колонки"
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ДоступноеПолеКомпоновкиДанных")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ДоступноеПолеОтбораКомпоновкиДанных"))
|
||
Тогда
|
||
Для Каждого ДоступноеПоле Из МетаданныеРодителя.Элементы Цикл
|
||
СхемаКоллекции.Вставить(ирОбщий.ПоследнийФрагментЛкс("" + ДоступноеПоле.Поле), ДоступноеПоле.ТипЗначения);
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ОбщиеРеквизиты"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных")
|
||
Тогда
|
||
Попытка
|
||
ОбщиеРеквизиты = Метаданные.ОбщиеРеквизиты;
|
||
Исключение
|
||
// Платформа 8.2.13 и ниже
|
||
ОбщиеРеквизиты = Новый Массив;
|
||
КонецПопытки;
|
||
СхемаКоллекции = Новый Массив();
|
||
Для Каждого ОбщийРеквизит Из ОбщиеРеквизиты Цикл
|
||
Если ирОбщий.ЛиОбщийРеквизитИспользуетсяВОбъектеМетаданныхЛкс(ОбщийРеквизит, МетаданныеРодителя) Тогда
|
||
СхемаКоллекции.Добавить(ОбщийРеквизит);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Картинки"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданныхКонфигурация")
|
||
Тогда
|
||
Если ЗначениеЗаполнено(Слово) Тогда
|
||
МетаКартинка = Метаданные.ОбщиеКартинки.Найти(Слово);
|
||
Если МетаКартинка <> Неопределено Тогда
|
||
СхемаКоллекции.Вставить(МетаКартинка.Имя, МетаКартинка);
|
||
КонецЕсли;
|
||
Иначе
|
||
// Долго
|
||
СхемаКоллекции = Новый Структура;
|
||
Для Каждого МетаКартинка Из Метаданные.ОбщиеКартинки Цикл
|
||
СхемаКоллекции.Вставить(МетаКартинка.Имя, МетаКартинка);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина //
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Свойства"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектXDTO")
|
||
Тогда
|
||
КоллекцияЗначений = Новый Структура;
|
||
ОбъектXDTO = МетаданныеРодителя;
|
||
Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл
|
||
Если ОбъектXDTO.Установлено(Свойство.Имя) Тогда
|
||
Если Свойство.ВерхняяГраница > 1 Или Свойство.ВерхняяГраница = -1 Тогда
|
||
ЗначениеСвойства = ОбъектXDTO.ПолучитьСписок(Свойство.Имя);
|
||
Иначе
|
||
ЗначениеСвойства = ОбъектXDTO.Получить(Свойство.Имя);
|
||
КонецЕсли;
|
||
КоллекцияЗначений.Вставить(Свойство.Имя, ЗначениеСвойства);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
ИначеЕсли Истина //
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Свойства"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("СвойствоXDTO")
|
||
Тогда
|
||
КоллекцияЗначений = Новый Структура;
|
||
ОбъектXDTO = МетаданныеРодителя.ОбъектВладелец;
|
||
Свойство = МетаданныеРодителя;
|
||
Если ОбъектXDTO.Установлено(Свойство.Имя) Тогда
|
||
Если Свойство.ВерхняяГраница > 1 Или Свойство.ВерхняяГраница = -1 Тогда
|
||
ЗначениеСвойства = ОбъектXDTO.ПолучитьСписок(Свойство.Имя);
|
||
Иначе
|
||
ЗначениеСвойства = ОбъектXDTO.Получить(Свойство.Имя);
|
||
КонецЕсли;
|
||
КоллекцияЗначений.Вставить(Свойство.Имя, ЗначениеСвойства);
|
||
КонецЕсли;
|
||
#Если Клиент Тогда
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Реквизиты"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Форма")
|
||
Тогда
|
||
МассивИмен = ПолучитьМассивИменРеквизитовФормы(МетаданныеРодителя);
|
||
КоллекцияЗначений = Новый Структура;
|
||
Для Каждого ИмяРеквизита Из МассивИмен Цикл
|
||
КоллекцияЗначений.Вставить(ИмяРеквизита, МетаданныеРодителя[ИмяРеквизита]);
|
||
КонецЦикла;
|
||
ИначеЕсли Ложь
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ЭлементыФормы"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Форма"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Элементы"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("УправляемаяФорма"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Страницы"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("Панель"))
|
||
Или (Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Кнопки"
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("КнопкаКоманднойПанели")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("КнопкиКоманднойПанели")))
|
||
Тогда
|
||
КоллекцияЗначений = МетаданныеРодителя[СтрокаОписанияВида.ИмяКоллекции];
|
||
#КонецЕсли
|
||
//ИначеЕсли СтрокаОписанияВида.ИмяКоллекции = "Оформление" Тогда
|
||
// Для Каждого МетаОбщийМодуль Из МетаданныеРодителя[СтрокаОписанияВида.ИмяКоллекции] Цикл
|
||
// Если МетаОбщийМодуль.Глобальный Тогда
|
||
// Продолжить;
|
||
// КонецЕсли;
|
||
// СхемаКоллекции.Вставить(МетаОбщийМодуль.Имя);
|
||
// КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ОбщиеМодули"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданныхКонфигурация") //
|
||
Тогда
|
||
СхемаКоллекции = ирКэш.ДоступныеОбщиеМодулиЛкс(ЛиСерверныйКонтекст);
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ВидыСубконто"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных") //
|
||
Тогда
|
||
Для Счетчик = 1 По МетаданныеРодителя.ПланСчетов.МаксКоличествоСубконто Цикл
|
||
СхемаКоллекции.Вставить(Строка(Счетчик), МетаданныеРодителя.ПланСчетов.ВидыСубконто);
|
||
КонецЦикла;
|
||
ИначеЕсли СтрокаОписанияВида.ИмяКоллекции = "Движения" Тогда
|
||
Если ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных") Тогда
|
||
Для Каждого МетаРегистр Из МетаданныеРодителя[СтрокаОписанияВида.ИмяКоллекции] Цикл
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(МетаРегистр.ПолноеИмя());
|
||
СхемаКоллекции.Вставить(МетаРегистр.Имя, Новый ОписаниеТипов(МассивФрагментов[0] + "НаборЗаписей." + МассивФрагментов[1]));
|
||
КонецЦикла;
|
||
ИначеЕсли ТипЗнч(МетаданныеРодителя) = Тип("КоллекцияДвижений") Тогда
|
||
Для Каждого НаборЗаписейРегистра Из МетаданныеРодителя Цикл
|
||
СхемаКоллекции.Вставить(НаборЗаписейРегистра.Метаданные().Имя, НаборЗаписейРегистра);
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И Слово <> Неопределено
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданныхКонфигурация") //
|
||
Тогда
|
||
МетаданныеРегистра = Метаданные.РегистрыСведений.Найти(Слово);
|
||
Если МетаданныеРегистра = Неопределено Тогда
|
||
МетаданныеРегистра = Метаданные.РегистрыНакопления.Найти(Слово);
|
||
КонецЕсли;
|
||
Если МетаданныеРегистра = Неопределено Тогда
|
||
МетаданныеРегистра = Метаданные.РегистрыБухгалтерии.Найти(Слово);
|
||
КонецЕсли;
|
||
Если МетаданныеРегистра = Неопределено Тогда
|
||
МетаданныеРегистра = Метаданные.РегистрыРасчета.Найти(Слово);
|
||
КонецЕсли;
|
||
Если МетаданныеРегистра <> Неопределено Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(МетаданныеРегистра.ПолноеИмя());
|
||
СхемаКоллекции.Вставить(МассивФрагментов[1], Новый ОписаниеТипов(МассивФрагментов[0] + "НаборЗаписей." + МассивФрагментов[1]));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "ТочкиМаршрута"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных")
|
||
Тогда
|
||
КоллекцияЗначений = ирОбщий.ПолучитьМенеджерЛкс(МетаданныеРодителя)[СтрокаОписанияВида.ИмяКоллекции];
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "<Имя коллекции метаданных>"
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("КоллекцияОбъектовМетаданных")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданныхКонфигурация"))
|
||
Тогда
|
||
КоллекцияЗначений = МетаданныеРодителя;
|
||
Если ТипЗнч(МетаданныеРодителя) = Тип("КоллекцияОбъектовМетаданных") Тогда
|
||
//
|
||
Иначе
|
||
ИмяКоллекцииОбъектовМетаданных = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИмяОбщегоТипа, МаркерКоллекцииОбъектовМетаданных + ": ", , Ложь);
|
||
Если ЗначениеЗаполнено(ИмяКоллекцииОбъектовМетаданных) Тогда
|
||
СтрокаКорневогоТипа = ПолучитьСтрокуТипаМетаОбъектов(, ИмяКоллекцииОбъектовМетаданных);
|
||
Если СтрокаКорневогоТипа <> Неопределено Тогда
|
||
//КоллекцияЗначений = МетаданныеРодителя[ИмяКоллекцииОбъектовМетаданных];
|
||
Попытка
|
||
КоллекцияЗначений = МетаданныеРодителя[РодительскаяСтруктураТипа.СтрокаОписания.Слово];
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке(); // Для отладки
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
//И СтрокаОписанияВида.ИмяКоллекции = "<Имя коллекции метаданных>"
|
||
И Это2iS
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СправочникСсылка.КонфигурацииМетаданных2iS")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СправочникСсылка.ОбъектыМетаданных2iS"))
|
||
Тогда
|
||
Если СтрокаОписанияВида.ИмяКоллекции = "<Имя коллекции метаданных>" Тогда
|
||
ИмяКоллекцииОбъектовМетаданных = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИмяОбщегоТипа, МаркерКоллекцииОбъектовМетаданных + ": ", , Ложь);
|
||
Иначе
|
||
ИмяКоллекцииОбъектовМетаданных = СтрокаОписанияВида.ИмяКоллекции;
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ИмяКоллекцииОбъектовМетаданных) Тогда
|
||
СтрокаКорневогоТипа = ПолучитьСтрокуТипаМетаОбъектов(, ИмяКоллекцииОбъектовМетаданных);
|
||
Запрос = Новый Запрос;
|
||
Если СтрокаКорневогоТипа <> Неопределено Тогда
|
||
//лИмяКоллекции = РодительскаяСтруктураТипа.СтрокаОписания.Слово;
|
||
Если ИмяКоллекцииОбъектовМетаданных = "Реквизиты" Тогда
|
||
ТекстЗапроса = "ВЫБРАТЬ Наименование КАК Имя, Типы Как Значение ИЗ Справочник.СвойстваМетаданных2iS
|
||
|ГДЕ Владелец = &Владелец И Вид <> ЗНАЧЕНИЕ(Перечисление.ВидыСвойств.Свойство)";
|
||
Запрос.Текст = ТекстЗапроса;
|
||
Запрос.УстановитьПараметр("Владелец", МетаданныеРодителя);
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
СхемаКоллекции[Выборка.Имя] = Выборка.Значение.Выгрузить().ВыгрузитьКолонку("Тип");
|
||
КонецЦикла;
|
||
Иначе
|
||
ТекстЗапроса = "ВЫБРАТЬ Имя, Ссылка КАК Значение ИЗ Справочник.ОбъектыМетаданных2iS
|
||
|ГДЕ Владелец = &Владелец И Родитель.Наименование = &ИмяРодителя";
|
||
Запрос.УстановитьПараметр("ИмяРодителя", ИмяКоллекцииОбъектовМетаданных);
|
||
Запрос.Текст = ТекстЗапроса;
|
||
Запрос.УстановитьПараметр("Владелец", МетаданныеРодителя);
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
СхемаКоллекции[Выборка.Имя] = Выборка.Значение;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
//КоллекцияЗначений = МетаданныеРодителя;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
//И СтрокаОписанияВида.ИмяКоллекции = "<Имя коллекции метаданных>"
|
||
И ЭтоИнтеграция
|
||
И (Ложь
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СправочникСсылка.КонфигурацииМетаданныхИис")
|
||
Или ТипЗнч(МетаданныеРодителя) = Тип("СправочникСсылка.МетаданныеИис"))
|
||
Тогда
|
||
Если СтрокаОписанияВида.ИмяКоллекции = "<Имя коллекции метаданных>" Тогда
|
||
ИмяКоллекцииОбъектовМетаданных = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИмяОбщегоТипа, МаркерКоллекцииОбъектовМетаданных + ": ", , Ложь);
|
||
Иначе
|
||
ИмяКоллекцииОбъектовМетаданных = СтрокаОписанияВида.ИмяКоллекции;
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ИмяКоллекцииОбъектовМетаданных) Тогда
|
||
СтрокаКорневогоТипа = ПолучитьСтрокуТипаМетаОбъектов(, ИмяКоллекцииОбъектовМетаданных);
|
||
Запрос = Новый Запрос;
|
||
Если СтрокаКорневогоТипа <> Неопределено Тогда
|
||
//лИмяКоллекции = РодительскаяСтруктураТипа.СтрокаОписания.Слово;
|
||
Если ИмяКоллекцииОбъектовМетаданных = "Реквизиты" Тогда
|
||
ТекстЗапроса = "ВЫБРАТЬ Наименование КАК Имя, Типы Как Значение ИЗ Справочник.СвойстваМетаданныхИис
|
||
|ГДЕ КонфигурацияМетаданных = &Владелец И Вид <> ЗНАЧЕНИЕ(Перечисление.ВидыСвойствМетаданныхИис.Свойство)";
|
||
Запрос.Текст = ТекстЗапроса;
|
||
Запрос.УстановитьПараметр("Владелец", МетаданныеРодителя);
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
СхемаКоллекции[Выборка.Имя] = Выборка.Значение.Выгрузить().ВыгрузитьКолонку("Тип");
|
||
КонецЦикла;
|
||
Иначе
|
||
ТекстЗапроса = "ВЫБРАТЬ Имя, Ссылка КАК Значение ИЗ Справочник.МетаданныеИис
|
||
|ГДЕ КонфигурацияМетаданных = &Владелец И ТипМетаданных.ИмяМножественное = &ИмяРодителя";
|
||
Запрос.УстановитьПараметр("ИмяРодителя", ИмяКоллекцииОбъектовМетаданных);
|
||
Запрос.Текст = ТекстЗапроса;
|
||
Запрос.УстановитьПараметр("Владелец", МетаданныеРодителя);
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
СхемаКоллекции[Выборка.Имя] = Выборка.Значение;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
//КоллекцияЗначений = МетаданныеРодителя;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И СтрокаОписанияВида.ИмяКоллекции = "Реквизиты"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("УправляемаяФорма")
|
||
Тогда
|
||
//
|
||
Иначе
|
||
Если МассивИсключенийИменКоллекций.НайтиПоЗначению(СтрокаОписанияВида.ИмяКоллекции) <> Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СхемаКоллекции = МетаданныеРодителя;
|
||
Если ТипЗнч(МетаданныеРодителя) <> Тип("КоллекцияОбъектовМетаданных") Тогда
|
||
Попытка
|
||
ЦелевойТип = Тип(СтрокаОбщегоТипа.ИмяОбщегоТипа);
|
||
Исключение
|
||
ЦелевойТип = Неопределено;
|
||
КонецПопытки;
|
||
Попытка
|
||
Если ТипЗнч(МетаданныеРодителя) = ЦелевойТип Тогда
|
||
СхемаКоллекции = МетаданныеРодителя;
|
||
Иначе
|
||
СхемаКоллекции = МетаданныеРодителя[СтрокаОписанияВида.ИмяКоллекции];
|
||
КонецЕсли;
|
||
Исключение
|
||
Продолжить;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если КоллекцияЗначений = Неопределено Тогда
|
||
КоллекцияЗначений = СхемаКоллекции;
|
||
Если Слово <> Неопределено Тогда
|
||
ЭлементСхемы = Неопределено;
|
||
Если Ложь
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("ФиксированнаяСтруктура")
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("ФиксированноеСоответствие")
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("Структура")
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("Соответствие")
|
||
Тогда
|
||
//Для Каждого ЭлементКоллекции Из КоллекцияЗначений Цикл
|
||
// Если ЭлементКоллекции.Ключ = ИмяТекущегоСлова Тогда
|
||
// ЭлементСхемы = ЭлементКоллекции.Значение;
|
||
// Прервать;
|
||
// КонецЕсли;
|
||
//КонецЦикла;
|
||
Попытка
|
||
ЭлементСхемы = КоллекцияЗначений[ИмяТекущегоСлова];
|
||
Исключение
|
||
КонецПопытки;
|
||
Иначе
|
||
Попытка
|
||
ЭлементСхемы = КоллекцияЗначений.Найти(ИмяТекущегоСлова);
|
||
Исключение КонецПопытки;
|
||
Если ЭлементСхемы = Неопределено Тогда
|
||
Для Каждого ЭлементКоллекции Из КоллекцияЗначений Цикл
|
||
Если ЭлементКоллекции.Имя = ИмяТекущегоСлова Тогда
|
||
ЭлементСхемы = ЭлементКоллекции;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КоллекцияЗначений = Новый Соответствие;
|
||
Если ЭлементСхемы <> Неопределено Тогда
|
||
КоллекцияЗначений.Вставить(ИмяТекущегоСлова, ЭлементСхемы);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Слово <> Неопределено Тогда
|
||
Попытка
|
||
ЭлементСхемы = КоллекцияЗначений[ИмяТекущегоСлова];
|
||
Исключение
|
||
КонецПопытки;
|
||
КоллекцияЗначений = Новый Соответствие;
|
||
Если ЭлементСхемы <> Неопределено Тогда
|
||
КоллекцияЗначений.Вставить(ИмяТекущегоСлова, ЭлементСхемы);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если КоллекцияЗначений = Неопределено Тогда
|
||
КоллекцияЗначений = Новый Массив();
|
||
КонецЕсли;
|
||
|
||
Для Каждого ЭлементКоллекции Из КоллекцияЗначений Цикл
|
||
Если ЭлементКоллекции = Неопределено Тогда
|
||
// ПараметрыМакетаТабличногоДокумента
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЭлементКоллекции) = Тип("КлючИЗначение") Тогда
|
||
ИмяСвойства = ЭлементКоллекции.Ключ;
|
||
ЗначениеСвойства = ЭлементКоллекции.Значение;
|
||
Иначе
|
||
ИмяСвойства = ЭлементКоллекции.Имя;
|
||
ЗначениеСвойства = ЭлементКоллекции;
|
||
КонецЕсли;
|
||
КонечноеСлово = СтрЗаменить(СтрокаВида.Слово, ИмяЭлементаКоллекции, ИмяСвойства);
|
||
ТаблицаСтруктурТипов = Неопределено;
|
||
Если ВычислятьТипы Тогда
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
МассивТипов = Новый Массив;
|
||
ОписаниеТиповЗначения = Неопределено;
|
||
Если СхемаКоллекции.Количество() > 0 Тогда
|
||
Если Ложь
|
||
Или СтрокаВида.ТипЗначения = "Произвольный"
|
||
Или СтрокаВида.ТипЗначения = "Набор записей регистра"
|
||
Или Найти(СтрокаВида.ТипЗначения, "<") > 0
|
||
Тогда
|
||
Если ТипЗнч(ЗначениеСвойства) = Тип("ОписаниеТипов") Тогда
|
||
ОписаниеТиповЗначения = ЗначениеСвойства;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ЯзыкПрограммы = 1
|
||
И РодительскаяСтруктураТипа.ТипЯзыка <> "ЗначениеВЗапросе"
|
||
И КорневойТипРодителя <> Неопределено
|
||
И КорневойТипРодителя <> "ВнешнийИсточникДанных"
|
||
Тогда
|
||
ДоступноеПолеСлова = ПостроительЗапросаРодителя.ДоступныеПоля.Найти(КонечноеСлово);
|
||
Если ДоступноеПолеСлова = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ДоступноеПолеСлова.ТипЗначения <> Новый ОписаниеТипов("ТаблицаЗначений") Тогда
|
||
ОписаниеТиповЗначения = ДоступноеПолеСлова.ТипЗначения;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ОписаниеТиповЗначения = Неопределено
|
||
И СтрокаОписанияВида.ИмяКоллекции <> "КритерииОтбора"
|
||
И СтрокаОписанияВида.ИмяКоллекции <> "ПланыВидовХарактеристик"
|
||
И ИмяОбщегоТипа <> "Константа"
|
||
Тогда
|
||
Попытка
|
||
ОписаниеТиповЗначения = ЗначениеСвойства.Тип;
|
||
Исключение
|
||
КонецПопытки;
|
||
Если ТипЗнч(ОписаниеТиповЗначения) <> Тип("ОписаниеТипов") Тогда
|
||
ОписаниеТиповЗначения = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ОписаниеТиповЗначения) = Тип("ОписаниеТипов") Тогда
|
||
МассивТипов = ОписаниеТиповЗначения.Типы();
|
||
ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Массив") Тогда
|
||
МассивТипов = ЗначениеСвойства;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
МассивТипов = ирОбщий.БыстрыйМассивЛкс(ТипЗнч(ЗначениеСвойства));
|
||
КонецЕсли;
|
||
Если Истина
|
||
//И ОписаниеТиповЗначения <> Неопределено
|
||
И МассивТипов.Количество() > 0
|
||
И СтрокаОписанияВида.ИмяКоллекции <> "<Имя коллекции метаданных>"
|
||
И (Ложь
|
||
Или СтрокаОписанияВида.ИмяКоллекции <> "Константы"
|
||
Или ЯзыкПрограммы = 1)
|
||
Тогда
|
||
ШаблонСтруктурыТипа = Новый Структура("СтрокаОписания, ТипЯзыка, Метаданные, ДержательМетаданных");
|
||
ШаблонСтруктурыТипа.СтрокаОписания = СтрокаВида;
|
||
ШаблонСтруктурыТипа.ТипЯзыка = РодительскаяСтруктураТипа.ТипЯзыка;
|
||
ШаблонСтруктурыТипа.ДержательМетаданных = РодительскаяСтруктураТипа.ДержательМетаданных;
|
||
//ШаблонСтруктурыТипа.Метаданные = МетаданныеРодителя;
|
||
Для Каждого Тип Из МассивТипов Цикл
|
||
//Если Истина
|
||
// И Тип = ТипЗнч(ЗначениеСвойства)
|
||
// И (Ложь
|
||
// Или мМассивТиповВключающихМетаданные.Найти(Тип) <> Неопределено
|
||
// Или мМассивТиповЭлементовУправления.Найти(Тип) <> Неопределено)
|
||
//Тогда
|
||
// ШаблонСтруктурыТипа.Метаданные = ЗначениеСвойства;
|
||
// СтруктураТипаСвойства = СтруктураТипаИзЗначения(ЗначениеСвойства, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
//Иначе
|
||
// ШаблонСтруктурыТипа.Метаданные = МетаданныеРодителя;
|
||
// СтруктураТипаСвойства = СтруктураТипаИзКонкретногоТипа(Тип, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
//КонецЕсли;
|
||
Если Истина
|
||
И Тип = ТипЗнч(ЗначениеСвойства)
|
||
//И (Ложь
|
||
// Или мМассивТиповВключающихМетаданные.Найти(Тип) <> Неопределено
|
||
// Или мМассивТиповЭлементовУправления.Найти(Тип) <> Неопределено)
|
||
Тогда
|
||
МетаданныеЭлемента = МетаданныеЭлементов[ИмяСвойства];
|
||
Если МетаданныеЭлемента = Неопределено Тогда
|
||
МетаданныеЭлемента = ЗначениеСвойства;
|
||
КонецЕсли;
|
||
ШаблонСтруктурыТипа.Метаданные = МетаданныеЭлемента;
|
||
СтруктураТипаСвойства = СтруктураТипаИзЗначения(ЗначениеСвойства, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
ИначеЕсли Истина
|
||
И Это2iS
|
||
И ТипЗнч(Тип) = Тип("СправочникСсылка.ОбъектыМетаданных2iS")
|
||
Тогда
|
||
СтруктураТипаСвойства = НоваяСтруктураТипа();
|
||
СтруктураТипаСвойства.Метаданные = Тип;
|
||
ТипОбъект = КэшОбъект(Тип);
|
||
ОбъектСистемы = ТипОбъект.ОбъектСистемы;
|
||
Расширение = Вычислить("Ядро2iS.ПолучитьРасширениеСсылкиОбъектаСистемы(ОбъектСистемы)");
|
||
Если ЗначениеЗаполнено(Расширение) Тогда
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = Расширение.ИмяОбщегоТипа;
|
||
Иначе
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = ТипОбъект.Наименование;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И ЭтоИнтеграция
|
||
И ТипЗнч(Тип) = Тип("СправочникСсылка.МетаданныеИис")
|
||
Тогда
|
||
СтруктураТипаСвойства = НоваяСтруктураТипа();
|
||
СтруктураТипаСвойства.Метаданные = Тип;
|
||
ТипОбъект = КэшОбъект(Тип);
|
||
//ОбъектСистемы = ТипОбъект.ОбъектСистемы;
|
||
//Расширение = Вычислить("Ядро2iS.ПолучитьРасширениеСсылкиОбъектаСистемы(ОбъектСистемы)");
|
||
//Если ЗначениеЗаполнено(Расширение) Тогда
|
||
// СтруктураТипаСвойства.ИмяОбщегоТипа = Расширение.ИмяОбщегоТипа;
|
||
//Иначе
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = ТипОбъект.Наименование;
|
||
//КонецЕсли;
|
||
Иначе
|
||
ШаблонСтруктурыТипа.Метаданные = МетаданныеРодителя;
|
||
СтруктураТипаСвойства = СтруктураТипаИзКонкретногоТипа(Тип, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
КонецЕсли;
|
||
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипаСвойства);
|
||
КонецЦикла;
|
||
Иначе
|
||
СтруктураТипаСвойства = НоваяСтруктураТипа();
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипаСвойства, РодительскаяСтруктураТипа, "ТипЯзыка");
|
||
Если РодительскаяСтруктураТипа.ТипЯзыка = "ИмяТипа" Тогда
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = СтрокаВида.Слово;
|
||
Если СтрокаВида.ТипКонтекста <> "" Тогда
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = СтрокаВида.ТипКонтекста + "." + СтруктураТипаСвойства.ИмяОбщегоТипа;
|
||
КонецЕсли;
|
||
Иначе
|
||
СтруктураТипаСвойства.ИмяОбщегоТипа = СтрокаВида.ТипЗначения;
|
||
СтруктураТипаСвойства.СтрокаОписания = СтрокаВида;
|
||
КонецЕсли;
|
||
СтруктураТипаСвойства.Метаданные = ЗначениеСвойства;
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипаСвойства);
|
||
КонецЕсли;
|
||
Иначе
|
||
//
|
||
КонецЕсли;
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, КонечноеСлово, СтрокаВида.ТипСлова, ТаблицаСтруктурТипов);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Если Ложь
|
||
Или ЯзыкПрограммы = 0
|
||
Или ЯзыкПрограммы = 2
|
||
Тогда
|
||
Если Истина
|
||
И МодульМетаданных = Неопределено
|
||
И СтрокаОбщегоТипа.ИмяОбщегоТипа = "Глобальный"
|
||
Тогда
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.ИмяОбщегоТипа = "ОбщийМодуль";
|
||
Для Каждого МетаОбщийМодуль Из Метаданные.ОбщиеМодули Цикл
|
||
#Если Сервер И Не Сервер Тогда
|
||
МетаОбщийМодуль = Метаданные.ОбщиеМодули.ирОбщий;
|
||
#КонецЕсли
|
||
Если Ложь
|
||
Или Не МетаОбщийМодуль.Глобальный
|
||
Или (Истина
|
||
И ЛиСерверныйКонтекст
|
||
И Не МетаОбщийМодуль.Сервер)
|
||
Или (Истина
|
||
И Не ЛиСерверныйКонтекст
|
||
И Не МетаОбщийМодуль.ВызовСервера
|
||
И (Ложь
|
||
#Если ТолстыйКлиентОбычноеПриложение Тогда
|
||
Или Не МетаОбщийМодуль.КлиентОбычноеПриложение
|
||
#Иначе
|
||
Или Не МетаОбщийМодуль.КлиентУправляемоеПриложение
|
||
#КонецЕсли
|
||
)
|
||
)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СтруктураТипа.Метаданные = МетаОбщийМодуль;
|
||
МодульМетаданных = ПодготовитьМодульМетаданных(СтруктураТипа);
|
||
ДобавитьВТаблицуСловЭлементыМодуляМетаданных(СтрокаОбщегоТипа, Слово, ТипСлова, ВнутренняяТаблицаСлов, МодульМетаданных);
|
||
КонецЦикла;
|
||
Если Не ЛиСерверныйКонтекст Тогда
|
||
СтруктураТипа = СтруктураТипаИзЗначения(Метаданные);
|
||
#Если ТолстыйКлиентОбычноеПриложение Тогда
|
||
МодульМетаданных = ПодготовитьМодульМетаданных(СтруктураТипа, "МодульОбычногоПриложения");
|
||
#Иначе
|
||
МодульМетаданных = ПодготовитьМодульМетаданных(СтруктураТипа, "МодульУправляемогоПриложения");
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ДобавитьВТаблицуСловЭлементыМодуляМетаданных(СтрокаОбщегоТипа, Слово, ТипСлова, ВнутренняяТаблицаСлов, МодульМетаданных);
|
||
#Если Клиент Тогда
|
||
Если Истина
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("COMОбъект")
|
||
И ЛиИмяТипаComОбъекта(ИмяОбщегоТипа)
|
||
Тогда
|
||
ИмяБиблиотеки = "";
|
||
ИнфоТипа = ПолучитьИнфоТипаCOMОбъекта(МетаданныеРодителя, ИмяОбщегоТипа, ИмяБиблиотеки);
|
||
Если ИнфоТипа <> Неопределено Тогда
|
||
Если Найти(ИмяОбщегоТипа, " {") > 0 Тогда
|
||
ИнфоТипа = ИнфоТипа.Parent.TypeInfos.NamedItem(ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, " {"));
|
||
КонецЕсли;
|
||
//Если ИмяCOMКласса = "" Тогда
|
||
// Если Описатель.Parent.Name = "V" + ирКэш.НомерИзданияПлатформыЛкс() Тогда
|
||
// ИмяОбщегоТипа = "COM-соединитель";
|
||
// КонецЕсли;
|
||
//КонецЕсли;
|
||
Если НРег(ИнфоТипа.TypeKindString) = "coclass" Тогда
|
||
МассивИнфоТипа = ИнфоТипа.Interfaces;
|
||
Иначе
|
||
МассивИнфоТипа = Новый Массив;
|
||
МассивИнфоТипа.Добавить(ИнфоТипа);
|
||
Для Каждого ИнтерфейсОбъекта Из ИнфоТипа.ImpliedInterfaces Цикл
|
||
МассивИнфоТипа.Добавить(ИнтерфейсОбъекта);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Для Каждого ИнфоТипа Из МассивИнфоТипа Цикл
|
||
Для Каждого Член Из ИнфоТипа.Members Цикл
|
||
Если Член.AttributeMask = 1 Тогда
|
||
// Это члены IDispatch
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяЧлена = Член.Name;
|
||
Если Член.InvokeKind = 1 Или Член.Parameters.Count > 0 Тогда
|
||
лТипСлова = "Метод";
|
||
Иначе
|
||
лТипСлова = "Свойство";
|
||
КонецЕсли;
|
||
Если Слово <> Неопределено Тогда
|
||
Если Не ирОбщий.СтрокиРавныЛкс(Слово, ИмяЧлена) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Не ирОбщий.СтрокиРавныЛкс(ТипСлова, лТипСлова) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.ИмяОбщегоТипа = ПолучитьТипЗначенияЧленаИнтерфейса(Член.ReturnType, ИмяБиблиотеки, ИнфоТипа.Parent);
|
||
СтруктураТипа.СтрокаОписания = Член;
|
||
СтруктураТипа.Метаданные = МетаданныеРодителя;
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, ИмяЧлена, лТипСлова, ТаблицаСтруктурТипов);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
Если Истина
|
||
// Для того, чтобы постоянно не присваивался тип <ОбщийМодуль>
|
||
И ИмяОбщегоТипа <> "Глобальный"
|
||
И НайденныеСтроки.Количество() > 0
|
||
Тогда
|
||
Если Истина
|
||
И Слово <> Неопределено
|
||
И ВнутренняяТаблицаСлов.Количество() = 0
|
||
И НайденныеСтроки.Количество() = 1
|
||
Тогда
|
||
// Шаблон только один. Берем его даже если имя элемента коллекции не подошло.
|
||
СтрокаВида = НайденныеСтроки[0];
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрокаВида.ТипЗначения;
|
||
СтруктураТипа.СтрокаОписания = СтрокаВида;
|
||
СтруктураТипа.Метаданные = МетаданныеРодителя;
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, СтрокаВида.Слово, СтрокаВида.ТипСлова, ТаблицаСтруктурТипов);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиИмяТипаComОбъекта(ИмяОбщегоТипа) Экспорт
|
||
|
||
Результат = Ложь
|
||
Или ирОбщий.СтрокиРавныЛкс(ИмяОбщегоТипа, "COMОбъект")
|
||
Или Найти(ИмяОбщегоТипа, " {") > 0;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ДобавитьВТаблицуСловЭлементыМодуляМетаданных(Знач СтруктураТипа, Знач Слово = Неопределено, Знач ТипСлова = Неопределено, Знач ВнутренняяТаблицаСлов = Неопределено,
|
||
Знач МодульМетаданных = Неопределено) Экспорт
|
||
|
||
Если ВнутренняяТаблицаСлов = Неопределено Тогда
|
||
ВнутренняяТаблицаСлов = ПолучитьНовуюВнутреннююТаблицуСлов();
|
||
КонецЕсли;
|
||
МетаданныеРодителя = СтруктураТипа.Метаданные;
|
||
Если ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных") Тогда
|
||
Если МодульМетаданных = Неопределено Тогда
|
||
МодульМетаданных = ПодготовитьМодульМетаданных(СтруктураТипа);
|
||
КонецЕсли;
|
||
ОтборЭлементовМодуля = Новый Структура;
|
||
ОтборЭлементовМодуля.Вставить("ЛиЭкспорт", Истина);
|
||
Если ЗначениеЗаполнено(Слово) Тогда
|
||
ОтборЭлементовМодуля.Вставить("НИмя", НРег(Слово));
|
||
КонецЕсли;
|
||
Иначе
|
||
ОтборЭлементовМодуля = Новый Структура;
|
||
Если ЗначениеЗаполнено(Слово) Тогда
|
||
ОтборЭлементовМодуля.Вставить("НИмя", НРег(Слово));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если МодульМетаданных <> Неопределено Тогда
|
||
Если Ложь
|
||
Или ТипСлова = Неопределено
|
||
Или ТипСлова = "Свойство"
|
||
Тогда
|
||
ПеременныеМодуля = МодульМетаданных.Переменные;
|
||
#Если Сервер И Не Сервер Тогда
|
||
ПеременныеМодуля = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
Если ОтборЭлементовМодуля.Количество() > 0 Тогда
|
||
ПодходящиеПеременные = ПеременныеМодуля.НайтиСтроки(ОтборЭлементовМодуля);
|
||
Иначе
|
||
ПодходящиеПеременные = ПеременныеМодуля;
|
||
КонецЕсли;
|
||
Для Каждого ПеременнаяМодуля Из ПодходящиеПеременные Цикл
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, ПеременнаяМодуля.Имя, "Свойство");
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или ТипСлова = Неопределено
|
||
Или ТипСлова = "Метод"
|
||
Тогда
|
||
МетодыМодуля = МодульМетаданных.Методы;
|
||
#Если Сервер И Не Сервер Тогда
|
||
МетодыМодуля = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
Если ОтборЭлементовМодуля.Количество() > 0 Тогда
|
||
ПодходящиеМетоды = МетодыМодуля.НайтиСтроки(ОтборЭлементовМодуля);
|
||
Иначе
|
||
ПодходящиеМетоды = МетодыМодуля;
|
||
КонецЕсли;
|
||
ИскательВозврата = Неопределено;
|
||
Если Не ЗначениеЗаполнено(Слово) Тогда
|
||
ИмяКласса = "ПолеТекстовогоДокументаСКонтекстнойПодсказкой";
|
||
ВычислятьТипыВСписке = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ВычислятьТипыВСписке") = Истина;
|
||
Иначе
|
||
ВычислятьТипыВСписке = Ложь;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И Не ЗначениеЗаполнено(Слово)
|
||
И ВычислятьТипыВСписке
|
||
Тогда
|
||
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ПодходящиеМетоды.Количество(), "Вычисление типов функций");
|
||
Иначе
|
||
Индикатор = Неопределено;
|
||
КонецЕсли;
|
||
Для Каждого МетодМодуля Из ПодходящиеМетоды Цикл
|
||
Если Индикатор <> Неопределено Тогда
|
||
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или ЗначениеЗаполнено(Слово)
|
||
Или ВычислятьТипыВСписке
|
||
Тогда
|
||
ПодготовитьТипРезультатаМетода(МетодМодуля, МодульМетаданных, ИскательВозврата);
|
||
КонецЕсли;
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
Если МетодМодуля.ТаблицаСтруктурТипов <> Неопределено Тогда
|
||
ТаблицаСтруктурТипов = МетодМодуля.ТаблицаСтруктурТипов.Скопировать();
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаСтруктурТипов = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
Иначе
|
||
СтруктураТипа = ТаблицаСтруктурТипов.Добавить();
|
||
Если МетодМодуля.Тип = "Функция" Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = "??";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ТаблицаСтруктурТипов.ЗаполнитьЗначения(МетодМодуля, "СтрокаОписания");
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, МетодМодуля.Имя, "Метод", ТаблицаСтруктурТипов, МетодМодуля.ТипЗначения);
|
||
КонецЦикла;
|
||
Если Индикатор <> Неопределено Тогда
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПодготовитьМодульМетаданных(Знач СтруктураТипа, ТипМодуля = "") Экспорт
|
||
|
||
ИмяОбщегоТипа = СтруктураТипа.ИмяОбщегоТипа;
|
||
МетаданныеРодителя = СтруктураТипа.Метаданные;
|
||
ТипыМетаОбъектов = ирКэш.ТипыМетаОбъектов();
|
||
Если ИмяОбщегоТипа = "ОбщаяКоманда" Тогда
|
||
ТипМодуля = "МодульКоманды";
|
||
ИначеЕсли Ложь
|
||
Или ИмяОбщегоТипа = "WebСервис"
|
||
Или ИмяОбщегоТипа = "HttpСервис"
|
||
Или ИмяОбщегоТипа = "ОбщийМодуль"
|
||
Или ИмяОбщегоТипа = "ОбщаяКоманда"
|
||
Или ИмяОбщегоТипа = "ОбщаяФорма"
|
||
Тогда
|
||
ТипМодуля = "Модуль";
|
||
Если ИмяОбщегоТипа = "ОбщийМодуль" Тогда
|
||
СтрокаСозданияРодителя = МетаданныеРодителя.Имя;
|
||
КонецЕсли;
|
||
ИначеЕсли ИмяОбщегоТипа = "ОбъектМетаданныхКонфигурация" Тогда
|
||
Если Не ЗначениеЗаполнено(ТипМодуля) Тогда
|
||
#Если ТолстыйКлиентОбычноеПриложение Тогда
|
||
ТипМодуля = "МодульОбычногоПриложения";
|
||
#Иначе
|
||
ТипМодуля = "МодульУправляемогоПриложения";
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
Иначе
|
||
КорневойТипОбъекта = ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "Объект.", Ложь);
|
||
Если ЗначениеЗаполнено(КорневойТипОбъекта) Тогда
|
||
ТипМодуля = "МодульОбъекта";
|
||
СтрокаТипаМетаОбъекта = ТипыМетаОбъектов.Найти(КорневойТипОбъекта, "Единственное");
|
||
Если СтрокаТипаМетаОбъекта <> Неопределено Тогда
|
||
Множественное = СтрокаТипаМетаОбъекта.Множественное;
|
||
Если СтрокаТипаМетаОбъекта.Категория = 1 Тогда
|
||
СтрокаСозданияРодителя = Множественное + "." + МетаданныеРодителя.Имя + ".Создать()";
|
||
Иначе
|
||
СтрокаСозданияРодителя = Множественное + "." + МетаданныеРодителя.Имя + ".ПустаяСсылка().ПолучитьОбъект()";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли ЗначениеЗаполнено(ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "НаборЗаписей.", Ложь)) Тогда
|
||
ТипМодуля = "МодульНабораЗаписей";
|
||
КорневойТип = ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "НаборЗаписей");
|
||
СтрокаТипаМетаОбъекта = ТипыМетаОбъектов.Найти(КорневойТип, "Единственное");
|
||
Если СтрокаТипаМетаОбъекта <> Неопределено Тогда
|
||
Множественное = СтрокаТипаМетаОбъекта.Множественное;
|
||
СтрокаСозданияРодителя = Множественное + "." + МетаданныеРодителя.Имя + ".СоздатьНаборЗаписей()";
|
||
КонецЕсли;
|
||
ИначеЕсли ЗначениеЗаполнено(ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "МенеджерЗначения.", Ложь)) Тогда
|
||
ТипМодуля = "МодульМенеджераЗначения";
|
||
СтрокаСозданияРодителя = "Константы." + МетаданныеРодителя.Имя + ".СоздатьМенеджерЗначения()";
|
||
ИначеЕсли ЗначениеЗаполнено(ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "Менеджер.", Ложь)) Тогда
|
||
ТипМодуля = "МодульМенеджера";
|
||
КорневойТип = ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, "Менеджер");
|
||
СтрокаТипаМетаОбъекта = ТипыМетаОбъектов.Найти(КорневойТип, "Единственное");
|
||
Если СтрокаТипаМетаОбъекта <> Неопределено Тогда
|
||
Множественное = СтрокаТипаМетаОбъекта.Множественное;
|
||
СтрокаСозданияРодителя = Множественное + "." + МетаданныеРодителя.Имя;
|
||
КонецЕсли;
|
||
Иначе
|
||
// Еще можно добавить поддержку глобального контекста
|
||
ТипМодуля = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ТипМодуля <> Неопределено Тогда
|
||
Если МодулиМетаданных = Неопределено Тогда
|
||
МодулиМетаданных = Новый Соответствие;
|
||
КонецЕсли;
|
||
Если ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданныхКонфигурация") Тогда
|
||
ИмяФайлаМодуляБезРасширения = "Конфигурация" + "." + ТипМодуля;
|
||
Иначе
|
||
ИмяФайлаМодуляБезРасширения = МетаданныеРодителя.ПолноеИмя() + "." + ТипМодуля;
|
||
КонецЕсли;
|
||
МодульМетаданных = МодулиМетаданных[ИмяФайлаМодуляБезРасширения];
|
||
Если МодульМетаданных = Неопределено Тогда
|
||
//ПроверитьСтруктуруФайловогоКэша();
|
||
#Если Сервер И Не Сервер Тогда
|
||
ПапкаКэшаМодулей = Новый Файл;
|
||
#КонецЕсли
|
||
ФайлОписанияМодуля = Новый Файл(ПапкаКэшаМодулей.ПолноеИмя + "\" + ИмяФайлаМодуляБезРасширения + ".ixd");
|
||
ФайлОписанияМодуляСуществует = ФайлОписанияМодуля.Существует();
|
||
ФайлМодуля = Новый Файл(ПапкаКэшаМодулей.ПолноеИмя + "\" + ИмяФайлаМодуляБезРасширения + ".txt");
|
||
Если ФайлОписанияМодуляСуществует Тогда
|
||
МодульМетаданных = ирОбщий.ЗагрузитьЗначениеИзФайлаЛкс(ФайлОписанияМодуля.ПолноеИмя);
|
||
Если Ложь
|
||
Или ТипЗнч(МодульМетаданных) <> Тип("Структура")
|
||
Или МодульМетаданных.Методы.Колонки.Найти("ТипЗначения") = Неопределено
|
||
Тогда
|
||
// Старый формат кэша
|
||
ФайлОписанияМодуляСуществует = Ложь;
|
||
МодульМетаданных = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или Не ФайлОписанияМодуляСуществует
|
||
Или (Истина
|
||
И ФайлМодуля.Существует()
|
||
И ФайлМодуля.ПолучитьВремяИзменения() > ФайлОписанияМодуля.ПолучитьВремяИзменения())
|
||
Тогда
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
Если Не ФайлМодуля.Существует() Тогда
|
||
Если МодулиМетаданных.Количество() = 0 И СообщениеОНеобходимостиОбновитьКэшМодулейВыводилось <> Истина Тогда
|
||
ФайлыМодулей = НайтиФайлы(ПапкаКэшаМодулей.ПолноеИмя, "*Модул*");
|
||
Если ФайлыМодулей.Количество() = 0 Тогда
|
||
ирОбщий.СообщитьЛкс("Для получения экспортных методов и переменных модулей нужно обновлять кэш модулей через форму настроек контекстной подсказки.");
|
||
Форма = ирОбщий.ПолучитьФормуЛкс("Обработка.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Форма.ФормаНастройки");
|
||
Форма.Открыть();
|
||
КонецЕсли;
|
||
СообщениеОНеобходимостиОбновитьКэшМодулейВыводилось = Истина;
|
||
КонецЕсли;
|
||
Иначе
|
||
ТекстовыйДокумент.Прочитать(ФайлМодуля.ПолноеИмя);
|
||
МодульМетаданных = МодульМетаданных(ТекстовыйДокумент.ПолучитьТекст());
|
||
ирОбщий.СохранитьЗначениеВФайлЛкс(МодульМетаданных, ФайлОписанияМодуля.ПолноеИмя);
|
||
//УдалитьФайлы(ФайлМодуля.ПолноеИмя);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если МодульМетаданных <> Неопределено Тогда
|
||
#Если Сервер И Не Сервер Тогда
|
||
МетодыМодуля = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
МодульМетаданных.Методы.Колонки.Имя.Заголовок = СтрокаСозданияРодителя; // Некрасиво, но компактно
|
||
КонецЕсли;
|
||
МодулиМетаданных[ИмяФайлаМодуляБезРасширения] = МодульМетаданных;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат МодульМетаданных;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОписаниеМетодаМодуля(ПолноеИмяМетода) Экспорт
|
||
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.ИмяОбщегоТипа = "ОбщийМодуль";
|
||
СтруктураТипа.Метаданные = Метаданные.ОбщиеМодули[ирОбщий.ПервыйФрагментЛкс(ПолноеИмяМетода)];
|
||
МодульМетаданных = ПодготовитьМодульМетаданных(СтруктураТипа);
|
||
Если МодульМетаданных = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
МетодыМодуля = МодульМетаданных.Методы;
|
||
#Если Сервер И Не Сервер Тогда
|
||
МетодыМодуля = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
ОписаниеМетода = МетодыМодуля.Найти(ирОбщий.ПоследнийФрагментЛкс(ПолноеИмяМетода), "Имя");
|
||
Возврат ОписаниеМетода;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьРазделыМодуля1С(Знач ТекстМодуля = "") Экспорт
|
||
|
||
Шаблоны = ПолучитьШаблоныДляАнализаВстроенногоЯзыка();
|
||
RegExp.IgnoreCase = Истина;
|
||
RegExp.MultiLine = Истина;
|
||
RegExp.Global = Истина;
|
||
RegExp.Pattern = Шаблоны.СтруктураМодуля;
|
||
// Если после последнего слова КонецПроцедуры или КонецФункции сразу расположен конец, то этот блок попадает в раздел ОсновнаяПрограмма
|
||
// Чтобы этого избежать нужно добавлять в конце текста пробел!
|
||
РезультатПоиска = RegExp.Execute(ТекстМодуля + Символы.ПС);
|
||
Если РезультатПоиска.Count = 0 Тогда
|
||
ирОбщий.СообщитьЛкс("Неверный текст модуля", СтатусСообщения.Внимание);
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Вхождение = РезультатПоиска.Item(0);
|
||
Результат = Новый Структура;
|
||
Результат.Вставить("Переменные", Вхождение.SubMatches(0));
|
||
Результат.Вставить("Методы", Вхождение.SubMatches(4));
|
||
Результат.Вставить("Программа", Вхождение.SubMatches(11));
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьШаблоныДляАнализаВстроенногоЯзыка() Экспорт
|
||
|
||
// {ОписаниеРегулярногоВыражения.Начало} конструктор из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
|
||
// Перем шИмя, шРазделитель, шКомментарий, шСтруктураКомментарияПарам, шСтруктураКомментарияВозвр, шДирективаПрепроцессора, шВозврат, шСтруктураКомментарияОписаниеПараметров, шКомментарийМетода, шОписаниеПеременной, шСтрокаПеременныхБезКомментов, шСтрокаПеременных, шСтрокаПрограммы, шПараметрыМетода, шБлокКомментариев, шМетодЧистый, шМетод1, шМетод, шСтруктураМодуля, шЭлементОбластиМетодов;
|
||
// {Шаблон.Начало}
|
||
// + <шИмя> = [_ЁА-ЯA-Z][_ЁА-ЯA-Z\d]*
|
||
// + <шРазделитель> = (?://[^\n]*\n|\s|^|$)
|
||
// + <шКомментарий> = //[^\n]*[\n$]
|
||
// + <шСтруктураКомментарияПарам> = Параметры(?:\s*:\s*)?((([^\n]\n)*|.|\n)*)(?:\n\s*Возвращаемое значение\s*\:?\s*\n|$)
|
||
// + <шСтруктураКомментарияВозвр> = Возвращаемое значение(?:\s*:\s*)?((([^\n]\n)*|.|\n)*)(?:\n\s*Параметры\s*\:?\s*\n|$)
|
||
// + <шДирективаПрепроцессора> = (?:\t| )*[#&][^\n]*\n(?:(?:\t| )*(?:\r|$))*
|
||
// + <шВозврат> = Возврат\s+(?:Неопределено|Undefined|Null|(<шИмя>))[;\n\r$]
|
||
// + <шСтруктураКомментарияОписаниеПараметров> = (<шИмя>)(?:\s*(?:-|–))([^\n]*(?:\n|$)(\s{4}[^\n]*(?:\n|$))*)
|
||
// + <шКомментарийМетода> = ((?:[\f\r\t\v]*//[^\n]*\n)+)(?:Функция|Процедура)<шРазделитель>*(<шИмя>)
|
||
// + <шОписаниеПеременной> = (<шИмя>)(<шРазделитель>+Экспорт)?
|
||
// + <шСтрокаПеременныхБезКомментов> = Перем((?:<шРазделитель>*<шОписаниеПеременной><шРазделитель>*(?:;|,))+)
|
||
// + <шСтрокаПеременных> = <шСтрокаПеременныхБезКомментов>(.*//[^\n]*)*
|
||
// + <шСтрокаПрограммы> = "(?:(?:"")|[^"\n$])*(?:<шРазделитель>*\|(?:(?:"")|[^"\n$])*)*(?:"|$)
|
||
// + <шПараметрыМетода> = <шРазделитель>*(Знач\s)?<шРазделитель>*(<шИмя>)<шРазделитель>*=?((?:<шРазделитель>*|(<шСтрокаПрограммы>)|(?:[^,\n$]*))+)(?:,|$)
|
||
// + <шБлокКомментариев> = (?:(?:\t| )*<шКомментарий>)+
|
||
// + <шМетодЧистый> = ((Процедура|Функция)<шРазделитель>*(<шИмя>)<шРазделитель>*\(([^\)]*)\)(<шРазделитель>*Экспорт)?)((?:(?:<шСтрокаПрограммы>|<шБлокКомментариев>|\.Конец(?:Процедуры|Функции)|\r|\n|.)*?))[^а-яё_a-z0-9\."]Конец(?:Процедуры|Функции)(?:<шКомментарий>|[^а-яё_a-z0-9\."]|$)
|
||
// - <шМетодЧистый> = ((Процедура|Функция)<шРазделитель>*(<шИмя>)<шРазделитель>*\(([^\)]*)\)(<шРазделитель>*Экспорт)?)((?:(?:<шСтрокаПрограммы>|<шБлокКомментариев>|\.Конец(?:Процедуры|Функции)|\r|\n|.)*?))(?:[^а-яё_a-z0-9\."]Конец(?:Процедуры|Функции)|(?:\t| )*<шКомментарий>Конец(?:Процедуры|Функции))(?:<шКомментарий>|[^а-яё_a-z0-9\."]|$)
|
||
// + <шМетод1> = (?:^|\n\s*)<шМетодЧистый>
|
||
// + <шМетод> = (?:(<шБлокКомментариев>)|\n|^)(?:\t| )*<шМетодЧистый>
|
||
// + <шСтруктураМодуля> = ^((?:<шРазделитель><шДирективаПрепроцессора>|<шСтрокаПеременныхБезКомментов>|<шРазделитель>)*\n)?((?:<шРазделитель><шДирективаПрепроцессора>|<шМетод1>|<шРазделитель>)*)((?:\r|\n|.)*)$
|
||
// + <шЭлементОбластиМетодов> = <шМетод>|(<шБлокКомментариев>)|(<шДирективаПрепроцессора>)
|
||
// {Шаблон.Конец}
|
||
шИмя = "[_ЁА-ЯA-Z][_ЁА-ЯA-Z\d]*";
|
||
шРазделитель = "(?://[^\n]*\n|\s|^|$)";
|
||
шКомментарий = "//[^\n]*[\n$]";
|
||
шСтруктураКомментарияПарам = "Параметры(?:\s*:\s*)?((([^\n]\n)*|.|\n)*)(?:\n\s*Возвращаемое значение\s*\:?\s*\n|$)";
|
||
шСтруктураКомментарияВозвр = "Возвращаемое значение(?:\s*:\s*)?((([^\n]\n)*|.|\n)*)(?:\n\s*Параметры\s*\:?\s*\n|$)";
|
||
шДирективаПрепроцессора = "(?:\t| )*[#&][^\n]*\n(?:(?:\t| )*(?:\r|$))*";
|
||
шВозврат = "Возврат\s+(?:Неопределено|Undefined|Null|(" + шИмя + "))[;\n\r$]";
|
||
шСтруктураКомментарияОписаниеПараметров = "(" + шИмя + ")(?:\s*(?:-|–))([^\n]*(?:\n|$)(\s{4}[^\n]*(?:\n|$))*)";
|
||
шКомментарийМетода = "((?:[\f\r\t\v]*//[^\n]*\n)+)(?:Функция|Процедура)" + шРазделитель + "*(" + шИмя + ")";
|
||
шОписаниеПеременной = "(" + шИмя + ")(" + шРазделитель + "+Экспорт)?";
|
||
шСтрокаПеременныхБезКомментов = "Перем((?:" + шРазделитель + "*" + шОписаниеПеременной + "" + шРазделитель + "*(?:;|,))+)";
|
||
шСтрокаПеременных = "" + шСтрокаПеременныхБезКомментов + "(.*//[^\n]*)*";
|
||
шСтрокаПрограммы = """(?:(?:"""")|[^""\n$])*(?:" + шРазделитель + "*\|(?:(?:"""")|[^""\n$])*)*(?:""|$)";
|
||
шПараметрыМетода = "" + шРазделитель + "*(Знач\s)?" + шРазделитель + "*(" + шИмя + ")" + шРазделитель + "*=?((?:" + шРазделитель + "*|(" + шСтрокаПрограммы + ")|(?:[^,\n$]*))+)(?:,|$)";
|
||
шБлокКомментариев = "(?:(?:\t| )*" + шКомментарий + ")+";
|
||
// Быстрый вариант, но не находит конец у метода с комментарием в последней строке
|
||
шМетодЧистый = "((Процедура|Функция)" + шРазделитель + "*(" + шИмя + ")" + шРазделитель + "*\(([^\)]*)\)(" + шРазделитель + "*Экспорт)?)((?:(?:" + шСтрокаПрограммы + "|" + шБлокКомментариев + "|\.Конец(?:Процедуры|Функции)|\r|\n|.)*?))[^а-яё_a-z0-9\.""]Конец(?:Процедуры|Функции)(?:" + шКомментарий + "|[^а-яё_a-z0-9\.""]|$)";
|
||
шМетод1 = "(?:^|\n\s*)" + шМетодЧистый + "";
|
||
шМетод = "(?:(" + шБлокКомментариев + ")|\n|^)(?:\t| )*" + шМетодЧистый + "";
|
||
// Если после последнего слова КонецПроцедуры или КонецФункции сразу расположен конец, то этот блок попадает в раздел ОсновнаяПрограмма
|
||
// Чтобы этого избежать нужно добавлять в конце текста пробел!
|
||
шСтруктураМодуля = "^((?:" + шРазделитель + "" + шДирективаПрепроцессора + "|" + шСтрокаПеременныхБезКомментов + "|" + шРазделитель + ")*\n)?((?:" + шРазделитель + "" + шДирективаПрепроцессора + "|" + шМетод1 + "|" + шРазделитель + ")*)((?:\r|\n|.)*)$";
|
||
шЭлементОбластиМетодов = "" + шМетод + "|(" + шБлокКомментариев + ")|(" + шДирективаПрепроцессора + ")";
|
||
// {ОписаниеРегулярногоВыражения.Конец}
|
||
|
||
Результат = Новый Структура;
|
||
Результат.Вставить("СтрокаПрограммы", шСтрокаПрограммы);
|
||
Результат.Вставить("ДирективаПрепроцессора", шДирективаПрепроцессора);
|
||
Результат.Вставить("БлокКомментариев", шБлокКомментариев);
|
||
Результат.Вставить("ОписаниеФункцииПроцедуры", шМетод);
|
||
Результат.Вставить("ЭлементОбластиМетодов", шЭлементОбластиМетодов);
|
||
Результат.Вставить("ОписаниеПеременной", шОписаниеПеременной);
|
||
Результат.Вставить("ОписаниеСтрокиПеременных", шСтрокаПеременных);
|
||
Результат.Вставить("ОписаниеСтрокиПеременныхБезКомментов", шСтрокаПеременныхБезКомментов);
|
||
Результат.Вставить("КомментарийОписаниеМетода", шКомментарийМетода);
|
||
Результат.Вставить("ПараметрыМетода", шПараметрыМетода);
|
||
Результат.Вставить("СтруктураКомментарияВозвр", шСтруктураКомментарияВозвр);
|
||
Результат.Вставить("СтруктураКомментарияПарам", шСтруктураКомментарияПарам);
|
||
Результат.Вставить("СтруктураКомментарияОписаниеПараметров", шСтруктураКомментарияОписаниеПараметров);
|
||
//Результат.Вставить("ВхождениеМетодов", шВхождениеМетодов);
|
||
Результат.Вставить("СтруктураМодуля", шСтруктураМодуля);
|
||
Результат.Вставить("Возврат", шВозврат);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция МодульМетаданных(ТекстМодуля) Экспорт
|
||
Результат = ПолучитьРазделыМодуля1С(ТекстМодуля);
|
||
Шаблоны = ПолучитьШаблоныДляАнализаВстроенногоЯзыка();
|
||
RegExp.IgnoreCase = Истина;
|
||
|
||
Переменные = Новый ТаблицаЗначений;
|
||
Переменные.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
|
||
Переменные.Колонки.Добавить("НИмя", Новый ОписаниеТипов("Строка"));
|
||
Переменные.Колонки.Добавить("ЛиЭкспорт", Новый ОписаниеТипов("Булево"));
|
||
Переменные.Колонки.Добавить("Описание");
|
||
RegExp.Multiline = Ложь;
|
||
RegExp.Pattern = Шаблоны.ОписаниеСтрокиПеременных + "|(" + Шаблоны.БлокКомментариев + ")|(" + Шаблоны.ДирективаПрепроцессора + ")";
|
||
Вхождения = RegExp.Execute(Результат.Переменные);
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
Если Вхождение.SubMatches(0) <> Неопределено Тогда
|
||
RegExp2.Pattern = Шаблоны.ОписаниеПеременной + "|\s*(?:;|,)";
|
||
Результат2 = RegExp2.Execute(Вхождение.SubMatches(0));
|
||
Для Каждого Вхождение2 Из Результат2 Цикл
|
||
Если Вхождение2.SubMatches(0) <> Неопределено Тогда
|
||
СтрокаПеременной = Переменные.Добавить();
|
||
СтрокаПеременной.Имя = Вхождение2.SubMatches(0);
|
||
СтрокаПеременной.НИмя = Нрег(СтрокаПеременной.Имя);
|
||
СтрокаПеременной.ЛиЭкспорт = ?(Вхождение2.SubMatches(1) = Неопределено, Ложь, Истина);
|
||
СтрокаПеременной.Описание = СокрЛП(ОчиститьТекстМодуляОтПрефиксаКомментария(Вхождение.SubMatches(3)));
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
//ИначеЕсли Вхождение.SubMatches(4) <> Неопределено Тогда
|
||
// СтрокаПеременной.Тип = "Комментарий";
|
||
//ИначеЕсли Вхождение.SubMatches(5) <> Неопределено Тогда
|
||
// СтрокаПеременной.Тип = "Директива";
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Результат.Переменные = Переменные;
|
||
|
||
RegExp.MultiLine = Истина;
|
||
RegExp.Global = Истина;
|
||
|
||
RegExp.Pattern = "^(?://[^\n]*\n|\s|^|$)*(КонецПроцедуры|КонецФункции)";
|
||
Вхождения = RegExp.Execute(Результат.Методы);
|
||
Если Вхождения.Count > 0 Тогда
|
||
НачалоТекстаПрограммы = Вхождения.Item(Вхождения.Count - 1).FirstIndex + Вхождения.Item(Вхождения.Count - 1).Length;
|
||
ТекстМетоды = Лев(Результат.Методы, НачалоТекстаПрограммы + 1);
|
||
Результат.Программа = Сред(Результат.Методы, НачалоТекстаПрограммы + 2) + Результат.Программа;
|
||
КонецЕсли;
|
||
RegExp.Pattern = Шаблоны.ЭлементОбластиМетодов;
|
||
RegExp.MultiLine = Ложь;
|
||
RegExp2.Global = Истина;
|
||
RegExp2.Pattern = Шаблоны.ПараметрыМетода;
|
||
Вхождения = RegExp.Execute(" " + ТекстМетоды);
|
||
КомпонентаПодсказки = Неопределено;
|
||
ИскательВозврата = Неопределено;
|
||
Методы = Новый ТаблицаЗначений;
|
||
Методы.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
|
||
Методы.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка"));
|
||
//Методы.Колонки.Добавить("Индекс", Новый ОписаниеТипов("Число"));
|
||
Методы.Колонки.Добавить("НИмя", Новый ОписаниеТипов("Строка"));
|
||
Методы.Колонки.Добавить("Тело", Новый ОписаниеТипов("Строка"));
|
||
Методы.Колонки.Добавить("Параметры");
|
||
Методы.Колонки.Добавить("Описание");
|
||
Методы.Колонки.Добавить("ТипЗначения");
|
||
Методы.Колонки.Добавить("ОписаниеРезультата");
|
||
Методы.Колонки.Добавить("ТаблицаСтруктурТипов");
|
||
Методы.Колонки.Добавить("ЛиЭкспорт", Новый ОписаниеТипов("Булево"));
|
||
шРазделительВнутриСтроки = "[-–]"; // Здесь 2 разных символа
|
||
шОписаниеПараметра = "\n\s{1,8}(" + шИмя + ")\*?\s*(?:" + шРазделительВнутриСтроки + "\s*([^-–\n]*)\s*)?" + шРазделительВнутриСтроки + "\s*(.*(\n\s{5,}[^\s].*)*)[\.;]?";
|
||
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Вхождения.Count, "Поиск методов модуля");
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
|
||
Если Вхождение.SubMatches(1) <> Неопределено Тогда
|
||
СтрокаПараметров = "";
|
||
СтрокаМетода = Методы.Добавить();
|
||
ТекстМодуля = Вхождение.SubMatches(0);
|
||
СтрокаМетода.Описание = ОчиститьТекстМодуляОтПрефиксаКомментария(ТекстМодуля);
|
||
//СтрокаМетода.Индекс = Вхождение.FirstIndex + Смещение;
|
||
СтрокаМетода.Тип = ТРег(Вхождение.SubMatches(2));
|
||
СтрокаМетода.Имя = Вхождение.SubMatches(3);
|
||
СтрокаМетода.НИмя = Нрег(СтрокаМетода.Имя);
|
||
СтрокаПараметров = Вхождение.SubMatches(4);
|
||
ЛиЭкспорт = ?(Вхождение.SubMatches(5) = Неопределено, Ложь, Истина);
|
||
СтрокаМетода.ЛиЭкспорт = ЛиЭкспорт;
|
||
СтрокаМетода.Тело = Вхождение.SubMatches(6);
|
||
Если Не ПустаяСтрока(СтрокаПараметров) И ЛиЭкспорт Тогда
|
||
РезультатПараметров = RegExp2.Execute(СтрокаПараметров);
|
||
Если РезультатПараметров.Count > 0 Тогда
|
||
ТаблицаПараметровМетода = Новый ТаблицаЗначений;
|
||
ТаблицаПараметровМетода.Колонки.Добавить("Имя");
|
||
ТаблицаПараметровМетода.Колонки.Добавить("НИмя");
|
||
ТаблицаПараметровМетода.Колонки.Добавить("ТипЗначения");
|
||
ТаблицаПараметровМетода.Колонки.Добавить("Описание");
|
||
ТаблицаПараметровМетода.Колонки.Добавить("Значение");
|
||
ТаблицаПараметровМетода.Колонки.Добавить("Знач");
|
||
СтрокаМетода.Параметры = ТаблицаПараметровМетода;
|
||
Для Каждого ВхождениеПараметра Из РезультатПараметров Цикл
|
||
СтрокаПраметра = ТаблицаПараметровМетода.Добавить();
|
||
СтрокаПраметра.Имя = ВхождениеПараметра.SubMatches(1);
|
||
СтрокаПраметра.НИмя = НРег(СтрокаПраметра.Имя);
|
||
СтрокаПраметра.Знач = ?(ВхождениеПараметра.SubMatches(0) = Неопределено, Ложь, Истина);
|
||
СтрокаПраметра.Значение = ВхождениеПараметра.SubMatches(2);
|
||
КонецЦикла;
|
||
Если ЗначениеЗаполнено(СтрокаМетода.Описание) Тогда
|
||
ВхожденияОписаний = ирОбщий.НайтиРегулярноеВыражениеЛкс(СтрокаМетода.Описание, шОписаниеПараметра, "Имя, ТипЗначения, Описание",,, Ложь, Ложь);
|
||
#Если Сервер И Не Сервер Тогда
|
||
ВхожденияОписаний = Обработки.ирПлатформа.Создать().ВхожденияРегулярногоВыражения;
|
||
#КонецЕсли
|
||
Для каждого ВхождениеОписания Из ВхожденияОписаний Цикл
|
||
СтрокаПараметра = ТаблицаПараметровМетода.Найти(НРег(ВхождениеОписания.Имя));
|
||
Если СтрокаПараметра <> Неопределено Тогда
|
||
СтрокаПараметра.Описание = ВхождениеОписания.Описание;
|
||
СтрокаПараметра.ТипЗначения = ВхождениеОписания.ТипЗначения;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если ирОбщий.СтрокиРавныЛкс(СтрокаМетода.Тип, "функция") Тогда
|
||
СтрокаМетода.ТипЗначения = "??";
|
||
ШаблонРезультата = "(?:Возвращаемое\s+значение|Результат)[:-]\s*([^-]+)\s*-\s*(.*)\s*";
|
||
ВхожденияОписаний = ирОбщий.НайтиРегулярноеВыражениеЛкс(СтрокаМетода.Описание, ШаблонРезультата, "ТипЗначения, Описание", Ложь,, Ложь, Ложь);
|
||
Если ВхожденияОписаний.Количество() > 0 Тогда
|
||
ВхождениеОписания = ВхожденияОписаний[ВхожденияОписаний.Количество() - 1];
|
||
СтрокаМетода.ТипЗначения = СтрокаМетода.ТипЗначения + ", " + ВхождениеОписания.ТипЗначения;
|
||
СтрокаМетода.ОписаниеРезультата = ВхождениеОписания.Описание;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
//ИначеЕсли Вхождение.SubMatches(7) <> Неопределено Тогда
|
||
// //СтрокаБлока.Тип = "Комментарий";
|
||
//ИначеЕсли Вхождение.SubMatches(8) <> Неопределено Тогда
|
||
// //СтрокаБлока.Тип = "Директива";
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
|
||
Методы.Индексы.Добавить("ЛиЭкспорт");
|
||
Методы.Индексы.Добавить("ЛиЭкспорт, НИмя");
|
||
Методы.Индексы.Добавить("НИмя");
|
||
Результат.Методы = Методы;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
|
||
Функция ОчиститьТекстМодуляОтПрефиксаКомментария(Знач ТекстМодуля)
|
||
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
|
||
Для Счетчик = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
|
||
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Счетчик);
|
||
ТекстовыйДокумент.ЗаменитьСтроку(Счетчик, Сред(ТекущаяСтрока, Найти(ТекущаяСтрока, "//") + 2));
|
||
КонецЦикла;
|
||
Описание = ТекстовыйДокумент.ПолучитьТекст();
|
||
Возврат Описание;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПодготовитьТипРезультатаМетода(СтрокаМетода, МодульМетаданных, кэшИскательВозврата = Неопределено, кэшКомпонентаПодсказки = Неопределено) Экспорт
|
||
|
||
Если СтрокаМетода.Тип = "Функция" И СтрокаМетода.ТаблицаСтруктурТипов = Неопределено Тогда
|
||
Если кэшИскательВозврата = Неопределено Тогда
|
||
Шаблоны = ПолучитьШаблоныДляАнализаВстроенногоЯзыка();
|
||
кэшИскательВозврата = ирКэш.ВычислительРегулярныхВыраженийЛкс();
|
||
кэшИскательВозврата.Pattern = Шаблоны.Возврат;
|
||
кэшИскательВозврата.Global = Истина;
|
||
КонецЕсли;
|
||
Если кэшКомпонентаПодсказки = Неопределено Тогда
|
||
кэшКомпонентаПодсказки = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой");
|
||
#Если Сервер И Не Сервер Тогда
|
||
кэшКомпонентаПодсказки = Обработки.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Создать();
|
||
#КонецЕсли
|
||
кэшКомпонентаПодсказки.мПлатформа = ЭтотОбъект;
|
||
кэшКомпонентаПодсказки.мМодульМетаданных = МодульМетаданных;
|
||
кэшКомпонентаПодсказки.ИнициализироватьНеинтерактивно();
|
||
КонецЕсли;
|
||
ТелоБезКомментариев = кэшКомпонентаПодсказки.ЗалитьКомментарииИСтроковыеЛитералы(СтрокаМетода.Тело);
|
||
ВхожденияВозврата = кэшИскательВозврата.Execute(ТелоБезКомментариев);
|
||
ИмяОбщегоТипа = "Произвольный";
|
||
СтрокаМетода.ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа(); // Защита от циклической рекурсии
|
||
//СтрокаМетода.ТипЗначения = ПримитивныйТипЗначения;
|
||
НачальноеКоличество = ВхожденияВозврата.Count;
|
||
Для Счетчик = 1 По НачальноеКоличество Цикл
|
||
ВхождениеВозврата = ВхожденияВозврата.Item(НачальноеКоличество - Счетчик);
|
||
ИмяПеременной = ВхождениеВозврата.SubMatches(0);
|
||
Если ИмяПеременной = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или ИмяПеременной = "Ложь"
|
||
Или ИмяПеременной = "Истина"
|
||
Или ИмяПеременной = "False"
|
||
Или ИмяПеременной = "True"
|
||
Тогда
|
||
ИмяОбщегоТипа = "Булево";
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ТекстДляПоискаОпределения = Лев(ТелоБезКомментариев, ВхождениеВозврата.FirstIndex - 1);
|
||
// кэшКомпонентаПодсказки.МассивЗащитыОтРекурсии.Очистить(); // Возможно нужно делать
|
||
ТаблицаСтруктурТиповЛ = кэшКомпонентаПодсказки.ОпределитьТипЗначенияКонтекста(ИмяПеременной, ТекстДляПоискаОпределения, ТекстДляПоискаОпределения);
|
||
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ТаблицаСтруктурТиповЛ, СтрокаМетода.ТаблицаСтруктурТипов);
|
||
Прервать;
|
||
КонецЦикла;
|
||
Если СтрокаМетода.ТаблицаСтруктурТипов.Количество() = 0 Тогда
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.ИмяОбщегоТипа = ИмяОбщегоТипа;
|
||
ЗаполнитьЗначенияСвойств(СтрокаМетода.ТаблицаСтруктурТипов.Добавить(), СтруктураТипа);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
// Еще можно анализировать возвращемые типы значений параметров
|
||
//СтрокаМетода.Тело = ""; // Не освобождаем память, т.к. теперь мы ищем по телам методов в форме "Общие методы"
|
||
|
||
КонецФункции
|
||
|
||
// Получает внутреннюю таблицу предопределенных слов заданного родительского типа.
|
||
//
|
||
// Параметры:
|
||
// РодительскаяСтруктураТипа – Структура;
|
||
// *Слово – Строка, *Неопределено – для отбора;
|
||
// *ТипСлова – Строка, *Неопределено – для отбора;
|
||
// *ВиртуальнаяТаблица - Структура, *Неопределено - описание виртуальной таблицы;
|
||
// *ЯзыкПрограммы - *Число, 0;
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений – с колонками "Слово", "ТипСлова", "ТаблицаСтруктурТипов".
|
||
//
|
||
Функция ПолучитьВнутреннююТаблицуПредопределенныхСлов(Знач РодительскаяСтруктураТипа, Знач Слово = Неопределено, Знач ТипСлова = Неопределено, Знач ВиртуальнаяТаблица = Неопределено, Знач ЯзыкПрограммы = 0,
|
||
Знач Конфигурация = Неопределено, Знач ВычислятьТипы = Истина, Знач ЛиСерверныйКонтекст = Ложь) Экспорт
|
||
|
||
ВнутренняяТаблицаСлов = ПолучитьНовуюВнутреннююТаблицуСлов();
|
||
|
||
КлючПоискаКонструктора = Новый Структура;
|
||
Если РодительскаяСтруктураТипа.Конструктор Тогда
|
||
КлючПоискаКонструктора = Новый Структура("ЕстьКонструктор, ЯзыкПрограммы, НСлово", Истина, ЯзыкПрограммы);
|
||
КонецЕсли;
|
||
|
||
ИмяОбщегоТипа = РодительскаяСтруктураТипа.ИмяОбщегоТипа;
|
||
Если Найти(ИмяОбщегоТипа, " {V") > 0 Тогда
|
||
ЧистоеИмяТипа = ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, " ");
|
||
Если Найти(ЧистоеИмяТипа, "IV8COMConnector") = 1 Тогда
|
||
РодительскаяСтруктураТипа.ИмяОбщегоТипа = "Менеджер COM-соединений";
|
||
ИначеЕсли Найти(ЧистоеИмяТипа, "IServerAgentConnection") = 1 Тогда
|
||
РодительскаяСтруктураТипа.ИмяОбщегоТипа = "Соединение с агентом сервера";
|
||
ИначеЕсли Найти(ИмяОбщегоТипа, "IWorkingProcessConnection") Тогда
|
||
РодительскаяСтруктураТипа.ИмяОбщегоТипа = "Соединение с рабочим процессом";
|
||
ИначеЕсли Найти(ИмяОбщегоТипа, "Application") Тогда
|
||
РодительскаяСтруктураТипа.ИмяОбщегоТипа = "Automation сервер";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
МассивОбщихТипов = ПолучитьТаблицуОбщихТиповСтруктурыТипа(РодительскаяСтруктураТипа);
|
||
#Если Сервер И Не Сервер Тогда
|
||
МассивОбщихТипов = Новый ТаблицаЗначений;
|
||
ВнутренняяТаблицаСлов = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
НомерВерсииПлатформы = ирКэш.НомерВерсииПлатформыЛкс();
|
||
СтрокаОбщегоТипаГлобального = МассивОбщихТипов.Найти("Глобальный", "ИмяОбщегоТипа");
|
||
Если СтрокаОбщегоТипаГлобального <> Неопределено Тогда
|
||
// Глобальный контекст всегда идет строго первым
|
||
МассивОбщихТипов.Сдвинуть(СтрокаОбщегоТипаГлобального, -МассивОбщихТипов.Индекс(СтрокаОбщегоТипаГлобального));
|
||
КонецЕсли;
|
||
Для Каждого СтрокаОбщегоТипа Из МассивОбщихТипов Цикл
|
||
ИмяОбщегоТипа = СтрокаОбщегоТипа.ИмяОбщегоТипа;
|
||
ИспользоватьКэширование = Истина
|
||
И ИмяОбщегоТипа = "Глобальный"
|
||
И Слово = Неопределено;
|
||
Если ИспользоватьКэширование Тогда
|
||
КлючКэширования = "" + ЯзыкПрограммы + ";" + Конфигурация + ";" + ВычислятьТипы + ";" + ЛиСерверныйКонтекст;
|
||
Если мКэшСловГлобальногоКонтекста = Неопределено Тогда
|
||
мКэшСловГлобальногоКонтекста = Новый Соответствие;
|
||
КонецЕсли;
|
||
ТаблицаСловИзКэша = мКэшСловГлобальногоКонтекста[КлючКэширования];
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаСловИзКэша = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
Если ТаблицаСловИзКэша <> Неопределено Тогда
|
||
Если ТипСлова <> Неопределено Тогда
|
||
ОтборСлов = Новый Структура("ТипСлова", ТипСлова);
|
||
Иначе
|
||
ОтборСлов = Неопределено;
|
||
КонецЕсли;
|
||
ВнутренняяТаблицаСлов = ТаблицаСловИзКэша.Скопировать(ОтборСлов);
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
МетаданныеРодителя = СтрокаОбщегоТипа.Метаданные;
|
||
КорневойТипРодителя = Неопределено;
|
||
ПостроительЗапросаРодителя = Неопределено;
|
||
ТипМетаданныхРодителя = ТипЗнч(МетаданныеРодителя);
|
||
Если Истина
|
||
И (Ложь
|
||
Или ТипМетаданныхРодителя = Тип("ОбъектМетаданных")
|
||
Или (Истина
|
||
И Это2iS
|
||
И (Ложь
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.ОбъектыМетаданных2iS")
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.СвойстваМетаданных2iS")))
|
||
Или (Истина
|
||
И ЭтоИнтеграция
|
||
И (Ложь
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.МетаданныеИис")
|
||
Или ТипМетаданныхРодителя = Тип("СправочникСсылка.СвойстваМетаданныхИис"))))
|
||
И РодительскаяСтруктураТипа.ТипЯзыка <> "ИмяТипа"
|
||
Тогда
|
||
Если ТипМетаданныхРодителя = Тип("ОбъектМетаданных") Тогда
|
||
КорневойТипРодителя = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(МетаданныеРодителя);
|
||
Иначе
|
||
КорневойТипРодителя = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(КэшОбъект(МетаданныеРодителя).ПолноеИмя);
|
||
КонецЕсли;
|
||
ПостроительЗапросаРодителя = ПолучитьПостроительЗапросаПоСтруктуреТипа(СтрокаОбщегоТипа,
|
||
РодительскаяСтруктураТипа.ВиртуальнаяТаблица);
|
||
КонецЕсли;
|
||
Если ИмяОбщегоТипа = "Локальный" Тогда
|
||
НайденныеСтроки = Новый Массив;
|
||
ИначеЕсли ТипСлова = "Конструктор" Тогда
|
||
НайденныеСтроки = Новый Массив;
|
||
Если ИмяОбщегоТипа = "Глобальный" Тогда
|
||
СтруктураКлюча = Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка, ТипСлова",
|
||
Слово, ЯзыкПрограммы, РодительскаяСтруктураТипа.ТипЯзыка, ТипСлова);
|
||
НайденныеСтроки = ТаблицаКонтекстов.НайтиСтроки(СтруктураКлюча);
|
||
КонецЕсли;
|
||
Иначе
|
||
// Состав полей совпадает с индексом
|
||
СтруктураКлюча = Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка",
|
||
ИмяОбщегоТипа, ЯзыкПрограммы, РодительскаяСтруктураТипа.ТипЯзыка);
|
||
Если Слово <> Неопределено Тогда
|
||
СтруктураКлюча.Вставить("НСлово", НРег(Слово));
|
||
Если Истина
|
||
И ЯзыкПрограммы = 0 // В языке запросов может быть неоднозначность между типами слов Таблица и Поле. Поэтому для них жертвуем попаданием в индекс
|
||
И ТипСлова = Неопределено
|
||
Тогда
|
||
//ирОбщий.СообщитьЛкс("Использован медленный поиск по таблице контекстов");
|
||
ТипСлова = "Свойство"; // Так будем всегда попадать в индекс
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ТипСлова <> Неопределено Тогда
|
||
СтруктураКлюча.Вставить("ТипСлова", ТипСлова);
|
||
КонецЕсли;
|
||
НайденныеСтроки = ТаблицаКонтекстов.НайтиСтроки(СтруктураКлюча);
|
||
КонецЕсли;
|
||
Для Каждого СтрокаСлова Из НайденныеСтроки Цикл
|
||
Если СтрокаСлова.НомерВерсииПлатформы > НомерВерсииПлатформы Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И СтрокаСлова.ТипСлова = "Метод"
|
||
И СтрокаОбщегоТипа.НеВключатьМетоды
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ТипСлова = Неопределено
|
||
И (Ложь
|
||
Или СтрокаСлова.ТипСлова = "Событие"
|
||
Или СтрокаСлова.ТипСлова = "Параметр"
|
||
Или СтрокаСлова.ТипСлова = "Конструктор")
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если РодительскаяСтруктураТипа.Конструктор Тогда
|
||
КлючПоискаКонструктора.НСлово = НРег(СтрокаСлова.Слово);
|
||
Если ТаблицаОбщихТипов.НайтиСтроки(КлючПоискаКонструктора).Количество() = 0 Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ТаблицаСтруктурТипов = Неопределено;
|
||
Если ВычислятьТипы Тогда
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
ЛиДобавляемСлово = Истина;
|
||
МассивТиповЗначения = ирОбщий.СтрРазделитьЛкс(СтрокаСлова.ТипЗначения, ", ");
|
||
Для Каждого ИмяОбщегоТипа Из МассивТиповЗначения Цикл
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.СтрокаОписания = СтрокаСлова;
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа, РодительскаяСтруктураТипа, , "ИмяОбщегоТипа, СтрокаОписания, Метаданные");
|
||
Если Истина
|
||
//И ТипЗнч(МетаданныеРодителя) <> Тип("COMОбъект")
|
||
//И ИмяОбщегоТипа <>
|
||
//И СтрокаСлова.ТипСлова = "Свойство"
|
||
Тогда
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа, СтрокаОбщегоТипа, "Метаданные");
|
||
КонецЕсли;
|
||
Если ИмяОбщегоТипа = "ОбъектМетаданныхКонфигурация" Тогда
|
||
//СтруктураТипа.Метаданные = Конфигурация;
|
||
Если Конфигурация <> Неопределено Тогда
|
||
СтруктураТипа.Метаданные = Конфигурация;
|
||
Иначе
|
||
СтруктураТипа.Метаданные = мМетаданные;
|
||
КонецЕсли;
|
||
ИначеЕсли ИмяОбщегоТипа = "Отбор" Тогда
|
||
Если Ложь
|
||
//Или Найти(НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа), "объект.") > 0
|
||
Или Найти(НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа), "наборзаписей.") > 0
|
||
Тогда
|
||
ИмяТаблицыБД = ирКэш.ИмяТаблицыИзМетаданныхЛкс(СтрокаОбщегоТипа.Метаданные.ПолноеИмя());
|
||
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(ИмяТаблицыБД);
|
||
СтруктураТипа.Метаданные = СтруктураОбъекта.Методы;
|
||
Иначе
|
||
// %%%% Недокументированная особенность платформы
|
||
КонкретныйТип = ИмяТипаИзСтруктурыТипа(СтрокаОбщегоТипа);
|
||
Если Найти(КонкретныйТип, "<") = 0 Тогда
|
||
Попытка
|
||
Образователь = Новый (КонкретныйТип);
|
||
СтруктураТипа.Метаданные = Образователь;
|
||
Исключение
|
||
// Срабатывает для табличных полей
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтруктураТипа.ИмяОбщегоТипа = ИмяОбщегоТипа;
|
||
Если ВиртуальнаяТаблица <> Неопределено Тогда
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа.ВиртуальнаяТаблица, ВиртуальнаяТаблица);
|
||
КонецЕсли;
|
||
|
||
Если РодительскаяСтруктураТипа.ТипЯзыка = "ИмяТипа" Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрокаСлова.Слово;
|
||
Если СтрокаСлова.ТипКонтекста <> "" Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрокаСлова.ТипКонтекста + "." + СтруктураТипа.ИмяОбщегоТипа;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если Истина
|
||
И СтруктураТипа.ИмяОбщегоТипа = "Строка табличной части"
|
||
И Найти(РодительскаяСтруктураТипа.ИмяОбщегоТипа, "ТабличнаяЧасть.") > 0
|
||
Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрЗаменить(РодительскаяСтруктураТипа.ИмяОбщегоТипа, "ТабличнаяЧасть.", "ТабличнаяЧастьСтрока.");
|
||
КонецЕсли;
|
||
|
||
МаркерРасширений = "Расширение ";
|
||
Если Истина
|
||
И Лев(РодительскаяСтруктураТипа.ИмяОбщегоТипа, СтрДлина(МаркерРасширений)) = МаркерРасширений
|
||
И СтрокаСлова.Слово = "Значение"
|
||
Тогда
|
||
Если РодительскаяСтруктураТипа.Метаданные <> Неопределено Тогда
|
||
СтруктураТипа = СтруктураТипаИзЗначения(РодительскаяСтруктураТипа.Метаданные.Значение);
|
||
Иначе
|
||
СтрокаРасширения = ТаблицаРасширенийТипов.Найти(РодительскаяСтруктураТипа.ИмяОбщегоТипа, "Расширение");
|
||
//Если СтрокаРасширения <> Неопределено Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = СтрокаРасширения.РасширяющийТип;
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И МетаданныеРодителя <> Неопределено
|
||
И СтрокаСлова.ТипСлова = "Свойство"
|
||
Тогда
|
||
Если Ложь
|
||
Или (Истина // Нельзя допускать неявного выполнения запроса при обращении к свойству "Результат" построителя
|
||
И СтруктураТипа.ИмяОбщегоТипа = "РезультатЗапроса"
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ПостроительЗапроса"))
|
||
Или (Истина // Здесь свойство есть у объекта метаданных, но имеет другой смысл
|
||
И СтрокаСлова.Слово = "ВидыСубконто"
|
||
И СтруктураТипа.ИмяОбщегоТипа = "ПланСчетовВидыСубконто.<Имя плана счетов>")
|
||
Тогда
|
||
ЗначениеСвойства = МетаданныеРодителя;
|
||
Иначе
|
||
Если Истина
|
||
#Если Клиент Тогда
|
||
И ТипЗнч(МетаданныеРодителя) = Тип("ТабличноеПоле")
|
||
#Иначе
|
||
И Ложь
|
||
#КонецЕсли
|
||
И СтрокаСлова.Слово = "ТекущийРодитель"
|
||
Тогда
|
||
// Антибаг платформы 8.2.16. Вывести в чистом виде не удалось. Падает при вычислении свойства ТекущийРодитель в форме списка РС.ООП_ВаучерыТез
|
||
ЗначениеСвойства = Неопределено;
|
||
Иначе
|
||
Попытка
|
||
ЗначениеСвойства = МетаданныеРодителя[СтрокаСлова.Слово];
|
||
Исключение
|
||
ЗначениеСвойства = Неопределено;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ЗначениеСвойства <> Неопределено Тогда
|
||
Если мМассивТиповВключающихМетаданные.Найти(ТипЗнч(ЗначениеСвойства)) <> Неопределено Тогда
|
||
СтруктураТипа.Метаданные = ЗначениеСвойства;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
// Для методов метаданных нужна специфическая обработка для усечения типов
|
||
Если Истина
|
||
И СтрокаСлова.ТипСлова = "Метод"
|
||
И Лев(ИмяОбщегоТипа, СтрДлина(МаркерОбъектаМетаданных)) = МаркерОбъектаМетаданных
|
||
И СтрокаСлова.Слово = "Родитель"
|
||
Тогда
|
||
Родитель = Неопределено;
|
||
Если ТипЗнч(МетаданныеРодителя) = Тип("ОбъектМетаданных") Тогда
|
||
Родитель = МетаданныеРодителя.Родитель();
|
||
КонецЕсли;
|
||
Если Родитель <> Неопределено Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(Родитель.ПолноеИмя());
|
||
СтруктураТипа.ИмяОбщегоТипа = МаркерОбъектаМетаданных + ": " + МассивФрагментов[МассивФрагментов.ВГраница() - 1];
|
||
Иначе
|
||
СтруктураТипа.ИмяОбщегоТипа = "Неопределено";
|
||
КонецЕсли;
|
||
СтруктураТипа.Метаданные = Родитель;
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
Прервать;
|
||
ИначеЕсли Истина
|
||
И СтрокаСлова.ТипСлова = "Метод"
|
||
И Лев(ИмяОбщегоТипа, СтрДлина(МаркерКоллекцииОбъектовМетаданных)) = МаркерКоллекцииОбъектовМетаданных
|
||
И (Ложь
|
||
Или СтрокаСлова.Слово = "Найти"
|
||
Или СтрокаСлова.Слово = "Получить")
|
||
Тогда
|
||
СтруктураКлюча = Новый Структура("БазовыйТип, ЯзыкПрограммы", ИмяОбщегоТипа, ЯзыкПрограммы);
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча);
|
||
СтруктураТипа.ИмяОбщегоТипа = НайденныеСтроки[0].ТипЭлементаКоллекции;
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
Прервать;
|
||
КонецЕсли;
|
||
|
||
Если КорневойТипРодителя <> Неопределено Тогда
|
||
ДоступноеПолеСлова = ПостроительЗапросаРодителя.ДоступныеПоля.Найти(СтрокаСлова.Слово);
|
||
// Частные случаи
|
||
Если Ложь
|
||
Или СтрокаСлова.ТипСлова = "Поле"
|
||
Или СтрокаСлова.Слово = "Активность"
|
||
Или СтрокаСлова.Слово = "Владелец"
|
||
Или СтрокаСлова.Слово = "ВидДвижения"
|
||
Или СтрокаСлова.Слово = "Период"
|
||
Или СтрокаСлова.Слово = "Регистратор"
|
||
Или СтрокаСлова.Слово = "МоментВремени"
|
||
Или СтрокаСлова.Слово = "НомерСтроки"
|
||
//Или СтрокаСлова.Слово = "СубконтоДт" // Закомментировано 14.04.2012
|
||
//Или СтрокаСлова.Слово = "СубконтоКт" // Закомментировано 14.04.2012
|
||
Или СтрокаСлова.Слово = "СчетДт"
|
||
Или СтрокаСлова.Слово = "СчетКт"
|
||
Тогда
|
||
Если ДоступноеПолеСлова = Неопределено Тогда
|
||
ЛиДобавляемСлово = Ложь;
|
||
Иначе
|
||
ТипыЗначенияСлова = ДоступноеПолеСлова.ТипЗначения.Типы();
|
||
Для Каждого ТипЗначенияСлова Из ТипыЗначенияСлова Цикл
|
||
ШаблонСтруктурыТипа = Новый Структура("СтрокаОписания, ТипЯзыка");
|
||
ШаблонСтруктурыТипа.СтрокаОписания = СтрокаСлова;
|
||
ЗаполнитьЗначенияСвойств(ШаблонСтруктурыТипа, РодительскаяСтруктураТипа, "ТипЯзыка");
|
||
СтруктураТипа = СтруктураТипаИзКонкретногоТипа(ТипЗначенияСлова, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Прервать;
|
||
ИначеЕсли Ложь
|
||
Или (Истина
|
||
И ИмяОбщегоТипа = "КонстантаМенеджер.<Имя константы>"
|
||
И СтрокаСлова.Слово = "Получить")
|
||
Или (Истина
|
||
И ИмяОбщегоТипа = "КонстантаМенеджерЗначения.<Имя константы>"
|
||
И СтрокаСлова.Слово = "Значение")
|
||
Тогда
|
||
ТипыЗначенияКонстанты = МетаданныеРодителя.Тип.Типы();
|
||
Для Каждого ТипЗначенияКонстанты Из ТипыЗначенияКонстанты Цикл
|
||
ШаблонСтруктурыТипа = Новый Структура("СтрокаОписания, ТипЯзыка");
|
||
ШаблонСтруктурыТипа.СтрокаОписания = СтрокаСлова;
|
||
ЗаполнитьЗначенияСвойств(ШаблонСтруктурыТипа, РодительскаяСтруктураТипа, "ТипЯзыка");
|
||
СтруктураТипа = СтруктураТипаИзКонкретногоТипа(ТипЗначенияКонстанты, ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И СтрокаСлова.ТипСлова = "Метод"
|
||
И (Ложь
|
||
Или СтрокаСлова.Слово = "Выгрузить"
|
||
Или СтрокаСлова.Слово = "ВыгрузитьКолонки")
|
||
И ТипЗнч(СтрокаОбщегоТипа.Метаданные) = Тип("ОбъектМетаданных")
|
||
Тогда
|
||
КонкретныйТип = ИмяТипаИзСтруктурыТипа(СтрокаОбщегоТипа);
|
||
Образователь = Неопределено;
|
||
Если НРег(КонкретныйТип) = Нрег("Табличная часть") Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(СтрокаОбщегоТипа.Метаданные.ПолноеИмя());
|
||
Если Ложь
|
||
Или МассивФрагментов[0] = "Обработка"
|
||
Или МассивФрагментов[0] = "Отчет"
|
||
Тогда
|
||
Образователь = Новый (МассивФрагментов[0] + "Объект." + МассивФрагментов[1]);
|
||
Образователь = Образователь[МассивФрагментов[3]];
|
||
Иначе
|
||
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(МассивФрагментов[0] + "." + МассивФрагментов[1]);
|
||
Образователь = СтруктураОбъекта.Данные[МассивФрагментов[3]];
|
||
КонецЕсли;
|
||
ИначеЕсли НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа) = Нрег("ПланСчетовВидыСубконто.<Имя плана счетов>") Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(СтрокаОбщегоТипа.Метаданные.ПолноеИмя());
|
||
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(МассивФрагментов[0] + "." + МассивФрагментов[1]);
|
||
Образователь = СтруктураОбъекта.Данные.ВидыСубконто;
|
||
ИначеЕсли Ложь
|
||
Или НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа) = Нрег("ВытесняющиеВидыРасчета.<Имя плана видов расчета>")
|
||
Или НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа) = Нрег("БазовыеВидыРасчета.<Имя плана видов расчета>")
|
||
Или НРег(СтрокаОбщегоТипа.ИмяОбщегоТипа) = Нрег("ВедущиеВидыРасчета.<Имя плана видов расчета>")
|
||
Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(СтрокаОбщегоТипа.Метаданные.ПолноеИмя());
|
||
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(МассивФрагментов[0] + "." + МассивФрагментов[1]);
|
||
ИмяТЧ = ирОбщий.ПервыйФрагментЛкс(СтрокаОбщегоТипа.ИмяОбщегоТипа);
|
||
Попытка
|
||
Образователь = СтруктураОбъекта.Данные[ИмяТЧ];
|
||
Исключение
|
||
КонецПопытки;
|
||
ИначеЕсли Найти(КонкретныйТип, "<") = 0 Тогда
|
||
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(ирКэш.ИмяТаблицыИзМетаданныхЛкс(СтрокаОбщегоТипа.Метаданные.ПолноеИмя()));
|
||
Образователь = СтруктураОбъекта.Данные;
|
||
КонецЕсли;
|
||
Если Образователь <> Неопределено Тогда
|
||
Если ТипЗнч(Образователь) = Тип("ТаблицаЗначений") Тогда
|
||
Образователь = Образователь;
|
||
Иначе
|
||
Образователь = Образователь.ВыгрузитьКолонки();
|
||
КонецЕсли;
|
||
СтруктураТипа.Метаданные = Образователь;
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И (Ложь
|
||
Или СтрокаСлова.Слово = "СрезПервых"
|
||
Или СтрокаСлова.Слово = "СрезПоследних")
|
||
И КорневойТипРодителя = "РегистрСведений"
|
||
И МетаданныеРодителя.ПериодичностьРегистраСведений = мМетаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический
|
||
Тогда
|
||
ЛиДобавляемСлово = Ложь;
|
||
Прервать;
|
||
ИначеЕсли Истина
|
||
И (Ложь
|
||
Или СтрокаСлова.Слово = "Остатки"
|
||
Или СтрокаСлова.Слово = "ОстаткиИОбороты")
|
||
И КорневойТипРодителя = "РегистрНакопления"
|
||
И МетаданныеРодителя.ВидРегистра = мМетаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты
|
||
Тогда
|
||
ЛиДобавляемСлово = Ложь;
|
||
Прервать;
|
||
ИначеЕсли Истина
|
||
И (Ложь
|
||
Или СтрокаСлова.Слово = "ОборотыДтКт")
|
||
И КорневойТипРодителя = "РегистрБухгалтерии"
|
||
И Не МетаданныеРодителя.Корреспонденция
|
||
Тогда
|
||
ЛиДобавляемСлово = Ложь;
|
||
Прервать;
|
||
Иначе
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Истина
|
||
И ИмяОбщегоТипа = "Форма"
|
||
И СтрокаСлова.Слово = "ЭтаФорма"
|
||
Тогда
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, РодительскаяСтруктураТипа, Истина);
|
||
Иначе
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа, Ложь);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Не ЛиДобавляемСлово Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТаблицаСтруктурТипов.Количество() = 0 Тогда
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ДобавитьВТаблицуСлов(ВнутренняяТаблицаСлов, СтрокаСлова.Слово, СтрокаСлова.ТипСлова, ТаблицаСтруктурТипов, СтрокаСлова.ТипЗначения);
|
||
КонецЦикла;
|
||
Если ИспользоватьКэширование Тогда
|
||
мКэшСловГлобальногоКонтекста[КлючКэширования] = ВнутренняяТаблицаСлов.Скопировать();
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьТипЗначенияЧленаИнтерфейса(ОписаниеРезультата, ИмяБиблиотеки = "", БиблиотекаТипов = Неопределено) Экспорт
|
||
|
||
//Тест = ПолучитьИмяТипаCOMVariant(Член);
|
||
ИнфоТипаРезультата = ОписаниеРезультата.TypeInfo;
|
||
Если ИнфоТипаРезультата <> Неопределено Тогда
|
||
ТипЗначенияРезультата = ПолноеИмяТипаCOMОбъектаИзИнфоТипа(ИнфоТипаРезультата, ИмяБиблиотеки);
|
||
Иначе
|
||
НомерТипа = ОписаниеРезультата.VarType;
|
||
ТипЗначенияРезультата = "Произвольный" + ", " + НомерТипа;
|
||
Если НомерТипа = 0 Тогда
|
||
ТипЗначенияРезультата = Неопределено;
|
||
ИначеЕсли НомерТипа = 1 Тогда
|
||
ТипЗначенияРезультата = Null;
|
||
ИначеЕсли НомерТипа >= 2 И НомерТипа <= 5 Тогда
|
||
ТипЗначенияРезультата = "Число";
|
||
ИначеЕсли НомерТипа = 7 Тогда
|
||
ТипЗначенияРезультата = "Дата";
|
||
ИначеЕсли НомерТипа = 8 Тогда
|
||
ТипЗначенияРезультата = "Строка";
|
||
ИначеЕсли НомерТипа = 11 Тогда
|
||
ТипЗначенияРезультата = "Булево";
|
||
ИначеЕсли НомерТипа = 12 Тогда
|
||
ТипЗначенияРезультата = "Строка";
|
||
ИначеЕсли НомерТипа >= 14 И НомерТипа <= 23 Тогда
|
||
ТипЗначенияРезультата = "Число";
|
||
ИначеЕсли НомерТипа = 24 Тогда
|
||
// Метод не возвращает значение - Процедура
|
||
ТипЗначенияРезультата = "";
|
||
ИначеЕсли НомерТипа = 9 Тогда
|
||
// Тип этого значения станет известен только при его появлении
|
||
//ТипЗначенияРезультата = ПолучитьИмяТипаCOMVariant(ОписаниеРезультата); // Тоже не дает результат
|
||
ТипЗначенияРезультата = "Произвольный";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Возврат ТипЗначенияРезультата;
|
||
|
||
//'OLE Automation VARIANT types
|
||
// Enum TliVarType
|
||
// VT_EMPTY = 0 '&H0
|
||
// VT_NULL = 1 '&H1
|
||
// VT_I2 = 2 '&H2
|
||
// VT_I4 = 3 '&H3
|
||
// VT_R4 = 4 '&H4
|
||
// VT_R8 = 5 '&H5
|
||
// VT_CY = 6 '&H6
|
||
// VT_DATE = 7 '&H7
|
||
// VT_BSTR = 8 '&H8
|
||
// VT_DISPATCH = 9 '&H9
|
||
// VT_ERROR = 10 '&HA
|
||
// VT_BOOL = 11 '&HB
|
||
// VT_VARIANT = 12 '&HC
|
||
// VT_UNKNOWN = 13 '&HD
|
||
// VT_DECIMAL = 14 '&HE
|
||
// VT_I1 = 16 '&H10
|
||
// VT_UI1 = 17 '&H11
|
||
// VT_UI2 = 18 '&H12
|
||
// VT_UI4 = 19 '&H13
|
||
// VT_I8 = 20 '&H14
|
||
// VT_UI8 = 21 '&H15
|
||
// VT_INT = 22 '&H16
|
||
// VT_UINT = 23 '&H17
|
||
// VT_VOID = 24 '&H18
|
||
// VT_HRESULT = 25 '&H19
|
||
// VT_PTR = 26 '&H1A
|
||
// VT_SAFEARRAY = 27 '&H1B
|
||
// VT_CARRAY = 28 '&H1C
|
||
// VT_USERDEFINED = 29 '&H1D
|
||
// VT_LPSTR = 30 '&H1E
|
||
// VT_LPWSTR = 31 '&H1F
|
||
// VT_RECORD = 36 '&H24
|
||
// VT_FILETIME = 64 '&H40
|
||
// VT_BLOB = 65 '&H41
|
||
// VT_STREAM = 66 '&H42
|
||
// VT_STORAGE = 67 '&H43
|
||
// VT_STREAMED_OBJECT = 68 '&H44
|
||
// VT_STORED_OBJECT = 69 '&H45
|
||
// VT_BLOB_OBJECT = 70 '&H46
|
||
// VT_CF = 71 '&H47
|
||
// VT_CLSID = 72 '&H48
|
||
// VT_VECTOR = 4096 '&H1000
|
||
// VT_ARRAY = 8192 '&H2000
|
||
// VT_BYREF = 16384 '&H4000
|
||
// VT_RESERVED = 32768 '&H8000
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолноеИмяТипаCOMОбъектаИзИнфоТипа(ИнфоИнтерфейса, Знач ИмяБиблиотеки = "") Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(ИмяБиблиотеки) Тогда
|
||
ИмяБиблиотеки = "COMОбъект";
|
||
КонецЕсли;
|
||
Результат = ИнфоИнтерфейса.Name + " {" + ИмяБиблиотеки + "}";
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолноеИмяТипаCOMОбъекта(COMОбъект, Знач ПолноеИмяОсновногоКласса = "") Экспорт
|
||
|
||
ИнфоИнтерфейса = ПолучитьИнфоТипаCOMОбъекта(COMОбъект, , ПолноеИмяОсновногоКласса);
|
||
Если ИнфоИнтерфейса <> Неопределено Тогда
|
||
Результат = ПолноеИмяТипаCOMОбъектаИзИнфоТипа(ИнфоИнтерфейса, ПолноеИмяОсновногоКласса);
|
||
Иначе
|
||
Результат = "COMОбъект";
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИнфоТипаCOMОбъекта(выхCOMОбъект, Знач ИмяОбщегоТипа = Неопределено, выхПолноеИмяОсновногоКласса = "") Экспорт
|
||
|
||
ПолучитьCOMНавигатор();
|
||
Если COMНавигатор = "Отказ" Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Если ТипЗнч(выхCOMОбъект) = Тип("COMОбъект") Тогда
|
||
Попытка
|
||
COMНавигатор.ResolveAliases = Ложь; // Тут бывает кривой объект без свойств и методов и при выводе строки эта ошибка очень раздражает
|
||
//ИнфоКласса = COMНавигатор.ClassInfoFromObject(выхCOMОбъект); // Этот способ не поддерживается в большинстве классов
|
||
ИнфоИнтерфейса = COMНавигатор.InterfaceInfoFromObject(выхCOMОбъект); // Тут падает для некоторых объектов, например V83.Application, ADODB.Recorset.Fields(*).Precision
|
||
Исключение
|
||
ОписаниеОшибки = ОписаниеОшибки();
|
||
//ирОбщий.СообщитьЛкс(ОписаниеОшибки);
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ИмяОбщегоТипа) Тогда
|
||
выхПолноеИмяОсновногоКласса = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИмяОбщегоТипа, "{", "}", Ложь);
|
||
ИмяОбщегоТипа = ирОбщий.ПервыйФрагментЛкс(ИмяОбщегоТипа, " ");
|
||
КонецЕсли;
|
||
Если Не ЗначениеЗаполнено(выхПолноеИмяОсновногоКласса) Тогда
|
||
Если ТипЗнч(выхCOMОбъект) = Тип("COMОбъект") Тогда
|
||
ИмяБиблиотеки = ИнфоИнтерфейса.Parent.Name;
|
||
ИмяОсновногоКласса = мИменаОсновныхКлассовБиблиотекCOM[ИмяБиблиотеки];
|
||
Если ИмяОсновногоКласса = Неопределено Тогда
|
||
//КаталогПриложений = Новый COMОбъект("COMAdmin.COMAdminCatalog");
|
||
//КаталогПриложений.Connect("localhost");
|
||
//Компоненты = КаталогПриложений.GetCollection("InprocServers");
|
||
//Компоненты.PopulateByKey("" + ИнфоИнтерфейса.Parent.GUID);
|
||
//Компоненты.PopulateByKey("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}");
|
||
//Если Компоненты.Count > 0 Тогда
|
||
// ИмяОсновногоКласса = Компоненты.Item(0).Name;
|
||
//Иначе
|
||
ПробныйОбъект = Неопределено;
|
||
Для Каждого Претендент Из ИнфоИнтерфейса.Parent.CoClasses Цикл
|
||
Попытка
|
||
ПробныйОбъект = Новый COMОбъект(ИмяБиблиотеки + "." + Претендент.Name);
|
||
Исключение
|
||
Продолжить;
|
||
КонецПопытки;
|
||
Прервать;
|
||
КонецЦикла;
|
||
Если ПробныйОбъект <> Неопределено Тогда
|
||
ПробныйОбъект = Неопределено;
|
||
ИмяОсновногоКласса = Претендент.Name;
|
||
Иначе
|
||
ИмяОсновногоКласса = "?";
|
||
КонецЕсли;
|
||
мИменаОсновныхКлассовБиблиотекCOM[ИмяБиблиотеки] = ИмяОсновногоКласса;
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
выхПолноеИмяОсновногоКласса = ИмяБиблиотеки + "." + ИмяОсновногоКласса;
|
||
Иначе
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ИнфоИнтерфейса = Неопределено Тогда
|
||
выхCOMОбъект = ПолучитьОбразецCOMОбъекта(выхПолноеИмяОсновногоКласса);
|
||
Попытка
|
||
ИнфоИнтерфейса = COMНавигатор.InterfaceInfoFromObject(выхCOMОбъект);
|
||
Исключение
|
||
//ирОбщий.СообщитьЛкс(ОписаниеОшибки());
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
лИнфоИнтерфейса = ИнфоИнтерфейса.Parent.TypeInfos.NamedItem(ИмяОбщегоТипа);
|
||
Если лИнфоИнтерфейса <> Неопределено Тогда
|
||
ИнфоИнтерфейса = лИнфоИнтерфейса;
|
||
Иначе
|
||
// Например для Shell.Application выполняется
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ИнфоИнтерфейса;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьОбразецCOMОбъекта(ПолноеИмяОсновногоКлассаCOM) Экспорт
|
||
|
||
КлючКэша = НРег(ПолноеИмяОсновногоКлассаCOM);
|
||
Результат = мОбразцыCOMОбъектов[КлючКэша];
|
||
Если Результат <> Неопределено Тогда
|
||
ИнфоИнтерфейса = ПолучитьИнфоТипаCOMОбъекта(Результат,,ПолноеИмяОсновногоКлассаCOM);
|
||
Если ИнфоИнтерфейса = Неопределено Тогда
|
||
// Объект испорчен
|
||
Результат = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Результат = Неопределено Тогда
|
||
Попытка
|
||
Результат = Новый COMОбъект(ПолноеИмяОсновногоКлассаCOM);
|
||
Исключение
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
мОбразцыCOMОбъектов[КлючКэша] = Результат;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Получает новый экземпляр ком-объекта парсера.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Com-объект, Неопределено.
|
||
//
|
||
Функция ПолучитьCOMНавигатор() Экспорт
|
||
|
||
Если COMНавигатор = "НеИнициализирован" Тогда
|
||
COMНавигатор = ПолучитьCOMОбъектИзМакета("TLBINF32", "TLI.TLIApplication");
|
||
КонецЕсли;
|
||
Возврат COMНавигатор;
|
||
|
||
КонецФункции // ПолучитьCOMНавигатор()
|
||
|
||
Функция ПолучитьТипыЭлементовКоллекции(СтруктураТипаКоллекции, ЯзыкПрограммы = 0) Экспорт
|
||
|
||
ТипыЭлементовКоллекции = Новый Массив();
|
||
Если ЛиИмяТипаComОбъекта(СтруктураТипаКоллекции.ИмяОбщегоТипа) Тогда
|
||
ИмяОбщегоТипа = СтруктураТипаКоллекции.ИмяОбщегоТипа;
|
||
ТаблицаСтруктурТипаЭлемента = НоваяТаблицаСтруктурТипа();
|
||
ИмяБиблиотеки = "";
|
||
МетаданныеОбъекта = СтруктураТипаКоллекции.Метаданные;
|
||
ИнфоТипа = ПолучитьИнфоТипаCOMОбъекта(МетаданныеОбъекта, ИмяОбщегоТипа, ИмяБиблиотеки);
|
||
Если ИнфоТипа = Неопределено Тогда
|
||
Возврат ТаблицаСтруктурТипаЭлемента;
|
||
КонецЕсли;
|
||
Если НРег(ИнфоТипа.TypeKindString) = "coclass" Тогда
|
||
МассивИнфоТипа = ИнфоТипа.Interfaces;
|
||
Иначе
|
||
МассивИнфоТипа = Новый Массив;
|
||
МассивИнфоТипа.Добавить(ИнфоТипа);
|
||
КонецЕсли;
|
||
Для Каждого ИнфоТипа Из МассивИнфоТипа Цикл
|
||
Для Каждого Член Из ИнфоТипа.Members Цикл
|
||
Если Истина
|
||
//И Член.InvokeKind = 1 // метод // почему то иногда у него стоит 2 (например ADODB.Fields)
|
||
И ирОбщий.СтрокиРавныЛкс(Член.Name, "Item")
|
||
Тогда
|
||
ИнфоТипаЭлемента = Член.ReturnType.TypeInfo;
|
||
ИмяОбщегоТипаЭлемента = ПолучитьТипЗначенияЧленаИнтерфейса(Член.ReturnType, ИмяБиблиотеки, ИнфоТипа.Parent);
|
||
ТипыЭлементовКоллекции.Добавить(ИмяОбщегоТипаЭлемента);
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Иначе
|
||
СтруктураКлюча = Новый Структура("Слово, ЯзыкПрограммы", СтруктураТипаКоллекции.ИмяОбщегоТипа, ЯзыкПрограммы);
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
Если НайденныеСтроки[0].ТипЭлементаКоллекции <> "" Тогда
|
||
ТипыЭлементовКоллекции = ирОбщий.СтрРазделитьЛкс(НайденныеСтроки[0].ТипЭлементаКоллекции, ",", Истина);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ТипыЭлементовКоллекции;
|
||
|
||
КонецФункции
|
||
|
||
// Добавляет и заполяет строку в таблицу слов при условии отсутствия там строк по ключу (Слово, ТипСлова)
|
||
//
|
||
// Параметры:
|
||
// ТаблицаСлов – ТаблицаЗначений – ПолучитьНовуюВнутреннююТаблицуСлов();
|
||
// Слово – Строка;
|
||
// ТипСлова – Строка;
|
||
// ТаблицаСтруктурТипов - ТаблицаЗначений.
|
||
//
|
||
Функция ДобавитьВТаблицуСлов(ТаблицаСлов, Слово, ТипСлова, ТаблицаСтруктурТипов = Неопределено, ТипЗначения = "??") Экспорт
|
||
|
||
#Если Сервер И Не Сервер Тогда
|
||
ТаблицаСлов = Новый ТаблицаЗначений
|
||
#КонецЕсли
|
||
КлючПоиска = Новый Структура("Слово, ТипСлова", Слово, ТипСлова);
|
||
НайденныеСтроки = ТаблицаСлов.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
Возврат НайденныеСтроки[0];
|
||
КонецЕсли;
|
||
СтрокаСлова = ТаблицаСлов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(СтрокаСлова, КлючПоиска);
|
||
СтрокаСлова.ТипЗначения = ТипЗначения;
|
||
Если ТаблицаСтруктурТипов <> Неопределено Тогда
|
||
СтрокаСлова.ТаблицаСтруктурТипов = ТаблицаСтруктурТипов;
|
||
КонецЕсли;
|
||
Возврат СтрокаСлова;
|
||
|
||
КонецФункции
|
||
|
||
// Получает таблицу слов указанной структуры типа.
|
||
//
|
||
// Параметры:
|
||
// СтруктураТипа – Структура – описание типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений – с колонками "Слово", "ТипСлова", "ТаблицаСтруктурТипов", "Определение".
|
||
//
|
||
Функция ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа, ЯзыкПрограммы = 0, Конфигурация = Неопределено, ВнешниеФункцииКомпоновкиДанных = Истина, ВычислятьТипы = Истина,
|
||
Знач РазрешитьСозданиеОбъектаИзТипа = Истина, ТипСлова = Неопределено, ЛиСерверныйКонтекст = Ложь, Знач Слово = Неопределено, Знач МодульМетаданных = Неопределено) Экспорт
|
||
|
||
ИнициализацияОписанияМетодовИСвойств();
|
||
ВнутренняяТаблицаСлов = ПолучитьВнутреннююТаблицуПредопределенныхСлов(СтруктураТипа, Слово, ТипСлова,, ЯзыкПрограммы, Конфигурация, ВычислятьТипы, ЛиСерверныйКонтекст);
|
||
ВнутренняяТаблицаСлов.Колонки.Добавить("Определение");
|
||
ВнутренняяТаблицаСлов.ЗаполнитьЗначения("Предопределенный", "Определение");
|
||
ВнутренняяТаблицаМетаданныхСлов = ПолучитьВнутреннююТаблицуМетаданныхСлов(СтруктураТипа, Слово, ТипСлова,, ЯзыкПрограммы,, ВнешниеФункцииКомпоновкиДанных, ВычислятьТипы, ЛиСерверныйКонтекст, МодульМетаданных);
|
||
ВнутренняяТаблицаМетаданныхСлов.Колонки.Добавить("Определение");
|
||
ВнутренняяТаблицаМетаданныхСлов.ЗаполнитьЗначения("Метаданные", "Определение");
|
||
// ЗагрузитьВТаблицуЗначений()
|
||
Для каждого СтрокаТаблицыИсточника Из ВнутренняяТаблицаМетаданныхСлов Цикл
|
||
СтрокаТаблицыПриемника = ВнутренняяТаблицаСлов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
|
||
КонецЦикла;
|
||
Возврат ВнутренняяТаблицаСлов;
|
||
|
||
КонецФункции
|
||
|
||
// Получает новую структуру типа.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура - "ИмяОбщегоТипа", "Метаданные", "СтрокаОписания", "ТипЯзыка", "ВиртуальнаяТаблица".
|
||
//
|
||
Функция ПолучитьНовуюТаблицуДополнительныхТипов() Экспорт
|
||
|
||
ТаблицаСтруктурТипа = Новый ТаблицаЗначений;
|
||
ТаблицаСтруктурТипа.Колонки.Добавить("ИмяОбщегоТипа", Новый ОписаниеТипов("Строка"));
|
||
ТаблицаСтруктурТипа.Колонки.Добавить("Метаданные");
|
||
//ТаблицаСтруктурТипа.Колонки.Добавить("ВключатьСвойства", Новый ОписаниеТипов("Булево"));
|
||
ТаблицаСтруктурТипа.Колонки.Добавить("НеВключатьМетоды", Новый ОписаниеТипов("Булево"));
|
||
Возврат ТаблицаСтруктурТипа;
|
||
|
||
КонецФункции // ПолучитьНовуюТаблицуДополнительныхТипов()
|
||
|
||
// Получает допустимые типы (строку) из таблицы структур типа.
|
||
//
|
||
// Параметры:
|
||
// ТаблицаСтруктурТипов – ТаблицаЗначений.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка.
|
||
//
|
||
Функция ПолучитьДопустимыеТипыИзТаблицыСтруктурТипа(ТаблицаСтруктурТипов) Экспорт
|
||
|
||
СтрокаСериализованныхТипов = "";
|
||
Для Каждого СтруктураТипа Из ТаблицаСтруктурТипов Цикл
|
||
СтрокаСериализованныхТипов = СтрокаСериализованныхТипов + ";" + СтруктураТипаВСтрокуВнутр(СтруктураТипа);
|
||
КонецЦикла;
|
||
СтрокаСериализованныхТипов = Сред(СтрокаСериализованныхТипов, 2);
|
||
Возврат СтрокаСериализованныхТипов;
|
||
|
||
КонецФункции // ПолучитьДопустимыеТипыИзТаблицыСтруктурТипа()
|
||
|
||
Функция ПолучитьДопустимыеТипыИзОписанияТипов(ОписаниеТипов) Экспорт
|
||
|
||
ТаблицаСтруктурТипов = ТаблицаСтруктурТиповИзОписанияТипов(ОписаниеТипов);
|
||
ДопустимыеТипы = ПолучитьДопустимыеТипыИзТаблицыСтруктурТипа(ТаблицаСтруктурТипов);
|
||
Возврат ДопустимыеТипы;
|
||
|
||
КонецФункции // ПолучитьДопустимыеТипыИзТаблицыСтруктурТипа()
|
||
|
||
// Получает представление допустимых типов.
|
||
//
|
||
// Параметры:
|
||
// ДопустимыеТипы – Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СтрокаПредставления – Строка.
|
||
//
|
||
Функция ПолучитьПредставлениеДопустимыхТипов(ДопустимыеТипы) Экспорт
|
||
|
||
ТаблицаСтруктурТипов = ПолучитьТаблицуСтруктурТиповИзДопустимыхТипов(ДопустимыеТипы);
|
||
СтрокаПредставления = "";
|
||
Для Каждого СтруктураТипа Из ТаблицаСтруктурТипов Цикл
|
||
СтрокаПредставления = СтрокаПредставления + ", " + ИмяТипаИзСтруктурыТипа(СтруктураТипа);
|
||
ТипМетаданных = ТипЗнч(СтруктураТипа.Метаданные);
|
||
Если ТипМетаданных = Тип("КвалификаторыДаты") Тогда
|
||
Квалификаторы = СтруктураТипа.Метаданные;
|
||
Если Квалификаторы.ЧастиДаты = ЧастиДаты.Время Тогда
|
||
ПредставлениеСоставаДаты = "В";
|
||
ИначеЕсли Квалификаторы.ЧастиДаты = ЧастиДаты.Дата Тогда
|
||
ПредставлениеСоставаДаты = "Д";
|
||
ИначеЕсли Квалификаторы.ЧастиДаты = ЧастиДаты.ДатаВремя Тогда
|
||
ПредставлениеСоставаДаты = "ДВ";
|
||
КонецЕсли;
|
||
СтрокаПредставления = СтрокаПредставления + "(" + ПредставлениеСоставаДаты + ")";
|
||
ИначеЕсли ТипМетаданных = Тип("КвалификаторыСтроки") Тогда
|
||
Квалификаторы = СтруктураТипа.Метаданные;
|
||
СтрокаПредставления = СтрокаПредставления + "("
|
||
+ Квалификаторы.Длина + ","
|
||
+ ?(Квалификаторы.ДопустимаяДлина = ДопустимаяДлина.Фиксированная, "Ф", "П") + ")";
|
||
ИначеЕсли ТипМетаданных = Тип("КвалификаторыЧисла") Тогда
|
||
Квалификаторы = СтруктураТипа.Метаданные;
|
||
СтрокаПредставления = СтрокаПредставления + "("
|
||
+ ?(Квалификаторы.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный, "Н", "")
|
||
+ Квалификаторы.Разрядность + ","
|
||
+ Квалификаторы.РазрядностьДробнойЧасти + ")";
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
СтрокаПредставления = Сред(СтрокаПредставления, 3);
|
||
Возврат СтрокаПредставления;
|
||
|
||
КонецФункции // ПолучитьПредставлениеДопустимыхТипов()
|
||
|
||
// Получает структуру типа из значения.
|
||
//
|
||
// Параметры:
|
||
// Значение – Произвольный;
|
||
// *ЯзыкПрограммы - Число, *0;
|
||
// *ШаблонСтруктурыТипа - Структура, *Неопределено - содержит значения по умолчанию для новой структуры типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура – структура типа.
|
||
//
|
||
Функция СтруктураТипаИзЗначения(Значение, ЯзыкПрограммы = 0, ШаблонСтруктурыТипа = Неопределено) Экспорт
|
||
|
||
Если Истина
|
||
И ШаблонСтруктурыТипа = Неопределено
|
||
//И (Ложь
|
||
// #Если Клиент Тогда
|
||
// Или ТипЗнч(Значение) = Тип("Форма")
|
||
// Или ТипЗнч(Значение) = Тип("ПолеВвода")
|
||
// //Или ТипЗнч(Значение) = Тип("КолонкаТабличногоПоля")
|
||
// Или ТипЗнч(Значение) = Тип("ТабличноеПоле")
|
||
// #КонецЕсли
|
||
// Или ТипЗнч(Значение) = Тип("Структура")
|
||
// Или ТипЗнч(Значение) = Тип("ТаблицаЗначений")
|
||
// Или ТипЗнч(Значение) = Тип("ДеревоЗначений")
|
||
// Или ТипЗнч(Значение) = Тип("ОбъектМетаданных"))
|
||
И мМассивТиповВключающихМетаданные.Найти(ТипЗнч(Значение)) <> Неопределено
|
||
Тогда
|
||
ШаблонСтруктурыТипа = Новый Структура("Метаданные", Значение);
|
||
КонецЕсли;
|
||
СтруктураТипа = СтруктураТипаИзКонкретногоТипа(ТипЗнч(Значение), ЯзыкПрограммы, ШаблонСтруктурыТипа);
|
||
Если СтруктураТипа.ИмяОбщегоТипа = "COMОбъект" Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = ПолноеИмяТипаCOMОбъекта(Значение);
|
||
КонецЕсли;
|
||
ИмяОбщегоТипа = СтруктураТипа.ИмяОбщегоТипа;
|
||
//Если Ложь
|
||
// Или (Истина
|
||
// И ИмяОбщегоТипа = "СтрокаТаблицыЗначений"
|
||
// И ТипЗнч(СтруктураТипа.Метаданные) <> Тип("ТаблицаЗначений"))
|
||
// Или (Истина
|
||
// И ИмяОбщегоТипа = "СтрокаДереваЗначений"
|
||
// И ТипЗнч(СтруктураТипа.Метаданные) <> Тип("ДеревоЗначений"))
|
||
// Или (Истина
|
||
// И ИмяОбщегоТипа = "ВыборкаИзРезультатаЗапроса"
|
||
// И ТипЗнч(СтруктураТипа.Метаданные) <> Тип("РезультатЗапроса"))
|
||
//Тогда
|
||
// Попытка
|
||
// СтруктураТипа.Метаданные = Значение.Владелец();
|
||
// Исключение
|
||
// // Строка была удалена из коллекции
|
||
// КонецПопытки;
|
||
//КонецЕсли;
|
||
Если Ложь
|
||
Или ИмяОбщегоТипа = "ВнешняяОбработкаОбъект.<Имя внешней обработки>"
|
||
Или ИмяОбщегоТипа = "ВнешнийОтчетОбъект.<Имя внешнего отчета>"
|
||
Тогда
|
||
МетаданныеЗначения = Значение.Метаданные();
|
||
ЛиНеУчитыватьПодтип = (ЯзыкПрограммы <> 0) И СтруктураТипа.ТипЯзыка <> "ЗначениеВЗапросе";
|
||
ИмяОбщегоТипа = ПолучитьИмяОбщегоТипаПоТипуЗначенияСМетаданными(ТипЗнч(Значение), МетаданныеЗначения, ЛиНеУчитыватьПодтип);
|
||
СтруктураТипа.Метаданные = МетаданныеЗначения;
|
||
КлючПоиска = Новый Структура("Слово", ИмяОбщегоТипа);
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = НайденныеСтроки[0].Слово;
|
||
Если СтруктураТипа.СтрокаОписания = Неопределено Тогда
|
||
СтруктураТипа.СтрокаОписания = НайденныеСтроки[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
#Если Клиент Тогда
|
||
МаркерРасширений = "Расширение ";
|
||
Если Ложь
|
||
Или ИмяОбщегоТипа = "Форма"
|
||
Или ИмяОбщегоТипа = "ПолеВвода"
|
||
//Или ИмяОбщегоТипа = "КолонкаТабличногоПоля"
|
||
Или ИмяОбщегоТипа = "ТабличноеПоле"
|
||
Тогда
|
||
РасширяющийТип = Неопределено;
|
||
Если ИмяОбщегоТипа = "Форма" Тогда
|
||
ОсновнойРеквизитФормы = ПолучитьИмяОсновногоРеквизитаФормы(Значение);
|
||
Если ЗначениеЗаполнено(ОсновнойРеквизитФормы) Тогда
|
||
СтруктураРасширяющегоТипа = СтруктураТипаИзЗначения(Значение[ОсновнойРеквизитФормы]);
|
||
РасширяющийТип = СтруктураРасширяющегоТипа.ИмяОбщегоТипа;
|
||
КонецЕсли;
|
||
Иначе
|
||
Попытка
|
||
ДанныеЭлементаФормы = Значение.Значение;
|
||
Исключение
|
||
// Случается из-за особенностей платформы. Иногда она убирает это свойство из элемента управления.
|
||
КонецПопытки;
|
||
СтруктураРасширяющегоТипа = СтруктураТипаИзЗначения(ДанныеЭлементаФормы);
|
||
РасширяющийТип = СтруктураРасширяющегоТипа.ИмяОбщегоТипа;
|
||
Попытка
|
||
Пустышка = Тип("Перечисление" + СтруктураРасширяющегоТипа.ИмяОбщегоТипа);
|
||
РасширяющийТип = "Системное перечисление";
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
|
||
Если РасширяющийТип <> Неопределено Тогда
|
||
Если РасширяющийТип = "ВнешняяОбработкаОбъект.<Имя внешней обработки>" Тогда
|
||
РасширяющийТип = "ОбработкаОбъект.<Имя обработки>";
|
||
ИначеЕсли РасширяющийТип = "ВнешнийОтчетОбъект.<Имя внешнего отчета>" Тогда
|
||
РасширяющийТип = "ОтчетОбъект.<Имя отчета>";
|
||
КонецЕсли;
|
||
СтруктураКлюча = Новый Структура("РасширяющийТип, ОсновнойТип", РасширяющийТип, ИмяОбщегоТипа);
|
||
МассивНайденных = ТаблицаРасширенийТипов.НайтиСтроки(СтруктураКлюча);
|
||
Если МассивНайденных.Количество() > 0 Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = МассивНайденных[0].Расширение;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ИмяОбщегоТипа = "Форма" Тогда
|
||
СтруктураТипа.ДержательМетаданных = Значение;
|
||
КонецЕсли;
|
||
|
||
#КонецЕсли
|
||
|
||
Возврат СтруктураТипа;
|
||
|
||
КонецФункции // СтруктураТипаИзЗначения()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьУникальныйИдентификаторИзСтроки(Текст) Экспорт
|
||
|
||
Цифра = "[a-fA-F0-9]";
|
||
RegExp.Pattern = "(" + ирОбщий.СтрокаПовторомЛкс(Цифра, 32) + ")|("
|
||
+ ирОбщий.СтрокаПовторомЛкс(Цифра, 8) + "-"
|
||
+ ирОбщий.СтрокаПовторомЛкс(Цифра, 4) + "-"
|
||
+ ирОбщий.СтрокаПовторомЛкс(Цифра, 4) + "-"
|
||
+ ирОбщий.СтрокаПовторомЛкс(Цифра, 4) + "-"
|
||
+ ирОбщий.СтрокаПовторомЛкс(Цифра, 12) + ")";
|
||
Вхождения = RegExp.Execute(Текст);
|
||
Если Вхождения.Count > 0 Тогда
|
||
Вхождение = Вхождения.Item(0);
|
||
Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(Вхождение.SubMatches(1)) Тогда
|
||
УникальныйИдентификатор = Новый УникальныйИдентификатор(Вхождение.SubMatches(1));
|
||
Иначе
|
||
УникальныйИдентификатор = Новый УникальныйИдентификатор(ирОбщий.ПолучитьГУИДПрямойИзИнверсногоЛкс(Вхождение.SubMatches(0)));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат УникальныйИдентификатор;
|
||
|
||
КонецФункции // ПолучитьУникальныйИдентификаторИзСтроки()
|
||
|
||
// Неполный сериализатор структуры типа.
|
||
//
|
||
// Параметры:
|
||
// СтруктураТипа – Структура.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка.
|
||
//
|
||
Функция СтруктураТипаВСтрокуВнутр(СтруктураТипа) Экспорт
|
||
|
||
ОписательТипа = Новый Структура("ИмяОбщегоТипа, Метаданные");
|
||
ЗаполнитьЗначенияСвойств(ОписательТипа, СтруктураТипа, "ИмяОбщегоТипа");
|
||
ТипМетаданных = ТипЗнч(СтруктураТипа.Метаданные);
|
||
Если ТипМетаданных = Тип("ОбъектМетаданныхКонфигурация") Тогда
|
||
//ОписательТипа.Метаданные = СтруктураТипа.Метаданные.ПолноеИмя();
|
||
ИначеЕсли ТипМетаданных = Тип("ОбъектМетаданных") Тогда
|
||
ОписательТипа.Метаданные = СтруктураТипа.Метаданные.ПолноеИмя();
|
||
ИначеЕсли Ложь
|
||
Или ТипМетаданных = Тип("КвалификаторыДаты")
|
||
Или ТипМетаданных = Тип("КвалификаторыСтроки")
|
||
Или ТипМетаданных = Тип("КвалификаторыЧисла")
|
||
Тогда
|
||
Поток = Новый ЗаписьXML;
|
||
Поток.УстановитьСтроку();
|
||
СериализаторXDTO.ЗаписатьXML(Поток, СтруктураТипа.Метаданные);
|
||
ОписательТипа.Метаданные = Новый ХранилищеЗначения(Поток.Закрыть());
|
||
Иначе
|
||
//ОписательТипа.Метаданные = СтруктураТипа.Метаданные;
|
||
КонецЕсли;
|
||
Результат = ЗначениеВСтрокуВнутр(ОписательТипа);
|
||
Возврат Результат;
|
||
|
||
КонецФункции // СтруктураТипаВСтрокуВнутр()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьИмяОбщегоТипаПоТипуЗначенияСМетаданными(Знач КонкрентыйТип, МетаданныеТипа, ЛиНеУчитыватьПодтип)
|
||
|
||
КонкрентыйТип = НРег(КонкрентыйТип);
|
||
Если Ложь
|
||
Или Найти(КонкрентыйТип, "(точка маршрута)") > 0
|
||
Или Найти(КонкрентыйТип, "(route point)") > 0
|
||
Тогда
|
||
ИмяОбщегоТипа = "ТочкаМаршрутаБизнесПроцессаСсылка.<Имя бизнес-процесса>";
|
||
Возврат ИмяОбщегоТипа;
|
||
КонецЕсли;
|
||
ИмяОбщегоТипа = ирОбщий.ПолучитьКорневойТипКонфигурацииЛкс(МетаданныеТипа);
|
||
Подтип = "";
|
||
ИмяЭлементаПодтипа = "";
|
||
Если ЛиНеУчитыватьПодтип Тогда
|
||
Подтип = "";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "объект:") > 0
|
||
Или Найти(КонкрентыйТип, "object:") > 0
|
||
Тогда
|
||
//Если Истина
|
||
// И Не ИмяОбщегоТипа = "ВнешняяОбработка"
|
||
// И Не ИмяОбщегоТипа = "ВнешнийОтчет"
|
||
//Тогда
|
||
Подтип = "Объект";
|
||
//КонецЕсли;
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "выборка:") > 0
|
||
Или Найти(КонкрентыйТип, "selection:") > 0
|
||
Тогда
|
||
Подтип = "Выборка";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "список:") > 0
|
||
Или Найти(КонкрентыйТип, "list:") > 0
|
||
Тогда
|
||
Подтип = "Список";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "менеджер:") > 0
|
||
Или Найти(КонкрентыйТип, "manager:") > 0
|
||
Тогда
|
||
Подтип = "Менеджер";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "менеджер значения:") > 0
|
||
Или Найти(КонкрентыйТип, "value manager:") > 0
|
||
Тогда
|
||
Подтип = "МенеджерЗначения";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "табличная часть:") > 0
|
||
Или Найти(КонкрентыйТип, "tabular section:") > 0
|
||
Тогда
|
||
Подтип = "ТабличнаяЧасть";
|
||
ИмяЭлементаПодтипа = "<Имя табличной части>";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "табличная часть строка:") > 0
|
||
Или Найти(КонкрентыйТип, "tabular section row:") > 0
|
||
Тогда
|
||
Подтип = "ТабличнаяЧастьСтрока";
|
||
ИмяЭлементаПодтипа = "<Имя табличной части>";
|
||
ИначеЕсли Ложь // Связано со следующим условием!
|
||
Или Найти(КонкрентыйТип, "виды субконто:") > 0
|
||
Или Найти(КонкрентыйТип, "ext dimension types:") > 0
|
||
Тогда
|
||
Подтип = "ВидыСубконто";
|
||
ИначеЕсли Ложь // Связано со следующим условием!
|
||
Или Найти(КонкрентыйТип, "ext dimensions:") > 0
|
||
Или Найти(КонкрентыйТип, "субконто:") > 0
|
||
Тогда
|
||
Подтип = "Субконто";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "виды субконто строка:") > 0
|
||
Или Найти(КонкрентыйТип, "ext dimension types row:") > 0
|
||
Тогда
|
||
Подтип = "ВидыСубконтоСтрока";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "набор записей:") > 0
|
||
Или Найти(КонкрентыйТип, "record set:") > 0
|
||
Тогда
|
||
Подтип = "НаборЗаписей";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "ключ записи:") > 0
|
||
Или Найти(КонкрентыйТип, "record key:") > 0
|
||
Тогда
|
||
Подтип = "КлючЗаписи";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "запись:") > 0
|
||
Или Найти(КонкрентыйТип, "record:") > 0
|
||
Тогда
|
||
Подтип = "Запись";
|
||
ИначеЕсли Ложь
|
||
Или Найти(КонкрентыйТип, "менеджер записи:") > 0
|
||
Или Найти(КонкрентыйТип, "record manager:") > 0
|
||
Тогда
|
||
Подтип = "МенеджерЗаписи";
|
||
// Пришлось сделать так из-за изменения представления ссылочных типов в 8.2 http://partners.v8.1c.ru/forum/thread.jsp?id=830683#830683
|
||
//ИначеЕсли Найти(КонкрентыйТип, "ссылка:") > 0 Тогда
|
||
Иначе//Если Найти(КонкрентыйТип, ":") = 0 Тогда
|
||
Подтип = "Ссылка";
|
||
КонецЕсли;
|
||
СтрокаКорневогоТипа = ПолучитьСтрокуТипаМетаОбъектов(ИмяОбщегоТипа);
|
||
СтрокаВида = ТаблицаИменЭлементовКоллекций.Найти(СтрокаКорневогоТипа.Множественное, "ИмяКоллекции");
|
||
Если СтрокаВида <> Неопределено Тогда
|
||
Если ИмяОбщегоТипа = "ВнешнийИсточникДанных" Тогда
|
||
ИмяОбщегоТипа = ИмяОбщегоТипа + "Таблица" + Подтип + "." + СтрокаВида.ИмяЭлементаКоллекции;
|
||
СтрокаВида = ТаблицаИменЭлементовКоллекций.Найти("Таблицы", "ИмяКоллекции");
|
||
ИмяОбщегоТипа = ИмяОбщегоТипа + "." + СтрокаВида.ИмяЭлементаКоллекции;
|
||
Иначе
|
||
ИмяОбщегоТипа = ИмяОбщегоТипа + Подтип + "." + СтрокаВида.ИмяЭлементаКоллекции;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ИмяЭлементаПодтипа <> "" Тогда
|
||
ИмяОбщегоТипа = ИмяОбщегоТипа + "." + ИмяЭлементаПодтипа;
|
||
КонецЕсли;
|
||
|
||
Возврат ИмяОбщегоТипа;
|
||
|
||
КонецФункции // ПолучитьИмяОбщегоТипаПоТипуЗначенияСМетаданными()
|
||
|
||
// Получает структуру типа из конкретного типа.
|
||
//
|
||
// Параметры:
|
||
// КонкрентыйТип – Тип, Строка - тип либо его представление (для неметаданных типов);
|
||
// *ЯзыкПрограммы - Число, *0;
|
||
// *ШаблонСтруктурыТипа - Структура, *Неопределено - содержит значения по умолчанию для новой структуры типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура – структура типа.
|
||
//
|
||
Функция СтруктураТипаИзКонкретногоТипа(КонкрентыйТип, ЯзыкПрограммы = 0, ШаблонСтруктурыТипа = Неопределено) Экспорт
|
||
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.Метаданные = мМетаданные;
|
||
Если ШаблонСтруктурыТипа <> Неопределено Тогда
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа, ШаблонСтруктурыТипа);
|
||
КонецЕсли;
|
||
Если КонкрентыйТип = Тип("ОбъектМетаданных") Тогда
|
||
Если Истина
|
||
И ШаблонСтруктурыТипа <> Неопределено // было закомментировано
|
||
И ТипЗнч(ШаблонСтруктурыТипа.Метаданные) = Тип("ОбъектМетаданных")
|
||
Тогда
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(ШаблонСтруктурыТипа.Метаданные.ПолноеИмя());
|
||
// Исключения из общего правила
|
||
Если МассивФрагментов[0] = "ОбщаяФорма" Тогда
|
||
МассивФрагментов[0] = "Форма";
|
||
ИначеЕсли МассивФрагментов[0] = "ОбщийМакет" Тогда
|
||
МассивФрагментов[0] = "Макет";
|
||
КонецЕсли;
|
||
СтруктураТипа.ИмяОбщегоТипа = МаркерОбъектаМетаданных + ": " + МассивФрагментов[МассивФрагментов.ВГраница() - 1];
|
||
Иначе
|
||
СтруктураТипа.ИмяОбщегоТипа = "ОбъектМетаданных";
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И КонкрентыйТип = Тип("КоллекцияОбъектовМетаданных")
|
||
И ШаблонСтруктурыТипа <> Неопределено
|
||
И СтруктураТипа.ИмяОбщегоТипа <> "Неизвестный контекст"
|
||
Тогда
|
||
//
|
||
Иначе
|
||
Если Истина
|
||
И КонкрентыйТип <> Тип("КонстантыНабор") // Антибаг платформы http://partners.v8.1c.ru/forum/thread.jsp?id=876094#876094
|
||
И ТипЗнч(КонкрентыйТип) = Тип("Тип")
|
||
Тогда
|
||
МетаданныеТипа = мМетаданные.НайтиПоТипу(КонкрентыйТип);
|
||
КонецЕсли;
|
||
Если МетаданныеТипа = Неопределено Тогда
|
||
ПредставлениеТипа = Строка(КонкрентыйТип);
|
||
Если Найти(ПредставлениеТипа, ":") = 0 Тогда
|
||
ИдентификаторТипа = ирОбщий.ПолучитьИдентификаторТипаЛкс(КонкрентыйТип);
|
||
Иначе
|
||
// Внешние метаданные
|
||
ИдентификаторТипа = "";
|
||
ПредставлениеТипа = ирОбщий.ПервыйФрагментЛкс(ПредставлениеТипа, ":");
|
||
Если НРег(ПредставлениеТипа) = Нрег("External data processor") Тогда
|
||
ПредставлениеТипа = "Внешняя обработка";
|
||
ИначеЕсли НРег(ПредставлениеТипа) = Нрег("External data processor tabular section") Тогда
|
||
ПредставлениеТипа = "Внешняя обработка табличная часть";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ИдентификаторТипа <> "" Тогда
|
||
КлючПоиска = Новый Структура("ИД, ТипТипа", ИдентификаторТипа, "Основной");
|
||
Иначе
|
||
КлючПоиска = Новый Структура("Представление, ТипТипа", ирОбщий.ПервыйФрагментЛкс(ПредставлениеТипа, ":"), "Основной");
|
||
КонецЕсли;
|
||
Иначе
|
||
ЛиНеУчитыватьПодтип = (ЯзыкПрограммы <> 0) И СтруктураТипа.ТипЯзыка <> "ЗначениеВЗапросе";
|
||
ИмяОбщегоТипа = ПолучитьИмяОбщегоТипаПоТипуЗначенияСМетаданными(КонкрентыйТип, МетаданныеТипа, ЛиНеУчитыватьПодтип);
|
||
СтруктураТипа.Метаданные = МетаданныеТипа;
|
||
КлючПоиска = Новый Структура("Слово, ТипТипа", ИмяОбщегоТипа, "Основной");
|
||
КонецЕсли;
|
||
|
||
НайденныеСтроки = ТаблицаОбщихТипов.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = НайденныеСтроки[0].Слово;
|
||
Если СтруктураТипа.СтрокаОписания = Неопределено Тогда
|
||
СтруктураТипа.СтрокаОписания = НайденныеСтроки[0];
|
||
КонецЕсли;
|
||
ИначеЕсли Найти(КонкрентыйТип, " ") = 0 Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = Строка(КонкрентыйТип);
|
||
Иначе
|
||
//ирОбщий.СообщитьЛкс("Невозможно восстановить имя типа """ + КонкрентыйТип + """", СтатусСообщения.Важное);
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
Возврат СтруктураТипа;
|
||
|
||
КонецФункции
|
||
|
||
// Получает таблицу структур типов из описания типов.
|
||
//
|
||
// Параметры:
|
||
// ОписаниеТипов – ОписаниеТипов;
|
||
// *ТаблицаСтруктурТипов - ТаблицаЗначений, *Неопределено - существующая таблица.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений - структур типов.
|
||
//
|
||
Функция ТаблицаСтруктурТиповИзОписанияТипов(ОписаниеТипов, ТаблицаСтруктурТипов = Неопределено) Экспорт
|
||
|
||
Если ТаблицаСтруктурТипов = Неопределено Тогда
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
КонецЕсли;
|
||
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
|
||
СтруктураТипа = СтруктураТипаИзКонкретногоТипа(Тип, Ложь);
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурТипов.Добавить(), СтруктураТипа);
|
||
КонецЦикла;
|
||
Возврат ТаблицаСтруктурТипов;
|
||
|
||
КонецФункции
|
||
|
||
Функция ТаблицаСтруктурТиповИзЗначения(Значение, ТаблицаСтруктурТипов = Неопределено, ЯзыкПрограммы = 0) Экспорт
|
||
|
||
Если ТаблицаСтруктурТипов = Неопределено Тогда
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
КонецЕсли;
|
||
СтруктураТипа = СтруктураТипаИзЗначения(Значение, ЯзыкПрограммы);
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурТипов.Добавить(), СтруктураТипа);
|
||
Возврат ТаблицаСтруктурТипов;
|
||
|
||
КонецФункции
|
||
|
||
// Получает объект по ссылке, кэшируя результат в соответствии.
|
||
//
|
||
// Параметры:
|
||
// Ссылка - Ссылка;
|
||
// ПринудительноОбновить - Булево, *Ложь.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Объект.
|
||
//
|
||
Функция КэшОбъект(Ссылка, ПринудительноОбновить = Ложь) Экспорт
|
||
|
||
ТипСсылки = ТипЗнч(Ссылка);
|
||
Кэш = КэшОбъектов[ТипСсылки];
|
||
Если Кэш = Неопределено Тогда
|
||
Кэш = Новый Соответствие;
|
||
КэшОбъектов[ТипСсылки] = Кэш;
|
||
КонецЕсли;
|
||
Если Не ПринудительноОбновить Тогда
|
||
Результат = Кэш[Ссылка];
|
||
КонецЕсли;
|
||
Если Результат = Неопределено Тогда
|
||
Результат = Ссылка.ПолучитьОбъект();
|
||
Кэш[Ссылка] = Результат;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // КэшОбъект()
|
||
|
||
// Получает строку конкретного типа.
|
||
//
|
||
// Параметры:
|
||
// СтруктураТипа - Структура - описание типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - конкрентого типа.
|
||
//
|
||
Функция ИмяТипаИзСтруктурыТипа(СтруктураТипа) Экспорт
|
||
|
||
КонкретныйТип = СтруктураТипа.ИмяОбщегоТипа;
|
||
МаркерРасширенияФормы = "Расширение формы";
|
||
Если Лев(КонкретныйТип, СтрДлина(МаркерРасширенияФормы)) = МаркерРасширенияФормы Тогда
|
||
КонкретныйТип = "Форма";
|
||
КонецЕсли;
|
||
//Если Лев(КонкретныйТип, СтрДлина(МаркерКоллекцииМетаданных)) = МаркерКоллекцииМетаданных Тогда
|
||
// КонкретныйТип = МаркерКоллекцииМетаданных;
|
||
//КонецЕсли;
|
||
ОбъектМД = СтруктураТипа.Метаданные;
|
||
Если Истина
|
||
И ТипЗнч(ОбъектМД) = Тип("КоллекцияОбъектовМетаданных")
|
||
И ОбъектМД.Количество() > 0
|
||
Тогда
|
||
ОбъектМД = ОбъектМД[0].Родитель();
|
||
КонецЕсли;
|
||
ТипМетаданных = ТипЗнч(ОбъектМД);
|
||
Если ТипМетаданных = Тип("ОбъектМетаданных") Тогда
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя();
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(ПолноеИмя);
|
||
Если МассивФрагментов[0] = "ТабличнаяЧасть" Тогда
|
||
// Баг платформы. У внешних метаданных полное имя не включает сам внешний метаобъект
|
||
МассивФрагментов.Вставить(0, "Имя");
|
||
МассивФрагментов.Вставить(0, "");
|
||
КонецЕсли;
|
||
Для Счетчик = 0 По МассивФрагментов.Количество() / 2 - 1 Цикл
|
||
ИмяЭлементаКоллекции = ирОбщий.СтрокаМеждуМаркерамиЛкс(КонкретныйТип, "<", ">", Ложь, Истина);
|
||
КонкретныйТип = СтрЗаменить(КонкретныйТип, ИмяЭлементаКоллекции, МассивФрагментов[Счетчик * 2 + 1]);
|
||
КонецЦикла;
|
||
ИначеЕсли Истина
|
||
И Это2iS
|
||
И (Ложь
|
||
Или ТипМетаданных = Тип("СправочникСсылка.ОбъектыМетаданных2iS")
|
||
Или ТипМетаданных = Тип("СправочникСсылка.СвойстваМетаданных2iS"))
|
||
Тогда
|
||
ОбъектМД = КэшОбъект(ОбъектМД);
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя;
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(ПолноеИмя);
|
||
Если МассивФрагментов[0] = "ТабличнаяЧасть" Тогда
|
||
// Баг платформы. У внешних метаданных полное имя не включает сам внешний метаобъект
|
||
МассивФрагментов.Вставить(0, "Имя");
|
||
МассивФрагментов.Вставить(0, "");
|
||
КонецЕсли;
|
||
Для Счетчик = 0 По МассивФрагментов.Количество() / 2 - 1 Цикл
|
||
ИмяЭлементаКоллекции = ирОбщий.СтрокаМеждуМаркерамиЛкс(КонкретныйТип, "<", ">", Ложь, Истина);
|
||
КонкретныйТип = СтрЗаменить(КонкретныйТип, ИмяЭлементаКоллекции, МассивФрагментов[Счетчик * 2 + 1]);
|
||
КонецЦикла;
|
||
//ИначеЕсли ТипЗнч(СтруктураТипа.Метаданные) = Тип("Соответствие") Тогда
|
||
// Для Каждого ЭлементВида Из СтруктураТипа.Метаданные Цикл
|
||
// КонкретныйТип = СтрЗаменить(КонкретныйТип, ЭлементВида.Ключ, ЭлементВида.Значение);
|
||
// КонецЦикла;
|
||
ИначеЕсли Ложь
|
||
Или КонкретныйТип = "Неизвестный контекст"
|
||
Или КонкретныйТип = "Произвольный"
|
||
Тогда
|
||
КонкретныйТип = "?";
|
||
КонецЕсли;
|
||
Возврат КонкретныйТип;
|
||
|
||
КонецФункции // ИмяТипаИзСтруктурыТипа()
|
||
|
||
// Получает новую структуру типа.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура - "ИмяОбщегоТипа", "Метаданные", "СтрокаОписания", "ТипЯзыка", "ВиртуальнаяТаблица".
|
||
//
|
||
Функция НоваяСтруктураТипа() Экспорт
|
||
|
||
Возврат Новый Структура("ИмяОбщегоТипа, Метаданные, СтрокаОписания, ТипЯзыка, Конструктор, ВиртуальнаяТаблица, ДополнительныеТипы, ДержательМетаданных",
|
||
"Неизвестный контекст", Неопределено, Неопределено, "", Ложь, Новый Структура("Выражение, НомерСтроки", "", 0));
|
||
|
||
КонецФункции
|
||
|
||
// Десериализатор структуры типа из неполной сериализации.
|
||
//
|
||
// Параметры:
|
||
// СтрокаСтруктурыТипа – Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СтруктураТипа – Структура.
|
||
//
|
||
Функция СтруктураТипаИзСтрокиВнутр(СтрокаСтруктурыТипа) Экспорт
|
||
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
Если ПустаяСтрока(СтрокаСтруктурыТипа) Тогда
|
||
Возврат СтруктураТипа;
|
||
КонецЕсли;
|
||
Успех = Ложь;
|
||
Попытка
|
||
ОписательТипа = ЗначениеИзСтрокиВнутр(СтрокаСтруктурыТипа);
|
||
Успех = Истина;
|
||
Исключение
|
||
ОписательТипа = НоваяСтруктураТипа();
|
||
ОписательТипа.ИмяОбщегоТипа = "<Ошибка преобразования>";
|
||
КонецПопытки;
|
||
Если Успех Тогда
|
||
СтруктураТипа.ИмяОбщегоТипа = ОписательТипа.ИмяОбщегоТипа;
|
||
Если ТипЗнч(ОписательТипа.Метаданные) = Тип("Строка") Тогда
|
||
СтруктураТипа.Метаданные = ирКэш.ОбъектМДПоПолномуИмениЛкс(ОписательТипа.Метаданные);
|
||
ИначеЕсли ТипЗнч(ОписательТипа.Метаданные) = Тип("ХранилищеЗначения") Тогда
|
||
Поток = Новый ЧтениеXML;
|
||
Поток.УстановитьСтроку(ОписательТипа.Метаданные.Получить());
|
||
// Тут тормоз
|
||
СтруктураТипа.Метаданные = СериализаторXDTO.ПрочитатьXML(Поток);
|
||
Иначе
|
||
СтруктураТипа.Метаданные = ОписательТипа.Метаданные;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат СтруктураТипа;
|
||
|
||
КонецФункции // СтруктураТипаВСтрокуВнутр()
|
||
|
||
// Получает новую структуру типа.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура - "ИмяОбщегоТипа", "Метаданные", "СтрокаОписания", "ТипЯзыка", "ВиртуальнаяТаблица".
|
||
//
|
||
Функция НоваяТаблицаСтруктурТипа() Экспорт
|
||
|
||
Возврат мТаблицаСтруктурТипа.СкопироватьКолонки();
|
||
|
||
КонецФункции // НоваяСтруктураТипа()
|
||
|
||
// Добавляет структуру типа в таблицу структур типов.
|
||
//
|
||
// Параметры:
|
||
// ТаблицаСтруктурТипов – ТаблицаЗначений;
|
||
// СтруктураТипа – Структура.
|
||
//
|
||
Процедура ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа, ПередаватьДополнительныеТипы = Ложь) Экспорт
|
||
|
||
ИсключаемыеСвойства = Неопределено;
|
||
Если Не ПередаватьДополнительныеТипы Тогда
|
||
ИсключаемыеСвойства = "ДополнительныеТипы";
|
||
КонецЕсли;
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурТипов.Добавить(), СтруктураТипа, , ИсключаемыеСвойства);
|
||
|
||
КонецПроцедуры // ДобавитьВТаблицуСтруктурТипов()
|
||
|
||
// Получает массив структур типов из строки допустимых типов.
|
||
//
|
||
// Параметры:
|
||
// ДопустимыеТипы – Строка;
|
||
// *ШаблонСтруктурыТипа - Структура, *Неопределено - содержит значения по умолчанию для новой структуры типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура – структура типа.
|
||
//
|
||
Функция ПолучитьТаблицуСтруктурТиповИзДопустимыхТипов(ДопустимыеТипы, ШаблонСтруктурыТипа = Неопределено) Экспорт
|
||
|
||
ТаблицаСтруктурТипов = НоваяТаблицаСтруктурТипа();
|
||
Если ПустаяСтрока(ДопустимыеТипы) Тогда
|
||
Возврат ТаблицаСтруктурТипов;
|
||
КонецЕсли;
|
||
МассивСериализованныхТипов = ирОбщий.СтрРазделитьЛкс(ДопустимыеТипы, ";");
|
||
Для Каждого СериализованныйТип Из МассивСериализованныхТипов Цикл
|
||
СтруктураТипа = СтруктураТипаИзСтрокиВнутр(СериализованныйТип);
|
||
Если ШаблонСтруктурыТипа <> Неопределено Тогда
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа, ШаблонСтруктурыТипа);
|
||
КонецЕсли;
|
||
ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа);
|
||
КонецЦикла;
|
||
Возврат ТаблицаСтруктурТипов;
|
||
|
||
КонецФункции // ПолучитьТаблицуСтруктурТиповИзДопустимыхТипов()
|
||
|
||
// Получает описание типов из допустимых типов.
|
||
//
|
||
// Параметры:
|
||
// ДопустимыеТипы – Строка;
|
||
// ТипЗначенияЭУ - ОписаниеТипов - все возможные типы из элемента управления.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ОписаниеТипов.
|
||
//
|
||
Функция ПолучитьОписаниеТиповИзДопустимыхТипов(ДопустимыеТипы, ТипЗначенияЭУ = Неопределено) Экспорт
|
||
|
||
ТаблицаСтруктурТипов = ПолучитьТаблицуСтруктурТиповИзДопустимыхТипов(ДопустимыеТипы);
|
||
ОписаниеТипов = ОписаниеТиповИзТаблицыСтруктурТипов(ТаблицаСтруктурТипов, ТипЗначенияЭУ);
|
||
Возврат ОписаниеТипов;
|
||
|
||
КонецФункции
|
||
|
||
// Получает описание типов из таблицы структур типов.
|
||
//
|
||
// Параметры:
|
||
// ДопустимыеТипы – Строка;
|
||
// ТипЗначенияЭУ - ОписаниеТипов - все возможные типы из элемента управления.
|
||
//
|
||
// Возвращаемое значение:
|
||
// ОписаниеТипов.
|
||
//
|
||
Функция ОписаниеТиповИзТаблицыСтруктурТипов(ТаблицаСтруктурТипов, ТипЗначенияЭУ = Неопределено) Экспорт
|
||
|
||
Если ТаблицаСтруктурТипов = Неопределено Тогда
|
||
Возврат Новый ОписаниеТипов;
|
||
КонецЕсли;
|
||
МассивТипов = Новый Массив;
|
||
Для Каждого СтруктураТипа Из ТаблицаСтруктурТипов Цикл
|
||
СтрокаКонкретногоТипа = ИмяТипаИзСтруктурыТипа(СтруктураТипа);
|
||
Попытка
|
||
ТекущийТип = Тип(СтрокаКонкретногоТипа);
|
||
Исключение
|
||
Продолжить;
|
||
КонецПопытки;
|
||
ТипМетаданных = ТипЗнч(СтруктураТипа.Метаданные);
|
||
Если ТипМетаданных = Тип("КвалификаторыСтроки") Тогда
|
||
КвалификаторыСтроки = СтруктураТипа.Метаданные;
|
||
ИначеЕсли ТипМетаданных = Тип("КвалификаторыЧисла") Тогда
|
||
КвалификаторыЧисла = СтруктураТипа.Метаданные;
|
||
ИначеЕсли ТипМетаданных = Тип("КвалификаторыДаты") Тогда
|
||
КвалификаторыДаты = СтруктураТипа.Метаданные;
|
||
КонецЕсли;
|
||
Если ТипЗначенияЭУ <> Неопределено Тогда
|
||
Если Не ТипЗначенияЭУ.СодержитТип(ТекущийТип) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
МассивТипов.Добавить(ТекущийТип);
|
||
КонецЦикла;
|
||
ОписаниеТипов = Новый ОписаниеТипов(МассивТипов, КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыСтроки);
|
||
Возврат ОписаниеТипов;
|
||
|
||
КонецФункции // ПолучитьОписаниеТиповИзДопустимыхТипов()
|
||
|
||
// Получает строку типа метаобъектов по единственному или множественному числу.
|
||
//
|
||
// Параметры:
|
||
// *Единственное – Строка, *Неопределено - единственное число типа;
|
||
// *Множественное – Строка, *Неопределено - множественное число типа.
|
||
// *Категория – Число, *Неопределено.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СтрокаТаблицыЗначений - найденная строка типа;
|
||
// Неопределено – корневой тип не найден.
|
||
//
|
||
Функция ПолучитьСтрокуТипаМетаОбъектов(Единственное = Неопределено, Множественное = Неопределено, Категория = Неопределено) Экспорт
|
||
|
||
СтруктураПоиска = Новый Структура;
|
||
Если Категория <> Неопределено Тогда
|
||
СтруктураПоиска.Вставить("Категория", Категория);
|
||
КонецЕсли;
|
||
Если Единственное <> Неопределено Тогда
|
||
СтруктураПоиска.Вставить("НЕдинственное", НРег(Единственное));
|
||
КонецЕсли;
|
||
Если Множественное <> Неопределено Тогда
|
||
СтруктураПоиска.Вставить("НМножественное", НРег(Множественное));
|
||
КонецЕсли;
|
||
НайденныеСтроки = ТаблицаТиповМетаОбъектов.НайтиСтроки(СтруктураПоиска);
|
||
Если НайденныеСтроки.Количество() = 0 Тогда
|
||
Результат = Неопределено;
|
||
Иначе
|
||
Результат = НайденныеСтроки[0];
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Проверяет общий тип на агрегатность.
|
||
//
|
||
// Параметры:
|
||
// ИмяОбщегоТипа - Строка;
|
||
// *ЯзыкПрограммы - *Число, 0.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Булево.
|
||
//
|
||
Функция ЭтоАгрегатныйОбщийТип(ИмяОбщегоТипа, ЯзыкПрограммы = 0) Экспорт
|
||
|
||
Если ИмяОбщегоТипа = "" Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
СтруктураКлюча = Новый Структура("ТипКонтекста, ЯзыкПрограммы", ИмяОбщегоТипа, ЯзыкПрограммы);
|
||
Если Ложь
|
||
Или ирОбщий.СтрокиРавныЛкс(ИмяОбщегоТипа, "COMОбъект")
|
||
Или (Истина
|
||
И ТаблицаКонтекстов.НайтиСтроки(СтруктураКлюча).Количество() = 0
|
||
И ТаблицаШаблоновКонтекстов.НайтиСтроки(СтруктураКлюча).Количество() = 0
|
||
//И Не ЛиИмяТипаComОбъекта(ИмяОбщегоТипа)
|
||
)
|
||
Тогда
|
||
Результат = Ложь;
|
||
Иначе
|
||
Результат = Истина;
|
||
КонецЕсли;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция БазовыйФайлРедактораJSON() Экспорт
|
||
Если БазовыйФайлРедактораJSON = Неопределено Тогда
|
||
БазовыйКаталог = КаталогВременныхФайлов();
|
||
КаталогКомпоненты = "JSONEditor";
|
||
КаталогНаДиске = Новый Файл(БазовыйКаталог + КаталогКомпоненты);
|
||
ДвоичныеДанные = ПолучитьМакет("JSONEditor");
|
||
Чтение = Вычислить("Новый ЧтениеДанных(ДвоичныеДанные)"); // 8.3.9+
|
||
Файл = Новый ЧтениеZipФайла(Чтение.ИсходныйПоток());
|
||
Файл.ИзвлечьВсе(БазовыйКаталог + КаталогКомпоненты);
|
||
БазовыйФайлРедактораJSON = БазовыйКаталог + КаталогКомпоненты + "\index.html";
|
||
КонецЕсли;
|
||
Возврат БазовыйФайлРедактораJSON;
|
||
КонецФункции
|
||
|
||
#Если Клиент Тогда
|
||
|
||
Функция ЗаполнитьСписокИнструментов() Экспорт
|
||
|
||
ТабличныйДокумент = ПолучитьМакет("СписокИнструментов");
|
||
СписокИнструментов.Загрузить(ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ТабличныйДокумент,,,, Истина));
|
||
Возврат СписокИнструментов;
|
||
|
||
КонецФункции
|
||
|
||
// Инициализирует полное дерево типов платформы.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
Процедура ИнициализироватьДеревоТипов() Экспорт
|
||
|
||
ИнициализацияОписанияМетодовИСвойств();
|
||
Состояние("Инициализация дерева типов...");
|
||
Если ДеревоТипов <> Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
ДеревоТипов = Новый ДеревоЗначений;
|
||
ДеревоТипов.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево"));
|
||
ДеревоТипов.Колонки.Добавить("Имя");
|
||
ДеревоТипов.Колонки.Добавить("ИндексКартинки", Новый ОписаниеТипов("Число"));
|
||
ДеревоТипов.Колонки.Добавить("СтруктураТипа");
|
||
лТаблицаТипов = ТаблицаОбщихТипов.Скопировать(Новый Структура("ЯзыкПрограммы", 0), "Слово");
|
||
лТаблицаТипов.Колонки.Слово.Имя = "Имя";
|
||
Для Каждого СтрокаТипа Из лТаблицаТипов Цикл
|
||
ЗаполнитьЗначенияСвойств(ДеревоТипов.Строки.Добавить(), СтрокаТипа);
|
||
КонецЦикла;
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
СтруктураТипа.Метаданные = мМетаданные;
|
||
СтруктураТипа.ТипЯзыка = "ИмяТипа";
|
||
СтруктураТипа.ИмяОбщегоТипа = "";
|
||
ОбработатьСтрокиДереваТипов(ДеревоТипов.Строки, СтруктураТипа);
|
||
ДеревоТипов.Строки.Сортировать("Имя", Истина);
|
||
ТаблицаТипов.Сортировать("Имя");
|
||
МассивВажныхТипов = Новый Массив;
|
||
МассивВажныхТипов.Добавить("Булево");
|
||
МассивВажныхТипов.Добавить("Дата");
|
||
МассивВажныхТипов.Добавить("Строка");
|
||
МассивВажныхТипов.Добавить("Число");
|
||
Для Каждого ВажныйТип Из МассивВажныхТипов Цикл
|
||
СтрокаТипа = ТаблицаТипов.Найти(ВажныйТип, "Имя");
|
||
ТаблицаТипов.Сдвинуть(СтрокаТипа, -ТаблицаТипов.Индекс(СтрокаТипа));
|
||
СтрокаТипа = ДеревоТипов.Строки.Найти(ВажныйТип, "Имя");
|
||
ДеревоТипов.Строки.Сдвинуть(СтрокаТипа, -ДеревоТипов.Строки.Индекс(СтрокаТипа));
|
||
КонецЦикла;
|
||
Состояние("");
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОбработатьСтрокиДереваТипов(Строки, КорневаяСтруктураТипа = Неопределено, ОкончаниеСтрокиТипа = "", МетаданныеТипа = Неопределено) Экспорт
|
||
|
||
МассивСтрокКУдалению = Новый Массив;
|
||
Для Каждого СтрокаТипа Из Строки Цикл
|
||
ТекущееИмяТипа = СтрокаТипа.Имя;
|
||
СтрокаТипа.Имя = СтрокаТипа.Имя + ОкончаниеСтрокиТипа;
|
||
Уровень = СтрокаТипа.Уровень();
|
||
ФрагментыОбщегоТипа = Неопределено;
|
||
Если Уровень = 0 Тогда
|
||
Если Найти(ТекущееИмяТипа, ".") > 0 Тогда
|
||
ФрагментыОбщегоТипа = ирОбщий.СтрРазделитьЛкс(ТекущееИмяТипа);
|
||
ТекущееИмяТипа = ФрагментыОбщегоТипа[0];
|
||
КонецЕсли;
|
||
СтрокаТипаМетаОбъектов = ПолучитьСтрокуТипаМетаОбъектов(ТекущееИмяТипа);
|
||
Если СтрокаТипаМетаОбъектов <> Неопределено Тогда
|
||
СтрокаТипа.ИндексКартинки = СтрокаТипаМетаОбъектов.ИндексКартинкиЕдинственное;
|
||
КонецЕсли;
|
||
Уровень = 0;
|
||
//СтрокаТипа.ИмяОбщегоТипа = ТекущееИмяТипа;
|
||
Иначе
|
||
Если КорневаяСтруктураТипа <> Неопределено Тогда
|
||
КорневаяСтруктураТипа.Свойство("ФрагментыОбщегоТипа", ФрагментыОбщегоТипа);
|
||
КонецЕсли;
|
||
СтрокаТипа.ИндексКартинки = Строки.Родитель.ИндексКартинки;
|
||
КонецЕсли;
|
||
Если ФрагментыОбщегоТипа <> Неопределено Тогда
|
||
Если ФрагментыОбщегоТипа.ВГраница() > Уровень Тогда
|
||
ТекущийФрагмент = ФрагментыОбщегоТипа[Уровень + 1];
|
||
КонецЕсли;
|
||
Если Найти(ТекущийФрагмент, "<") > 0 Тогда
|
||
Если Истина
|
||
И КорневаяСтруктураТипа = Неопределено
|
||
Тогда
|
||
КорневаяСтруктураТипа = НоваяСтруктураТипа();
|
||
КорневаяСтруктураТипа.Метаданные = мМетаданные;
|
||
КорневаяСтруктураТипа.ТипЯзыка = "ИмяТипа";
|
||
КорневаяСтруктураТипа.ИмяОбщегоТипа = СтрокаТипа.Имя;
|
||
КонецЕсли;
|
||
Если Уровень = 0 Тогда
|
||
КорневаяСтруктураТипа.Вставить("ФрагментыОбщегоТипа", ФрагментыОбщегоТипа);
|
||
СтруктураТипа = НоваяСтруктураТипа();
|
||
ЗаполнитьЗначенияСвойств(СтруктураТипа, КорневаяСтруктураТипа);
|
||
СтруктураТипа.ИмяОбщегоТипа = ТекущееИмяТипа;
|
||
Иначе
|
||
СтруктураТипа = СтрокаТипа.СтруктураТипа;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
ВнутренняяТаблицаСлов = ПолучитьВнутреннююТаблицуМетаданныхСлов(СтруктураТипа, , "Свойство");
|
||
Исключение
|
||
ВнутренняяТаблицаСлов = Новый ТаблицаЗначений;
|
||
КонецПопытки;
|
||
Если Истина
|
||
И Уровень > 0
|
||
И ВнутренняяТаблицаСлов.Количество() = 0
|
||
Тогда
|
||
МассивСтрокКУдалению.Добавить(СтрокаТипа);
|
||
Продолжить;
|
||
Иначе
|
||
ОкончаниеСтрокиТипаВниз = "";
|
||
Для Счетчик = Уровень + 2 По ФрагментыОбщегоТипа.ВГраница() Цикл
|
||
Фрагмент = ФрагментыОбщегоТипа[Счетчик];
|
||
ОкончаниеСтрокиТипаВниз = ОкончаниеСтрокиТипаВниз + "." + Фрагмент;
|
||
КонецЦикла;
|
||
Для Каждого СтрокаСлова Из ВнутренняяТаблицаСлов Цикл
|
||
НоваяСтрока = СтрокаТипа.Строки.Добавить();
|
||
СтруктураТипаВниз = СтрокаСлова.ТаблицаСтруктурТипов[0];
|
||
НоваяСтрока.СтруктураТипа = СтруктураТипаВниз;
|
||
//НоваяСтрока.Имя = ИмяТипаИзСтруктурыТипа(СтруктураТипаВниз);
|
||
НоваяСтрока.Имя = ТекущееИмяТипа + "." + СтруктураТипаВниз.Метаданные.Имя;
|
||
КонецЦикла;
|
||
ОбработатьСтрокиДереваТипов(СтрокаТипа.Строки, КорневаяСтруктураТипа, ОкончаниеСтрокиТипаВниз);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
//ЗаполнитьЗначенияСвойств(СтруктураТипа, КорневаяСтруктураТипа, "ИмяОбщегоТипа");
|
||
ЗаполнитьЗначенияСвойств(ТаблицаТипов.Добавить(), СтрокаТипа);
|
||
КонецЦикла;
|
||
РодительСтрок = Строки.Родитель;
|
||
Для Каждого СтрокаКУдалению Из МассивСтрокКУдалению Цикл
|
||
РодительСтрок.Строки.Удалить(СтрокаКУдалению);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Открыть диалог для редактирования допустимых типов.
|
||
//
|
||
// Параметры:
|
||
// ДопустимыеТипы – Строка – сериализованные допустимые типы;
|
||
// *ТолькоПросмотр – Булево, *Истина – открыть только для просмотра.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - сериализованных допустимых типов;
|
||
// Неопределено - отмена.
|
||
//
|
||
Функция РедактироватьДопустимыеТипы(ДопустимыеТипы, ТолькоПросмотр = Ложь) Экспорт
|
||
|
||
ФормаРедактора = ПолучитьФорму("РедакторДопустимыхТипов");
|
||
ФормаРедактора.ДопустимыеТипы = ДопустимыеТипы;
|
||
ФормаРедактора.ТолькоПросмотр = ТолькоПросмотр;
|
||
Если ФормаРедактора.ОткрытьМодально() = Истина Тогда
|
||
Возврат ФормаРедактора.ДопустимыеТипы;
|
||
Иначе
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
КонецФункции // РедактироватьДопустимыеТипы()
|
||
|
||
// Убирает из строки лишние кавычки.
|
||
//
|
||
// Параметры:
|
||
// ПервичнаяСтрока – Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка.
|
||
//
|
||
Функция ИзвлечьСтрокуШаблонаТекста(ПервичнаяСтрока)
|
||
|
||
RegExp.Global = Истина;
|
||
СтрокаБезГраниц = Сред(ПервичнаяСтрока, 2, СтрДлина(ПервичнаяСтрока) - 2);
|
||
RegExp.Pattern = "([^""]*"")""";
|
||
Результат = RegExp.Replace(СтрокаБезГраниц, "$1");
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ИзвлечьСтрокуШаблонаТекста ()
|
||
|
||
// Загружает шаблоны текста из файла.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Булево - успешность операции.
|
||
//
|
||
Функция ПолучитьТаблицуШаблоновТекста(ИмяКласса, мСообщенияЧерезПредупреждения, ПринудительноОбновить = Ложь) Экспорт
|
||
|
||
Если Истина
|
||
И Не ПринудительноОбновить
|
||
И ТаблицаШаблоновТекста <> Неопределено
|
||
Тогда
|
||
Возврат ТаблицаШаблоновТекста;
|
||
КонецЕсли;
|
||
ТаблицаШаблоновТекста = Новый ТаблицаЗначений;
|
||
ТаблицаШаблоновТекста.Колонки.Добавить("Шаблон");
|
||
ТаблицаШаблоновТекста.Колонки.Добавить("Замена");
|
||
ТаблицаШаблоновТекста.Индексы.Добавить("Шаблон");
|
||
|
||
ФайлШаблонов = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ФайлШаблоновТекста");
|
||
Файл = Новый Файл(ФайлШаблонов);
|
||
Если Не Файл.Существует() Тогда
|
||
Если ЗначениеЗаполнено(ФайлШаблонов) Тогда
|
||
ирОбщий.СообщитьСУчетомМодальностиЛкс("Не обнаружен файл шаблонов текста """ + ФайлШаблонов + """, указанный в настройках компоненты ""Контекстная подсказка""",
|
||
мСообщенияЧерезПредупреждения);
|
||
КонецЕсли;
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Парсер = мПолучитьПарсер("ГрамматикаФайлаШаблоновТекста");
|
||
Если Парсер = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
ТекстовыйДокументФайла = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокументФайла.Прочитать(ФайлШаблонов);
|
||
|
||
Состояние("Идет загрузка файла шаблонов текста...");
|
||
|
||
gpMsgReduction = 2;
|
||
gpMsgAccept = 3;
|
||
gpMsgNotLoadedError = 4;
|
||
gpMsgLexicalError = 5;
|
||
gpMsgSyntaxError = 6;
|
||
gpMsgInternalError = 8;
|
||
|
||
Парсер.OpenTextString(ТекстовыйДокументФайла.ПолучитьТекст());
|
||
|
||
Закончили = Ложь;
|
||
ТекущаяСтрокаТаблицыШаблоновТекста = Неопределено;
|
||
|
||
Пока Не Закончили Цикл
|
||
Ответ = Парсер.Parse();
|
||
Если Ложь
|
||
Или Ответ = gpMsgLexicalError
|
||
Или Ответ = gpMsgSyntaxError
|
||
Или Ответ = gpMsgInternalError
|
||
Или Ответ = gpMsgNotLoadedError
|
||
Или Ответ = gpMsgAccept
|
||
Тогда
|
||
Закончили = Истина;
|
||
ИначеЕсли Ответ = gpMsgReduction Тогда
|
||
ИмяПравила = Парсер.CurrentReduction.ParentRule.RuleNonterminal.Text;
|
||
Если ИмяПравила = "<Match>" Тогда
|
||
СтартовыйТокен = Парсер.CurrentReduction.Tokens(0);
|
||
ТекущаяСтрокаТаблицыШаблоновТекста = ТаблицаШаблоновТекста.Добавить();
|
||
ТекущаяСтрокаТаблицыШаблоновТекста.Шаблон = Нрег(ИзвлечьСтрокуШаблонаТекста(СтартовыйТокен.Data));
|
||
ИначеЕсли ИмяПравила = "<Replacement>" Тогда
|
||
СтартовыйТокен = Парсер.CurrentReduction.Tokens(0);
|
||
ТекущаяСтрокаТаблицыШаблоновТекста.Замена = ИзвлечьСтрокуШаблонаТекста(СтартовыйТокен.Data);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Состояние();
|
||
Если Ответ <> gpMsgAccept Тогда
|
||
ирОбщий.СообщитьСУчетомМодальностиЛкс("Указан неправильный файл шаблонов """ + ФайлШаблонов + """", мСообщенияЧерезПредупреждения);
|
||
ТаблицаШаблоновТекста = Неопределено;
|
||
КонецЕсли;
|
||
Возврат ТаблицаШаблоновТекста;
|
||
|
||
КонецФункции // ЗагрузитьШаблоныТекста()
|
||
|
||
// Параметры:
|
||
// Параметры - ТаблицаЗначений - колонки "ИмяПараметра, ЗначениеПараметра"
|
||
// ТипЗапроса - Строка, *"Построитель" - "Обычный", "Компоновка", "Построитель"
|
||
Функция РедактироватьЗапрос(Текст, Параметры, ТипЗапроса = "Построитель", ПараметрыADO = Неопределено, ПараметрыWMI = Неопределено) Экспорт
|
||
|
||
СтруктураЗапроса = Новый Структура;
|
||
СтруктураЗапроса.Вставить("ТекстЗапроса", Текст);
|
||
СтруктураЗапроса.Вставить("Параметры", Параметры);
|
||
Если ПараметрыADO <> Неопределено Тогда
|
||
СтруктураЗапроса.Вставить("ПараметрыADO", ПараметрыADO);
|
||
КонецЕсли;
|
||
Если ПараметрыWMI <> Неопределено Тогда
|
||
СтруктураЗапроса.Вставить("ПараметрыWMI", ПараметрыWMI);
|
||
КонецЕсли;
|
||
СтруктураЗапроса.Вставить("ТипЗапроса", ТипЗапроса);
|
||
СтруктураЗапроса.Вставить("Имя", "Запрос");
|
||
ОбработкаКонсольЗапросов = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирКонсольЗапросов");
|
||
РезультатФормы = ОбработкаКонсольЗапросов.РедактироватьСтруктуруЗапроса(, СтруктураЗапроса);
|
||
Результат = РезультатФормы <> Неопределено;
|
||
Если Результат Тогда
|
||
Текст = РезультатФормы.ТекстЗапроса;
|
||
Параметры = РезультатФормы.Параметры;
|
||
ПараметрыADO = РезультатФормы.ПараметрыADO;
|
||
ПараметрыWMI = РезультатФормы.ПараметрыWMI;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
#КонецЕсли
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// РАБОТА С АЛГОРИТМАМИ
|
||
|
||
// Выполняет текст программы.
|
||
//
|
||
// Параметры:
|
||
// ТекстДляВыполнения – Строка;
|
||
// *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля.
|
||
//
|
||
Функция ВыполнитьЛокально(ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт
|
||
|
||
Если ЛиСинтаксическийКонтроль Тогда
|
||
ирОбщий.ВыполнитьАлгоритмБезРезультата(ТекстДляВыполнения);
|
||
Иначе
|
||
Результат = ирОбщий.ВыполнитьАлгоритм(ТекстДляВыполнения);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Выполняет программный код в контексте.
|
||
//
|
||
// Параметры:
|
||
// ТекстДляВыполнения – Строка;
|
||
// *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля.
|
||
//
|
||
Функция ВыполнитьПрограммныйКодВКонтексте(КонтекстВыполнения, МетодВыполнения = "ВыполнитьЛокально", ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт
|
||
|
||
Если ПустаяСтрока(МетодВыполнения) Тогда
|
||
ВызватьИсключение "Не указан метод выполнения";
|
||
КонецЕсли;
|
||
Если КонтекстВыполнения = Неопределено Тогда
|
||
ИнформацияОбОшибке = Вычислить(МетодВыполнения + "(ТекстДляВыполнения, ЛиСинтаксическийКонтроль)");
|
||
Иначе
|
||
ИнформацияОбОшибке = Вычислить("КонтекстВыполнения." + МетодВыполнения + "(ТекстДляВыполнения, ЛиСинтаксическийКонтроль)");
|
||
КонецЕсли;
|
||
Возврат ИнформацияОбОшибке;
|
||
|
||
КонецФункции // ВыполнитьПрограммныйКодВКонтексте()
|
||
|
||
// Получает новый экземпляр ком-объекта парсера.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Com-объект, Неопределено.
|
||
//
|
||
Функция ПолучитьADOUtils(ПытатьсяУстанавливать = Ложь, Знач СмещениеГодаADO = Неопределено, Знач Типизировать1С = Ложь, Знач БинарныеВСтроку = Ложь) Экспорт
|
||
|
||
Если мADOUtils = Неопределено Тогда
|
||
ИдентификаторКласса = "GameWithFire.ADOUtils";
|
||
ИмяОбъекта = "ADOUtils";
|
||
ПодключитьВнешнююКомпоненту(ИдентификаторКласса);
|
||
Попытка
|
||
мADOUtils = Новый ("AddIn." + ИмяОбъекта);
|
||
мADOUtils.BinaryDataAs1C = Истина; // Для проверки актуальности версии библиотеки
|
||
Исключение
|
||
мADOUtils = Неопределено;
|
||
КонецПопытки;
|
||
Если Истина
|
||
И мADOUtils = Неопределено
|
||
//И ПытатьсяУстанавливать
|
||
И Ложь
|
||
Тогда
|
||
ИмяМакетаДополнительнойБиблиотеки = "Zlib1";
|
||
ИмяМакетаКомпоненты = "GameWithFire";
|
||
ПолучитьCOMОбъектИзМакета(ИмяМакетаКомпоненты, ИдентификаторКласса,, ИмяМакетаДополнительнойБиблиотеки, ИмяОбъекта);
|
||
ПодключитьВнешнююКомпоненту(ИдентификаторКласса);
|
||
Попытка
|
||
мADOUtils = Новый ("AddIn." + ИмяОбъекта);
|
||
мADOUtils.BinaryDataAs1C = Истина; // Для проверки актуальности версии библиотеки
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
// такой способ почему то не работает
|
||
//мADOUtils = ПолучитьОбъектВнешнейКомпонентыИзМакета(ИмяМакетаКомпоненты, , ИдентификаторКласса, ТипВнешнейКомпоненты.COM, ИмяМакетаДополнительнойБиблиотеки);
|
||
КонецЕсли;
|
||
Если мADOUtils <> Неопределено Тогда
|
||
мADOUtils.BinaryDataAsStrings = БинарныеВСтроку;
|
||
мADOUtils.BinaryDataAs1C = Типизировать1С;
|
||
мADOUtils.YearOffset = СмещениеГодаADO;
|
||
КонецЕсли;
|
||
Возврат мADOUtils;
|
||
|
||
КонецФункции
|
||
|
||
//#КонецЕсли
|
||
|
||
Функция ИдентификаторыПроцессовОтладчиков() Экспорт
|
||
|
||
Перем Результат;
|
||
ПортДляПодключенияОтладчика(Результат);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПортДляПодключенияОтладчика(выхИдентификаторыОтладчиков = Неопределено) Экспорт
|
||
|
||
Результат = "";
|
||
ирОбщий.ПараметрыЗапускаСеансаТекущиеЛкс(, Результат);
|
||
ИдентификаторЭтогоПроцесса = ИдентификаторПроцессаОС();
|
||
ТекстРезультата = ТекстРезультатаКомандыСистемы("netstat -n -a -o");
|
||
выхИдентификаторыОтладчиков = Новый Массив;
|
||
шАдресIP4 = "(?:[0-9]{1,3}\.){3}[0-9]{1,3}";
|
||
Результат = ирОбщий.СтрокаМеждуМаркерамиЛкс(Результат, "/DEBUGGERURL""", """");
|
||
Если Истина
|
||
И ЗначениеЗаполнено(Результат)
|
||
И ирОбщий.СтрокиРавныЛкс(ирОбщий.ПервыйФрагментЛкс(Результат, ":"), "http")
|
||
Тогда
|
||
// http://CORTEX:1550
|
||
ПортСервераОтладки = ирОбщий.ПоследнийФрагментЛкс(Результат, ":", Ложь);
|
||
Если ПортСервераОтладки = "" Тогда
|
||
ПортСервераОтладки = Неопределено;
|
||
КонецЕсли;
|
||
RegExp.Global = Истина;
|
||
шСоединениеССерверомОтладки = "TCP(?:\s+)(" + шАдресIP4 +"):(?:\d+)(?:\s+)" + шАдресIP4 + ":" + ПортСервераОтладки +"(?:\s+)ESTABLISHED(?:\s+)";
|
||
RegExp.Pattern = шСоединениеССерверомОтладки + Формат(ИдентификаторЭтогоПроцесса, "ЧГ=");
|
||
Вхождения = RegExp.Execute(ТекстРезультата);
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
ЛокальныйАдрес4 = Вхождение.SubMatches(0);
|
||
Прервать;
|
||
КонецЦикла;
|
||
RegExp.Pattern = шСоединениеССерверомОтладки + "(\d+)";
|
||
Вхождения = RegExp.Execute(ТекстРезультата);
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
ИдентификаторОтладчика = Вхождение.SubMatches(1);
|
||
Если Истина
|
||
И ИдентификаторОтладчика <> Формат(ИдентификаторЭтогоПроцесса, "ЧГ=")
|
||
И выхИдентификаторыОтладчиков.Найти(ИдентификаторОтладчика) = Неопределено
|
||
Тогда
|
||
ПроцессОС = ирОбщий.ПолучитьПроцессОСЛкс(ИдентификаторОтладчика);
|
||
Если Истина
|
||
И ирОбщий.СтрокиРавныЛкс(ПроцессОС.Name, "1cv8.exe")
|
||
И ирОбщий.ЛиПроцессОСКонфигуратораЛкс(ПроцессОС)
|
||
Тогда
|
||
выхИдентификаторыОтладчиков.Добавить(ИдентификаторОтладчика);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
выхИдентификаторыОтладчиков.Добавить("0"); // Чтобы неоднозначность сохранялась и с одним найденным отладчиком
|
||
Иначе
|
||
RegExp.Global = Истина;
|
||
RegExp.Pattern = "TCP(?:\s+)0\.0\.0\.0:(\d+)(?:\s+)" + шАдресIP4 + ":(\d+)(?:\s+)LISTENING(?:\s+)" + Формат(ИдентификаторЭтогоПроцесса, "ЧГ=");
|
||
Вхождения = RegExp.Execute(ТекстРезультата);
|
||
МассивСлушающихПортов = Новый Массив;
|
||
СтрокаПоиска = "";
|
||
// Т.к. неясно какой из портов для отладки, используем все
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
МассивСлушающихПортов.Добавить(Вхождение.SubMatches(0));
|
||
СтрокаПоиска = СтрокаПоиска + "|" + Вхождение.SubMatches(0);
|
||
КонецЦикла;
|
||
Если МассивСлушающихПортов.Количество() = 0 Тогда
|
||
Результат = Неопределено;
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
СтрокаПоиска = Сред(СтрокаПоиска, 2);
|
||
ЛокальныйАдрес = ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс("127.0.0.1");
|
||
RegExp.Pattern = "TCP(?:\s+)" + ЛокальныйАдрес + ":(?:\d+)(?:\s+)" + ЛокальныйАдрес + ":(" + СтрокаПоиска + ")(?:\s+)ESTABLISHED(?:\s+)(\d+)";
|
||
Вхождения = RegExp.Execute(ТекстРезультата);
|
||
Для Каждого Вхождение Из Вхождения Цикл
|
||
ИдентификаторКорреспондента = Вхождение.SubMatches(1);
|
||
Если ИдентификаторКорреспондента <> Формат(ИдентификаторЭтогоПроцесса, "ЧГ=") Тогда
|
||
выхИдентификаторыОтладчиков.Добавить(ИдентификаторКорреспондента);
|
||
Иначе
|
||
МассивСлушающихПортов.Удалить(МассивСлушающихПортов.Найти(Вхождение.SubMatches(0)));
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если МассивСлушающихПортов.Количество() > 0 Тогда
|
||
Результат = "tcp://127.0.0.1:" + МассивСлушающихПортов[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
#Если Клиент Тогда
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьФайлСтилейСинтаксПомощника() Экспорт
|
||
|
||
Если ФайлСтилейСинтаксПомощника = Неопределено Тогда
|
||
ФайлСтилейСинтаксПомощника = Новый Файл(ПолучитьИмяВременногоФайла("css"));
|
||
ТекстовыйДокумент = ПолучитьМакет("СтилиСинтаксПомощника");
|
||
ТекстовыйДокумент.Вывод = ИспользованиеВывода.Разрешить;
|
||
ТекстовыйДокумент.Записать(ФайлСтилейСинтаксПомощника.ПолноеИмя);
|
||
КонецЕсли;
|
||
Возврат ФайлСтилейСинтаксПомощника;
|
||
|
||
КонецФункции // ПолучитьФайлСтилейСинтаксПомощника()
|
||
|
||
// Получает zip-архив синтакс-помощника из файла "shcntx_ru.hbk" в каталоге установки платформы.
|
||
//
|
||
// Параметры:
|
||
// ЭлементСтруктуры - Число, *0 - 0 - архив страниц, 1 - содержание книги, 2 - индекс книги
|
||
//
|
||
Функция ПолучитьАрхивСинтаксПомощникаПоИмени(ЭлементСтруктуры = 0, ИмяАрхива = "shcntx_ru") Экспорт
|
||
|
||
Если АрхивСинтаксПомощника = Неопределено Тогда
|
||
АрхивСинтаксПомощника = Новый Структура;
|
||
КонецЕсли;
|
||
ФайлАрхива = Неопределено;
|
||
КлючСтруктуры = "_" + ИмяАрхива + ЭлементСтруктуры;
|
||
Если Не АрхивСинтаксПомощника.Свойство(КлючСтруктуры, ФайлАрхива) Тогда
|
||
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("zip");
|
||
Если ЭлементСтруктуры = 0 Тогда
|
||
ИмяБлока = "FileStorage.data";
|
||
ИначеЕсли ЭлементСтруктуры = 1 Тогда
|
||
ИмяБлока = "PackBlock.data";
|
||
ИначеЕсли ЭлементСтруктуры = 2 Тогда
|
||
ИмяБлока = "IndexPackBlock.data";
|
||
КонецЕсли;
|
||
ИмяФайлаПлатформы = ИмяАрхива + ".hbk";
|
||
ТекущийКаталог = КаталогВременныхФайлов();
|
||
ФайлПлатформы = Новый Файл(КаталогПрограммы() + ИмяФайлаПлатформы);
|
||
//ФайлПлатформы = Новый Файл(ПолучитьИмяФайлаВФорматеDOS(ФайлПлатформы.ПолноеИмя));
|
||
ФайлБлока = Новый Файл(ТекущийКаталог + ИмяБлока);
|
||
#Если Клиент Тогда
|
||
Состояние("Распаковка синтакс-помощника");
|
||
#КонецЕсли
|
||
РаспаковатьФайлВнешнейОбработки(ФайлПлатформы.ПолноеИмя, ТекущийКаталог);
|
||
Попытка
|
||
ПереместитьФайл(ФайлБлока.ПолноеИмя, ИмяВременногоФайла);
|
||
Исключение
|
||
// Если файл залочен на чтение (открыт синтакс-помощник в конфигураторе)
|
||
КопияФайлаПлатформы = Новый Файл(ПолучитьИмяВременногоФайла());
|
||
КопироватьФайл(ФайлПлатформы.ПолноеИмя, КопияФайлаПлатформы.ПолноеИмя);
|
||
ФайлПлатформы = Новый Файл(ПолучитьИмяФайлаВФорматеDOS(КопияФайлаПлатформы.ПолноеИмя));
|
||
ФайлБлока = Новый Файл(ТекущийКаталог + ИмяБлока);
|
||
РаспаковатьФайлВнешнейОбработки(ФайлПлатформы.ПолноеИмя, ТекущийКаталог);
|
||
ПереместитьФайл(ФайлБлока.ПолноеИмя, ИмяВременногоФайла);
|
||
КонецПопытки;
|
||
УдалитьФайлы(ТекущийКаталог + Лев(ФайлПлатформы.ИмяБезРасширения, 8));
|
||
#Если Клиент Тогда
|
||
Состояние("");
|
||
#КонецЕсли
|
||
ФайлАрхива = Новый Файл(ИмяВременногоФайла);
|
||
АрхивСинтаксПомощника.Вставить(КлючСтруктуры, ФайлАрхива);
|
||
КонецЕсли;
|
||
Возврат ФайлАрхива;
|
||
|
||
КонецФункции // ПолучитьАрхивСинтаксПомощника()
|
||
|
||
Функция ПрочитатьИндексАрхиваСинтаксПомощника(ИмяАрхива) Экспорт
|
||
|
||
#Если Сервер И Не Сервер Тогда
|
||
ПапкаКэшаСинтаксПомощника = Новый Файл;
|
||
#КонецЕсли
|
||
Результат = Неопределено;
|
||
ФайлИндекса = Новый Файл(ПапкаКэшаСинтаксПомощника.ПолноеИмя + "\" + ИмяАрхива + ".idx");
|
||
Если ФайлИндекса.Существует() Тогда
|
||
Результат = ЗначениеИзФайла(ФайлИндекса.ПолноеИмя);
|
||
Если Результат.НомерВерсииПлатформы <> ирКэш.НомерВерсииПлатформыЛкс(Истина) Тогда
|
||
Результат = Неопределено;
|
||
Иначе
|
||
Результат = Результат.Индекс;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ЗаписатьИндексАрхиваСинтаксПомощника(ИмяАрхива, ТаблицаИндекса) Экспорт
|
||
|
||
#Если Сервер И Не Сервер Тогда
|
||
ПапкаКэшаСинтаксПомощника = Новый Файл;
|
||
#КонецЕсли
|
||
ФайлИндекса = Новый Файл(ПапкаКэшаСинтаксПомощника.ПолноеИмя + "\" + ИмяАрхива + ".idx");
|
||
Результат = Новый Структура;
|
||
Результат.Вставить("НомерВерсииПлатформы", ирКэш.НомерВерсииПлатформыЛкс(Истина));
|
||
Результат.Вставить("Индекс", ТаблицаИндекса);
|
||
ЗначениеВФайл(ФайлИндекса.ПолноеИмя, Результат);
|
||
|
||
КонецПроцедуры
|
||
|
||
//
|
||
//
|
||
// Параметры:
|
||
// ПутьКЭлементу - Строка - модифицируется
|
||
// ИмяАрхива – Строка – входное значение игнорируется, на выход подается вычисленное имя файла архива;
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьАрхивСинтаксПомощникаПоПутиКЭлементу(ПутьКЭлементу, ЭлементСтруктуры = 0, ЛиОбрезатьПутьДоОтносительного = Ложь, ИмяАрхива = "") Экспорт
|
||
|
||
МаркерДопАрхива = "//";
|
||
Если Найти(ПутьКЭлементу, МаркерДопАрхива) = 1 Тогда
|
||
ИмяАрхива = ирОбщий.ПервыйФрагментЛкс(Сред(ПутьКЭлементу, СтрДлина(МаркерДопАрхива) + 1), "/");
|
||
Если ЛиОбрезатьПутьДоОтносительного Тогда
|
||
ПутьКЭлементу = Сред(ПутьКЭлементу, СтрДлина(МаркерДопАрхива) + 1 + СтрДлина(ИмяАрхива) + 1);
|
||
КонецЕсли;
|
||
ФайлАрхива = ПолучитьАрхивСинтаксПомощникаПоИмени(ЭлементСтруктуры, ИмяАрхива);
|
||
Иначе
|
||
ФайлАрхива = ПолучитьАрхивСинтаксПомощникаПоИмени(ЭлементСтруктуры);
|
||
КонецЕсли;
|
||
Возврат ФайлАрхива;
|
||
|
||
КонецФункции // ПолучитьИмяАрхиваСинтаксПомощника()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция РаспаковатьФайлАрхиваСинтаксПомощника(Знач ПутьКЭлементу, ПрефиксСсылки = "") Экспорт
|
||
|
||
ФайлАрхива = ПолучитьАрхивСинтаксПомощникаПоПутиКЭлементу(ПутьКЭлементу,, Истина);
|
||
Если ФайлАрхива = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Если Лев(ПутьКЭлементу, 1) = "/" Тогда
|
||
ПутьКЭлементу = Сред(ПутьКЭлементу, 2);
|
||
КонецЕсли;
|
||
МассивФрагментов = ирОбщий.СтрРазделитьЛкс(ПутьКЭлементу, "#");
|
||
ПутьКЭлементу = МассивФрагментов[0];
|
||
ФайлРаспаковщикаZIP = ПолучитьФайлРаспаковщикаZIP(Истина);
|
||
ВременныйФайл = Новый Файл(ПолучитьИмяВременногоФайла("html"));
|
||
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(ФайлРаспаковщикаZIP.Имя + " -j " + ФайлАрхива.Имя
|
||
+ " """ + ПутьКЭлементу + """", КаталогВременныхФайлов(), Истина);
|
||
ПолноеИмяРаспакованногоФайла = КаталогВременныхФайлов() + ирОбщий.ПоследнийФрагментЛкс(ПутьКЭлементу, "/");
|
||
Попытка
|
||
ПереместитьФайл(ПолноеИмяРаспакованногоФайла, ВременныйФайл.ПолноеИмя);
|
||
Исключение
|
||
// для примитивных типов видимо лежат файлы в другом архиве
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
УдалитьФайлы(ПолноеИмяРаспакованногоФайла);
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ВременныйФайл.ПолноеИмя);
|
||
СодержаниеСтраницы = ТекстовыйДокумент.ПолучитьТекст();
|
||
Если Найти(СодержаниеСтраницы, "<head>") > 0 Тогда
|
||
Маркер = "<head>";
|
||
ИначеЕсли Найти(СодержаниеСтраницы, "<HEAD>") > 0 Тогда
|
||
Маркер = "<HEAD>";
|
||
ИначеЕсли Найти(СодержаниеСтраницы, "<Head>") > 0 Тогда
|
||
Маркер = "<Head>";
|
||
КонецЕсли;
|
||
Если Маркер <> Неопределено Тогда
|
||
ТегБазы = "<base href=""" + ПрефиксСсылки + "/" + ПутьКЭлементу + """>";
|
||
СодержаниеСтраницы = СтрЗаменить(СодержаниеСтраницы, Маркер, Маркер + ТегБазы);
|
||
ТекстовыйДокумент.УстановитьТекст(СодержаниеСтраницы);
|
||
ТекстовыйДокумент.Вывод = ИспользованиеВывода.Разрешить;
|
||
ТекстовыйДокумент.Записать(ВременныйФайл.ПолноеИмя);
|
||
КонецЕсли;
|
||
ВременныйАдрес = ВременныйФайл.ПолноеИмя;
|
||
Если МассивФрагментов.Количество() > 1 Тогда
|
||
ВременныйАдрес = ВременныйАдрес + "#" + МассивФрагментов[1];
|
||
КонецЕсли;
|
||
Возврат ВременныйАдрес;
|
||
|
||
КонецФункции // РаспаковатьФайлАрхиваСинтаксПомощника()
|
||
|
||
Функция ПолучитьДокументDOMФормы(Форма) Экспорт
|
||
|
||
Перем ДокументDOM;
|
||
|
||
Попытка
|
||
Форма.мСвойстваФормы.Свойство("ДокументDOM", ДокументDOM);
|
||
ЕстьХранилище = Истина;
|
||
Исключение
|
||
ЕстьХранилище = Ложь;
|
||
КонецПопытки;
|
||
Если ДокументDOM = Неопределено Тогда
|
||
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
|
||
XMLСтрокаФормы = ирОбщий.СтрокаВнутрВХМЛТелоЛкс(СтрокаФормы);
|
||
ЧтениеXML = Новый ЧтениеXML;
|
||
ЧтениеXML.УстановитьСтроку(XMLСтрокаФормы);
|
||
ПостроительDOM = Новый ПостроительDOM;
|
||
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
|
||
Если ЕстьХранилище Тогда
|
||
Форма.мСвойстваФормы.Вставить("ДокументDOM", ДокументDOM);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ДокументDOM;
|
||
|
||
КонецФункции // ЛксПолучитьДокументDOMФормы()
|
||
|
||
Функция ПолучитьXPathИмениРеквизитаВОписанииРеквизита()
|
||
|
||
ИДВерсииПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
|
||
Если ИДВерсииПлатформы = "81" Тогда
|
||
Результат = "/data[3]";
|
||
ИначеЕсли Ложь
|
||
Или ИДВерсииПлатформы = "82"
|
||
Или ИДВерсииПлатформы = "83"
|
||
Тогда
|
||
Результат = "/data[4]";
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьXPathИмениРеквизитаВОписанииРеквизита()
|
||
|
||
Функция ПолучитьИмяОсновногоРеквизитаФормы(Форма) Экспорт
|
||
|
||
ДокументDOM = ПолучитьДокументDOMФормы(Форма);
|
||
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
|
||
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[1]/data[1]/text()";
|
||
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
|
||
КлючОсновногоРеквизита = РезультатXPath.СтроковоеЗначение;
|
||
|
||
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/elem[1]/data[1]/text()";
|
||
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ,
|
||
ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
|
||
Счетчик = 1;
|
||
Пока 1 = 1 Цикл
|
||
Узел = РезультатXPath.ПолучитьСледующий();
|
||
Если Узел = Неопределено Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
Если Узел.ТекстовоеСодержимое = КлючОсновногоРеквизита Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
Счетчик = Счетчик + 1;
|
||
КонецЦикла;
|
||
|
||
Если Узел = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem[" + Счетчик + "]" + ПолучитьXPathИмениРеквизитаВОписанииРеквизита() + "/text()";
|
||
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(СтрокаXPath, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
|
||
Длина = СтрДлина(РезультатXPath.СтроковоеЗначение);
|
||
Возврат Сред(РезультатXPath.СтроковоеЗначение, 2, Длина - 2);
|
||
|
||
КонецФункции // ЛксПолучитьИмяОсновногоРеквизитаФормы()
|
||
|
||
Функция ПолучитьМассивИменРеквизитовФормы(Форма) Экспорт
|
||
|
||
Массив = Новый Массив;
|
||
ДокументDOM = ПолучитьДокументDOMФормы(Форма);
|
||
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
|
||
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem" + ПолучитьXPathИмениРеквизитаВОписанииРеквизита() + "/text()";
|
||
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(СтрокаXPath, ДокументDOM,
|
||
РазыменовательПИ, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
|
||
Пока 1 = 1 Цикл
|
||
Узел = РезультатXPath.ПолучитьСледующий();
|
||
Если Узел = Неопределено Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
Текст = Узел.ТекстовоеСодержимое;
|
||
Длина = СтрДлина(Текст);
|
||
Текст = Сред(Текст, 2, Длина - 2);
|
||
Массив.Добавить(Текст);
|
||
КонецЦикла;
|
||
Возврат Массив;
|
||
|
||
КонецФункции // ЛксПолучитьМассивИменРеквизитовФормы()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьМакетКомпоненты(Компонента) Экспорт
|
||
|
||
Макет = 0;
|
||
Если Не МакетыКомпонент.Свойство(Компонента.ИмяКласса, Макет) Тогда
|
||
Макет = Компонента.ПолучитьФорму("ФормаМакет");
|
||
Попытка
|
||
Пустышка = Макет.мПлатформа;
|
||
Успех = Истина;
|
||
Исключение
|
||
Успех = Ложь;
|
||
КонецПопытки;
|
||
Если Успех Тогда
|
||
ирОбщий.СообщитьЛкс("Образована циклическая ссылка на ирПлатформа");
|
||
КонецЕсли;
|
||
МакетыКомпонент.Вставить(Компонента.ИмяКласса, Макет);
|
||
КонецЕсли;
|
||
Возврат Макет;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьТекстМодуляВнешнейОбработкиАлгоритма(ФайлВнешнейОбработки) Экспорт
|
||
|
||
Если Не ФайлВнешнейОбработки.Существует() Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ТекстМодуля = ТекстМодуляСгенерированнойВнешнейОбработки(ФайлВнешнейОбработки);
|
||
Если ТекстМодуля = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ТекстАлгоритма = ирОбщий.СтрокаМеждуМаркерамиЛкс(ТекстМодуля, МаркерНачалаАлгоритма, МаркерКонцаАлгоритма);
|
||
Результат = "";
|
||
ТекстАлгоритмаТД = Новый ТекстовыйДокумент;
|
||
ТекстАлгоритмаТД.УстановитьТекст(ТекстАлгоритма);
|
||
Для Счетчик = 1 По ТекстАлгоритмаТД.КоличествоСтрок() Цикл
|
||
СтрокаАлгоритма = ТекстАлгоритмаТД.ПолучитьСтроку(Счетчик);
|
||
Если Лев(СтрокаАлгоритма, 1) = Символы.Таб Тогда
|
||
СтрокаАлгоритма = Сред(СтрокаАлгоритма, 2);
|
||
КонецЕсли;
|
||
Результат = Результат + СтрокаАлгоритма + Символы.ПС;
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьТекстМодуляВнешнейОбработкиАлгоритма()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ТекстМодуляСгенерированнойВнешнейОбработки(ФайлВнешнейОбработки) Экспорт
|
||
|
||
#Если Сервер И Не Сервер Тогда
|
||
ФайлВнешнейОбработки = Новый Файл;
|
||
#КонецЕсли
|
||
ИспользоватьБыструюРаспаковку = ЛиИспользоватьБыструюРаспаковкуВнешнейОбработки();
|
||
Если Не ИспользоватьБыструюРаспаковку Тогда
|
||
// Штатный способ платформы, но работает только на 8.3.8+
|
||
ТекстЛога = Неопределено;
|
||
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
|
||
Если Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpExternalDataProcessorOrReportToFiles """ + ИмяВременногоФайла + """ """ + ФайлВнешнейОбработки.ПолноеИмя + """",, ТекстЛога, Истина) Тогда
|
||
УдалитьФайлы(ИмяВременногоФайла);
|
||
ирОбщий.СообщитьЛкс(ТекстЛога);
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
Файлы = НайтиФайлы(ИмяВременногоФайла, "ObjectModule.bsl", Истина);
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(Файлы[0].ПолноеИмя);
|
||
ТекстМодуля = ТекстовыйДокумент.ПолучитьТекст();
|
||
Иначе
|
||
КаталогРаспаковки = ПолучитьИмяВременногоФайла();
|
||
СоздатьКаталог(КаталогРаспаковки);
|
||
РаспаковатьФайлВнешнейОбработки(ФайлВнешнейОбработки.ПолноеИмя, КаталогРаспаковки);
|
||
ФайлТекстаМодуляОбработки = Новый Файл(КаталогРаспаковки + "\" + СубПутьКФайлуПотокаМодуляВнешнейОбработки);
|
||
ТекстовыйДокументМодуля = Новый ТекстовыйДокумент();
|
||
ТекстовыйДокументМодуля.Прочитать(ФайлТекстаМодуляОбработки.ПолноеИмя);
|
||
ТекстМодуля = ТекстовыйДокументМодуля.ПолучитьТекст();
|
||
УдалитьФайлы(КаталогРаспаковки);
|
||
КонецЕсли;
|
||
Возврат ТекстМодуля;
|
||
|
||
КонецФункции
|
||
|
||
// Открывает модуль внешней обработки алгоритма в конфигураторе.
|
||
//
|
||
// Параметры:
|
||
// АлгоритмОбъект – СправочникОбъект.Сервисы2iS;
|
||
// *НомерСтрокиВМодуле – Число, *0 - если указана, устанавливает текущую строку в модуле;
|
||
// *ИдентификаторПроцесса – Число, *0 - если указан, будет открываться только в заданном процессе;
|
||
// *Переоткрыть - Булево, *Истина - переоткрыть, если уже открыт
|
||
//
|
||
Процедура ОткрытьАлгоритмВОтладчике(АлгоритмОбъект, НомерСтрокиВМодуле = 0, ИдентификаторПроцесса = 0, Переоткрыть = Истина) Экспорт
|
||
|
||
Если Не ВыполнятьАлгоритмыЧерезВнешниеОбработки Тогда
|
||
ирОбщий.СообщитьЛкс("Данная функция доступна только в режиме выполнения сервисов через внешние обработки", СтатусСообщения.Информация);
|
||
Возврат;
|
||
КонецЕсли;
|
||
Если Не ФайловыйКэшАлгоритмовДопускаетРедактирование Тогда
|
||
ирОбщий.СообщитьЛкс("Изменения файла будут игнорироваться, т.к. в настройках алгоритмов не включено разрешение редактирования файлового кэша",
|
||
СтатусСообщения.Информация);
|
||
КонецЕсли;
|
||
ПолучитьФайлОткрывателя1С();
|
||
ФайлВнешнейОбработки = ПолучитьОбновитьФайлВнешнейОбработкиАлгоритма(АлгоритмОбъект);
|
||
Если ФайлВнешнейОбработки <> Неопределено Тогда
|
||
СтрокаЗапуска = """" + ФайлОткрывателя1С.ПолноеИмя + """ -com -ob1""" + ФайлВнешнейОбработки.ПолноеИмя + """";
|
||
Если ЗначениеЗаполнено(НомерСтрокиВМодуле) Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -num" + Формат(НомерСтрокиВМодуле, "ЧГ=");
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -pid" + Формат(ИдентификаторПроцесса, "ЧГ=");
|
||
КонецЕсли;
|
||
Если Переоткрыть Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -reopen";
|
||
КонецЕсли;
|
||
WshShell.Run(СтрокаЗапуска, 0, Ложь);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПодключитьПерехватКлавиатуры(НовоеЗначение = Неопределено) Экспорт
|
||
|
||
Если мПерехватКлавиатуры = Неопределено Тогда
|
||
Попытка
|
||
мПерехватКлавиатуры = Вычислить("ирПерехватКлавиатуры");
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если мПерехватКлавиатуры = Неопределено Тогда
|
||
Если Не ирОбщий.ЛиПерехватКлавиатурногоВводаЛкс() Тогда
|
||
мПерехватКлавиатуры = Новый Структура("ЗахватПервым,СобытиеПриНажатии,ЗахватРазрешен");
|
||
ПерехватКлавиатурногоВводаВОбычномПриложении = Ложь;
|
||
Иначе
|
||
мПерехватКлавиатуры = ПолучитьОбъектВнешнейКомпонентыИзМакета("KeyboardHook", "AddIn.ПерехватКлавиатуры.KeyboardHook", "ПерехватКлавиатуры", ТипВнешнейКомпоненты.Native);
|
||
КонецЕсли;
|
||
Если мПерехватКлавиатуры = Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс("Не удалось подключить внешнюю компоненту ПерехватКлавиатуры. Поэтому некоторые функции инструментов отключены.", СтатусСообщения.Внимание);
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
мПерехватКлавиатуры.СобытиеПриНажатии = Истина;
|
||
Попытка
|
||
Выполнить("ирПерехватКлавиатуры = мПерехватКлавиатуры");
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
мПерехватКлавиатуры.ЗахватРазрешен = ПерехватКлавиатурногоВводаВОбычномПриложении;
|
||
Возврат мПерехватКлавиатуры;
|
||
|
||
КонецФункции
|
||
|
||
// Открывает модуль внешней обработки в конфигураторе.
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмяФайла – Строка;
|
||
// *НомерСтрокиВМодуле – Число, *0 - если указана, устанавливает текущую строку в модуле;
|
||
// *ИдентификаторПроцесса – Число, *0 - если указан, будет открываться только в заданном процессе;
|
||
// *Переоткрыть - Булево, *Истина - переоткрыть, если уже открыт
|
||
//
|
||
Процедура ОткрытьМодульВнешнейОбработкиВКонфигураторе(ПолноеИмяФайла, НомерСтрокиВМодуле = 0, ИдентификаторПроцесса = 0, Переоткрыть = Истина, ВнутреннееИмя = "") Экспорт
|
||
|
||
ФайлВнешнейОбработки = Новый Файл(ПолноеИмяФайла);
|
||
Если Ложь
|
||
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803008 И ирКэш.НомерВерсииPowerShellЛкс() >= 3
|
||
Тогда
|
||
Если Не ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда
|
||
ИдентификаторПроцесса = ВыбратьПроцессКонфигуратора();
|
||
Если ИдентификаторПроцесса = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ТекстСкрипта = ПолучитьМакет("СкриптОткрытьМодульВнешнейОбработки");
|
||
ФайлСкрипта = Новый Файл(ПолучитьИмяВременногоФайла("ps1"));
|
||
ТекстСкрипта.Записать(ФайлСкрипта.ПолноеИмя);
|
||
СтрокаЗапуска = ирОбщий.КомандаСистемыЗапускаСкриптаPowerShellЛкс(ФайлСкрипта.Имя + " -processID " + ИдентификаторПроцесса + " -file """ + ПолноеИмяФайла + """");
|
||
Если НомерСтрокиВМодуле > 0 Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -line " + Формат(НомерСтрокиВМодуле, "ЧГ=");
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ВнутреннееИмя) Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -internalName """ + ВнутреннееИмя + """";
|
||
КонецЕсли;
|
||
РезультатКоманды = ирОбщий.ВыполнитьКомандуОСЛкс(СтрокаЗапуска);
|
||
Иначе
|
||
ПолучитьФайлОткрывателя1С();
|
||
СтрокаЗапуска = """" + ФайлОткрывателя1С.ПолноеИмя + """ -com -ob1""" + ФайлВнешнейОбработки.ПолноеИмя + """";
|
||
Если НомерСтрокиВМодуле > 0 Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -num" + Формат(НомерСтрокиВМодуле, "ЧГ=");
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -pid" + Формат(ИдентификаторПроцесса, "ЧГ=");
|
||
КонецЕсли;
|
||
Если Переоткрыть Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -reopen";
|
||
КонецЕсли;
|
||
WshShell.Run(СтрокаЗапуска, 0, Ложь);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ВыбратьПроцессКонфигуратора(Знач ИдентификаторыОтладчиков = Неопределено) Экспорт
|
||
|
||
Если ИдентификаторыОтладчиков = Неопределено Тогда
|
||
ИдентификаторыОтладчиков = ИдентификаторыПроцессовОтладчиков();
|
||
#Если Сервер И Не Сервер Тогда
|
||
ИдентификаторыОтладчиков = Новый Массив;
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
ТекстСкрипта = ПолучитьМакет("СкриптОткрытыеПриложения1С");
|
||
ФайлСкрипта = Новый Файл(ПолучитьИмяВременногоФайла("ps1"));
|
||
ТекстСкрипта.Записать(ФайлСкрипта.ПолноеИмя);
|
||
КомандаСистемыЗапускаСкрипта = ирОбщий.КомандаСистемыЗапускаСкриптаPowerShellЛкс(ФайлСкрипта.Имя);
|
||
РезультатСкрипта = ирОбщий.ВыполнитьКомандуОСЛкс(КомандаСистемыЗапускаСкрипта);
|
||
ТаблицаКонфигураторов = ирОбщий.ТаблицаИзСтрокиСРазделителемЛкс(РезультатСкрипта,,, Истина);
|
||
НачальноеЗначениеВыбора = Неопределено;
|
||
СписокКонфигураторов = Новый СписокЗначений;
|
||
Для Каждого СтрокаКонфигуратора Из ТаблицаКонфигураторов Цикл
|
||
ПроцессОС = ирОбщий.ПолучитьПроцессОСЛкс(СтрокаКонфигуратора.Id);
|
||
Если Не ирОбщий.ЛиПроцессОСКонфигуратораЛкс(ПроцессОС) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПредставлениеПроцесса = СтрокаКонфигуратора.MainWindowTitle;
|
||
ЛиОтладчик = ИдентификаторыОтладчиков.Найти(СтрокаКонфигуратора.Id) <> Неопределено;
|
||
Если ЛиОтладчик Тогда
|
||
ПредставлениеПроцесса = "<Отладчик>" + ПредставлениеПроцесса;
|
||
КонецЕсли;
|
||
НовыйЭлемент = СписокКонфигураторов.Добавить(СтрокаКонфигуратора.Id, ПредставлениеПроцесса);
|
||
Если ЛиОтладчик Тогда
|
||
НачальноеЗначениеВыбора = НовыйЭлемент;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если СписокКонфигураторов.Количество() = 1 Тогда
|
||
РезультатВыбора = СписокКонфигураторов[0];
|
||
ИначеЕсли СписокКонфигураторов.Количество() > 1 Тогда
|
||
РезультатВыбора = СписокКонфигураторов.ВыбратьЭлемент("Выберите окно конфигуратора", НачальноеЗначениеВыбора);
|
||
Иначе
|
||
РезультатВыбора = Неопределено;
|
||
КонецЕсли;
|
||
Если РезультатВыбора <> Неопределено Тогда
|
||
РезультатВыбора = РезультатВыбора.Значение;
|
||
КонецЕсли;
|
||
Возврат РезультатВыбора;
|
||
|
||
КонецФункции
|
||
|
||
// Открывает файл в конфигураторе.
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмя – Строка;
|
||
// *ЭлементОбработки – "Форма", "Модуль", *Неопределено$
|
||
// *ИдентификаторПроцесса – Число, *0 - если указан, будет открываться только в заданном процессе.
|
||
//
|
||
Процедура ОткрытьФайлВКонфигураторе(ПолноеИмя, ЭлементОбработки = "", ИдентификаторПроцесса = 0) Экспорт
|
||
|
||
ПолучитьФайлОткрывателя1С();
|
||
ФайлВнешнейОбработки = Новый Файл(ПолноеИмя);
|
||
Если ФайлВнешнейОбработки.Существует() Тогда
|
||
//WshShell = Новый COMОбъект("WScript.Shell");
|
||
СтрокаЗапуска = """" + ФайлОткрывателя1С.ПолноеИмя + """";
|
||
Если ЭлементОбработки = "Форма" Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -cof";
|
||
ИначеЕсли ЭлементОбработки = "Модуль" Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -com";
|
||
Иначе
|
||
СтрокаЗапуска = СтрокаЗапуска + " -coa";
|
||
КонецЕсли;
|
||
СтрокаЗапуска = СтрокаЗапуска + " -ob1""" + ПолноеИмя + """";
|
||
Если ИдентификаторПроцесса > 0 Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -pid" + Формат(ИдентификаторПроцесса, "ЧГ=");
|
||
КонецЕсли;
|
||
WshShell.Run(СтрокаЗапуска, 0, Ложь);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // ОткрытьФайлВКонфигураторе()
|
||
|
||
// Открывает диалог глобального поиска в конфигураторе и устанавливает каталог файлов.
|
||
//
|
||
// Параметры:
|
||
// КаталогРасположения - Строка;
|
||
// *ИдентификаторПроцесса – Число, *0 - если указан, будет открываться только в заданном процессе.
|
||
//
|
||
Процедура ОткрытьДиалогГлобальногоПоискаВКонфигураторе(КаталогРасположения, ИдентификаторПроцесса = 0) Экспорт
|
||
|
||
ПолучитьФайлОткрывателя1С();
|
||
СтрокаЗапуска = """" + ФайлОткрывателя1С.ПолноеИмя + """";
|
||
СтрокаЗапуска = СтрокаЗапуска + " -cgf";
|
||
СтрокаЗапуска = СтрокаЗапуска + " -ob1""" + КаталогРасположения + """";
|
||
Если ИдентификаторПроцесса > 0 Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " -pid" + Формат(ИдентификаторПроцесса, "ЧГ=");
|
||
КонецЕсли;
|
||
WshShell.Run(СтрокаЗапуска, 0, Ложь);
|
||
|
||
КонецПроцедуры // ОткрытьДиалогГлобальногоПоискаВКонфигураторе()
|
||
|
||
// Активизирует главное окно процесса по PID.
|
||
//
|
||
// Параметры:
|
||
// *ИдентификаторПроцесса – Число.
|
||
//
|
||
Процедура АктивизироватьОкноПроцесса1С8(ИдентификаторПроцесса = 0) Экспорт
|
||
|
||
ПолучитьФайлОткрывателя1С();
|
||
СтрокаЗапуска = """" + ФайлОткрывателя1С.ПолноеИмя + """";
|
||
СтрокаЗапуска = СтрокаЗапуска + " -aaa -pid" + Формат(ИдентификаторПроцесса, "ЧГ=");
|
||
WshShell.Run(СтрокаЗапуска, 0, Ложь);
|
||
|
||
КонецПроцедуры // ОткрытьДиалогГлобальногоПоискаВКонфигураторе()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура СохранитьНастройкиАлгоритмов() Экспорт
|
||
|
||
//ирОбщий.СохранитьЗначениеЛкс("ирПлатформа.ФиксироватьВнешниеИсключенияАлгоритмов", ФиксироватьВнешниеИсключенияАлгоритмов);
|
||
ирОбщий.СохранитьЗначениеЛкс("ФиксироватьВнешниеИсключенияАлгоритмов", ФиксироватьВнешниеИсключенияАлгоритмов);
|
||
//ирОбщий.СохранитьЗначениеЛкс("ирПлатформа.СинтаксическийКонтрольПередЗаписью", СинтаксическийКонтрольПередЗаписью);
|
||
ирОбщий.СохранитьЗначениеЛкс("СинтаксическийКонтрольПередЗаписью", СинтаксическийКонтрольПередЗаписью);
|
||
//ирОбщий.СохранитьЗначениеЛкс("ирПлатформа.ВыполнятьАлгоритмыЧерезВнешниеОбработки", ВыполнятьАлгоритмыЧерезВнешниеОбработки);
|
||
ирОбщий.СохранитьЗначениеЛкс("ВыполнятьАлгоритмыЧерезВнешниеОбработки", ВыполнятьАлгоритмыЧерезВнешниеОбработки);
|
||
ирОбщий.СохранитьЗначениеЛкс("ФайловыйКэшАлгоритмовДопускаетРедактирование", ФайловыйКэшАлгоритмовДопускаетРедактирование);
|
||
//ирОбщий.СохранитьЗначениеЛкс("ирПлатформа.ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов", ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов);
|
||
ирОбщий.СохранитьЗначениеЛкс("ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов", ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов);
|
||
|
||
КонецПроцедуры // СохранитьНастройкиАлгоритмов()
|
||
|
||
// Получает структуру для индикации прогресса цикла.
|
||
//
|
||
// Параметры:
|
||
// КоличествоПроходов – Число - максимальное значение счетчика;
|
||
// ПредставлениеПроцесса – Строка, "Выполнено" – отображаемое название процесса;
|
||
// ВнутреннийСчетчик - Булево, *Истина - использовать внутренний счетчик с начальным значением 1,
|
||
// иначе нужно будет передавать значение счетчика при каждом вызове обновления индикатора;
|
||
// КоличествоОбновлений - Число, *0 - всего количество обновлений индикатора, 0 - по минимальному периоду;
|
||
// ЛиВыводитьВремя - Булево, *Истина - выводить приблизительное время до окончания процесса;
|
||
// РазрешитьПрерывание - Булево, *Истина - разрешает пользователю прерывать процесс.
|
||
// МинимальныйПериодОбновления - Число, *0.5 - с, обновлять не чаще чем этот период, 0 - по количеству обновлений;
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура - которую потом нужно будет передавать в метод ирОбщий.ОбработатьИндикаторЛкс.
|
||
//
|
||
Функция ПолучитьИндикаторПроцесса(Знач КоличествоПроходов = 0, ПредставлениеПроцесса = "Выполнение", ВнутреннийСчетчик = Истина,
|
||
Знач КоличествоОбновлений = 0, ЛиВыводитьВремя = Истина, РазрешитьПрерывание = Истина, МинимальныйПериодОбновления = 0.5) Экспорт
|
||
|
||
//ПолучитьWinAPI();
|
||
Индикатор = Новый Структура;
|
||
Если КоличествоПроходов = 0 Тогда
|
||
Состояние(ПредставлениеПроцесса + "...");
|
||
КоличествоПроходов = 1;
|
||
КонецЕсли;
|
||
Индикатор.Вставить("КоличествоПроходов", КоличествоПроходов);
|
||
Индикатор.Вставить("ПредставлениеПроцесса", ПредставлениеПроцесса);
|
||
Индикатор.Вставить("ЛиВыводитьВремя", ЛиВыводитьВремя);
|
||
Индикатор.Вставить("РазрешитьПрерывание", РазрешитьПрерывание);
|
||
Индикатор.Вставить("МинимальныйПериодОбновления", МинимальныйПериодОбновления);
|
||
|
||
Индикатор.Вставить("ДатаНачалаПроцесса", ТекущаяДата());
|
||
Индикатор.Вставить("ДатаСледующегоОбновления", Дата('00010101'));
|
||
|
||
Индикатор.Вставить("ВремяНачалаПроцесса", ПолучитьТекущееВремяВМиллисекундах());
|
||
Индикатор.Вставить("ВремяСледующегоОбновления", 0);
|
||
|
||
Индикатор.Вставить("ВнутреннийСчетчик", ВнутреннийСчетчик);
|
||
Если КоличествоОбновлений > 0 Тогда
|
||
Шаг = КоличествоПроходов / КоличествоОбновлений;
|
||
Иначе
|
||
Шаг = 0;
|
||
КонецЕсли;
|
||
Индикатор.Вставить("Шаг", Шаг);
|
||
Индикатор.Вставить("СледующийСчетчик", 0);
|
||
Индикатор.Вставить("Счетчик", 0);
|
||
//ВложенностьИндикации = ВложенностьИндикации + 1;
|
||
Возврат Индикатор;
|
||
|
||
КонецФункции // ирОбщий.ПолучитьИндикаторПроцессаЛкс()
|
||
|
||
// Проверяет и обновляет индикатор. Нужно вызывать на каждом проходе индицируемого цикла.
|
||
//
|
||
// Параметры:
|
||
// Индикатор – Структура – индикатора, полученная методом ирОбщий.ПолучитьИндикаторПроцессаЛкс;
|
||
// Счетчик – Число – внешний счетчик цикла, используется при ВнутреннийСчетчик = Ложь.
|
||
//
|
||
Процедура ОбработатьИндикатор(Индикатор, Счетчик = Неопределено) Экспорт
|
||
|
||
Если Счетчик = Неопределено Тогда
|
||
Счетчик = Индикатор.Счетчик + 1;
|
||
Индикатор.Счетчик = Счетчик;
|
||
КонецЕсли;
|
||
Если Индикатор.РазрешитьПрерывание Тогда
|
||
ОбработкаПрерыванияПользователя();
|
||
КонецЕсли;
|
||
ОбновитьИндикатор = Истина;
|
||
Если Счетчик < Индикатор.КоличествоПроходов Тогда
|
||
ТекущееВремя = ПолучитьТекущееВремяВМиллисекундах();
|
||
Если Индикатор.МинимальныйПериодОбновления > 0 Тогда
|
||
Если ТекущееВремя >= Индикатор.ВремяСледующегоОбновления Тогда
|
||
Индикатор.ВремяСледующегоОбновления = ТекущееВремя + Индикатор.МинимальныйПериодОбновления * 1000;
|
||
Иначе
|
||
ОбновитьИндикатор = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ОбновитьИндикатор Тогда
|
||
Если Индикатор.Шаг > 0 Тогда
|
||
Если Счетчик >= Индикатор.СледующийСчетчик Тогда
|
||
Индикатор.СледующийСчетчик = Цел(Счетчик + Индикатор.Шаг);
|
||
Иначе
|
||
ОбновитьИндикатор = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ОбновитьИндикатор Тогда
|
||
Если Истина
|
||
И Индикатор.ЛиВыводитьВремя
|
||
И Счетчик > 0
|
||
И Счетчик < Индикатор.КоличествоПроходов
|
||
Тогда
|
||
ПрошлоВремени = (ТекущееВремя - Индикатор.ВремяНачалаПроцесса) / 1000;
|
||
Осталось = ПрошлоВремени * (Индикатор.КоличествоПроходов / Счетчик - 1);
|
||
Часов = Цел(Осталось / 3600);
|
||
Осталось = Осталось - (Часов * 3600);
|
||
Минут = Цел(Осталось / 60);
|
||
Секунд = Цел(Цел(Осталось - (Минут * 60)));
|
||
ОсталосьВремени = Формат(Часов, "ЧЦ=2; ЧН=00; ЧВН=") + ":"
|
||
+ Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + ":"
|
||
+ Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=");
|
||
ТекстОсталось = ", Осталось: ~" + ОсталосьВремени;
|
||
Иначе
|
||
ТекстОсталось = "";
|
||
КонецЕсли;
|
||
ТекстСостояния = Индикатор.ПредставлениеПроцесса + ": "
|
||
+ Формат(Счетчик / Индикатор.КоличествоПроходов * 100, "ЧЦ=3; ЧДЦ=0; ЧН=") + "%" + ТекстОсталось;
|
||
Если ТипЗнч(Индикатор) = Тип("СтрокаТаблицыЗначений") Тогда
|
||
ТаблицаИндикаторов = Индикатор.Владелец();
|
||
ИндексИндикатора = ТаблицаИндикаторов.Индекс(Индикатор);
|
||
Если ИндексИндикатора > 0 Тогда
|
||
ТекстСостояния = ТаблицаИндикаторов[ИндексИндикатора - 1].ТекстСостояния + ".>> " + ТекстСостояния;
|
||
КонецЕсли;
|
||
Индикатор.ТекстСостояния = ТекстСостояния;
|
||
КонецЕсли;
|
||
Состояние(ТекстСостояния);
|
||
КонецЕсли;
|
||
//Если Счетчик = Индикатор.КоличествоПроходов Тогда
|
||
// Состояние("");
|
||
//КонецЕсли;
|
||
|
||
КонецПроцедуры // ирОбщий.ОбработатьИндикаторЛкс()
|
||
|
||
Процедура ЗаполнитьТаблицуРедактируемыхТипов() Экспорт
|
||
|
||
ОписаниеТипов = ирОбщий.ОписаниеТиповВсеРедактируемыеТипыЛкс();
|
||
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
|
||
СтрокаТипа = ТаблицаРедактируемыхТипов.Добавить();
|
||
//СтрокаТипа.Представление = "" + Тип;
|
||
ТипXML = СериализаторXDTO.XMLТип(Тип);
|
||
Если Тип = Тип("Число") Тогда
|
||
СтрокаТипа.Порядок = -4;
|
||
ИначеЕсли Тип = Тип("Строка") Тогда
|
||
СтрокаТипа.Порядок = -3;
|
||
ИначеЕсли Тип = Тип("Дата") Тогда
|
||
СтрокаТипа.Порядок = -2;
|
||
ИначеЕсли Тип = Тип("Булево") Тогда
|
||
СтрокаТипа.Порядок = -1;
|
||
ИначеЕсли Истина
|
||
И ТипXML <> Неопределено
|
||
И Найти(ТипXML.ИмяТипа, ".") > 0
|
||
Тогда
|
||
СтрокаТипа.Порядок = 100;
|
||
ОбъектМД = Метаданные.НайтиПоТипу(Тип);
|
||
ТекущееИмяТипа = ОбъектМД.ПолноеИмя();
|
||
ИмяТипаМетаданных = ирОбщий.ПервыйФрагментЛкс(ТекущееИмяТипа);
|
||
СтрокаТипаМетаОбъектов = ПолучитьСтрокуТипаМетаОбъектов(ИмяТипаМетаданных);
|
||
Если СтрокаТипаМетаОбъектов <> Неопределено Тогда
|
||
СтрокаТипа.ИндексКартинки = СтрокаТипаМетаОбъектов.ИндексКартинкиЕдинственное;
|
||
СтрокаТипа.Порядок = СтрокаТипаМетаОбъектов.Владелец().Индекс(СтрокаТипаМетаОбъектов);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтрокаТипа.Имя = ТипXML.ИмяТипа;
|
||
СтрокаТипа.URIПространстваИмен = ТипXML.URIПространстваИмен;
|
||
СтрокаТипа.Представление = "" + Тип;
|
||
КонецЦикла;
|
||
ТаблицаРедактируемыхТипов.Сортировать("Порядок, Представление");
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ЛиКомпонентаFormsTextBoxДоступна() Экспорт
|
||
|
||
Если ЛиКомпонентаFormsTextBoxДоступна = Неопределено Тогда
|
||
ЛиКомпонентаFormsTextBoxДоступна = Истина;
|
||
ИдентификаторКласса = "Forms.TextBox.1";
|
||
Попытка
|
||
Пустышка = Новый COMОбъект(ИдентификаторКласса);
|
||
Исключение
|
||
ИмяМакетаДополнительнойБиблиотеки = "FM20ENU";
|
||
ИмяМакетаКомпоненты = "FM20";
|
||
Пустышка = ПолучитьCOMОбъектИзМакета(ИмяМакетаКомпоненты, ИдентификаторКласса,, ИмяМакетаДополнительнойБиблиотеки);
|
||
Если Пустышка = Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс("Для полной функциональности контекстной подсказки необходимо:
|
||
|1. Использовать 32б приложение
|
||
|2. Зарегистрировать библиотеки FM20.dll и FM20ENU.dll из состава MS Office 97-2007. Это можно сделать с помощью формы ""Регистрация COM-компонент"" из состава подсистемы");
|
||
ЛиКомпонентаFormsTextBoxДоступна = Ложь;
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Возврат ЛиКомпонентаFormsTextBoxДоступна;
|
||
|
||
КонецФункции
|
||
|
||
#КонецЕсли
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ИдентификаторПроцессаОС() Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(ИдентификаторПроцессаОС) Тогда
|
||
Если ПолучитьWinAPI() <> Неопределено Тогда
|
||
ИдентификаторПроцессаОС = WinAPI.GetCurrentProcessId();
|
||
Иначе
|
||
//// Первый вариант иногда не оставлял процесс работать (он сразу завершался) и приводил ниже к ошибкам "Произошла исключительная ситуация (SWbemServicesEx): Not found"
|
||
//oShell = Новый COMОбъект("WScript.Shell");
|
||
//ДочернийПроцесс = oShell.Exec("rundll32.exe kernel32,Sleep");
|
||
//ИдентификаторПроцессаОС = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ДочернийПроцесс.ProcessID) + "'").ParentProcessID;
|
||
//ДочернийПроцесс.Terminate(); // Может выполняться долго!
|
||
ВК = ирКэш.ВКОбщаяЛкс();
|
||
ИдентификаторПроцессаОС = ВК.PID();
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ИдентификаторПроцессаОС;
|
||
|
||
КонецФункции
|
||
|
||
// Получает новый экземпляр ком-объекта парсера.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Com-объект, Неопределено.
|
||
//
|
||
Функция мПолучитьПарсер(ИмяГрамматики, Кэшировать = Истина, СообщениеПользователюПриНеудаче = "") Экспорт
|
||
|
||
Если Кэшировать Тогда
|
||
Если Парсеры.Свойство(ИмяГрамматики) Тогда
|
||
Парсер = Парсеры[ИмяГрамматики];
|
||
Если Парсер <> Неопределено Тогда
|
||
Парсер.Restart(); // Без этого что то не очищается и приводит к зависанию парсинга.
|
||
КонецЕсли;
|
||
Возврат Парсер;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Парсер = ПолучитьCOMОбъектИзМакета("GoldParser", "GoldParserForNet.Parser"); // Новый Parser
|
||
Если Парсер <> Неопределено Тогда
|
||
Парсер.TrimReductions = Истина;
|
||
МакетГрамматики = ПолучитьМакет(ИмяГрамматики);
|
||
ФайлСкомпилированнойГрамматики = ПолучитьИмяВременногоФайла("cgt");
|
||
МакетГрамматики.Записать(ФайлСкомпилированнойГрамматики);
|
||
Если Не Парсер.LoadCompiledGrammar(ФайлСкомпилированнойГрамматики) Тогда
|
||
ирОбщий.СообщитьСУчетомМодальностиЛкс("Не удалось загрузить файл грамматики """ + ФайлСкомпилированнойГрамматики + """",
|
||
Истина, СтатусСообщения.Важное);
|
||
Парсер = Неопределено;
|
||
КонецЕсли;
|
||
УдалитьФайлы(ФайлСкомпилированнойГрамматики);
|
||
Иначе
|
||
ирОбщий.СообщитьЛкс(СообщениеПользователюПриНеудаче, СтатусСообщения.Внимание);
|
||
КонецЕсли;
|
||
Если Кэшировать Тогда
|
||
Парсеры.Вставить(ИмяГрамматики, Парсер);
|
||
КонецЕсли;
|
||
Возврат Парсер;
|
||
|
||
КонецФункции
|
||
|
||
// Получает идентификатор из любой строки.
|
||
// "3-я Дебиторка По контрагентам с интервалами СНГ (для Руководства)" => "_3_яДебиторкаПоКонтрагентамСИнтерваламиСНГ_дляРуководства_".
|
||
//
|
||
// Параметры:
|
||
// Представление – Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка.
|
||
//
|
||
Функция ИдентификаторИзПредставленияЛкс(Знач Представление, ЗаменаПустойСтроки = "_", ДопРазрешенныеСимволы = "") Экспорт
|
||
|
||
Если ПустаяСтрока(Представление) Тогда
|
||
Представление = ЗаменаПустойСтроки;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И СокрЛП(Представление) = Представление
|
||
И Найти(Представление, ",") = 0
|
||
Тогда
|
||
Попытка
|
||
Пустышка = Новый Структура(Представление);
|
||
Возврат Представление;
|
||
Исключение КонецПопытки;
|
||
КонецЕсли;
|
||
VBRegExp.Pattern = "\d";
|
||
НовоеПредставление = Представление;
|
||
ПервыйСимвол = Сред(Представление, 1, 1);
|
||
Если VBRegExp.Test(ПервыйСимвол) Тогда
|
||
// Первый символ - цифра
|
||
НовоеПредставление = "_" + НовоеПредставление;
|
||
КонецЕсли;
|
||
ПредыдущийСимвол = " ";
|
||
ТекущаяСтрока = "";
|
||
ШаблонРазрешенногоСимвола = "[" + шБуква + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(ДопРазрешенныеСимволы) + "\d]";
|
||
Для Счетчик = 1 По СтрДлина(НовоеПредставление) Цикл
|
||
ТекущийСимвол = Сред(НовоеПредставление, Счетчик, 1);
|
||
VBRegExp.Pattern = "\s";
|
||
Если VBRegExp.Test(ПредыдущийСимвол) Тогда
|
||
// Предыдущий символ - непечатаемый
|
||
ТекущийСимвол = ВРег(ТекущийСимвол);
|
||
КонецЕсли;
|
||
VBRegExp.Pattern = ШаблонРазрешенногоСимвола;
|
||
Если VBRegExp.Test(ТекущийСимвол) Тогда
|
||
// Предыдущий символ - непечатаемый
|
||
ТекущаяСтрока = ТекущаяСтрока + ТекущийСимвол;
|
||
Иначе
|
||
VBRegExp.Pattern = "[\S]";
|
||
Если VBRegExp.Test(ТекущийСимвол) Тогда
|
||
ТекущаяСтрока = ТекущаяСтрока + "_";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ПредыдущийСимвол = ТекущийСимвол;
|
||
КонецЦикла;
|
||
Результат = ТекущаяСтрока;
|
||
Возврат ТекущаяСтрока;
|
||
|
||
КонецФункции // ИдентификаторИзПредставленияЛкс()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура ПроверитьСтруктуруФайловогоКэша() Экспорт
|
||
|
||
ПроверитьКаталогФайловогоКэша();
|
||
СтруктураПодкаталоговФайловогоКэша = Новый Структура;
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("a"); // Внешние обработки алгоритмов
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("b"); // Внешние обработки архива 2iS
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("c"); // Внешние компоненты
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("КэшМодулей"); // Кэш модулей
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("КэшРолей"); // Кэш прав
|
||
СтруктураПодкаталоговФайловогоКэша.Вставить("СинтаксПомощник"); // Кэш синтакс-помощника
|
||
Для Каждого ЭлементПодкаталога Из СтруктураПодкаталоговФайловогоКэша Цикл
|
||
ПолныйПутьКаталога = КаталогФайловогоКэша + "\" + ЭлементПодкаталога.Ключ;
|
||
ФайлКаталога = Новый Файл(ПолныйПутьКаталога);
|
||
Если Не ФайлКаталога.Существует() Тогда
|
||
Попытка
|
||
СоздатьКаталог(ФайлКаталога.ПолноеИмя);
|
||
ПробныйФайл = Новый ТекстовыйДокумент;
|
||
ПробныйФайл.Записать(ФайлКаталога.ПолноеИмя + "\1.txt");
|
||
Исключение
|
||
ирОбщий.СообщитьЛкс("Дополнительный кэш """ + ЭлементПодкаталога.Ключ + """ отключен.", СтатусСообщения.Важное);
|
||
Продолжить;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
СтруктураПодкаталоговФайловогоКэша[ЭлементПодкаталога.Ключ] = ФайлКаталога;
|
||
Если ЭлементПодкаталога.Ключ = "a" Тогда
|
||
//КаталогДинамическихВнешнихОбработок = ПолныйПутьКаталога;
|
||
ПапкаКешаВнешнихОбработокАлгоритмов = ФайлКаталога;
|
||
|
||
ТекущаяДатаДвижка = Дата("20100927"); // Здесь меняем редко. Будет приводить к разовой очистке кэша перед началом его использования
|
||
ФайлКэшаДвижка = Новый Файл(ПолныйПутьКаталога + "\_EngineTimeStamp.mll");
|
||
ДатаКэшаДвижка = Неопределено;
|
||
Если ФайлКэшаДвижка.Существует() Тогда
|
||
Попытка
|
||
ДатаКэшаДвижка = ЗначениеИзФайла(ФайлКэшаДвижка.ПолноеИмя);
|
||
Исключение КонецПопытки;
|
||
КонецЕсли;
|
||
Если ДатаКэшаДвижка <> ТекущаяДатаДвижка Тогда
|
||
Попытка
|
||
УдалитьФайлы(ПолныйПутьКаталога + "\", "*.*");
|
||
Исключение
|
||
Неудача = Истина;
|
||
КонецПопытки;
|
||
Если Неудача <> Истина Тогда
|
||
ЗначениеВФайл(ФайлКэшаДвижка.ПолноеИмя, ТекущаяДатаДвижка);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли ЭлементПодкаталога.Ключ = "b" Тогда
|
||
ПапкаКешаВнешнихОбработокАрхива = ФайлКаталога;
|
||
ИначеЕсли ЭлементПодкаталога.Ключ = "c" Тогда
|
||
ПапкаВнешнихКомпонент = ФайлКаталога;
|
||
ИначеЕсли ЭлементПодкаталога.Ключ = "КэшМодулей" Тогда
|
||
ПапкаКэшаМодулей = ФайлКаталога;
|
||
ИначеЕсли ЭлементПодкаталога.Ключ = "СинтаксПомощник" Тогда
|
||
ПапкаКэшаСинтаксПомощника = ФайлКаталога;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
ПутьККаталогуСлужебныхВременныхФайлов = КаталогВременныхФайлов() + "temp1template\";
|
||
СоздатьКаталог(ПутьККаталогуСлужебныхВременныхФайлов);
|
||
МассивЗамков = НайтиФайлы(ПутьККаталогуСлужебныхВременныхФайлов, "*.lck");
|
||
Для Каждого Замок Из МассивЗамков Цикл
|
||
Попытка
|
||
УдалитьФайлы(Замок.ПолноеИмя);
|
||
УдалитьФайлы(Замок.Путь + Замок.ИмяБезРасширения);
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // ПроверитьСтруктуруФайловогоКэша()
|
||
|
||
Функция СловарьПеревода() Экспорт
|
||
|
||
Если СловарьПеревода = Неопределено Тогда
|
||
Результат = ПолучитьМакет("РусскийАнглийский");
|
||
СловарьПеревода = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(Результат);
|
||
СловарьПеревода.Индексы.Добавить("Русский");
|
||
СловарьПеревода.Индексы.Добавить("Английский");
|
||
КонецЕсли;
|
||
Возврат СловарьПеревода;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПеревестиСтроку(РусскаяСтрока, Принудительно = Ложь) Экспорт
|
||
|
||
Если Не Принудительно И Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда
|
||
Возврат РусскаяСтрока;
|
||
Иначе
|
||
Словарь = СловарьПеревода();
|
||
СтрокаПеревода = Словарь.Найти(РусскаяСтрока, "Русский");
|
||
Если СтрокаПеревода = Неопределено Тогда
|
||
Английский = РусскаяСтрока;
|
||
Иначе
|
||
Английский = СтрокаПеревода.Английский;
|
||
КонецЕсли;
|
||
Возврат Английский;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПеревестиВРусский(ЛокальнаяСтрока, Принудительно = Ложь) Экспорт
|
||
|
||
Если Не Принудительно И Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда
|
||
Возврат ЛокальнаяСтрока;
|
||
Иначе
|
||
Словарь = СловарьПеревода();
|
||
СтрокаПеревода = Словарь.НайтиСтроки(Новый Структура("Английский", ЛокальнаяСтрока));
|
||
КоличествоПереводов = СтрокаПеревода.Количество();
|
||
Если КоличествоПереводов = 0 Тогда
|
||
Русский = ЛокальнаяСтрока;
|
||
Иначе
|
||
Русский = СтрокаПеревода[0].Русский;
|
||
Если КоличествоПереводов > 1 Тогда
|
||
ирОбщий.СообщитьЛкс("Неоднозначный перевод на русский идентификатора """ + ЛокальнаяСтрока + """", СтатусСообщения.Внимание);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Русский;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ТекстРезультатаКомандыСистемы(Знач Команда = "", Знач ИмяСервера = "", Знач _ИспользоватьWSH = Истина, Элевация = Ложь) Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(ИмяСервера) Тогда
|
||
ФайлРезультата = Новый Файл(ПолучитьИмяВременногоФайла());
|
||
СтрокаЗапуска = Команда;
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(СтрокаЗапуска, ФайлРезультата.Путь, _ИспользоватьWSH, ФайлРезультата.Имя, , Элевация);
|
||
Если ФайлРезультата.Существует() Тогда
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ФайлРезультата.ПолноеИмя, КодировкаТекста.OEM);
|
||
УдалитьФайлы(ФайлРезультата.ПолноеИмя);
|
||
Результат = ТекстовыйДокумент.ПолучитьТекст();
|
||
Иначе
|
||
Результат = "Файл результата команды системы не найден! Попробуйте отключить антивирусное ПО.";
|
||
КонецЕсли;
|
||
Иначе
|
||
ВызватьИсключение "Получение результата команды системы на удаленном сервере не реализовано";
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЗарегистрироватьПолучитьCOMОбъект(КлассКомпоненты, ПолноеИмяDll, Административная = Ложь, ИмяТипаВК = Ложь, ИмяМакетаКомпоненты = "", Знач Зарегистрировать = Истина) Экспорт
|
||
|
||
Если ирКэш.Это64битныйПроцессЛкс() Тогда
|
||
ТипПроцесса = "64";
|
||
Иначе
|
||
ТипПроцесса = "32";
|
||
КонецЕсли;
|
||
Если Найти(КлассКомпоненты, "ForNet") > 0 Тогда
|
||
ТипCOMКомпоненты = "-Net";
|
||
Иначе
|
||
ТипCOMКомпоненты = "";
|
||
КонецЕсли;
|
||
Если Зарегистрировать Тогда
|
||
ПрефикДействия = "За";
|
||
Иначе
|
||
ПрефикДействия = "Раз";
|
||
КонецЕсли;
|
||
Если Истина
|
||
И Не Административная
|
||
И Зарегистрировать
|
||
И ЗначениеЗаполнено(ИмяМакетаКомпоненты)
|
||
Тогда
|
||
Если Метаданные().Макеты.Найти(ИмяМакетаКомпоненты + "Reg") <> Неопределено Тогда
|
||
// http://stackoverflow.com/questions/37193356/registering-net-com-dlls-without-admin-rights-regasm
|
||
// http://stackoverflow.com/questions/35782404/registering-a-com-without-admin-rights
|
||
СкриптРегистрации = ПолучитьМакет(ИмяМакетаКомпоненты + "Reg").ПолучитьТекст();
|
||
СкриптРегистрации = ирОбщий.СтрЗаменитьЛкс(СкриптРегистрации, "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER\Software\Classes");
|
||
РезультатКоманды = ВнестиФайлCOMКомпонентыВРеестр(СкриптРегистрации, СтрЗаменить(ПолноеИмяDll, "\", "/"));
|
||
Компонента = ПолучитьПроверитьCOMОбъект(КлассКомпоненты, ИмяТипаВК);
|
||
Если Компонента <> Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс(ПрефикДействия + "регистрирована COM" + ТипCOMКомпоненты + "-компонента " + КлассКомпоненты, СтатусСообщения.Информация);
|
||
Возврат Компонента;
|
||
Иначе
|
||
ирОбщий.СообщитьЛкс(РезультатКоманды);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ТипCOMКомпоненты = "-Net" Тогда
|
||
Если Административная Тогда
|
||
Если ФайлРегистратораNetКомпонент = Неопределено Тогда
|
||
ФайлРегистратораNetКомпонент = ПроверитьЗаписатьКомпонентуИзМакетаВФайл("Regasm" + ТипПроцесса, , "exe");
|
||
КонецЕсли;
|
||
КоманднаяСтрока = """" + ФайлРегистратораNetКомпонент.ПолноеИмя + """ """ + ПолноеИмяDll + """ /unregister"; // сначала надо отменить регистрацию, иначе новая может не выполниться
|
||
ИмяФайлаРезультата = "";
|
||
РезультатКоманды = ТекстРезультатаКомандыСистемы(КоманднаяСтрока, , Истина, Административная);
|
||
Если Зарегистрировать Тогда
|
||
КоманднаяСтрока = """" + ФайлРегистратораNetКомпонент.ПолноеИмя + """ """ + ПолноеИмяDll + """ /codebase";
|
||
ИмяФайлаРезультата = "";
|
||
РезультатКоманды = ТекстРезультатаКомандыСистемы(КоманднаяСтрока, , Истина, Административная);
|
||
Компонента = ПолучитьПроверитьCOMОбъект(КлассКомпоненты, ИмяТипаВК);
|
||
КонецЕсли;
|
||
Если Компонента <> Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс(ПрефикДействия + "регистрирована COM" + ТипCOMКомпоненты + "-компонента " + КлассКомпоненты, СтатусСообщения.Информация);
|
||
Возврат Компонента;
|
||
Иначе
|
||
ирОбщий.СообщитьЛкс(РезультатКоманды);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Не Административная Тогда
|
||
// HKCU через сторонний регистратор. Иногда это срабатывает
|
||
Если ФайлРегистратораКомпонентCU = Неопределено Тогда
|
||
ФайлРегистратораКомпонентCU = ПроверитьЗаписатьКомпонентуИзМакетаВФайл("RegsvrPower", , "exe");
|
||
ПроверитьЗаписатьКомпонентуИзМакетаВФайл("TLBINF32");
|
||
КонецЕсли;
|
||
//Regsvrex тут иногда аварийно завершается
|
||
//КоманднаяСтрока = """" + ФайлРегистратораКомпонент.ПолноеИмя + """ /c /s /i """ + ПолноеИмяDll + """"; // RegsvrEx
|
||
ФайлКомпоненты = Новый Файл(ПолноеИмяDll);
|
||
КоманднаяСтрока = """" + ФайлРегистратораКомпонентCU.ПолноеИмя + """ " + ФайлКомпоненты.Имя + " /s"; // RegsvrPower не понимает длинные пути
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(КоманднаяСтрока, ФайлКомпоненты.Путь, Истина);
|
||
Компонента = ПолучитьПроверитьCOMОбъект(КлассКомпоненты, ИмяТипаВК);
|
||
Если Компонента <> Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс("В HKCU " + ПрефикДействия + "регистрирована COM" + ТипCOMКомпоненты + "-компонента " + КлассКомпоненты, СтатусСообщения.Информация);
|
||
Возврат Компонента;
|
||
КонецЕсли;
|
||
Иначе
|
||
// HKLM
|
||
КоманднаяСтрока = "regsvr32 /s """ + ПолноеИмяDll + """";
|
||
Если Не Зарегистрировать Тогда
|
||
КоманднаяСтрока = КоманднаяСтрока + " /u";
|
||
КонецЕсли;
|
||
//ТекстРезультата = ТекстРезультатаКомандыСистемы(КоманднаяСтрока,, Истина);
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(КоманднаяСтрока, , Истина,,, Административная);
|
||
Компонента = ПолучитьПроверитьCOMОбъект(КлассКомпоненты, ИмяТипаВК);
|
||
Если Компонента <> Неопределено Тогда
|
||
ирОбщий.СообщитьЛкс(ПрефикДействия + "регистрирована COM" + ТипCOMКомпоненты + "-компонента " + КлассКомпоненты, СтатусСообщения.Информация);
|
||
Возврат Компонента;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
//Если ирКэш.Это64битныйПроцессЛкс() Тогда
|
||
// ирОбщий.СообщитьЛкс("Невозможно загрузить 32-битную COM" + ТипCOMКомпоненты + "-компоненту " + КлассКомпоненты + " в 64-битном приложении. Запустите 32-битное приложение.", СтатусСообщения.Внимание);
|
||
//Иначе
|
||
ТекстСообщения = "Не удалось " + ПрефикДействия + "регистрировать COM" + ТипCOMКомпоненты + "-компоненту " + КлассКомпоненты;
|
||
Если Истина
|
||
И Административная
|
||
И (Ложь
|
||
Или ирКэш.ВКОбщаяЛкс().IsAdmin()
|
||
//Или ЕстьАдминистративныеПраваУУчетнойЗаписиОС()
|
||
)
|
||
Тогда
|
||
ТекстСообщения = ТекстСообщения + " от имени администратора!"
|
||
Иначе
|
||
ТекстСообщения = ТекстСообщения + ". Запустите приложение от имени администратора или используйте инструмент ""Регистрация COM-компонент"", чтобы ее " + ПрефикДействия + "регистрировать"
|
||
КонецЕсли;
|
||
//КонецЕсли;
|
||
ирОбщий.СообщитьЛкс(ТекстСообщения, СтатусСообщения.Внимание);
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВнестиФайлCOMКомпонентыВРеестр(Знач СкриптРегистрации, Знач ПолноеИмяDll, Знач ИдентификаторКласса = "", Знач x64 = Неопределено) Экспорт
|
||
|
||
Если x64 = Неопределено Тогда
|
||
x64 = ирКэш.Это64битныйПроцессЛкс();
|
||
КонецЕсли;
|
||
СкриптРегистрации = ирОбщий.СтрЗаменитьЛкс(СкриптРегистрации, "%ComDllFilename%", ПолноеИмяDll);
|
||
Если ЗначениеЗаполнено(ИдентификаторКласса) Тогда
|
||
СкриптРегистрации = ирОбщий.СтрЗаменитьЛкс(СкриптРегистрации, "%ComDllCLSID%", ИдентификаторКласса);
|
||
КонецЕсли;
|
||
ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла("reg");
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст(СкриптРегистрации);
|
||
ТекстовыйДокумент.Записать(ИмяФайлаСкрипта, КодировкаТекста.ANSI);
|
||
//РезультатКоманды = ТекстРезультатаКомандыСистемы("regedit /s """ + ИмяФайлаСкрипта + """); // Поддержка Windows XP
|
||
РезультатКоманды = ТекстРезультатаКомандыСистемы("reg import """ + ИмяФайлаСкрипта + """ /reg:" + ?(x64, "64", "32")); // Windows Vista и выше
|
||
Возврат РезультатКоманды;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьПроверитьCOMОбъект(Знач КлассКомпоненты, ИмяТипаВК = "") Экспорт
|
||
|
||
Если ЗначениеЗаполнено(ИмяТипаВК) Тогда
|
||
ПодключитьВнешнююКомпоненту(КлассКомпоненты);
|
||
Попытка
|
||
Компонента = Новый ("AddIn." + ИмяТипаВК);
|
||
Исключение
|
||
КонецПопытки;
|
||
Возврат Компонента;
|
||
Иначе
|
||
Если КлассКомпоненты = "DynamicWrapperX" Тогда
|
||
КлассКомпоненты = ИМЯ_КЛАССА_DynamicWrapperX;
|
||
КонецЕсли;
|
||
Попытка
|
||
Компонента = Новый COMОбъект(КлассКомпоненты);
|
||
Если КлассКомпоненты = ИМЯ_КЛАССА_DynamicWrapperX Тогда
|
||
// Проверка на нужную версию компоненты DynamicWrapperX
|
||
Попытка
|
||
Если ирКэш.Это64битныйПроцессЛкс() Тогда
|
||
Если Компонента.Version() <> "2.1.1.1" Тогда // Официальная версия, с ней информатор вылетает
|
||
ВызватьИсключение "Неверная версия компоненты";
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Компонента.Version() <> "2.1.4.1" Тогда // Версия от Chessman
|
||
ВызватьИсключение "Неверная версия компоненты";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Компонента;
|
||
Исключение
|
||
Компонента = Неопределено;
|
||
КонецПопытки;
|
||
ИначеЕсли КлассКомпоненты = "GoldParserForNet.Parser" Тогда
|
||
Попытка
|
||
Если Компонента.Version = "5.08" Тогда
|
||
Возврат Компонента;
|
||
КонецЕсли;
|
||
Исключение
|
||
Компонента = Неопределено;
|
||
КонецПопытки;
|
||
Иначе
|
||
Возврат Компонента;
|
||
КонецЕсли;
|
||
Исключение
|
||
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
|
||
КонецПопытки;
|
||
Если Компонента = Неопределено Тогда
|
||
Если КлассКомпоненты = "DynamicWrapperX"
|
||
//И ирКэш.Это64битныйПроцессЛкс()
|
||
Тогда
|
||
ИМЯ_КЛАССА_DynamicWrapperX = "DynamicWrapperX.2"; // версия 2
|
||
Компонента = ПолучитьПроверитьCOMОбъект(КлассКомпоненты);
|
||
Возврат Компонента;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
// Возвращает нужный com-объект. Если компонента не зарегистрирована, то пытается ее сохранить из макета и зарегистрировать.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// COM-объект, Неопределено.
|
||
//
|
||
Функция ПолучитьCOMОбъектИзМакета(ИмяМакетаКомпоненты, КлассКомпоненты, КаталогУстановки = "авто", ИмяМакетаДополнительнойБиблиотеки = "",
|
||
ИмяТипаВК = "") Экспорт
|
||
|
||
Результат = ПолучитьПроверитьCOMОбъект(КлассКомпоненты, ИмяТипаВК);
|
||
Если Результат = Неопределено И АвторегистрацияComКомпонент Тогда
|
||
Если Нрег(КаталогУстановки) = Нрег("авто") Тогда
|
||
КаталогУстановки = ПапкаВнешнихКомпонент.ПолноеИмя;
|
||
КонецЕсли;
|
||
#Если Клиент Тогда
|
||
Если КаталогУстановки = "" Тогда
|
||
Ответ = Вопрос("Для работы данной функции необходимо зарегистрировать
|
||
//|(необходимы права локального администратора)
|
||
| COM-компоненту """ + ИмяМакетаКомпоненты + """. Выполнить регистрацию?",
|
||
РежимДиалогаВопрос.ОКОтмена, 30, КодВозвратаДиалога.Отмена);
|
||
Если Ответ = КодВозвратаДиалога.Отмена Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
|
||
ВыборФайла.Заголовок = "Укажите папку, куда установить компоненту.";
|
||
Если Не ВыборФайла.Выбрать() Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
КаталогУстановки = ВыборФайла.Каталог;
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
ФайлКомпоненты = ПроверитьЗаписатьКомпонентуИзМакетаВФайл(ИмяМакетаКомпоненты, КаталогУстановки);
|
||
Если ЗначениеЗаполнено(ИмяМакетаДополнительнойБиблиотеки) Тогда
|
||
ФайлДополнительнойБиблиотеки = ПроверитьЗаписатьКомпонентуИзМакетаВФайл(ИмяМакетаДополнительнойБиблиотеки, КаталогУстановки);
|
||
КонецЕсли;
|
||
Результат = ЗарегистрироватьПолучитьCOMОбъект(КлассКомпоненты, ФайлКомпоненты.ПолноеИмя, , ИмяТипаВК, ИмяМакетаКомпоненты);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// ИмяКомпоненты - Строка - имя макета компоненты
|
||
// КлассКомпоненты - Строка - имя
|
||
// ТипВнешнейКомпоненты - ТипВнешнейКомпоненты, * - по умолчанию Native
|
||
Функция ПолучитьОбъектВнешнейКомпонентыИзМакета(ИмяМакетаКомпоненты, ИмяОбъекта, ИмяКомпоненты = Неопределено, Знач ТипКомпоненты = Неопределено,
|
||
ИмяМакетаДополнительнойБиблиотеки = "") Экспорт
|
||
|
||
Если ТипКомпоненты = Неопределено Тогда
|
||
ТипКомпоненты = ТипВнешнейКомпоненты.Native;
|
||
КонецЕсли;
|
||
Попытка
|
||
Результат = Новый (ИмяОбъекта);
|
||
Исключение
|
||
Если ИмяКомпоненты = Неопределено Тогда
|
||
ИмяКомпоненты = ИмяМакетаКомпоненты;
|
||
КонецЕсли;
|
||
Если КодСимвола(ИмяМакетаКомпоненты, 1) >= 128 Тогда
|
||
// https://www.hostedredmine.com/issues/890335
|
||
ВызватьИсключение "Нельзя использовать кириллические буквы в именах файлов внешних компонент";
|
||
КонецЕсли;
|
||
ФайлКомпоненты = ПроверитьЗаписатьКомпонентуИзМакетаВФайл(ИмяМакетаКомпоненты);
|
||
Местоположение = ФайлКомпоненты.ПолноеИмя;
|
||
Если ЗначениеЗаполнено(ИмяМакетаДополнительнойБиблиотеки) Тогда
|
||
ФайлДополнительнойБиблиотеки = ПроверитьЗаписатьКомпонентуИзМакетаВФайл(ИмяМакетаДополнительнойБиблиотеки);
|
||
КонецЕсли;
|
||
Успех = ПодключитьВнешнююКомпоненту(Местоположение, ИмяКомпоненты, ТипКомпоненты);
|
||
ПодключитьВнешнююКомпоненту(ИмяОбъекта);
|
||
Попытка
|
||
Результат = Новый (ИмяОбъекта);
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПроверитьЗаписатьКомпонентуИзМакетаВФайл(Знач ИмяМакетаКомпоненты, КаталогУстановки = "", Расширение = "dll") Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(КаталогУстановки) Тогда
|
||
КаталогУстановки = ПапкаВнешнихКомпонент.ПолноеИмя;
|
||
КонецЕсли;
|
||
ДвоичныеДанныеМакета = ПолучитьДвоичныеДанныеКомпоненты(ИмяМакетаКомпоненты);
|
||
ФайлКомпоненты = Новый Файл(КаталогУстановки + "\" + ИмяМакетаКомпоненты + "." + Расширение);
|
||
ВременныйФайл = Новый Файл(ПолучитьИмяВременногоФайла());
|
||
Попытка
|
||
ДвоичныеДанныеМакета.Записать(ВременныйФайл.ПолноеИмя);
|
||
Исключение
|
||
ирОбщий.СообщитьЛкс("Не удалось создать временный файл компоненты """ + ИмяМакетаКомпоненты + """: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
Счетчик = 1;
|
||
ФайлПодходит = Ложь;
|
||
Пока ФайлКомпоненты.Существует() Цикл
|
||
#Если Клиент Тогда
|
||
СравнениеФайлов = Новый СравнениеФайлов;
|
||
СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.Двоичное;
|
||
СравнениеФайлов.ПервыйФайл = ВременныйФайл.ПолноеИмя;
|
||
СравнениеФайлов.ВторойФайл = ФайлКомпоненты.ПолноеИмя;
|
||
Если СравнениеФайлов.Сравнить() Тогда
|
||
ФайлПодходит = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
#Иначе
|
||
Если ВременныйФайл.Размер() = ФайлКомпоненты.Размер() Тогда // Опасно. Переделать на Хэш
|
||
ФайлПодходит = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
ФайлКомпоненты = Новый Файл(КаталогУстановки + "\" + ИмяМакетаКомпоненты + "_" + Формат(Счетчик, "ЧГ=") + "." + Расширение);
|
||
Счетчик = Счетчик + 1;
|
||
КонецЦикла;
|
||
Если Не ФайлПодходит Тогда
|
||
Попытка
|
||
ПереместитьФайлКакАдминистратор(ВременныйФайл.ПолноеИмя, ФайлКомпоненты.ПолноеИмя);
|
||
Исключение
|
||
УдалитьФайлы(ВременныйФайл.ПолноеИмя);
|
||
ирОбщий.СообщитьЛкс("Файл """ + ФайлКомпоненты.ПолноеИмя + """ недоступен для изменения и не был перезаписан.", СтатусСообщения.Внимание);
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Возврат ФайлКомпоненты;
|
||
|
||
КонецФункции
|
||
|
||
// Способ через ZIP архив (32+64) появился только в 8.3
|
||
Функция ПолучитьДвоичныеДанныеКомпоненты(БазовоеИмяМакетаКомпоненты) Экспорт
|
||
|
||
Если Метаданные().Макеты.Найти(БазовоеИмяМакетаКомпоненты) = Неопределено Тогда
|
||
Если ирКэш.Это64битныйПроцессЛкс() Тогда
|
||
БазовоеИмяМакетаКомпоненты = БазовоеИмяМакетаКомпоненты + "64";
|
||
Иначе
|
||
БазовоеИмяМакетаКомпоненты = БазовоеИмяМакетаКомпоненты + "32";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ДвоичныеДанныеМакета = ПолучитьМакет(БазовоеИмяМакетаКомпоненты);
|
||
Возврат ДвоичныеДанныеМакета;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция СоздатьОбъектВнешнихМетаданных(ПолноеИмяФайла, МенеджерВнешнихОбъектов = Неопределено, Конвертировать = Истина) Экспорт
|
||
|
||
Если МенеджерВнешнихОбъектов = Неопределено Тогда
|
||
МенеджерВнешнихОбъектов = ВнешниеОбработки;
|
||
КонецЕсли;
|
||
Попытка
|
||
ВнешнийОбъект = МенеджерВнешнихОбъектов.Создать(ПолноеИмяФайла, Ложь);
|
||
Исключение
|
||
#Если Клиент Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки();
|
||
Если Истина
|
||
И Конвертировать
|
||
И Найти(НРег(ОписаниеОшибки), НРег("не может быть прочитан")) > 0
|
||
//И ирКэш.НомерВерсииПлатформыЛкс() <> 802015 // Антибаг 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1003164#1003164
|
||
Тогда
|
||
СтрокаЗапуска = "DESIGNER /ConvertFiles""" + ПолноеИмяФайла + """";
|
||
ЗапуститьСистему(СтрокаЗапуска, Истина);
|
||
ВнешнийОбъект = МенеджерВнешнихОбъектов.Создать(ПолноеИмяФайла, Ложь);
|
||
Иначе
|
||
#КонецЕсли
|
||
ВызватьИсключение;
|
||
#Если Клиент Тогда
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
КонецПопытки;
|
||
Возврат ВнешнийОбъект;
|
||
|
||
КонецФункции // СоздатьОбъектВнешнихМетаданных()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция СоздатьВнешнююОбработкуАлгоритма(АлгоритмОбъект, ПолноеИмя) Экспорт
|
||
|
||
Попытка
|
||
ВнешняяОбработка = СоздатьОбъектВнешнихМетаданных(ПолноеИмя);
|
||
Результат = ВнешняяОбработка;
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
Если Найти(НРег(ОписаниеОшибки), НРег("не может быть прочитана текущей версией")) > 0 Тогда
|
||
УдалитьФайлы(ПолноеИмя);
|
||
КонецЕсли;
|
||
|
||
СобытиеОшибки = "Ошибка создания внешнего объекта";
|
||
ОписаниеОшибки = "Загрузка сервиса """ + АлгоритмОбъект.Наименование + """";
|
||
Если ИнформацияОбОшибке.Причина <> Неопределено Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + "
|
||
|" + ПредставлениеИнформацииОбОшибке(ИнформацияОбОшибке.Причина);
|
||
КонецЕсли;
|
||
ОписаниеОшибки = СобытиеОшибки + ": " + ОписаниеОшибки;
|
||
ОписаниеОшибки = ОписаниеОшибки + ": " + ИнформацияОбОшибке.Описание
|
||
+ Символы.ПС + ИнформацияОбОшибке.ИсходнаяСтрока;
|
||
ирОбщий.СообщитьЛкс(ОписаниеОшибки, СтатусСообщения.Важное);
|
||
ЗаписьЖурналаРегистрации(СобытиеОшибки, УровеньЖурналаРегистрации.Ошибка, Метаданные.НайтиПоТипу(ТипЗнч(АлгоритмОбъект.Ссылка)),
|
||
АлгоритмОбъект.Ссылка, ОписаниеОшибки);
|
||
Результат = Неопределено;
|
||
КонецПопытки;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // СоздатьВнешнююОбработкуАлгоритма()
|
||
|
||
// Проверяет актуальность кэша. Вызывается когда кэш в памяти уже точно не соотвествует объекту БД.
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПроверитьАктуальностьКэшаВнешнейОбработки(ЭлементКэша, ДатаИзмененияКэша, ФайлВнешнейОбработки, ДатаИзмененияОбъекта,
|
||
КэшВнешнейОбработкиАктуален, ФайлВнешнейОбработкиАктуален, ФайловыйКэшДопускаетРедактирование) Экспорт
|
||
|
||
Попытка
|
||
ДатаИзмененияФайла = ФайлВнешнейОбработки.ПолучитьВремяИзменения() + ирКэш.ПолучитьСмещениеВремениЛкс();
|
||
ФайлВнешнейОбработкиСуществует = Истина;
|
||
Исключение
|
||
ФайлВнешнейОбработкиСуществует = Ложь;
|
||
КонецПопытки;
|
||
Если ФайлВнешнейОбработкиСуществует Тогда
|
||
Если Истина
|
||
И ЭлементКэша <> Неопределено
|
||
И ЭлементКэша.ДатаИзменения >= ДатаИзмененияФайла
|
||
И ЭлементКэша.ДатаИзменения >= ДатаИзмененияОбъекта
|
||
Тогда
|
||
КэшВнешнейОбработкиАктуален = Истина;
|
||
ИначеЕсли Ложь
|
||
Или (Истина
|
||
И ЭлементКэша = Неопределено
|
||
И ДатаИзмененияФайла = ДатаИзмененияОбъекта)
|
||
Или (Истина
|
||
И ЭлементКэша <> Неопределено
|
||
И ДатаИзмененияФайла = ЭлементКэша.ДатаИзменения
|
||
И ДатаИзмененияФайла = ДатаИзмененияОбъекта)
|
||
Или (Истина
|
||
И ФайловыйКэшДопускаетРедактирование
|
||
И (Ложь
|
||
Или (Истина
|
||
И ЭлементКэша = Неопределено
|
||
И ДатаИзмененияФайла >= ДатаИзмененияОбъекта)
|
||
Или (Истина
|
||
И ЭлементКэша <> Неопределено
|
||
И ДатаИзмененияФайла >= ЭлементКэша.ДатаИзменения
|
||
И ДатаИзмененияФайла >= ДатаИзмененияОбъекта)))
|
||
Тогда
|
||
ФайлВнешнейОбработкиАктуален = Истина;
|
||
ДатаИзмененияКэша = ДатаИзмененияФайла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецФункции // ПроверитьАктуальностьКэшаВнешнейОбработки()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Функция РазвернутьНовыйШаблонВнешнейОбработки(СМакетом = Ложь, ГлобальныйКлюч = Неопределено,
|
||
ФайлСИменем, ТекстПотокаСИменем, Знач ДляИДВерсииПлатформы = "") Экспорт
|
||
|
||
Если ПустаяСтрока(ДляИДВерсииПлатформы) Тогда
|
||
ДляИДВерсииПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
|
||
КонецЕсли;
|
||
Если ДляИДВерсииПлатформы = "83" Тогда
|
||
ДляИДВерсииПлатформы = "82";
|
||
КонецЕсли;
|
||
Если ГлобальныйКлюч = Неопределено Тогда
|
||
ГлобальныйКлюч = "" + Новый УникальныйИдентификатор;
|
||
КонецЕсли;
|
||
лПутьКШаблонуВнешнейОбработки = ПутьККаталогуСлужебныхВременныхФайлов + ГлобальныйКлюч;
|
||
Файл = Новый Файл(ПолучитьИмяВременногоФайла());
|
||
//ПолучитьМакет("ВнешняяОбработка").Записать(Файл.ПолноеИмя);
|
||
Если СМакетом Тогда
|
||
ИмяМакета = "ШаблонВнешнейОбработкиСМакетом";
|
||
Иначе
|
||
ИмяМакета = "ШаблонВнешнейОбработкиСервиса";
|
||
КонецЕсли;
|
||
ИмяМакета = ИмяМакета + ДляИДВерсииПлатформы;
|
||
ПолучитьМакет(ИмяМакета).Записать(Файл.ПолноеИмя);
|
||
ЧтениеZip = Новый ЧтениеZipФайла(Файл.ПолноеИмя);
|
||
ЧтениеZip.ИзвлечьВсе(лПутьКШаблонуВнешнейОбработки);
|
||
ФайлСИменем = Новый Файл(лПутьКШаблонуВнешнейОбработки + "\" + СубПутьКФайлуПотокаЗаголовкаВнешнейОбработки);
|
||
ПотокСИменемОбработки = Новый ТекстовыйДокумент;
|
||
ПотокСИменемОбработки.Прочитать(ФайлСИменем.ПолноеИмя);
|
||
ТекстПотокаСИменем = ПотокСИменемОбработки.ПолучитьТекст();
|
||
СоздатьКомандныйФайлДляУпаковкиФайлаВнешнейОбработки(лПутьКШаблонуВнешнейОбработки);
|
||
|
||
Возврат лПутьКШаблонуВнешнейОбработки;
|
||
|
||
КонецФункции // РазвернутьШаблонВнешнейОбработки()
|
||
|
||
Процедура СоздатьКомандныйФайлДляУпаковкиФайлаВнешнейОбработки(Каталог) Экспорт
|
||
|
||
ПолучитьМакет("v8unpack").Записать(Каталог + "\" + ИмяФайлаПакера);
|
||
ПолучитьМакет("Zlib1").Записать(Каталог + "\" + "Zlib1.dll");
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст("
|
||
|FOR /D %%I IN (*.unp) DO " + ИмяФайлаПакера + " -pack %%I %%~nI
|
||
|FOR %%I IN (*.und) DO " + ИмяФайлаПакера + " -deflate %%I %%~nI
|
||
|" + ИмяФайлаПакера + " -pack .\ %1");
|
||
ТекстовыйДокумент.Записать(Каталог + "\" + "pack.bat", КодировкаТекста.ANSI);
|
||
|
||
КонецПроцедуры // СоздатьКомандныйФайлДляУпаковкиФайлаВнешнейОбработки()
|
||
|
||
Процедура УпаковатьФайлВнешнейОбработки(КаталогРаспаковки, ПолноеИмяФайлаВнешнейОбработки) Экспорт
|
||
|
||
СоздатьКомандныйФайлДляУпаковкиФайлаВнешнейОбработки(КаталогРаспаковки);
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения("pack.bat """ + ПолноеИмяФайлаВнешнейОбработки + """", КаталогРаспаковки);
|
||
|
||
КонецПроцедуры // УпаковатьФайлВнешнейОбработки()
|
||
|
||
// ПолноеИмяФайла - не должно содержать не английских букв
|
||
Процедура РаспаковатьФайлВнешнейОбработки(ПолноеИмяФайла, ПутьРаспаковки) Экспорт
|
||
|
||
//ПроверитьСоздатьФайлЗапаковщика1С();
|
||
ПолучитьМакет("v8unpack").Записать(ПутьРаспаковки + "\" + ИмяФайлаПакера);
|
||
ПолучитьМакет("Zlib1").Записать(ПутьРаспаковки + "\" + "Zlib1.dll");
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст("
|
||
|" + ИмяФайлаПакера + " -unpack %1 .\
|
||
|FOR %%I IN (*.data) DO " + ИмяФайлаПакера + " -undeflate %%I %%~nI.data.und
|
||
|FOR %%I IN (*.und) DO " + ИмяФайлаПакера + " -unpack %%I %%~nI.und.unp
|
||
|");
|
||
ТекстовыйДокумент.Записать(ПутьРаспаковки + "\" + "unpack.bat", КодировкаТекста.ANSI);
|
||
ИмяФайлаЛога = "log.txt";
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения("unpack.bat """ + ПолноеИмяФайла + """", ПутьРаспаковки,, ИмяФайлаЛога);
|
||
ЧитатьЛог = Ложь; // Для отладки
|
||
Если ЧитатьЛог Тогда
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ПутьРаспаковки + "\" + ИмяФайлаЛога);
|
||
ТекстЛога = ТекстовыйДокумент.ПолучитьТекст();
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // РаспаковатьВнешнююОбработку()
|
||
|
||
Функция ЛиИспользоватьБыструюРаспаковкуВнешнейОбработки() Экспорт
|
||
|
||
ИспользоватьБыстрыйГенератор = Истина;
|
||
Если ирОбщий.СтрокиРавныЛкс(ирКэш.ТекущийСеансЛкс().ИмяПриложения, "1cv8") Тогда
|
||
// Антибаг 8.3.11-?. Testplatform@1c.ru - Support #17972. В обычном приложении на клиенте при повторном создании с одним именем файла и внутренней версией используются метаданные первой обработки в сеансе.
|
||
// Начиная с 8.3.11 кэширование внешних обработок проверяет только контрольные суммы, которые в старом способе не меняются, поэтому на 8.3.11+ используется штатный долгий метод генерации внешней обработки
|
||
ИспользоватьБыстрыйГенератор = ирКэш.НомерВерсииПлатформыЛкс() < 803011;
|
||
КонецЕсли;
|
||
Возврат ИспользоватьБыстрыйГенератор;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция СформироватьВнешнююОбработку(Знач ФайлОбработки, Знач ИмяОбработки, Знач ТекстМодуля, Знач ТекстМакета = Неопределено, Знач ДляИДВерсииПлатформы = "") Экспорт
|
||
|
||
#Если Сервер И Не Сервер Тогда
|
||
ФайлОбработки = Новый файл;
|
||
#КонецЕсли
|
||
ИспользоватьБыструюРаспаковку = ЛиИспользоватьБыструюРаспаковкуВнешнейОбработки();
|
||
Если Не ИспользоватьБыструюРаспаковку Тогда
|
||
// Штатный способ платформы, но работает только на 8.3.8+
|
||
Если ТекстМакета <> Неопределено Тогда
|
||
ВызватьИсключение "Парамер ТекстМакета для 8.3.11+ не поддерживается";
|
||
КонецЕсли;
|
||
ШаблонВнешнейОбработки = ШаблоныВнешнейОбработки["8"];
|
||
Если ШаблонВнешнейОбработки = Неопределено Тогда
|
||
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
|
||
ПолучитьМакет("ВнешняяОбработка").Записать(ИмяВременногоФайла);
|
||
ШаблонВнешнейОбработки = ПолучитьИмяВременногоФайла();
|
||
СоздатьКаталог(ШаблонВнешнейОбработки);
|
||
ТекстЛога = Неопределено;
|
||
Если Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/DumpExternalDataProcessorOrReportToFiles """ + ШаблонВнешнейОбработки + """ """ + ИмяВременногоФайла + """",, ТекстЛога, Истина,,,,,,, Ложь) Тогда
|
||
УдалитьФайлы(ШаблонВнешнейОбработки);
|
||
УдалитьФайлы(ИмяВременногоФайла);
|
||
ирОбщий.СообщитьЛкс(ТекстЛога);
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
ШаблоныВнешнейОбработки["8"] = ШаблонВнешнейОбработки;
|
||
КонецЕсли;
|
||
Файлы = НайтиФайлы(ШаблонВнешнейОбработки, "ObjectModule.bsl", Истина);
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
|
||
ТекстовыйДокумент.Записать(Файлы[0].ПолноеИмя);
|
||
ТекстЛога = Неопределено;
|
||
ИмяКорневогоФайла = ШаблонВнешнейОбработки + "\ИмяВнешнейОбработки.xml";
|
||
Если ЗначениеЗаполнено(ИмяОбработки) Тогда
|
||
ПотокСИменемОбработки = Новый ТекстовыйДокумент;
|
||
ПотокСИменемОбработки.Прочитать(ИмяКорневогоФайла);
|
||
ПотокСИменемОбработки.УстановитьТекст(СтрЗаменить(ПотокСИменемОбработки.ПолучитьТекст(), "ИмяВнешнейОбработки", ИмяОбработки));
|
||
ПотокСИменемОбработки.Записать(ИмяКорневогоФайла);
|
||
КонецЕсли;
|
||
Если Не ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяКорневогоФайла + """ """ + ФайлОбработки.ПолноеИмя + """", , ТекстЛога, Истина,,,,,,, Ложь) Тогда
|
||
УдалитьФайлы(ШаблонВнешнейОбработки);
|
||
УдалитьФайлы(ИмяВременногоФайла);
|
||
ирОбщий.СообщитьЛкс(ТекстЛога);
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
Результат = Истина;
|
||
Иначе
|
||
Если ПустаяСтрока(ДляИДВерсииПлатформы) Тогда
|
||
ДляИДВерсииПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
|
||
КонецЕсли;
|
||
Если ДляИДВерсииПлатформы = "83" Тогда
|
||
ДляИДВерсииПлатформы = "82";
|
||
КонецЕсли;
|
||
|
||
Если ТекстМакета <> Неопределено Тогда
|
||
ШаблонВнешнейОбработкиСМакетом = ШаблоныВнешнейОбработкиСМакетом[ДляИДВерсииПлатформы];
|
||
Если ШаблонВнешнейОбработкиСМакетом = Неопределено Тогда
|
||
ШаблонВнешнейОбработкиСМакетом = Новый Структура("Путь, ФайлСИменем, ФайлЗамок, ТекстПотокаСИменем");
|
||
ШаблонВнешнейОбработкиСМакетом.Путь = РазвернутьНовыйШаблонВнешнейОбработки(Истина,,
|
||
ШаблонВнешнейОбработкиСМакетом.ФайлСИменем, ШаблонВнешнейОбработкиСМакетом.ТекстПотокаСИменем, ДляИДВерсииПлатформы);
|
||
ФайлЗамокШаблонаСМакетом = Новый ЗаписьТекста;
|
||
ФайлЗамокШаблонаСМакетом.Открыть(ШаблонВнешнейОбработкиСМакетом.Путь + ".lck");
|
||
ШаблонВнешнейОбработкиСМакетом.ФайлЗамок = ФайлЗамокШаблонаСМакетом;
|
||
ШаблоныВнешнейОбработкиСМакетом[ДляИДВерсииПлатформы] = ШаблонВнешнейОбработкиСМакетом;
|
||
КонецЕсли;
|
||
ПутьКШаблону = ШаблонВнешнейОбработкиСМакетом.Путь;
|
||
ФайлСИменем = ШаблонВнешнейОбработкиСМакетом.ФайлСИменем;
|
||
ТекстПотокаСИменем = ШаблонВнешнейОбработкиСМакетом.ТекстПотокаСИменем;
|
||
Иначе
|
||
ШаблонВнешнейОбработки = ШаблоныВнешнейОбработки[ДляИДВерсииПлатформы];
|
||
Если ШаблонВнешнейОбработки = Неопределено Тогда
|
||
ШаблонВнешнейОбработки = Новый Структура("Путь, ФайлСИменем, ФайлЗамок, ТекстПотокаСИменем");
|
||
ШаблонВнешнейОбработки.Путь = РазвернутьНовыйШаблонВнешнейОбработки(,,
|
||
ШаблонВнешнейОбработки.ФайлСИменем, ШаблонВнешнейОбработки.ТекстПотокаСИменем, ДляИДВерсииПлатформы);
|
||
ФайлЗамокШаблона = Новый ЗаписьТекста;
|
||
ФайлЗамокШаблона.Открыть(ШаблонВнешнейОбработки.Путь + ".lck");
|
||
ШаблонВнешнейОбработки.ФайлЗамок = ФайлЗамокШаблона;
|
||
ШаблоныВнешнейОбработки[ДляИДВерсииПлатформы] = ШаблонВнешнейОбработки;
|
||
КонецЕсли;
|
||
ПутьКШаблону = ШаблонВнешнейОбработки.Путь;
|
||
ФайлСИменем = ШаблонВнешнейОбработки.ФайлСИменем;
|
||
ТекстПотокаСИменем = ШаблонВнешнейОбработки.ТекстПотокаСИменем;
|
||
КонецЕсли;
|
||
|
||
ПутьКШаблону = ПутьКШаблону + "\";
|
||
Если ЗначениеЗаполнено(ИмяОбработки) Тогда
|
||
ТекстПотокаСИменем = СтрЗаменить(ТекстПотокаСИменем, "ИмяВнешнейОбработки", ИмяОбработки);
|
||
КонецЕсли;
|
||
ПотокСИменемОбработки = Новый ТекстовыйДокумент;
|
||
ПотокСИменемОбработки.УстановитьТекст(ТекстПотокаСИменем);
|
||
ПотокСИменемОбработки.Записать(ФайлСИменем.ПолноеИмя);
|
||
|
||
ФайлТекстаМодуляОбработки = Новый Файл(ПутьКШаблону + СубПутьКФайлуПотокаМодуляВнешнейОбработки);
|
||
ТекстовыйДокументМодуля = Новый ТекстовыйДокумент();
|
||
ТекстовыйДокументМодуля.УстановитьТекст(ТекстМодуля);
|
||
ТекстовыйДокументМодуля.Записать(ФайлТекстаМодуляОбработки.ПолноеИмя);
|
||
|
||
Если ТекстМакета <> Неопределено Тогда
|
||
ФайлТекстаМакетаПараметров = Новый Файл(ПутьКШаблону + СубПутьКФайлуПотокаМакетаВнешнейОбработки);
|
||
ТекстовыйДокументМакета = Новый ТекстовыйДокумент();
|
||
ТекстовыйДокументМакета.УстановитьТекст(ТекстМакета);
|
||
ТекстовыйДокументМакета.Записать(ФайлТекстаМакетаПараметров.ПолноеИмя);
|
||
КонецЕсли;
|
||
|
||
Результат = УпаковатьВнешнююОбработку(ПутьКШаблону, ФайлОбработки.ПолноеИмя);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Файлы "Zlib1.dll" и "v8unpack.exe" должны быть в этом каталоге.
|
||
Функция УпаковатьВнешнююОбработку(ПутьКШаблонуВнешнейОбработки, ИмяВыходногоФайла, СоздатьФайлыУпаковщика = Ложь) Экспорт
|
||
|
||
// Небольшой накладной расход, но надежность повышаем
|
||
УдалитьФайлы(ПутьКШаблонуВнешнейОбработки + СубПутьККонтрольномуФайлуВнешнейОбработки);
|
||
Попытка
|
||
УдалитьФайлы(ИмяВыходногоФайла);
|
||
Исключение
|
||
Событие = "Ошибка создания служебного объекта (1)";
|
||
//ирОбщий.СообщитьЛкс(Событие, СтатусСообщения.Важное);
|
||
//ЗаписьЖурналаРегистрации(Событие, УровеньЖурналаРегистрации.Ошибка);
|
||
//Возврат Неопределено;
|
||
ВызватьИсключение Событие;
|
||
КонецПопытки;
|
||
|
||
Если СоздатьФайлыУпаковщика Тогда
|
||
ПолучитьМакет("v8unpack").Записать(ПутьКШаблонуВнешнейОбработки + ИмяФайлаПакера);
|
||
ПолучитьМакет("Zlib1").Записать(ПутьКШаблонуВнешнейОбработки + "Zlib1.dll");
|
||
КонецЕсли;
|
||
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения("pack.bat """ + ИмяВыходногоФайла + """", ПутьКШаблонуВнешнейОбработки);
|
||
|
||
КонтрольныйФайл1 = Новый Файл(ПутьКШаблонуВнешнейОбработки + СубПутьККонтрольномуФайлуВнешнейОбработки);
|
||
КонтрольныйФайл2 = Новый Файл(ИмяВыходногоФайла);
|
||
Если Ложь
|
||
Или Не КонтрольныйФайл1.Существует()
|
||
//Или Не КонтрольныйФайл2.Существует() // Отключил для повышения скорости
|
||
Тогда
|
||
Событие = "Ошибка создания служебного объекта (2)";
|
||
//ирОбщий.СообщитьЛкс(Событие, СтатусСообщения.Важное);
|
||
//ЗаписьЖурналаРегистрации(Событие, УровеньЖурналаРегистрации.Ошибка);
|
||
//Возврат Неопределено;
|
||
ВызватьИсключение Событие;
|
||
КонецЕсли;
|
||
Возврат Истина;
|
||
|
||
КонецФункции // УпаковатьВнешнююОбработку()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьФайлВнешнейОбработкиАлгоритма(АлгоритмОбъект) Экспорт
|
||
|
||
Если Ложь
|
||
Или СтрДлина(ПапкаКешаВнешнихОбработокАлгоритмов.ПолноеИмя) + СтрДлина(АлгоритмОбъект.Наименование) > 250
|
||
Тогда
|
||
// Ограничение WinAPI на путь к файлу
|
||
КлючСервиса = "" + АлгоритмОбъект.Ссылка.УникальныйИдентификатор();
|
||
Иначе
|
||
КлючСервиса = АлгоритмОбъект.Наименование;
|
||
КонецЕсли;
|
||
ИмяФайла = КлючСервиса + ".epf";
|
||
ФайлВнешнейОбработки = Новый Файл(ПапкаКешаВнешнихОбработокАлгоритмов.ПолноеИмя + "\" + ИмяФайла);
|
||
Возврат ФайлВнешнейОбработки;
|
||
|
||
КонецФункции // ПолучитьФайлВнешнейОбработкиАлгоритма()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьОбновитьФайлВнешнейОбработкиАлгоритма(ДескрипторСервиса, ЭлементКэша = Неопределено,
|
||
ДатаИзмененияКэша = Неопределено) Экспорт
|
||
|
||
ВнешняяОбработка = Неопределено;
|
||
ФайлВнешнейОбработкиАктуален = Ложь;
|
||
КэшВнешнейОбработкиАктуален = Ложь;
|
||
ФайлВнешнейОбработки = ПолучитьФайлВнешнейОбработкиАлгоритма(ДескрипторСервиса);
|
||
ДатаИзмененияОбъекта = ДескрипторСервиса.ДатаИзмененияКонтекста;
|
||
|
||
//// Условие добавлено для мягкого перехода на новый кэш параметров сервисов 21.10.2010. Потом нужно убрать
|
||
//Если ЗначениеЗаполнено(ДескрипторСервиса.ДатаИзмененияКэша) Тогда
|
||
ПроверитьАктуальностьКэшаВнешнейОбработки(ЭлементКэша, ДатаИзмененияКэша, ФайлВнешнейОбработки, ДатаИзмененияОбъекта,
|
||
КэшВнешнейОбработкиАктуален, ФайлВнешнейОбработкиАктуален, ФайловыйКэшАлгоритмовДопускаетРедактирование);
|
||
//КонецЕсли;
|
||
Если Истина
|
||
И Не КэшВнешнейОбработкиАктуален
|
||
И Не ФайлВнешнейОбработкиАктуален
|
||
Тогда
|
||
СервисОбъект = ПроверитьПолучитьОбъектСервиса(ДескрипторСервиса);
|
||
СервисОбъект.СобратьКонтекст();
|
||
СформироватьВнешнююОбработку(ФайлВнешнейОбработки, СервисОбъект.Наименование,
|
||
СервисОбъект.ПолучитьТекстМодуляОбработки()
|
||
//, СервисОбъект.ПолучитьТекстМакетаПараметров()
|
||
);
|
||
Попытка
|
||
ФайлВнешнейОбработки.УстановитьВремяИзменения(СервисОбъект.ДатаИзмененияКонтекста);
|
||
Исключение
|
||
Если Не ФайлВнешнейОбработки.Существует() Тогда
|
||
ирОбщий.ПроверитьКодЯзыкаОСЛкс();
|
||
ВызватьИсключение "Файл внешней обработки сервиса """ + СервисОбъект.Наименование + """ не сформирован";
|
||
Иначе
|
||
ВызватьИсключение;
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если КэшВнешнейОбработкиАктуален Тогда
|
||
Возврат Неопределено;
|
||
Иначе
|
||
Возврат ФайлВнешнейОбработки;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьВнешнююОбработкуПоАлгоритму(ДескрипторСервиса) Экспорт
|
||
|
||
// %%%% Здесь можно было бы структуру попробовать вместо ТЗ
|
||
//ЭлементКэша = 0;
|
||
//КешВнешнихОбработокАлгоритмов.Свойство(ДескрипторСервиса.Наименование, ЭлементКэша);
|
||
ЭлементКэша = ДескрипторСервиса.мСтруктураВнешнейОбработки;
|
||
Если Ложь
|
||
Или ЭлементКэша = Неопределено
|
||
Или ЭлементКэша.ДатаИзменения < ДескрипторСервиса.ДатаИзмененияКонтекста
|
||
Или ФайловыйКэшАлгоритмовДопускаетРедактирование
|
||
Тогда
|
||
ДатаИзмененияКэша = ДескрипторСервиса.ДатаИзмененияКонтекста;
|
||
// Для обхода бага платформы WSHShell.Run(,,True)
|
||
Для Счетчик = 1 По 3 Цикл
|
||
|
||
ФайлВнешнейОбработки = ПолучитьОбновитьФайлВнешнейОбработкиАлгоритма(ДескрипторСервиса, ЭлементКэша,
|
||
ДатаИзмененияКэша);
|
||
Если ФайлВнешнейОбработки <> Неопределено Тогда
|
||
ВнешняяОбработка = СоздатьВнешнююОбработкуАлгоритма(ДескрипторСервиса, ФайлВнешнейОбработки.ПолноеИмя);
|
||
|
||
// Для обхода бага платформы.
|
||
Если ВнешняяОбработка <> Неопределено Тогда
|
||
ИмяАлгоритмаВнешнейОбработки = ВнешняяОбработка.Метаданные().Имя;
|
||
Если ИмяАлгоритмаВнешнейОбработки <> ДескрипторСервиса.Наименование Тогда
|
||
ЗаписьЖурналаРегистрации("Несоответствие внешней обработки и сервиса", УровеньЖурналаРегистрации.Ошибка, ,
|
||
ДескрипторСервиса.Ссылка, "Попытка №" + Счетчик + ". Внешняя обработка """ + ИмяАлгоритмаВнешнейОбработки + """");
|
||
УдалитьФайлы(ФайлВнешнейОбработки.ПолноеИмя);
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Прервать;
|
||
КонецЦикла;
|
||
Если ФайлВнешнейОбработки <> Неопределено Тогда
|
||
Если ЭлементКэша = Неопределено Тогда
|
||
ЭлементКэша = Новый Структура("ДатаИзменения, ВнешняяОбработка");
|
||
//КешВнешнихОбработокАлгоритмов.Вставить(ДескрипторСервиса.Наименование, ЭлементКэша);
|
||
ДескрипторСервиса.мСтруктураВнешнейОбработки = ЭлементКэша;
|
||
КонецЕсли;
|
||
Если ВнешняяОбработка <> Неопределено Тогда
|
||
ЭлементКэша.ДатаИзменения = ДатаИзмененияКэша;
|
||
ЭлементКэша.ВнешняяОбработка = ВнешняяОбработка;
|
||
Иначе
|
||
ЭлементКэша.ДатаИзменения = Дата("00010101");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ЭлементКэша <> Неопределено Тогда
|
||
Результат = ЭлементКэша.ВнешняяОбработка;
|
||
Иначе
|
||
Результат = Неопределено;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьВнешнююОбработкуПоАлгоритму()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// ИмяФайлаРезультата – Краткое имя файла, в который будет выведен выходной поток, только в текущем каталоге.
|
||
// Элевация - Булево - используется только если текущая учетная запись Windows входит в группу Администраторы
|
||
//
|
||
Процедура ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(Знач СтрокаЗапуска, Знач ТекущийКаталог = "", Знач _ИспользоватьWSH = Истина,
|
||
КраткоеИмяФайлаРезультата = "", ОжидатьЗавершения = Истина, Элевация = Ложь) Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(ТекущийКаталог) Тогда
|
||
ТекущийКаталог = КаталогВременныхФайлов();
|
||
КонецЕсли;
|
||
СтрокаЗапуска =
|
||
"cd """ + ТекущийКаталог + """
|
||
|cmd.exe /c """ + СтрокаЗапуска + """";
|
||
Если КраткоеИмяФайлаРезультата <> "" Тогда
|
||
СтрокаЗапуска = СтрокаЗапуска + " > """ + ТекущийКаталог + КраткоеИмяФайлаРезультата + """";
|
||
СтрокаЗапуска = СтрокаЗапуска + " 2>&1"; //stderr
|
||
КонецЕсли;
|
||
ИмяКомандногоФайла = ирОбщий.СоздатьСамоудаляющийсяКомандныйФайлЛкс(СтрокаЗапуска);
|
||
ВК = ирКэш.ВКОбщаяЛкс();
|
||
ВК.Run(ИмяКомандногоФайла, "", ТекущийКаталог, ОжидатьЗавершения, Элевация);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ЕстьАдминистративныеПраваУУчетнойЗаписиОС() Экспорт
|
||
|
||
Если мЕстьАдминистративныеПраваУУчетнойЗаписиОС <> Неопределено Тогда
|
||
Возврат мЕстьАдминистративныеПраваУУчетнойЗаписиОС;
|
||
КонецЕсли;
|
||
Network = Новый COMОбъект("WScript.Network");
|
||
//ПользовательОС = Network.UserDomain + "\" + Network.UserName;
|
||
ПользовательОС = Network.UserName;
|
||
КомандаСистемы = "Net user " + ПользовательОС;
|
||
РезультатКоманды = ТекстРезультатаКомандыСистемы(КомандаСистемы);
|
||
мЕстьАдминистративныеПраваУУчетнойЗаписиОС = Ложь
|
||
Или Найти(РезультатКоманды, "Администраторы") > 0
|
||
Или Найти(РезультатКоманды, "Administrators") > 0;
|
||
Возврат мЕстьАдминистративныеПраваУУчетнойЗаписиОС;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПереместитьФайлКакАдминистратор(ИмяИсточника, ИмяПриемника) Экспорт
|
||
|
||
Успех = Истина;
|
||
Попытка
|
||
//ПереместитьФайл(ИмяИсточника, ИмяПриемника); // так не работает наследование прав от каталога-приемника!
|
||
КопироватьФайл(ИмяИсточника, ИмяПриемника);
|
||
Исключение
|
||
ОписаниеОшибки = ОписаниеОшибки();
|
||
КонецПопытки;
|
||
Если ОписаниеОшибки <> Неопределено Тогда
|
||
//КомандаСистемы = "cmd.exe /c move """ + ИмяИсточника + """ """ + ИмяПриемника + """"; // так не работает наследование прав от каталога-приемника!
|
||
КомандаСистемы = "cmd.exe /c copy """ + ИмяИсточника + """ """ + ИмяПриемника + """";
|
||
ОписаниеОшибки = ТекстРезультатаКомандыСистемы(КомандаСистемы,,, Истина);
|
||
// При успехе возвращает:
|
||
// Скопировано файлов: 1.
|
||
Если Найти(ОписаниеОшибки, "1") = 0 Тогда
|
||
ВызватьИсключение "Ошибка доступа к файлу """ + ИмяПриемника + """: " + ОписаниеОшибки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Успех Тогда
|
||
Попытка
|
||
УдалитьФайлы(ИмяИсточника);
|
||
Исключение
|
||
КомандаСистемы = "cmd.exe /c del """ + ИмяИсточника + """";
|
||
ОписаниеОшибки = ТекстРезультатаКомандыСистемы(КомандаСистемы,,, Истина);
|
||
// При успехе возвращает пустую строку
|
||
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
|
||
ВызватьИсключение "Ошибка доступа к файлу """ + ИмяИсточника + """: " + ОписаниеОшибки;
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Возврат Успех;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьПолноеИмяКомпьютераСетиПоЛюбомуИмени(ИмяКомпьютера) Экспорт
|
||
|
||
ПолучитьИсполнительСкрытыхКомандСистемы();
|
||
ФайлРезультата = Новый Файл(ПолучитьИмяВременногоФайла());
|
||
ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения("nslookup " + ИмяКомпьютера, ФайлРезультата.Путь, Истина, ФайлРезультата.Имя);
|
||
Если Не ФайлРезультата.Существует() Тогда
|
||
ПолноеИмяКомпьютера = "";
|
||
Иначе
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ФайлРезультата.ПолноеИмя);
|
||
УдалитьФайлы(ФайлРезультата.ПолноеИмя);
|
||
ТекстРезультата = ТекстовыйДокумент.ПолучитьТекст();
|
||
RegExp.IgnoreCase = Истина;
|
||
RegExp.Pattern = "(?:name|имя|╚ь ):\s*([-0-9A-ZА-ЯЁ]+(\.([-0-9A-ZА-ЯЁ]+))*)\s*";
|
||
Результат = RegExp.Execute(ТекстРезультата);
|
||
Если Результат.Count > 0 Тогда
|
||
ПолноеИмяКомпьютера = Результат.Item(0).SubMatches(0);
|
||
Иначе
|
||
ПолноеИмяКомпьютера = "";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
//ASPDNS = ПолучитьCOMОбъектИзМакета("ASPDNS", "ASPDNS.DNSLookup");
|
||
//IP = ASPDNS.GetIPFromName(ИмяКомпьютера);
|
||
//ПолноеИмяКомпьютера = ASPDNS.GetNameFromIP(IP);
|
||
Возврат ПолноеИмяКомпьютера;
|
||
|
||
КонецФункции // ПолучитьПолноеИмяКомпьютераСетиПоЛюбомуИмени()
|
||
|
||
Функция ПолучитьИсполнительСкрытыхКомандСистемы() Экспорт
|
||
|
||
Если ИсполнительСкрытыхКомандСистемы = Неопределено Тогда
|
||
ДвоичныеДанные = ПолучитьМакет("HiddenStart");
|
||
ИсполнительСкрытыхКомандСистемы = ПолучитьИмяВременногоФайла("exe");
|
||
ДвоичныеДанные.Записать(ИсполнительСкрытыхКомандСистемы);
|
||
КонецЕсли;
|
||
Возврат ИсполнительСкрытыхКомандСистемы;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Функция ПроверитьКаталогФайловогоКэша() Экспорт
|
||
|
||
//http://www.hostedredmine.com/issues/851201
|
||
//СтрокаСоединения = ирКэш.СтрокаСоединенияСервераЛкс();
|
||
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
|
||
|
||
КаталогВерсииПлатформыВПрофиле = ирКэш.КаталогИзданияПлатформыВПрофилеЛкс();
|
||
КаталогФайловогоКэша = КаталогВерсииПлатформыВПрофиле + "\" + ИдентификаторИзПредставленияЛкс(СтрокаСоединения);
|
||
ПапкаФайловогоКэша = Новый Файл(КаталогФайловогоКэша);
|
||
Если Не ПапкаФайловогоКэша.Существует() Тогда
|
||
Попытка
|
||
СоздатьКаталог(ПапкаФайловогоКэша.ПолноеИмя);
|
||
ПробныйФайл = Новый ТекстовыйДокумент;
|
||
ПробныйФайл.Записать(ПапкаФайловогоКэша.ПолноеИмя + "\1.txt");
|
||
Исключение
|
||
ирОбщий.СообщитьЛкс("Дополнительные кэши отключены.", СтатусСообщения.Важное);
|
||
ВыполнятьАлгоритмыЧерезВнешниеОбработки = Ложь;
|
||
Возврат Ложь;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Возврат Истина;
|
||
|
||
КонецФункции // ПроверитьКаталогФайловогоКэша()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ИмяНеопределеннойПеременнойИзИнформацииОбОшибке(ИнформацияОбОшибке, СообщитьНеобрабатываемуюОшибку = Ложь) Экспорт
|
||
|
||
Если ИнформацияОбОшибке <> Неопределено Тогда
|
||
RegExp.Global = Ложь;
|
||
//ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
Пока ИнформацияОбОшибке.Причина <> Неопределено Цикл // Добавлено 26.07.2011 из-за доработки синтаксического контроля в COM сеансе
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке.Причина;
|
||
КонецЦикла;
|
||
ОписаниеОшибки = ИнформацияОбОшибке.Описание;
|
||
|
||
RegExp.Pattern = "(?:Переменная не определена |Variable is not defined )\(([_0-9" + шБуква + "]+)\)";
|
||
Результат = RegExp.Execute(ОписаниеОшибки);
|
||
Если Результат.Count > 0 Тогда
|
||
ИмяПеременнойРезультата = Результат.Item(0).SubMatches(0);
|
||
Иначе
|
||
Если СообщитьНеобрабатываемуюОшибку Тогда
|
||
ирОбщий.СообщитьЛкс(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), СтатусСообщения.Важное);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ИмяПеременнойРезультата;
|
||
|
||
КонецФункции
|
||
|
||
Функция ИмяНеопределенногоМетодаИзИнформацииОбОшибке(ИнформацияОбОшибке, СообщитьНеобрабатываемуюОшибку = Ложь) Экспорт
|
||
|
||
Если ИнформацияОбОшибке <> Неопределено Тогда
|
||
RegExp.Global = Ложь;
|
||
//ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
Пока ИнформацияОбОшибке.Причина <> Неопределено Цикл // Добавлено 26.07.2011 из-за доработки синтаксического контроля в COM сеансе
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке.Причина;
|
||
КонецЦикла;
|
||
ОписаниеОшибки = ИнформацияОбОшибке.Описание;
|
||
|
||
RegExp.Pattern = "(?:Процедура или функция с указанным именем не определена |TODO_xxxx9469326459823 )\(([_0-9" + шБуква + "]+)\)";
|
||
Результат = RegExp.Execute(ОписаниеОшибки);
|
||
Если Результат.Count > 0 Тогда
|
||
ИмяМетодаРезультата = Результат.Item(0).SubMatches(0);
|
||
Иначе
|
||
Если СообщитьНеобрабатываемуюОшибку Тогда
|
||
ирОбщий.СообщитьЛкс(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), СтатусСообщения.Важное);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ИмяМетодаРезультата;
|
||
|
||
КонецФункции
|
||
|
||
#Если Клиент Или ВнешнееСоединение Тогда
|
||
|
||
// Выполняет алгоритм по ссылке.
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ВыполнитьАлгоритм(СсылкаАлгоритма, СтруктураПараметров = Неопределено) Экспорт
|
||
|
||
Если СтруктураПараметров = Неопределено Тогда
|
||
СтруктураПараметров = Новый Структура;
|
||
КонецЕсли;
|
||
АлгоритмОбъект = Неопределено;
|
||
Если Не КешАлгоритмов.Свойство(СсылкаАлгоритма, АлгоритмОбъект) Тогда
|
||
АлгоритмОбъект = СсылкаАлгоритма.ПолучитьОбъект();
|
||
КешАлгоритмов.Вставить(СсылкаАлгоритма, АлгоритмОбъект);
|
||
КонецЕсли;
|
||
Результат = ВыполнитьМетодАлгоритма(АлгоритмОбъект, 1, СтруктураПараметров);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура ОчиститьКешАлгоритмов(ОчиститьКэшНаДиске = Ложь) Экспорт
|
||
|
||
КешАлгоритмов.Очистить();
|
||
//КешВнешнихОбработокАлгоритмов.Очистить();
|
||
Если ОчиститьКэшНаДиске Тогда
|
||
//Для Каждого ЭлементПодкаталога Из СтруктураПодкаталоговФайловогоКэша Цикл
|
||
// УдалитьФайлы(ЭлементПодкаталога.Значение.ПолноеИмя, "*.dat");
|
||
// УдалитьФайлы(ЭлементПодкаталога.Значение.ПолноеИмя, "*.epf");
|
||
//КонецЦикла;
|
||
|
||
ФайлПодкаталога = СтруктураПодкаталоговФайловогоКэша["a"];
|
||
УдалитьФайлы(ФайлПодкаталога.ПолноеИмя + "\", "*.*");
|
||
ПроверитьСтруктуруФайловогоКэша();
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // ОчиститьКешАлгоритмов()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура ОбновитьАлгоритмВКеше(АлгоритмОбъект) Экспорт
|
||
|
||
КешАлгоритмов.Вставить(АлгоритмОбъект.Ссылка, АлгоритмОбъект);
|
||
|
||
КонецПроцедуры // УдалитьАлгоритмИзКеша()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Процедура _ПроверитьСоздатьФайлЗапаковщика1С(БыстраяПроверка = Ложь) Экспорт
|
||
|
||
Если Ложь
|
||
Или Не БыстраяПроверка
|
||
Или ФайлЗапаковщика1С = Неопределено
|
||
Тогда
|
||
ИмяФайла = "V8unpack.exe";
|
||
ФайлЗапаковщика1С = Новый Файл(ПапкаКешаВнешнихОбработокАлгоритмов.ПолноеИмя + "\" + ИмяФайла);
|
||
Если Не ФайлЗапаковщика1С.Существует() Тогда
|
||
ДанныеМакета = ПолучитьМакет("v8unpack");
|
||
ЗаписатьМакетСУчетомМаскировки(ДанныеМакета, ФайлЗапаковщика1С.ПолноеИмя);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или Не БыстраяПроверка
|
||
Или ФайлБиблиотекиЗапаковщика = Неопределено
|
||
Тогда
|
||
ФайлБиблиотекиЗапаковщика = Новый Файл(ПапкаКешаВнешнихОбработокАлгоритмов.ПолноеИмя + "\Zlib1.dll");
|
||
Если Не ФайлБиблиотекиЗапаковщика.Существует() Тогда
|
||
ДанныеМакета = ПолучитьМакет("Zlib1");
|
||
ЗаписатьМакетСУчетомМаскировки(ДанныеМакета, ФайлБиблиотекиЗапаковщика.ПолноеИмя);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // ПроверитьСоздатьФайлЗапаковщика1С()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьФайлОткрывателя1С(БыстраяПроверка = Истина) Экспорт
|
||
|
||
Если Ложь
|
||
Или Не БыстраяПроверка
|
||
Или ФайлОткрывателя1С = Неопределено
|
||
Тогда
|
||
ФайлОткрывателя1С = Новый Файл(ПолучитьИмяВременногоФайла("exe"));
|
||
ПолучитьМакет("OpenIn1Cv8").Записать(ФайлОткрывателя1С.ПолноеИмя);
|
||
КонецЕсли;
|
||
Возврат ФайлОткрывателя1С;
|
||
|
||
КонецФункции // ПолучитьФайлОткрывателя1С()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПолучитьФайлРаспаковщикаZIP(БыстраяПроверка = Ложь) Экспорт
|
||
|
||
Если Ложь
|
||
Или Не БыстраяПроверка
|
||
Или ФайлРаспаковщикаZIP = Неопределено
|
||
Тогда
|
||
ФайлРаспаковщикаZIP = Новый Файл(ПолучитьИмяВременногоФайла("exe"));
|
||
ПолучитьМакет("unzip").Записать(ФайлРаспаковщикаZIP.ПолноеИмя);
|
||
КонецЕсли;
|
||
Возврат ФайлРаспаковщикаZIP;
|
||
|
||
КонецФункции // ПолучитьФайлРаспаковщикаZIP()
|
||
|
||
// Получает из длинного пути к файлу короткий в формате DOS (8.3)
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмяФайла – Строка;
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка;
|
||
//
|
||
Функция ПолучитьИмяФайлаВФорматеDOS(ПолноеИмяФайла) Экспорт
|
||
|
||
Если VBScript = Неопределено Тогда
|
||
VBScript = Новый COMОбъект("MSScriptControl.ScriptControl");
|
||
VBScript.language = "vbscript";
|
||
КонецЕсли;
|
||
VBScript.addcode("
|
||
|Public Function GetShortPath()
|
||
|Set fso = CreateObject(""scripting.filesystemobject"")
|
||
|Set fsoFile = fso.GetFile(""" + ПолноеИмяФайла + """)
|
||
|GetShortPath = fsoFile.ShortPath
|
||
|End Function
|
||
|");
|
||
DOSИмя = VBScript.Run("GetShortPath");
|
||
Возврат DOSИмя;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Процедура ЗаписатьМакетСУчетомМаскировки(ДанныеМакета, ПолноеИмя)
|
||
|
||
ДанныеМакета.Записать(ПолноеИмя);
|
||
|
||
КонецПроцедуры // ЗаписатьМакетСУчетомМаскировки()
|
||
|
||
// <Описание процедуры>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Процедура УдалитьСлужебныеФайлы() Экспорт
|
||
|
||
СтруктураЦикла = Новый Массив;
|
||
СтруктураЦикла.Добавить(ШаблоныВнешнейОбработки);
|
||
СтруктураЦикла.Добавить(ШаблоныВнешнейОбработкиСМакетом);
|
||
Для Каждого ЭлементЦикла Из СтруктураЦикла Цикл
|
||
Для Каждого КлючИЗначение Из ЭлементЦикла Цикл
|
||
ШаблонВнешнейОбработки = КлючИЗначение.Значение;
|
||
Если ШаблонВнешнейОбработки.ФайлЗамок <> Неопределено Тогда
|
||
ШаблонВнешнейОбработки.ФайлЗамок.Закрыть();
|
||
Попытка
|
||
УдалитьФайлы(ШаблонВнешнейОбработки.Путь + ".lck");
|
||
УдалитьФайлы(ШаблонВнешнейОбработки.Путь);
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // УдалитьСлужебныеФайлы()
|
||
|
||
// Получает уникальную строку, подходящую для именования элемента структуры.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка.
|
||
//
|
||
Функция ПолучитьНовоеУникальноеИмя() Экспорт
|
||
|
||
Результат = "_" + ИдентификаторИзПредставленияЛкс(Новый УникальныйИдентификатор);
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьНовоеУникальноеИмя()
|
||
|
||
Функция ПолучитьКартинкуТипа()
|
||
|
||
Если КартинкиТипов = Неопределено Тогда
|
||
КартинкиТипов = Новый ТаблицаЗначений;
|
||
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
#КонецЕсли
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция мПолучитьПредставлениеПустогоЗначения(ПустоеЗначение) Экспорт
|
||
|
||
Если ПустоеЗначение = Неопределено Тогда
|
||
Результат = "<Неопределено>";
|
||
Иначе
|
||
Результат = мКэшПустыхЗначений[ПустоеЗначение];
|
||
Если Результат = Неопределено Тогда
|
||
Если ПустоеЗначение = Null Тогда
|
||
Результат = "<Null>";
|
||
ИначеЕсли ТипЗнч(ПустоеЗначение) = Тип("Булево") И ПустоеЗначение = Ложь Тогда
|
||
//Результат = "<Булево: Нет>";
|
||
Результат = "" + ПустоеЗначение;
|
||
ИначеЕсли ПустоеЗначение = "" Тогда
|
||
Результат = "<Строка>";
|
||
ИначеЕсли ПустоеЗначение = 0 Тогда
|
||
//Результат = "<Пустое число>";
|
||
Результат = Формат(ПустоеЗначение, "ЧН=");
|
||
ИначеЕсли ПустоеЗначение = Дата("00010101") Тогда
|
||
Результат = "<Дата>";
|
||
ИначеЕсли ТипЗнч(ПустоеЗначение) = Тип("УникальныйИдентификатор") Тогда
|
||
Результат = "<Идентификатор>";
|
||
Иначе
|
||
ОбъектМД = ирОбщий.ПолучитьМетаданныеЛкс(ПустоеЗначение);
|
||
Если ОбъектМД <> Неопределено Тогда
|
||
Результат = "<" + ОбъектМД.ПолноеИмя() + ".Ссылка>";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
мКэшПустыхЗначений[ПустоеЗначение] = Результат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ПолучитьПредставлениеПустогоЗначения()
|
||
|
||
// Возвращает текущее время в миллисекундах.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Число.
|
||
//
|
||
Функция ПолучитьТекущееВремяВМиллисекундах() Экспорт
|
||
|
||
Если ПолучитьWinAPI() <> Неопределено Тогда
|
||
Результат = WinAPI.timeGetTime();
|
||
КонецЕсли;
|
||
Если Результат = Неопределено Тогда
|
||
Если ирКэш.НомерИзданияПлатформыЛкс() >= "83" Тогда
|
||
Результат = Вычислить("ТекущаяУниверсальнаяДатаВМиллисекундах()");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Результат = Неопределено Тогда
|
||
Если JavaScript = Неопределено Тогда
|
||
Попытка
|
||
JavaScript = Новый COMОбъект("MSScriptControl.ScriptControl");
|
||
Исключение
|
||
ирОбщий.СообщитьЛкс("Ошибка создания MSScriptControl.ScriptControl: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
|
||
Возврат 0;
|
||
КонецПопытки;
|
||
JavaScript.Language = "javascript";
|
||
КонецЕсли;
|
||
Результат = JavaScript.Eval("new Date().getTime()");
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПроверитьПолучитьОбъектСервиса(Знач АлгоритмОбъект) Экспорт
|
||
|
||
Если ТипЗнч(АлгоритмОбъект) = Тип("СтрокаТаблицыЗначений") Тогда
|
||
лОбъект = АлгоритмОбъект.ЭтотОбъект;
|
||
Если лОбъект = Неопределено Тогда
|
||
лОбъект = АлгоритмОбъект.Ссылка.ПолучитьОбъект();
|
||
ЗаполнитьЗначенияСвойств(лОбъект, АлгоритмОбъект, , "ЭтотОбъект, Ссылка, мПолнаяТаблицаПараметров"); ////%!%
|
||
АлгоритмОбъект.ЭтотОбъект = лОбъект;
|
||
КонецЕсли;
|
||
АлгоритмОбъект = лОбъект;
|
||
КонецЕсли;
|
||
Возврат АлгоритмОбъект;
|
||
|
||
КонецФункции // ПроверитьПолучитьОбъектСервиса()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>;
|
||
// <Значение2> – <Тип.Вид> – <описание значения>
|
||
// <продолжение описания значения>.
|
||
//
|
||
Функция ПредставлениеИнформацииОбОшибке(Знач ИнформацияОбОшибке) Экспорт
|
||
|
||
// Антибаг платформы. В описании повторяется причина и описание между уровнями. В общем бардак.
|
||
ОписаниеОшибки = ИнформацияОбОшибке.Описание;
|
||
Если ИнформацияОбОшибке.Причина <> Неопределено Тогда
|
||
Пока Истина
|
||
И ИнформацияОбОшибке.Причина <> Неопределено
|
||
И ИнформацияОбОшибке.Описание = ОписаниеОшибки
|
||
Цикл
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке.Причина;
|
||
КонецЦикла;
|
||
Если ИнформацияОбОшибке.Описание <> ОписаниеОшибки Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + ПредставлениеИнформацииОбОшибке(ИнформацияОбОшибке);
|
||
КонецЕсли;
|
||
Иначе
|
||
Фрагмент = ирОбщий.ПоследнийФрагментЛкс(ОписаниеОшибки, "по причине:" + Символы.ПС);
|
||
Позиция = Найти(ОписаниеОшибки, Фрагмент + Символы.ПС + "по причине:" + Символы.ПС + Фрагмент);
|
||
Если Позиция > 0 Тогда
|
||
ОписаниеОшибки = Лев(ОписаниеОшибки, Позиция) + Фрагмент;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ОписаниеОшибки;
|
||
|
||
КонецФункции // ПредставлениеИнформацииОбОшибке()
|
||
|
||
// <Описание функции>
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Функция ОбработатьВнешнееИсключениеАлгоритма(ДескрипторСервиса, ИнформацияОбОшибке, РежимВыполненияАлгоритма, Интерактивно = Истина) Экспорт
|
||
|
||
//СервисОбъект = ПроверитьПолучитьОбъектСервиса(ДескрипторСервиса);
|
||
// Такой прием применен для избежания обращения к БД внутри сломанной транзакции
|
||
Если ТипЗнч(ДескрипторСервиса) = Тип("СтрокаТаблицыЗначений") Тогда
|
||
лОбъект = ДескрипторСервиса.ЭтотОбъект;
|
||
Если лОбъект = Неопределено Тогда
|
||
//лОбъект = Справочники.Сервисы2iS.СоздатьЭлемент();
|
||
//ЗаполнитьЗначенияСвойств(лОбъект, ДескрипторСервиса, , "ЭтотОбъект, Ссылка, КэшПараметров");
|
||
лОбъект = Новый ("СправочникОбъект.Сервисы2iS");
|
||
ЗаполнитьЗначенияСвойств(лОбъект, ДескрипторСервиса, "мЗначенияПоУмолчанию, мВнешниеПараметры, мВнутренниеПараметры");
|
||
КонецЕсли;
|
||
СервисОбъект = лОбъект;
|
||
Иначе
|
||
СервисОбъект = ДескрипторСервиса;
|
||
КонецЕсли;
|
||
|
||
Если РежимВыполненияАлгоритма = 3 Тогда
|
||
Смещение = СервисОбъект.ПолучитьСтартовуюСтрокуАлгоритмаВРежиме2();
|
||
ИмяМодуляСервиса = "";
|
||
ИначеЕсли РежимВыполненияАлгоритма = 2 Тогда
|
||
Смещение = СервисОбъект.ПолучитьСтартовуюСтрокуАлгоритмаВТексте();
|
||
ИмяМодуляСервиса = "";
|
||
ИначеЕсли Ложь
|
||
Или РежимВыполненияАлгоритма = 1
|
||
Или РежимВыполненияАлгоритма = 0
|
||
Тогда
|
||
Смещение = СервисОбъект.ПолучитьСтартовуюСтрокуМетодаВМодуле();
|
||
ИмяМодуляСервиса = "ВнешняяОбработка." + ДескрипторСервиса.Наименование;
|
||
Если Ложь
|
||
Или ирКэш.НомерИзданияПлатформыЛкс() = "82"
|
||
Или ирКэш.НомерИзданияПлатформыЛкс() = "83"
|
||
Тогда
|
||
ИмяМодуляСервиса = ИмяМодуляСервиса + ".МодульОбъекта";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ПрефиксСервиса = "Сервис ";
|
||
Если ИмяМодуляСервиса = ИнформацияОбОшибке.ИмяМодуля Тогда
|
||
НомерСтрокиАлгоритма = ИнформацияОбОшибке.НомерСтроки;
|
||
НомерСтрокиАлгоритма = НомерСтрокиАлгоритма - Смещение;
|
||
ОписаниеОшибки = ПрефиксСервиса + """" + ДескрипторСервиса.Наименование + """[" + РежимВыполненияАлгоритма + "]{"
|
||
+ НомерСтрокиАлгоритма + "}:" + Символы.ПС + "==========================================================================" + Символы.ПС
|
||
+ ИнформацияОбОшибке.Описание + Символы.ПС + ИнформацияОбОшибке.ИсходнаяСтрока;
|
||
Иначе
|
||
ОписаниеОшибки = ПрефиксСервиса + """" + ДескрипторСервиса.Наименование + """[" + РежимВыполненияАлгоритма + "]";
|
||
МаркерСлужебногоИсключения = "ВызватьИсключение Ошибка;//#Служебное";
|
||
Если Найти(ИнформацияОбОшибке.ИсходнаяСтрока, МаркерСлужебногоИсключения) = 0 Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + "{" + ИнформацияОбОшибке.ИмяМодуля + "(" + ИнформацияОбОшибке.НомерСтроки + ")}: ";
|
||
КонецЕсли;
|
||
ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + ИнформацияОбОшибке.Описание;
|
||
Если Найти(ИнформацияОбОшибке.ИсходнаяСтрока, МаркерСлужебногоИсключения) = 0 Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + ИнформацияОбОшибке.ИсходнаяСтрока;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ИнформацияОбОшибке.Причина <> Неопределено Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + "
|
||
|" + ПредставлениеИнформацииОбОшибке(ИнформацияОбОшибке.Причина);
|
||
КонецЕсли;
|
||
|
||
#Если Клиент Тогда
|
||
Если Интерактивно И ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов Тогда
|
||
Если Не ирКэш.ЛиПортативныйРежимЛкс() И ПравоДоступа("Просмотр", Метаданные.ОбщиеФормы.ирАдаптацияРасширения) Тогда
|
||
Если Истина
|
||
И ОтложенноеОткрытиеИсточникаОшибки.Количество() > 0
|
||
И ОтложенноеОткрытиеИсточникаОшибки[0].АлгоритмОбъект = Неопределено // СтопСтрока
|
||
Тогда
|
||
// Не подключаем отложенное открытие, т.к. уже внутри него. Случается при ПолученииДанных
|
||
Иначе
|
||
СтрокаИсточникаОшибки = ОтложенноеОткрытиеИсточникаОшибки.Добавить();
|
||
СтрокаИсточникаОшибки.АлгоритмОбъект = ДескрипторСервиса.Ссылка;
|
||
СтрокаИсточникаОшибки.ИнформацияОбОшибке = ИнформацияОбОшибке;
|
||
СтрокаИсточникаОшибки.РежимВыполненияАлгоритма = РежимВыполненияАлгоритма;
|
||
СтрокаИсточникаОшибки.Смещение = Смещение;
|
||
ПодключитьОбработчикОжидания("ОтложенноеОткрытиеИсточникаОшибки", 0.1, Истина);
|
||
КонецЕсли;
|
||
//Возврат Символы.ПС + ОписаниеОшибки;
|
||
Иначе
|
||
ирОбщий.СообщитьЛкс(ОписаниеОшибки, СтатусСообщения.Важное);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
Возврат ОписаниеОшибки;
|
||
|
||
КонецФункции // ОбработатьВнешнееИсключениеАлгоритма()
|
||
|
||
// Выполняет алгоритм по объекту.
|
||
//
|
||
// Параметры:
|
||
// <Параметр1> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>;
|
||
// <Параметр2> – <Тип.Вид> – <описание параметра>
|
||
// <продолжение описания параметра>.
|
||
//
|
||
Функция ВыполнитьМетодАлгоритма(ДескрипторСервиса, Режим, П0 = Null, П1 = Null, П2 = Null, П3 = Null, П4 = Null,
|
||
П5 = Null, П6 = Null, П7 = Null, П8 = Null, П9 = Null) Экспорт
|
||
|
||
//#Если Клиент Тогда
|
||
Если ВыполнятьАлгоритмыЧерезВнешниеОбработки Тогда
|
||
Если Ложь
|
||
Или ВнешняяОбработкаСервисы = Неопределено
|
||
Или ДескрипторСервиса.ИндивидуальнаяВнешняяОбработка
|
||
Тогда
|
||
ВнешняяОбработкаАлгоритма = ПолучитьВнешнююОбработкуПоАлгоритму(ДескрипторСервиса);
|
||
//Иначе
|
||
// ВнешняяОбработкаАлгоритма = ДескрипторСервиса.мСтруктураВнешнейОбработки;
|
||
// Если ВнешняяОбработкаАлгоритма = Неопределено Тогда
|
||
// ВнешняяОбработкаАлгоритма = ВнешняяОбработкаСервисы.ПолучитьФорму(ДескрипторСервиса.Наименование);
|
||
// ДескрипторСервиса.мСтруктураВнешнейОбработки = ВнешняяОбработкаАлгоритма;
|
||
// КонецЕсли;
|
||
//КонецЕсли;
|
||
Если ВнешняяОбработкаАлгоритма <> Неопределено Тогда
|
||
Если ФиксироватьВнешниеИсключенияАлгоритмов Тогда
|
||
Попытка
|
||
Результат = ВнешняяОбработкаАлгоритма.мМетод(ДескрипторСервиса, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9);
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
Ошибка = ОбработатьВнешнееИсключениеАлгоритма(ДескрипторСервиса, ИнформацияОбОшибке, 0);
|
||
ВызватьИсключение Ошибка;//#Служебное
|
||
КонецПопытки;
|
||
Иначе
|
||
Результат = ВнешняяОбработкаАлгоритма.мМетод(ДескрипторСервиса, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9);
|
||
КонецЕсли;
|
||
Иначе
|
||
//ирОбщий.СообщитьЛкс("Ошибка компиляции сервиса """ + ДескрипторСервиса.Наименование + """. Сервис не выполнен.", СтатусСообщения.Внимание);
|
||
ВызватьИсключение "Ошибка компиляции сервиса """ + ДескрипторСервиса.Наименование + """";
|
||
КонецЕсли;
|
||
Иначе
|
||
// Прямые вызовы
|
||
Если ФиксироватьВнешниеИсключенияАлгоритмов Тогда
|
||
Попытка
|
||
Результат = Вычислить("ВнешняяОбработкаСервисы._" + ДескрипторСервиса.Наименование
|
||
+ "(ДескрипторСервиса, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9)");
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
Ошибка = ОбработатьВнешнееИсключениеАлгоритма(ДескрипторСервиса, ИнформацияОбОшибке, 0);
|
||
ВызватьИсключение Ошибка;//#Служебное
|
||
КонецПопытки;
|
||
Иначе
|
||
Результат = Вычислить("ВнешняяОбработкаСервисы._" + ДескрипторСервиса.Наименование
|
||
+ "(ДескрипторСервиса, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9)");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
//#КонецЕсли
|
||
//#Если Не Клиент И Не ВнешнееСоединение Тогда
|
||
//ДескрипторСервиса.ирПлатформа = ЭтотОбъект;
|
||
//#КонецЕсли
|
||
СервисОбъект = ПроверитьПолучитьОбъектСервиса(ДескрипторСервиса);
|
||
#Если Сервер И Не Сервер Тогда
|
||
СервисОбъект = Обработки.ирИмитаторАлгоритмОбъект.Создать();
|
||
#КонецЕсли
|
||
ТекстАлгоритмаСПараметрами = СервисОбъект.ПолучитьТелоМетода();
|
||
Если ФиксироватьВнешниеИсключенияАлгоритмов Тогда
|
||
Попытка
|
||
Результат = ирОбщий.ВыполнитьАлгоритм(ТекстАлгоритмаСПараметрами, СервисОбъект, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9);
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
Ошибка = ОбработатьВнешнееИсключениеАлгоритма(СервисОбъект, ИнформацияОбОшибке, 2);
|
||
ВызватьИсключение Ошибка;//#Служебное
|
||
КонецПопытки;
|
||
Иначе
|
||
Результат = ирОбщий.ВыполнитьАлгоритм(ТекстАлгоритмаСПараметрами, СервисОбъект, Режим, П0, П1, П2, П3, П4, П5, П6, П7, П8, П9);
|
||
КонецЕсли;
|
||
//#Если Клиент Тогда
|
||
КонецЕсли;
|
||
//#КонецЕсли
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ВыполнитьМетодАлгоритма()
|
||
|
||
// Получает новый экземпляр ком-объекта DynamicWrapperX.
|
||
//
|
||
// Параметры:
|
||
// Нет.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Com-объект, Неопределено.
|
||
//
|
||
Функция ПолучитьWinAPI() Экспорт
|
||
|
||
// Отключено из-за классификации HackTool со стороны Windows Defender
|
||
WinAPI = Неопределено;
|
||
Возврат WinAPI;
|
||
|
||
Если WinAPI = "НеИнициализирован" Тогда
|
||
#Если Клиент Или ВнешнееСоединение Тогда
|
||
WinAPI = ПолучитьCOMОбъектИзМакета("DynamicWrapperX", ИМЯ_КЛАССА_DynamicWrapperX);
|
||
#Иначе
|
||
// На сервере вызывало зависание. Пришлось отключить
|
||
WinAPI = Неопределено;
|
||
#КонецЕсли
|
||
Если WinAPI <> Неопределено Тогда
|
||
WinAPI.Register("KERNEL32.DLL", "Sleep", "i=h", "f=s");
|
||
//WinAPI.Register("KERNEL32.DLL", "GetTickCount64", "r=l", "f=s"); // обычный DynamicWrapper на x86 подключает, а этот - нет
|
||
WinAPI.Register("KERNEL32.DLL", "GetTickCount", "r=l", "f=s");
|
||
WinAPI.Register("KERNEL32.DLL", "GetProcessId", "i=l", "r=l", "f=s");
|
||
WinAPI.Register("KERNEL32.DLL", "GetCurrentProcessId", "r=l", "f=s");
|
||
WinAPI.Register("KERNEL32.DLL", "GetLastError", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "GetCurrentProcessId", "r=l", "f=s");
|
||
WinAPI.Register("KERNEL32.DLL", "GetCurrentThreadId", "f=s", "r=l");
|
||
WinAPI.Register("WINMM.DLL", "timeGetTime", "r=l", "f=s");
|
||
WinAPI.Register("WINMM.DLL", "timeBeginPeriod", "i=l", "r=l", "f=s");
|
||
WinAPI.Register("WINMM.DLL", "timeEndPeriod", "i=l", "r=l", "f=s");
|
||
|
||
WinAPI.Register("USER32.DLL", "GetForegroundWindow", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetActiveWindow", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetFocus", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "SetFocus", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "EnableWindow", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "SendMessage", "i=llll", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "PostMessage", "i=llll", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetWindowThreadProcessId", "i=ll", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "AttachThreadInput", "i=lll", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetKeyState", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetAsyncKeyState", "i=l", "f=s", "r=l");
|
||
|
||
// Clipboard
|
||
WinAPI.Register("USER32.DLL", "OpenClipboard", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "GetClipboardData", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "SetClipboardData", "i=ll", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "CloseClipboard", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "EmptyClipboard", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "IsClipboardFormatAvailable", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("USER32.DLL", "RegisterClipboardFormat", "i=s", "f=s", "r=l");
|
||
|
||
WinAPI.Register("KERNEL32.DLL", "GlobalLock", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "GlobalUnlock", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "GlobalAlloc", "i=ll", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "GlobalFree", "i=l", "r=l");
|
||
//Результат.Register("KERNEL32.DLL", "lstrlen", "i=l", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "lstrcpy", "i=ll", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "MultiByteToWideChar", "i=llllll", "f=s", "r=l");
|
||
WinAPI.Register("KERNEL32.DLL", "WideCharToMultiByte", "i=llllll", "f=s", "r=l");
|
||
Иначе
|
||
////#Если Клиент Тогда
|
||
////// Под пользователем ОС без админиских прав сразу после установки через regsvr32 /i компонента не создается почему то.
|
||
////// Нужно перезапускать приложение.
|
||
//Если Не ирКэш.Это64битныйПроцессЛкс() Тогда
|
||
// ирОбщий.СообщитьЛкс("Установлена новая компонента. Сеанс рекомендуется перезапустить", СтатусСообщения.Внимание);
|
||
//КонецЕсли;
|
||
//////ПрекратитьРаботуСистемы(Истина);
|
||
////#Иначе
|
||
//////ВызватьИсключение "Не удалось подключить компоненту расширения платформы";
|
||
////#КонецЕсли
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат WinAPI;
|
||
|
||
КонецФункции // ПолучитьWinAPI()
|
||
|
||
Функция ПолучитьНовыйВычислительРегулярныхВыражений(VBScript = Истина) Экспорт
|
||
|
||
Если VBScript Тогда
|
||
Результат = Новый COMОбъект("VBScript.RegExp");
|
||
Иначе
|
||
Результат = ПолучитьОбъектВнешнейКомпонентыИзМакета("V8RegEx", "V8RegEx");
|
||
КонецЕсли;
|
||
Результат.IgnoreCase = Истина;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИмяТипаCOMVariant(ReturnType) Экспорт
|
||
|
||
Перем ScrptCtrl;
|
||
|
||
ТекстМодуля = "
|
||
|Function getMemberReturn( ReturnType )
|
||
| Dim ret
|
||
| On Error Resume Next
|
||
| If ReturnType Is Nothing Then
|
||
| ret = """"
|
||
| ElseIf Not IsEmpty(ReturnType.TypedVariant) Then
|
||
| ff = ReturnType.TypedVariant
|
||
| ff.VariantInit()
|
||
| ret = ff.Name
|
||
| ElseIf Not ReturnType.TypeInfo Is Nothing Then
|
||
| ret = ReturnType.TypeInfo.Name
|
||
| Else
|
||
| ret = """"
|
||
| End If
|
||
| getMemberReturn = ret
|
||
|End Function";
|
||
ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
|
||
ScrptCtrl.Language = "vbscript";
|
||
Попытка
|
||
ScrptCtrl.AddCode(ТекстМодуля);
|
||
Исключение
|
||
ирОбщий.СообщитьЛкс(ScrptCtrl.Error.Description);
|
||
ирОбщий.СообщитьЛкс(ScrptCtrl.Error.Source);
|
||
ирОбщий.СообщитьЛкс(ScrptCtrl.Error.Text);
|
||
ирОбщий.СообщитьЛкс(ScrptCtrl.Error.Line);
|
||
КонецПопытки;
|
||
Результат = ScrptCtrl.Run("getMemberReturn", ReturnType);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
//ирПортативный Контейнер = Новый Структура();
|
||
//ирПортативный #Если Клиент Тогда
|
||
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
|
||
//ирПортативный #КонецЕсли
|
||
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
|
||
//ирПортативный Файл = Новый Файл(ИспользуемоеИмяФайла);
|
||
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(Файл.Путь, СтрДлина(Файл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
|
||
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
|
||
//ирПортативный КонецЕсли;
|
||
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
|
||
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
|
||
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
|
||
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
|
||
|
||
ИМЯ_КЛАССА_DynamicWrapperX = "DynamicWrapperX";
|
||
ИнициализацияОписанияОбщихТипов();
|
||
мМетаданные = Метаданные;
|
||
КэшОбъектов = Новый Соответствие;
|
||
мКэшПустыхЗначений = Новый Соответствие;
|
||
СисИнфо = Новый СистемнаяИнформация;
|
||
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения);
|
||
ВерсияПлатформы = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000 + Число(Фрагменты[2]);
|
||
Это2iS = Метаданные.ОбщиеМодули.Найти("Ядро2iS") <> Неопределено;
|
||
ЭтоИнтеграция = Метаданные.Справочники.Найти("иисМетаданные") <> Неопределено;
|
||
МаркерНачалаАлгоритма = "//НАЧАЛО.СЕРВИС" + Символы.ПС;
|
||
МаркерКонцаАлгоритма = "//КОНЕЦ_.СЕРВИС" + Символы.ПС;
|
||
мМаркерИмениЗапросаПакета = "{Запрос: ";
|
||
мМаркерИмениЧастиОбъединения = "{Выборка: ";
|
||
|
||
шБуква = "_ЁА-ЯA-Z";
|
||
шКомментарий = "//[^\n]*[\n$]";
|
||
шРазделитель = "(?:" + шКомментарий + "|\s|^|$)";
|
||
шGUID = "[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}";
|
||
шЧисло = "\d+(\.\d+)?";
|
||
шИндекс = "(\[[^\]\[]+?(?:(?:\[[^\]]+?\][^\]\[]*?)*)*\])";
|
||
//шСкобки = "(\([^\)\(]*?(?:(?:\([^\)]*?\)[^\)\(]*?)*)*\))";
|
||
шСкобки = "(\([^\(\)]*(?:\([^\(\)]*\)[^\(\)]*)*\))";
|
||
шИмя = "[" + шБуква + "][" + шБуква + "\d]*";
|
||
шБукваСРешеткой = "_ЁА-ЯA-Z#";
|
||
шИмяСРешеткой = "[" + шБукваСРешеткой + "][" + шБукваСРешеткой + "\d]*";
|
||
шИмяВременнойТаблицы = шИмяСРешеткой + "(?:\." + шИмяСРешеткой + ")*";
|
||
|
||
VBRegExp = ПолучитьНовыйВычислительРегулярныхВыражений(Истина);
|
||
ВложенностьИндикации = 0;
|
||
ИмяКластераСерверов = НСтр(СтрокаСоединенияИнформационнойБазы(), "Srvr");
|
||
ЭтоФайловаяБаза = ПустаяСтрока(ИмяКластераСерверов);
|
||
WshShell = Новый COMОбъект("WScript.Shell");
|
||
//JavaScript = Новый COMОбъект("MSScriptControl.ScriptControl");
|
||
//JavaScript.Language = "javascript";
|
||
//ВремяОбъект = JavaScript.Eval("new Date()");
|
||
ФиксироватьВнешниеИсключенияАлгоритмов = ирОбщий.ВосстановитьЗначениеЛкс("ФиксироватьВнешниеИсключенияАлгоритмов");
|
||
Если ФиксироватьВнешниеИсключенияАлгоритмов = Неопределено Тогда
|
||
ФиксироватьВнешниеИсключенияАлгоритмов = Истина;
|
||
КонецЕсли;
|
||
ФайловыйКэшАлгоритмовДопускаетРедактирование = ирОбщий.ВосстановитьЗначениеЛкс("ФайловыйКэшАлгоритмовДопускаетРедактирование");
|
||
Если ФайловыйКэшАлгоритмовДопускаетРедактирование = Неопределено Тогда
|
||
ФайловыйКэшАлгоритмовДопускаетРедактирование = Ложь;
|
||
КонецЕсли;
|
||
ВыполнятьАлгоритмыЧерезВнешниеОбработки = ирОбщий.ВосстановитьЗначениеЛкс("ВыполнятьАлгоритмыЧерезВнешниеОбработки");
|
||
Если ВыполнятьАлгоритмыЧерезВнешниеОбработки = Неопределено Тогда
|
||
// Антибаг http://partners.v8.1c.ru/forum/thread.jsp?id=861032#861032
|
||
ВыполнятьАлгоритмыЧерезВнешниеОбработки = Ложь;
|
||
КонецЕсли;
|
||
АвторегистрацияComКомпонент = ирОбщий.ВосстановитьЗначениеЛкс("АвторегистрацияComКомпонент");
|
||
Если АвторегистрацияComКомпонент = Неопределено Тогда
|
||
АвторегистрацияComКомпонент = Истина;
|
||
КонецЕсли;
|
||
ПерехватКлавиатурногоВводаВОбычномПриложении = ирОбщий.ВосстановитьЗначениеЛкс("ПерехватКлавиатурногоВводаВОбычномПриложении");
|
||
Если ПерехватКлавиатурногоВводаВОбычномПриложении = Неопределено Тогда
|
||
ПерехватКлавиатурногоВводаВОбычномПриложении = Метаданные.ОсновнойРежимЗапуска = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение;
|
||
КонецЕсли;
|
||
ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов = ирОбщий.ВосстановитьЗначениеЛкс("ирПлатформа.ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов");
|
||
Если ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов = Неопределено Тогда
|
||
ПоказыватьВнешниеИсключенияПриВыполненииАлгоритмов = Ложь;
|
||
КонецЕсли;
|
||
СинтаксическийКонтрольПередЗаписью = ирОбщий.ВосстановитьЗначениеЛкс("ирПлатформа.СинтаксическийКонтрольПередЗаписью");
|
||
Если СинтаксическийКонтрольПередЗаписью = Неопределено Тогда
|
||
СинтаксическийКонтрольПередЗаписью = Истина;
|
||
КонецЕсли;
|
||
|
||
Парсеры = Новый Структура;
|
||
ШаблоныВнешнейОбработки = Новый Соответствие;
|
||
ШаблоныВнешнейОбработкиСМакетом = Новый Соответствие;
|
||
ПроверитьСтруктуруФайловогоКэша();
|
||
ИмяФайлаПакера = "v8unpack.exe";
|
||
WinAPI = "НеИнициализирован";
|
||
//ПолучитьWinAPI();
|
||
МассивОбычныхЭлементовУправления = Новый Массив;
|
||
|
||
#Если Клиент Тогда
|
||
COMНавигатор = "НеИнициализирован";
|
||
|
||
ТаблицаСтатистикиВыбора = ирОбщий.ВосстановитьЗначениеЛкс("ирПлатформа.ТаблицаСтатистикиВыбора");
|
||
Если ТаблицаСтатистикиВыбора <> Неопределено Тогда
|
||
Если ТаблицаСтатистикиВыбора.Колонки.Найти("ЯзыкПрограммы") = Неопределено Тогда
|
||
ТаблицаСтатистикиВыбора = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ТаблицаСтатистикиВыбора = Неопределено Тогда
|
||
ТаблицаСтатистикиВыбора = Новый ТаблицаЗначений;
|
||
ТаблицаСтатистикиВыбора.Колонки.Добавить("ТипКонтекста");
|
||
ТаблицаСтатистикиВыбора.Колонки.Добавить("Слово");
|
||
ТаблицаСтатистикиВыбора.Колонки.Добавить("ЯзыкПрограммы");
|
||
ТаблицаСтатистикиВыбора.Колонки.Добавить("Рейтинг", Новый ОписаниеТипов("Число"));
|
||
КонецЕсли;
|
||
ОтложенноеОткрытиеИсточникаОшибки = Новый ТаблицаЗначений;
|
||
ОтложенноеОткрытиеИсточникаОшибки.Колонки.Добавить("АлгоритмОбъект");
|
||
ОтложенноеОткрытиеИсточникаОшибки.Колонки.Добавить("ИнформацияОбОшибке");
|
||
ОтложенноеОткрытиеИсточникаОшибки.Колонки.Добавить("РежимВыполненияАлгоритма");
|
||
ОтложенноеОткрытиеИсточникаОшибки.Колонки.Добавить("Смещение", Новый ОписаниеТипов("Число"));
|
||
СлужебнаяФорма = ПолучитьФорму("Служебная");
|
||
Если СлужебнаяФорма <> Неопределено Тогда // Для портативного режима управляемого приложения
|
||
СлужебноеПолеТекстовогоДокумента = СлужебнаяФорма.ЭлементыФормы.Добавить(Тип("ПолеТекстовогоДокумента"), "СлужебноеПолеТекстовогоДокумента", Ложь);
|
||
//СлужебноеПолеHtmlДокумента = СлужебнаяФорма.ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "СлужебноеПолеHTMLДокумента", Ложь); // Тяжелая операция
|
||
КонецЕсли;
|
||
|
||
МассивОбычныхЭлементовУправления.Добавить("Диаграмма");
|
||
МассивОбычныхЭлементовУправления.Добавить("ДиаграммаГанта");
|
||
МассивОбычныхЭлементовУправления.Добавить("Дендрограмма");
|
||
МассивОбычныхЭлементовУправления.Добавить("Индикатор");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеКалендаря");
|
||
МассивОбычныхЭлементовУправления.Добавить("Кнопка");
|
||
МассивОбычныхЭлементовУправления.Добавить("КолонкаТабличногоПоля"); // Возможно что то сломается. Добавил для возможности автоопределения объекта системы
|
||
МассивОбычныхЭлементовУправления.Добавить("КоманднаяПанель");
|
||
МассивОбычныхЭлементовУправления.Добавить("Надпись");
|
||
МассивОбычныхЭлементовУправления.Добавить("Панель");
|
||
МассивОбычныхЭлементовУправления.Добавить("Переключатель");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеГрафическойСхемы");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеГеографическойСхемы");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеТабличногоДокумента");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеHTMLДокумента");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеТекстовогоДокумента");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеВвода");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеВыбора");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеСписка");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолеКартинки");
|
||
МассивОбычныхЭлементовУправления.Добавить("ПолосаРегулирования");
|
||
МассивОбычныхЭлементовУправления.Добавить("Разделитель");
|
||
МассивОбычныхЭлементовУправления.Добавить("РамкаГруппы");
|
||
МассивОбычныхЭлементовУправления.Добавить("СводнаяДиаграмма");
|
||
МассивОбычныхЭлементовУправления.Добавить("СтраницаПанели"); // Возможно что то сломается. Добавил для возможности автоопределения объекта системы
|
||
МассивОбычныхЭлементовУправления.Добавить("ТабличноеПоле");
|
||
МассивОбычныхЭлементовУправления.Добавить("Флажок");
|
||
|
||
мМассивТиповЭлементовУправления = Новый Массив;
|
||
Для Каждого ИмяТипа Из МассивОбычныхЭлементовУправления Цикл
|
||
мМассивТиповЭлементовУправления.Добавить(Тип(ИмяТипа));
|
||
КонецЦикла;
|
||
СодержанияАрхивовСправки = Новый Соответствие;
|
||
#КонецЕсли
|
||
|
||
МассивУправляемыхЭлементовУправления = Новый Массив;
|
||
МассивУправляемыхЭлементовУправления.Добавить("ПолеФормы");
|
||
МассивУправляемыхЭлементовУправления.Добавить("КнопкаФормы");
|
||
МассивУправляемыхЭлементовУправления.Добавить("ТаблицаФормы");
|
||
МассивУправляемыхЭлементовУправления.Добавить("ГруппаФормы");
|
||
МассивУправляемыхЭлементовУправления.Добавить("ДекорацияФормы");
|
||
|
||
мМассивТиповВключающихМетаданные = Новый Массив;
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ОбъектМетаданных"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("КоллекцияОбъектовМетаданных")); // 31.10.2020
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("КоллекцияДвижений")); // 31.10.2020
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ОписанияСтандартныхРеквизитов")); // 31.10.2020
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("СписокПолей")); // 31.10.2020
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("Структура"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ФиксированнаяСтруктура"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ТаблицаЗначений"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ДеревоЗначений"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("СтрокаТаблицыЗначений"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("СтрокаДереваЗначений"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ВыборкаИзРезультатаЗапроса"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("РезультатЗапроса"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("Отбор"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("НастройкаОформления"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("COMОбъект"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ОбъектXDTO"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("СвойствоXDTO"));
|
||
//мМассивТиповВключающихМетаданные.Добавить(Тип("ОбщийМодуль"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ПостроительЗапроса"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ПостроительОтчета"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ПоляНастройки"));
|
||
#Если Клиент Тогда
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ТабличноеПоле"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("Панель"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("КнопкаКоманднойПанели"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("КоманднаяПанель"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("Форма"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("УправляемаяФорма"));
|
||
мМассивТиповВключающихМетаданные.Добавить(Тип("ПолеВвода"));
|
||
#КонецЕсли
|
||
|
||
мТаблицаСтруктурТипа = Новый ТаблицаЗначений;
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("ИмяОбщегоТипа", Новый ОписаниеТипов("Строка"));
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("Метаданные");
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("СтрокаОписания");
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("ТипЯзыка", Новый ОписаниеТипов("Строка"));
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("ВиртуальнаяТаблица");
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("Конструктор", Новый ОписаниеТипов("Булево"));
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("ДополнительныеТипы");
|
||
мТаблицаСтруктурТипа.Колонки.Добавить("ДержательМетаданных");
|
||
|
||
//#Если Клиент Или ВнешнееСоединение Тогда
|
||
|
||
СубПутьКФайлуПотокаМодуляВнешнейОбработки = "1ad4dbd4-e136-4202-8121-02c33ad2af45.0.data.und.unp\text.data";
|
||
СубПутьКФайлуПотокаМакетаВнешнейОбработки = "902f74d3-f929-4b0f-8719-4cbb655891aa.0.data.und";
|
||
СубПутьКФайлуПотокаЗаголовкаВнешнейОбработки = "4eb1cc18-835d-4f8c-a120-3f9d886d75d4.data.und";
|
||
СубПутьККонтрольномуФайлуВнешнейОбработки = "1ad4dbd4-e136-4202-8121-02c33ad2af45.0.data";
|
||
|
||
//КешВнешнихОбработокАлгоритмов = Новый Структура;
|
||
|
||
КешАлгоритмов = Новый Структура;
|
||
ТаблицаТиповМетаОбъектов = ирКэш.ТипыМетаОбъектов();
|
||
МакетыКомпонент = Новый Структура;
|
||
МаркерКоллекцииОбъектовМетаданных = "КоллекцияОбъектовМетаданных";
|
||
МаркерОбъектаМетаданных = "ОбъектМетаданных";
|
||
МассивИсключенийИменКоллекций = Новый СписокЗначений;
|
||
МассивИсключенийИменКоллекций.Добавить("Свойства");
|
||
МассивИсключенийИменКоллекций.Добавить("Методы");
|
||
МассивИсключенийИменКоллекций.Добавить("");
|
||
|
||
СоответствиеВидовСравнения = Новый ТаблицаЗначений;
|
||
СоответствиеВидовСравнения.Колонки.Добавить("Построитель");
|
||
СоответствиеВидовСравнения.Колонки.Добавить("Компоновка");
|
||
СоответствиеВидовСравнения.Колонки.Добавить("Имя");
|
||
СоответствиеВидовСравнения.Индексы.Добавить("Построитель");
|
||
СоответствиеВидовСравнения.Индексы.Добавить("Компоновка");
|
||
//Интервал
|
||
//ИнтервалВключаяГраницы
|
||
//ИнтервалВключаяНачало
|
||
//ИнтервалВключаяОкончание
|
||
СоответствиеВидовСравнения.Добавить().Имя = "Больше";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "БольшеИлиРавно";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "ВИерархии";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "ВСписке";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "ВСпискеПоИерархии";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "Меньше";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "МеньшеИлиРавно";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "НеВИерархии";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "НеВСписке";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "НеВСпискеПоИерархии";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "НеРавно";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "НеСодержит";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "Равно";
|
||
СоответствиеВидовСравнения.Добавить().Имя = "Содержит";
|
||
Для Каждого СтрокаСоответствия Из СоответствиеВидовСравнения Цикл
|
||
СтрокаСоответствия.Построитель = Вычислить("ВидСравнения." + СтрокаСоответствия.Имя);
|
||
СтрокаСоответствия.Компоновка = Вычислить("ВидСравненияКомпоновкиДанных." + СтрокаСоответствия.Имя);
|
||
КонецЦикла;
|
||
|
||
мТаблицаЗамеров = Новый ТаблицаЗначений;
|
||
мТаблицаЗамеров.Колонки.Добавить("_0");
|
||
мТаблицаЗамеров.Колонки.Добавить("Ключ");
|
||
мТаблицаЗамеров.Колонки.Добавить("ДатаНачала");
|
||
мТаблицаЗамеров.Колонки.Добавить("Отладчик", Новый ОписаниеТипов("Булево"));
|
||
мТаблицаЗамеров.Колонки.Добавить("КоличествоПроходов", Новый ОписаниеТипов("Число"));
|
||
|
||
мТаблицаИндикаторов = Новый ТаблицаЗначений;
|
||
мТаблицаИндикаторов.Колонки.Добавить("КоличествоПроходов", Новый ОписаниеТипов("Число"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("ПредставлениеПроцесса", Новый ОписаниеТипов("Строка"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("ЛиВыводитьВремя", Новый ОписаниеТипов("Булево"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("РазрешитьПрерывание", Новый ОписаниеТипов("Булево"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("ДатаНачалаПроцесса", Новый ОписаниеТипов("Дата"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("МинимальныйПериодОбновления", Новый ОписаниеТипов("Число"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("ДатаСледующегоОбновления", Новый ОписаниеТипов("Дата"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("Шаг", Новый ОписаниеТипов("Число"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("ТекстСостояния", Новый ОписаниеТипов("Строка"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("СледующийСчетчик", Новый ОписаниеТипов("Число"));
|
||
мТаблицаИндикаторов.Колонки.Добавить("Счетчик", Новый ОписаниеТипов("Число"));
|
||
|
||
//#КонецЕсли
|
||
RegExp = ПолучитьНовыйВычислительРегулярныхВыражений();
|
||
RegExp.IgnoreCase = Истина;
|
||
RegExp.MultiLine = Ложь;
|
||
RegExp2 = ПолучитьНовыйВычислительРегулярныхВыражений();
|
||
RegExp2.IgnoreCase = Истина;
|
||
RegExp2.MultiLine = Ложь;
|
||
мИменаОсновныхКлассовБиблиотекCOM = Новый Соответствие;
|
||
мОбразцыCOMОбъектов = Новый Соответствие;
|
||
БуферыСравнения = Новый Соответствие;
|
||
СчетчикМодальныхФорм = Новый Массив;
|
||
ОтмененныеФоновыеЗадания = Новый Массив;
|
||
АсинхронностьЗапрещена = Ложь; |