//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; //////////////////////////////////////////////////////////////////////////////// // КОНТЕКСНАЯ ПОДСКАЗКА ПОЛЯ ТЕКСТОВОГО ДОКУМЕНТА #Если Клиент Тогда Перем ИмяКласса Экспорт; Перем СсылочнаяФормаКласса Экспорт; Перем ДопКнопкиКомандныхПанелей Экспорт; Перем СоответствиеЭУ Экспорт; Перем мФормаАвтодополнение Экспорт; Перем мФормаВызовМетода Экспорт; Перем RegExp; Перем СлужебноеПолеТекста Экспорт; Перем Парсер; Перем ШиринаТабуляции; Перем мПлатформа Экспорт; Перем ТаблицаЛокальногоКонтекста; Перем мНачальнаяСтрока Экспорт; // снаружи только для чтения Перем мНачальнаяКолонка Экспорт; // снаружи только для чтения Перем мКонечнаяСтрока Экспорт; // снаружи только для чтения Перем мКонечнаяКолонка Экспорт; // снаружи только для чтения Перем ТекущееНачалоСтроки; Перем ОригинальнаяСтрока; Перем ТекущийКонецСтроки; Перем НачалоКонтекста; Перем НачалоСлова; Перем КонецКонтекста; Перем ОригинальныйТекст; Перем ТекстБезКомментариевИОпасныхСтрок; Перем мТекстДляПоискаОпределения Экспорт; Перем мПозицияТекстаДляПоискаОпределения; Перем мРодительскийКонтекст; Перем мКонтекст; Перем мВызовМетода Экспорт; Перем мЭтоСтроковыйЛитерал Экспорт; Перем мЭтоОбъявлениеПсевдонима Экспорт; Перем мТекущееСлово; Перем мПредшествующийТекст Экспорт; Перем мНомерПараметра Экспорт; Перем мИмяМетода Экспорт; Перем мЭтоКонструктор Экспорт; Перем мФактическиеПараметры Экспорт; Перем мПервыйПараметр; Перем мРазбиратьКонтекст; Перем МассивЗащитыОтРекурсии; Перем мАвтоКонтекстнаяПомощь Экспорт; Перем мРасширенноеПолучениеМетаданныхADO Экспорт; Перем ПравилаВычисленияФункций; Перем мПоследнийРежимВызоваСправки; Перем мИменаОбщихТиповПоИменамКлассовCOM; Перем мПарсер; Перем мДиалектSQL Экспорт; Перем мДиалектыSQL Экспорт; Перем мПараметрыДиалектаSQL Экспорт; Перем мПрефиксыПараметров Экспорт; Перем мМаркерСлужебногоКомментария Экспорт; Перем мОткрытьСправкуПоПараметру Экспорт; // снаружи только для чтения Перем мМодульМетаданных Экспорт; Перем мСтруктурыТиповПодсказкиУдержания; Перем МассивКомКлассов; Перем мКонкретныйТипКонтекста; Перем мСтруктураТипаКонтекста; Перем мТолькоСсылочныеИменаТипов; Перем enableBeforeShowSuggestEvent; Перем АвтоматическаяПодсказкаПоВызовуМетода Экспорт; Перем АвтоматическаяПодсказкаАвтодополненияHTML Экспорт; Перем ПоказыватьВсеТипыВСпискеАвтодополненияHTML Экспорт; Перем мСоответствиеТиповСловHTML; Перем шЧисло; Перем шЛюбой; Перем шБуква; Перем шСтрокаПрограммы Экспорт; Перем шНачалоСтрокиПрограммы; Перем шСтрокаЗапроса; Перем шИндекс; Перем шСкобки; Перем шНачалоСкобок; Перем шИмя; Перем шИмяСкобки; Перем шПараметрЗапроса; Перем шПредИмя; Перем шИЗ; Перем шРазделитель; Перем шВыражениеПрограммы; Перем шВыражениеЗапроса; Перем шВызовМетодаПрограммы; Перем шВызовМетодаЗапроса; Перем шПока; Перем шЕсли; Перем шВызватьИсключение; Перем шНачалоТокена; Перем шКонецТокена; Перем шКомментарий; Перем шПрисваивание; Перем шПоискОписанияТаблицы; // Инициализирует экземпляр класса. // // Параметры: // *СтруктураЭкземляров - Структура, *Неопределено - содержит все объекты данного класса для данной формы; // пФорма - Форма - владелец элементов управления; // пПолеТекстовогоДокумента – ПолеТекста; // *пКоманднаяПанель – КоманднаяПанель, *Неопределено – в конце которой будут размещены кнопки; // *пЛиЯзыкЗапросов - Булево, *Ложь - режим языка запросов, иначе внутренний язык; // *пМетодВыполнения - Строка, *"" - имя метода выполнения программного кода; // *пКонтекстВыполнения - Тип, Запрос, Произвольный, *Неопределено - контекст выполнения программного кода или текста запроса; // *пТипТекста - Строка, *"Алгоритм" - "Алгоритм" или "Выражение". // Процедура ИнициализироватьНеинтерактивно(пЯзыкПрограммы = 0, пМетодВыполнения = "", пКонтекстВыполнения = Неопределено, пТипТекста = "Алгоритм", пКонфигурация = Неопределено, пПолеТекстовогоДокумента= Неопределено) Экспорт ЭтотОбъект.ЯзыкПрограммы = пЯзыкПрограммы; ЭтотОбъект.МетодВыполнения = пМетодВыполнения; ЭтотОбъект.ТипТекста = пТипТекста; ЭтотОбъект.ПолеТекста = ирОбщий.ОболочкаПоляТекстаЛкс(пПолеТекстовогоДокумента); УстановитьКонфигурациюМетаданных(пКонфигурация, пКонтекстВыполнения); ОчиститьТаблицуСловЛокальногоКонтекста(); мПрефиксыПараметров = мДиалектыSQL.Скопировать(, "ПрефиксПараметра"); мПрефиксыПараметров.Свернуть("ПрефиксПараметра"); мПрефиксыПараметров.ВыгрузитьКолонку(0); Если ЯзыкПрограммы = 1 Тогда Если КонтекстВыполнения = Неопределено Тогда КонтекстВыполнения = Новый ПостроительЗапроса; КонецЕсли; шПредИмя = "(?:[^&#?" + шБуква + "\d\.]|^)"; Иначе шПредИмя = "(?:[^" + шБуква + "\d\.]|^)"; КонецЕсли; Если МетодВыполнения = "" Тогда ЭтотОбъект.МетодВыполнения = "ВыполнитьЛокально"; КонецЕсли; Попытка ПроверитьПрограммныйКод(, ""); Исключение ирОбщий.СообщитьСУчетомМодальностиЛкс(ОписаниеОшибки()); ирОбщий.СообщитьСУчетомМодальностиЛкс("Задан неверный контекст выполнения программы. Будет использован общий контекст выполнения"); ЭтотОбъект.КонтекстВыполнения = ЭтотОбъект; ЭтотОбъект.МетодВыполнения = "ВыполнитьПрограмму"; КонецПопытки; КонецПроцедуры // Инициализирует экземпляр класса. // // Параметры: // *СтруктураЭкземляров - Структура, *Неопределено - содержит все объекты данного класса для данной формы; // пФорма - Форма - владелец элементов управления; // пПолеТекстовогоДокумента – ПолеТекста; // *пКоманднаяПанель – КоманднаяПанель, *Неопределено – в конце которой будут размещены кнопки; // *пЛиЯзыкЗапросов - Булево, *Ложь - режим языка запросов, иначе внутренний язык; // *пМетодВыполнения - Строка, *"" - имя метода выполнения программного кода; // *пКонтекстВыполнения - Тип, Запрос, Произвольный, *Неопределено - контекст выполнения программного кода или текста запроса; // *пТипТекста - Строка, *"Алгоритм" - "Алгоритм" или "Выражение". // Процедура Инициализировать(СтруктураЭкземляров = Неопределено, пФорма, пПолеТекстовогоДокумента, пКоманднаяПанель = Неопределено, пЯзыкПрограммы = 0, пМетодВыполнения = "", пКонтекстВыполнения = Неопределено, пТипТекста = "Алгоритм", пКонфигурация = Неопределено) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли мПлатформа.ПодключитьПерехватКлавиатуры(); СсылочнаяФормаКласса = Ложь; КоманднаяПанель = пКоманднаяПанель; УстановитьФормуВладельца(пФорма); ИнициализироватьНеинтерактивно(пЯзыкПрограммы, пМетодВыполнения, пКонтекстВыполнения, пТипТекста, пКонфигурация, пПолеТекстовогоДокумента); Имя = ПолеТекста.ЭлементФормы.Имя; Если КоманднаяПанель = Неопределено Тогда КоманднаяПанель = ФормаВладелец.ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КоманднаяПанель" + Имя, Ложь); ПолеТекста.ЭлементФормы.КонтекстноеМеню = КоманднаяПанель; КонецЕсли; ФормаКласса = мПлатформа.ПолучитьМакетКомпоненты(ЭтотОбъект); КнопкиМакета = ФормаКласса.ЭлементыФормы["КоманднаяПанель" + Формат(ЯзыкПрограммы, "ЧН=")].Кнопки; ирОбщий.ДобавитьКнопкиКоманднойПанелиКомпонентыЛкс(ЭтотОбъект, КнопкиМакета, КоманднаяПанель); КнопкиМакета = ФормаКласса.ЭлементыФормы.КоманднаяПанельОбщая.Кнопки; ирОбщий.ДобавитьКнопкиКоманднойПанелиКомпонентыЛкс(ЭтотОбъект, КнопкиМакета, КоманднаяПанель); Попытка ФормаВладелец.ПодключитьОбработчикОжидания("КлсПолеТекстаПрограммыАвтоОбновитьСправку", 100);; ФормаВладелец.ОтключитьОбработчикОжидания("КлсПолеТекстаПрограммыАвтоОбновитьСправку"); Исключение //КоманднаяПанель.Кнопки.Удалить(ирОбщий.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ЭтотОбъект, "АвтоКонтекстнаяПомощь")); Кнопка = ирОбщий.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ЭтотОбъект, "АвтоКонтекстнаяПомощь"); Кнопка.Доступность = Ложь; КонецПопытки; //ФайлШаблоновТекста = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ФайлШаблоновТекста"); //Если Ложь // Или ТипЗнч(ФайлШаблоновТекста) <> Тип("Строка") // Или ФайлШаблоновТекста = "" //Тогда // КнопкаВыполнитьШаблон = ирОбщий.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ЭтотОбъект, "ВыполнитьШаблон"); // КнопкаВыполнитьШаблон.Доступность = Ложь; // КнопкаВыполнитьШаблон.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.Нет); // Чтобы освободить сочетание клавиш //КонецЕсли; Если СтруктураЭкземляров <> Неопределено Тогда СтруктураЭкземляров.Вставить(Имя, ЭтотОбъект); КонецЕсли; КонецПроцедуры Процедура ИнициализироватьСсылочно(пФорма, мСвойстваФормы, пПолеТекстовогоДокумента, пКоманднаяПанель = Неопределено, пЯзыкПрограммы = 0, пМетодВыполнения = "", пКонтекстВыполнения = Неопределено, пТипТекста = "Алгоритм", пКонфигурация = Неопределено) Экспорт ИнициализироватьНеинтерактивно(пЯзыкПрограммы, пМетодВыполнения, пКонтекстВыполнения, пТипТекста); СсылочнаяФормаКласса = Истина; ПолеТекста = пПолеТекстовогоДокумента; КоманднаяПанель = пКоманднаяПанель; Имя = ПолеТекста.Имя; УстановитьФормуВладельца(пФорма); Если КоманднаяПанель = Неопределено Тогда КоманднаяПанель = ФормаВладелец.ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КоманднаяПанель" + Имя, Ложь); ПолеТекста.КонтекстноеМеню = КоманднаяПанель; КонецЕсли; мСвойстваФормы.Компоненты.Добавить(ЭтотОбъект); ФормаКласса = Вычислить("глПолучитьФормуКомпоненты(ЭтотОбъект)"); СоответствиеЭУ = Новый Соответствие; СоответствиеЭУ.Вставить(ПолеТекста, ФормаКласса.ЭлементыФормы.ПолеТекста); СоответствиеЭУ.Вставить(КоманднаяПанель, ФормаКласса.ЭлементыФормы.КП_Компонента); КонецПроцедуры // Инициализировать() Процедура УстановитьФормуВладельца(пФорма) Экспорт ФормаВладелец = пФорма; КонецПроцедуры // УстановитьВладельца() // Освобождает ресурсы занятые экземпляром класса. // Самое главное - очистить ссылки на формы и объекты БД. // // Параметры: // Нет. // Процедура Уничтожить() Экспорт Для Каждого Реквизит Из Метаданные().Реквизиты Цикл ЭтотОбъект[Реквизит.Имя] = Неопределено; КонецЦикла; Если мФормаВызовМетода <> Неопределено Тогда ЭтотОбъект.мФормаВызовМетода.ВладелецФормы = Неопределено; КонецЕсли; ЭтотОбъект.мФормаВызовМетода = Неопределено; Если ЭтотОбъект.мФормаАвтодополнение <> Неопределено Тогда ЭтотОбъект.мФормаАвтодополнение.ВладелецФормы = Неопределено; КонецЕсли; ЭтотОбъект.мФормаАвтодополнение = Неопределено; ОчиститьТаблицуСловЛокальногоКонтекста(); СохранитьСтатистикуВыбораПодсказки(); КонецПроцедуры Процедура СохранитьСтатистикуВыбораПодсказки() Экспорт ирОбщий.СохранитьЗначениеЛкс("ирПлатформа.ТаблицаСтатистикиВыбора", мПлатформа.ТаблицаСтатистикиВыбора); КонецПроцедуры Процедура ВнешнееСобытиеОбъекта(Источник, Событие, Данные) Экспорт Если Источник <> "KeyboardHook" Тогда Возврат; КонецЕсли; Если Ложь Или ФормаВладелец = Неопределено Или Не ирОбщий.Форма_ВводДоступенЛкс(ФормаВладелец) // Для поля HTML это затратно Тогда Возврат; КонецЕсли; ирОбщий.Форма_ВнешнееСобытиеЛкс(ФормаВладелец, Источник, Событие, Данные); //Формат строки данные: //Первые 5 символов десятичное число в котором закодированы двоичные данные //биты 0-7 - виртуальный код клавиши (http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx) //бит 08 - 1 = нажата расширенная клавиша //бит 09 - 1 = Правый alt //бит 10 - 1 = Левый alt //бит 11 - 1 = Правый ctrl //бит 12 - 1 = Левый ctrl //бит 13 - 1 = Правый shift //бит 14 - 1 = Левый shift // //6 символ и возможно следующие символы могут быть или не быть (максимальное количество 10) //Это результат интерпретации клавиши с учетом языковой раскладки. (http://msdn.microsoft.com/en-us/library/ms646320%28v=VS.85%29.aspx) // ПолученноеЧисло = Лев(Данные,5); ПолученноеЧисло = Число(ПолученноеЧисло); ВиртуальнаяКлавиша = ПолученноеЧисло % 256; ПолученноеЧисло = ПолученноеЧисло - ВиртуальнаяКлавиша; РасширеннаяКлавиша = ПолученноеЧисло % 512; ПолученноеЧисло = ПолученноеЧисло - РасширеннаяКлавиша; ПравыйАльт = ПолученноеЧисло % 1024; ПолученноеЧисло = ПолученноеЧисло - ПравыйАльт; ЛевыйАльт = ПолученноеЧисло % 2048; ПолученноеЧисло = ПолученноеЧисло - ЛевыйАльт; ПравыйСонтрол = ПолученноеЧисло % 4096; ПолученноеЧисло = ПолученноеЧисло - ПравыйСонтрол; ЛевыйСонтрол = ПолученноеЧисло % 8192; ПолученноеЧисло = ПолученноеЧисло - ЛевыйСонтрол; ПравыйШифт = ПолученноеЧисло % 16384; ПолученноеЧисло = ПолученноеЧисло - ПравыйШифт; ЛевыйШифт = ПолученноеЧисло; Если СтрДлина(Данные) > 5 Тогда Символ = Сред(Данные,6); Иначе Символ = ""; КонецЕсли; КодыКлавиш = ирКэш.КодыКлавишЛкс(); Если ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы Тогда Если Ложь Или Найти(Данные, КодыКлавиш["CTRL+ALT+Space"]) = 1 Тогда #Если Сервер И Не Сервер Тогда ОткрытьАвтодополнение(); #КонецЕсли ВыполнитьКоманду("ОткрытьАвтодополнение", Данные); КонецЕсли; // Подсказка по вызову метода Если Ложь Или ЛиДоступноОткрытиеСвободнойФормы() Или ТипЗнч(ПолеТекста.ЭлементФормы) = Тип("ПолеТекстовогоДокумента") Тогда Если Ложь Или Найти(Данные, КодыКлавиш["CTRL+SHIFT+Space"]) = 1 Тогда ВыполнитьКоманду("ПодсказатьПараметр"); КонецЕсли; ФормаВызовМетода = ФормаВызовМетода(); БылаОткрыта = ФормаВызовМетода.Открыта(); Если Истина И Не БылаОткрыта И ЛиДоступноОткрытиеСвободнойФормы() И (Ложь Или Символ = "(" Или Символ = ",") Тогда Если АвтоматическаяПодсказкаПоВызовуМетода() Тогда ВыполнитьКоманду("ПодсказатьПараметрАвто"); КонецЕсли; КонецЕсли; Если БылаОткрыта Тогда ОбновитьПодсказкуПоВызовуМетода(); КонецЕсли; Если Ложь Или Найти(Данные, КодыКлавиш["ALT+Up"]) = 1 Или Найти(Данные, КодыКлавиш["ALT+Down"]) = 1 //Или Найти(Данные, "04390") = 1 // CTRL+Up //Или Найти(Данные, "04392") = 1 // CTRL+Down Или Найти(Данные, КодыКлавиш["Esc"]) = 1 // Работает только в поле HTML документа. В остальных местах платформа делает полный перехват Тогда ФормаВызовМетода.ВнешнееСобытие(Источник, Событие, Данные); КонецЕсли; КонецЕсли; //Сообщить(Данные); КонецЕсли; КонецПроцедуры Процедура ОбновитьПодсказкуПоВызовуМетода() ФормаВызовМетода = ФормаВызовМетода(); Если Не ФормаВызовМетода.Открыта() Тогда Возврат; КонецЕсли; ФормаВызовМетода.ПараметрСтруктураТипаКонтекста = Неопределено; //Если Форма.Открыта() Тогда ФормаВызовМетода.ОбновитьИлиЗакрытьФорму(, Истина); //КонецЕсли; КонецПроцедуры Функция ЛиМожноЗакрытьФорму() Экспорт ФормаВызовМетода = ФормаВызовМетода(); Если ФормаВызовМетода.Открыта() Тогда ФормаВызовМетода.Закрыть(); Результат = Ложь; Иначе Результат = Истина; КонецЕсли; Возврат Результат; КонецФункции Функция ФормаВызовМетода() Экспорт Если мФормаВызовМетода = Неопределено Тогда мФормаВызовМетода = ПолучитьФорму("ВызовМетода", ФормаВладелец); КонецЕсли; Возврат мФормаВызовМетода; КонецФункции // Получает номер текущей строки в тексте (по конечной границе выделения). // // Параметры: // Нет. // // Возвращаемое значение: // Число. // Функция ПолучитьНомерТекущейСтроки(Начальной = Ложь) Экспорт Если ПолеТекста <> Неопределено Тогда ПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); Если Начальной Тогда Возврат мНачальнаяСтрока; Иначе Возврат мКонечнаяСтрока; КонецЕсли; Иначе Возврат Неопределено; КонецЕсли; КонецФункции // ПолучитьНомерТекущейСтроки() // Получает текущее объектное выражение (на котором установлен курсор). // // Параметры: // Нет. // // Возвращаемое значение: // Строка - объектное выражение, в котором находится курсов. // Функция ТекущееОбъектноеВыражение(НомерСтроки = 0, НомерКолонки = 0, выхЕстьТочкаСправа = Ложь, КончитьОбработкуКоманды = Истина) Экспорт Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда Возврат Неопределено; КонецЕсли; мПлатформа.ИнициализацияОписанияМетодовИСвойств(); КончитьОбработкуКоманды(); Если НомерСтроки > ПолеТекста.КоличествоСтрок() Тогда Возврат Неопределено; КонецЕсли; РазобратьТекущийКонтекст(, выхЕстьТочкаСправа,, НомерСтроки, НомерКолонки); Если КончитьОбработкуКоманды Тогда КончитьОбработкуКоманды(); КонецЕсли; Если мЭтоСтроковыйЛитерал Тогда мКонтекст = ""; КонецЕсли; Возврат мКонтекст; КонецФункции // Получает текущее контекст параметра. // // Параметры: // Нет. // // Возвращаемое значение: // Структура - // "ОбъектноеВыражение" // "НомерПараметра" // Функция ПолучитьТекущийКонтекстПараметра() Экспорт КончитьОбработкуКоманды(); РазобратьТекущийКонтекст(,, Истина); КончитьОбработкуКоманды(); СтруктураРезультата = Новый Структура; СтруктураРезультата.Вставить("ОбъектноеВыражение", мВызовМетода); СтруктураРезультата.Вставить("ПервыйПараметр", мПервыйПараметр); СтруктураРезультата.Вставить("НомерПараметра", мНомерПараметра); Возврат СтруктураРезультата; КонецФункции // Разбирает контекст метода. // // Параметры: // Нет. // Функция ТекущийКонтекстМетода() RegExp.Global = Истина; мКонтекст = ""; ОригинальныйТекст = ПолеТекста.ПолучитьТекст(); СлужебноеПолеТекста.УстановитьТекст(ОригинальныйТекст); ПредшествующийТекст = ""; СледующийТекст = ""; МаксЧислоПредшествующихСтрок = 20; // Чтобы снизить вероятность зацикливания при вычислении рег.выражения Если мКонечнаяСтрока > 1 Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(Макс(1, мКонечнаяСтрока - МаксЧислоПредшествующихСтрок - 1), 1, мКонечнаяСтрока - 1, 333); ПредшествующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; МаксНомерСтроки = Мин(СлужебноеПолеТекста.КоличествоСтрок(), мКонечнаяСтрока + 100); Если Истина И МаксНомерСтроки > 0 И МаксНомерСтроки <= СлужебноеПолеТекста.КоличествоСтрок() Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(мКонечнаяСтрока + 1, 1, МаксНомерСтроки, 333); СледующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; ТекстДоКурсора = ПредшествующийТекст + ТекущееНачалоСтроки; // Так почему то иногда возникало смещение на 1 символ ТекстПослеКурсора = ТекущийКонецСтроки + Символы.ПС + СледующийТекст; Если мЭтоСтроковыйЛитерал Тогда ТекстДоКурсора = ТекстДоКурсора + """"; ТекстПослеКурсора = """" + ТекстПослеКурсора; Если ирОбщий.ЛиВнутриСтроковогоЛитералаЛкс(ТекстПослеКурсора) Тогда ТекстПослеКурсора = ТекстПослеКурсора + """"; КонецЕсли; КонецЕсли; Если ЯзыкПрограммы = 0 Тогда ШаблонПараметра = "(?:" + шВыражениеПрограммы + ")?" + шРазделитель + "*"; Иначе ШаблонПараметра = "(?:" + шВыражениеЗапроса + ")?" + шРазделитель + "*"; КонецЕсли; RegExp.Global = Ложь; RegExp.MultiLine = Ложь; RegExp.Pattern = "^(?:" + ШаблонПараметра + ",)*" + ШаблонПараметра + "\)"; Результат = RegExp.НайтиВхождения(ТекстПослеКурсора); Если Результат.Количество() > 0 Тогда //КонецВыражения = Лев(ТекстПослеКурсора, Результат[0].Length); КонецВыражения = Результат[0].Value; КонецЕсли; RegExp.Global = Ложь; RegExp.MultiLine = Ложь; Если ЯзыкПрограммы = 1 Тогда RegExp.Pattern = шВызовМетодаЗапроса + "$"; Иначе RegExp.Pattern = шВызовМетодаПрограммы + "$"; КонецЕсли; Результат = RegExp.НайтиВхождения(ТекстДоКурсора + Лев(КонецВыражения, СтрДлина(КонецВыражения) - 1) + ","); //Результат = RegExp.НайтиВхождения(Лев(ОригинальныйТекст, СтрДлина(ТекстДоКурсора)+ СтрДлина(КонецВыражения) - 1) + ","); // Отрезаем последний символ зачем то мФактическиеПараметры = Новый Массив; Если Результат.Количество() > 0 Тогда //ПоследнееВхождение = Результат[Результат.Количество() - 1]; ПоследнееВхождение = Результат[0]; //ДлинаТекста = СтрДлина(ОригинальныйТекст); //Попытка // СлужебноеПолеТекста.УстановитьГраницыВыделения(ПоследнееВхождение.FirstIndex + 1, // Мин(ДлинаТекста, ПоследнееВхождение.FirstIndex + 1 + ПоследнееВхождение.Length)); //Исключение // СлужебноеПолеТекста.УстановитьГраницыВыделения(ПоследнееВхождение.FirstIndex + 1, // Мин(ДлинаТекста, ПоследнееВхождение.FirstIndex + 1 + ПоследнееВхождение.Length - 1)); // -1 надо делать из-за бага платформы (она не дает выделить последний символ в тексте) //КонецПопытки; //СлужебноеПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); мВызовМетода = ПоследнееВхождение.SubMatches(1) + "("; ТекстПараметров = ПоследнееВхождение.SubMatches(5) + ПоследнееВхождение.SubMatches(14); мЭтоКонструктор = ЗначениеЗаполнено(ПоследнееВхождение.SubMatches(0)); RegExp.Global = Истина; Если ЯзыкПрограммы = 0 Тогда ШаблонПараметра = "(" + шВыражениеПрограммы + ")?" ; Иначе ШаблонПараметра = "(" + шВыражениеЗапроса + ")?"; КонецЕсли; RegExp.Pattern = ШаблонПараметра + шРазделитель + "*,"; Результат = RegExp.НайтиВхождения(ТекстПараметров); ЛокальнаяПозицияКурсора = СтрДлина(ТекстПараметров) + 1 - СтрДлина(КонецВыражения); Счетчик = 0; Для Каждого Вхождение Из Результат Цикл Счетчик = Счетчик + 1; ПозицияВхождения = Вхождение.FirstIndex; Если Истина И (ПозицияВхождения + 1) <= ЛокальнаяПозицияКурсора И (ПозицияВхождения + Вхождение.Length + 1) >= ЛокальнаяПозицияКурсора Тогда мНомерПараметра = Счетчик; КонецЕсли; мФактическиеПараметры.Добавить(СокрЛП(Вхождение.SubMatches(0))); КонецЦикла; Если мФактическиеПараметры.Количество() > 0 Тогда мПервыйПараметр = мФактическиеПараметры[0]; КонецЕсли; мИмяМетода = ирОбщий.ПервыйФрагментЛкс(ирОбщий.ПоследнийФрагментЛкс(мВызовМетода), "("); СтруктураРезультата = Новый Структура; СтруктураРезультата.Вставить("ОбъектноеВыражение", мВызовМетода); СтруктураРезультата.Вставить("ОригинальныйТекст", Лев(ПоследнееВхождение.Value, СтрДлина(ПоследнееВхождение.Value) - 1) + ")"); СтруктураРезультата.Вставить("МассивПараметров", мФактическиеПараметры); СтруктураРезультата.Вставить("НомерПараметра", мНомерПараметра); СтруктураРезультата.Вставить("ЭтоКонструктор", мЭтоКонструктор); Возврат СтруктураРезультата; Иначе Возврат Неопределено; КонецЕсли; КонецФункции // Разбирает контекст метода. // // Параметры: // Нет. // Функция УстановитьТекущийКонтекстМетода(НовыйТекст) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); ВыделенныйТекст(НовыйТекст); ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мНачальнаяСтрока, мНачальнаяКолонка,, ФормаВладелец); КонецФункции // Разбирает контекст УК. // // Параметры: // Нет. // Функция ПолучитьТекущийКонтекстУК() Экспорт мПлатформа.ИнициализацияОписанияМетодовИСвойств(); ПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); RegExp.Global = Истина; ВыделитьНачалоИКонецТекущейСтроки(); ИмяСтруктурыПараметров = ""; ОригинальныйТекст = ПолеТекста.ПолучитьТекст(); СлужебноеПолеТекста.УстановитьТекст(ОригинальныйТекст); мПредшествующийТекст = ""; СледующийТекст = ""; Если мКонечнаяСтрока > 1 Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(1, 1, мКонечнаяСтрока - 1, 333); мПредшествующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; МаксНомерСтроки = Мин(СлужебноеПолеТекста.КоличествоСтрок(), мКонечнаяСтрока + 100); Если Истина И МаксНомерСтроки > 0 И МаксНомерСтроки <= СлужебноеПолеТекста.КоличествоСтрок() Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(мКонечнаяСтрока + 1, 1, МаксНомерСтроки, 333); СледующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; ТекстДоКурсора = мПредшествующийТекст + Символы.ПС + ТекущееНачалоСтроки; ТекстПослеКурсора = ТекущийКонецСтроки + Символы.ПС + СледующийТекст; ШаблонУК = "(" + шИмя + ")" + шРазделитель + "*=" + шРазделитель + "*УК\((" + шИмя + ")\)"; RegExp.Global = Ложь; RegExp.MultiLine = Ложь; RegExp.Pattern = "^" + "(" + шРазделитель + "*)" + ШаблонУК; Результат = RegExp.НайтиВхождения(ТекущееНачалоСтроки + ТекстПослеКурсора); Если Результат.Количество() > 0 Тогда Смещение = Результат[0].SubMatches(0); ИмяСтруктурыПараметров = Результат[0].SubMatches(1); МассивПараметров = Новый Массив; МассивПараметров.Добавить(Результат[0].SubMatches(2)); Иначе Возврат Неопределено; КонецЕсли; ШаблонПараметра = шРазделитель + "*" + ИмяСтруктурыПараметров + "\.(" + шИмя + ")" + шРазделитель + "*=" + шРазделитель + "*(" + шВыражениеПрограммы + ")?" + шРазделитель + "*" + ";"; RegExp.Pattern = "^" + "(" + шРазделитель + "*)" + ШаблонУК + ";" + "((?:" + ШаблонПараметра + шРазделитель + "*" + ")*)"; Результат = RegExp.НайтиВхождения(ТекущееНачалоСтроки + ТекстПослеКурсора); Если Результат.Количество() > 0 Тогда ПолныйТекстВыражения = Результат[0].Value; Иначе Возврат Неопределено; КонецЕсли; //RegExp.Global = Ложь; RegExp.MultiLine = Ложь; RegExp.Pattern = ШаблонУК + ";" + "((?:" + ШаблонПараметра + шРазделитель + "*" + ")*)$"; Результат = RegExp.НайтиВхождения(мПредшествующийТекст + ПолныйТекстВыражения); СтруктураПараметров = Новый Структура; Если Результат.Количество() > 0 Тогда ПоследнееВхождение = Результат[Результат.Количество() - 1]; Попытка СлужебноеПолеТекста.УстановитьГраницыВыделения(ПоследнееВхождение.FirstIndex + 1, ПоследнееВхождение.FirstIndex + 1 + ПоследнееВхождение.Length); Исключение СлужебноеПолеТекста.УстановитьГраницыВыделения(ПоследнееВхождение.FirstIndex + 1, ПоследнееВхождение.FirstIndex + 1 + ПоследнееВхождение.Length - 1); // -1 надо делать из-за бага платформы (она не дает выделить последний символ в тексте) КонецПопытки; СлужебноеПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); //ИмяСтруктурыПараметров = Результат[0].SubMatches(0); ТекстПараметров = ПоследнееВхождение.SubMatches(2); RegExp.Global = Истина; RegExp.Pattern = ШаблонПараметра; Результат = RegExp.НайтиВхождения(ТекстПараметров); //ЛокальнаяПозицияКурсора = СтрДлина(ТекстПараметров) - СтрДлина(ПолныйТекстВыражения); Счетчик = 0; Для Каждого Вхождение Из Результат Цикл Счетчик = Счетчик + 1; //Если Истина // И (Вхождение.FirstIndex + 1) <= ЛокальнаяПозицияКурсора // И (Вхождение.FirstIndex + Вхождение.Length + 1) >= ЛокальнаяПозицияКурсора //Тогда // мНомерПараметра = Счетчик; //КонецЕсли; СтруктураПараметров.Вставить(СокрЛП(Вхождение.SubMatches(0)), СокрЛП(Вхождение.SubMatches(1))); КонецЦикла; СтруктураРезультата = Новый Структура; СтруктураРезультата.Вставить("ИмяСтруктурыПараметров", ИмяСтруктурыПараметров); СтруктураРезультата.Вставить("МассивПараметров", МассивПараметров); СтруктураРезультата.Вставить("ОригинальныйТекст", ПоследнееВхождение.Value); СтруктураРезультата.Вставить("Смещение", Смещение); СтруктураРезультата.Вставить("СтруктураПараметров", СтруктураПараметров); СтруктураРезультата.Вставить("НомерПараметра", мНомерПараметра); Возврат СтруктураРезультата; Иначе Возврат Неопределено; КонецЕсли; КонецФункции Процедура НачатьОбработкуКоманды() мРазбиратьКонтекст = Ложь; КонецПроцедуры // Вызывается в конце обработки команды. // // Параметры: // Нет. // Процедура КончитьОбработкуКоманды() Экспорт мРазбиратьКонтекст = Истина; КонецПроцедуры // Находит первое вхождение слова в тексте. Если слово найдено, устанавливается выделение и фокус. // // Параметры: // СтрокаПоиска - - // СловоЦеликом - - // ПолеТекста - - // // Возвращаемое значение: // - Булево - была ли найдена и выделена строка // Функция НайтиПоказатьСловоВТексте(СтрокаПоиска, СловоЦеликом = Истина, ПолеТекста = Неопределено, УстановитьФокус = Ложь, ИскатьСНачала = Ложь) Экспорт Если ПолеТекста = Неопределено Тогда ПолеТекста = ЭтотОбъект.ПолеТекста; КонецЕсли; Результат = ирОбщий.НайтиПоказатьСтрокуВПолеТекстаЛкс(ФормаВладелец, ПолеТекста, СтрокаПоиска, СловоЦеликом, ИскатьСНачала); Если УстановитьФокус Тогда УстановитьФокус(); КонецЕсли; Возврат Результат; КонецФункции // Вставляет в текущую позицию поля текстового документа ссылку на объект БД. // // Параметры: // ЗначенияСвойствНового – Структура – если параметр будет добавлен, то к его строке будут применены эти значения свойств; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // // Возвращаемое значение: // – <Тип.Вид> – <описание значения> // <продолжение описания значения>; // <Значение2> – <Тип.Вид> – <описание значения> // <продолжение описания значения>. // Функция ВставитьСсылкуНаОбъектБД(ТабличноеПолеПараметров, ИмяКолонкиИмени = "Имя", ИмяКолонкиЗначения = "Значение", ИмяСтруктурыПараметров = "", ОбновитьКопиюСвойстваВНижнемРегистре = Ложь, НачальноеЗначениеВыбора = Неопределено, РазрешитьВыбор = Истина, ВставитьВТекст = Истина) Экспорт ТаблицаПараметров = ТабличноеПолеПараметров.Значение; ТекущееОбъектноеВыражение = ТекущееОбъектноеВыражение(); Если Истина И РазрешитьВыбор И НачальноеЗначениеВыбора = Неопределено И ВставитьВТекст Тогда Если Ложь Или ЯзыкПрограммы = 0 Или Лев(ТекущееОбъектноеВыражение, 1) = "&" Тогда ИмяПараметра = ТекущееОбъектноеВыражение; Если ЯзыкПрограммы = 1 Тогда ИмяПараметра = Сред(ИмяПараметра, 2); Иначе Если Истина И Не ПустаяСтрока(ИмяСтруктурыПараметров) И Найти(НРег(ИмяПараметра), НРег(ИмяСтруктурыПараметров) + ".") = 1 Тогда ИмяПараметра = Сред(ИмяПараметра, СтрДлина(ИмяСтруктурыПараметров) + 2); КонецЕсли; КонецЕсли; СтрокаНайденногоПараметра = ТаблицаПараметров.Найти(ИмяПараметра, ИмяКолонкиИмени); Если СтрокаНайденногоПараметра <> Неопределено Тогда Ответ = Вопрос("Использовать тип и значение выделенного в тексте параметра?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда ЗначениеПараметра = СтрокаНайденногоПараметра[ИмяКолонкиЗначения]; Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ЗначениеПараметра, Ложь) Тогда НачальноеЗначениеВыбора = ЗначениеПараметра; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; //Если ЗначениеЗаполнено(НачальноеЗначениеВыбора) Тогда Если НачальноеЗначениеВыбора <> Неопределено Тогда ТипСсылки = ТипЗнч(НачальноеЗначениеВыбора); Если Не ирОбщий.ЛиТипСсылкиБДЛкс(ТипСсылки, Ложь) Тогда Возврат Неопределено; КонецЕсли; КонецЕсли; Если РазрешитьВыбор Тогда ВыделитьТекущееОбъектноеВыражение(); КонецЕсли; Если ТипСсылки = Неопределено И Не ЗначениеЗаполнено(ТекущееОбъектноеВыражение) Тогда СтруктураТипаКонтекста = ПолучитьСтруктуруТипаСправаОтРавно(); Если СтруктураТипаКонтекста <> Неопределено Тогда Если ТипЗнч(СтруктураТипаКонтекста.Метаданные) = Тип("ОбъектМетаданных") Тогда ТипСсылки = Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(СтруктураТипаКонтекста.Метаданные.ПолноеИмя())); КонецЕсли; КонецЕсли; КонецЕсли; Если РазрешитьВыбор И ТипСсылки = Неопределено Тогда Форма = мПлатформа.ПолучитьФорму("ВыборОбъектаМетаданных", ФормаВладелец, ФормаВладелец); лСтруктураПараметров = Новый Структура; лСтруктураПараметров.Вставить("ОтображатьСсылочныеОбъекты", Истина); лСтруктураПараметров.Вставить("ОтображатьПеречисления", Истина); лСтруктураПараметров.Вставить("ОтображатьВнешниеИсточникиДанных", Истина); Форма.НачальноеЗначениеВыбора = лСтруктураПараметров; Результат = Форма.ОткрытьМодально(); Если Результат = Неопределено Тогда Возврат Неопределено; КонецЕсли; ТипСсылки = Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(Результат.ПолноеИмяОбъекта)); КонецЕсли; Если НачальноеЗначениеВыбора = Неопределено Тогда НачальноеЗначениеВыбора = Новый (ТипСсылки); КонецЕсли; Если РазрешитьВыбор Тогда ЗначениеПараметра = ирОбщий.ВыбратьСсылкуЛкс(ТипСсылки, НачальноеЗначениеВыбора); УстановитьФокус(); Иначе ЗначениеПараметра = НачальноеЗначениеВыбора; КонецЕсли; Если ЗначениеПараметра = Неопределено Тогда Возврат Неопределено; КонецЕсли; Если ТабличноеПолеПараметров.ИзменяетДанные Тогда ФормаВладелец.Модифицированность = Истина; КонецЕсли; СтрокаПараметра = ирОбщий.НайтиДобавитьПараметрСсылкуВТаблицуЛкс(ТаблицаПараметров, ИмяКолонкиИмени, ИмяКолонкиЗначения, ЗначениеПараметра,, ОбновитьКопиюСвойстваВНижнемРегистре); Если ВставитьВТекст Тогда ТекстВставки = СтрокаПараметра[ИмяКолонкиИмени]; Если Ложь Или ЯзыкПрограммы = 1 Или ЯзыкПрограммы = 2 Тогда ТекстВставки = "&" + ТекстВставки; КонецЕсли; Если ЯзыкПрограммы = 0 Тогда Если Не ПустаяСтрока(ИмяСтруктурыПараметров) Тогда ТекстВставки = ИмяСтруктурыПараметров + "." + ТекстВставки; КонецЕсли; КонецЕсли; ВыделенныйТекст(ТекстВставки); КонецЕсли; Возврат СтрокаПараметра; КонецФункции // Обрабатывает нажатие на кнопки // // Параметры: // Кнопка - Кнопка. // // Возвращаемое значение: // Булево – результат проверки. // Функция Нажатие(Кнопка) Экспорт Перем Результат; Команда = ирОбщий.ПоследнийФрагментЛкс(Кнопка.Имя, "_"); Если Команда = "АвтоКонтекстнаяПомощь" Тогда УстановитьАвтоКонтекстнаяПомощь(Не Кнопка.Пометка); КонецЕсли; Результат = ВыполнитьКоманду(Команда); Возврат Результат; КонецФункции Функция ВыполнитьКоманду(Знач Команда, Знач КодКлавиши = "") КончитьОбработкуКоманды(); Результат = Неопределено; Попытка мПлатформа.ИнициализацияОписанияМетодовИСвойств(); ПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); мОткрытьСправкуПоПараметру = Ложь; Если Команда = "ОткрытьАвтодополнение" Тогда ОткрытьАвтодополнение(КодКлавиши); ИначеЕсли Команда = "ПоискОбщегоМетода" Тогда ПоискОбщегоМетода(); ИначеЕсли Команда = "ЗаменитьТабуляции" Тогда ЗаменитьТабуляции(); ИначеЕсли Команда = "ВыделитьСлово" Тогда ВыделитьТекущееСлово(); ИначеЕсли Команда = "СравнитьТекст" Тогда ВариантСинтаксиса = Неопределено; Если ЯзыкПрограммы = 0 Тогда ВариантСинтаксиса = "ВстроенныйЯзык"; ИначеЕсли ЯзыкПрограммы = 1 Тогда ВариантСинтаксиса = "ЯзыкЗапросов"; ИначеЕсли ЯзыкПрограммы = 2 Тогда ВариантСинтаксиса = "ЯзыкКомпоновки"; КонецЕсли; ирОбщий.СравнитьСодержимоеЭлементаУправленияЛкс(ФормаВладелец, ПолеТекста, ВариантСинтаксиса); ИначеЕсли Истина И ЯзыкПрограммы = 1 И Команда = "УдалитьПереносы" Тогда УдалитьПереносы(); ИначеЕсли Команда = "КонструкторЗапросов1С" Тогда Результат = ВызватьКонструкторЗапросов(Ложь); ИначеЕсли Команда = "КонструкторЗапросовИР" Тогда Результат = ВызватьКонструкторЗапросов(Истина); ИначеЕсли Команда = "КонструкторЗапросов" Тогда Результат = ВызватьКонструкторЗапросов(); ИначеЕсли Команда = "ВставитьИзБуфераОбменаВесьТекст" Тогда ирОбщий.УстановитьТекстСОткатомЛкс(ПолеТекста, ирОбщий.ТекстИзБуфераОбменаОСЛкс()); ИначеЕсли Команда = "КопироватьВБуферОбменаВесьТекст" Тогда ирОбщий.ТекстВБуферОбменаОСЛкс(ПолеТекста.ПолучитьТекст()); ИначеЕсли Команда = "КопироватьВБуферОбменаТекстВВидеКода" Тогда КопироватьВБуферОбменаТекстВВидеКода(); ИначеЕсли Команда = "Закомментировать" Тогда Закомментировать(); ИначеЕсли Команда = "Раскомментировать" Тогда Раскомментировать(); ИначеЕсли Команда = "РедакторСтроковогоЛитерала" Тогда Результат = ОткрытьРедакторСтроковогоЛитерала(); ИначеЕсли Команда = "ПерейтиКОпределению" Тогда ПерейтиКОпределению(); Результат = мТекущееСлово; ИначеЕсли Команда = "Проверить" Тогда ПроверитьПрограммныйКод(Истина); ИначеЕсли Команда = "УстановитьФокус" Тогда УстановитьФокус(); ИначеЕсли Команда = "Форматировать" Тогда ФорматироватьТекст(); ИначеЕсли Истина И ЯзыкПрограммы = 0 И Команда = "Выполнить" Тогда ВыполнитьПрограммныйКод(); ИначеЕсли Команда = "КонтекстныйСинтаксПомощник" Тогда мПоследнийРежимВызоваСправки = Команда; ОткрытьКонтекстнуюСправку(, ФормаВладелец); ИначеЕсли Команда = "СинтаксПомощник" Тогда ОткрытьСправкуПоЯзыкуПрограммы(); ИначеЕсли Команда = "ПодсказатьПараметр" Тогда мПоследнийРежимВызоваСправки = Команда; ОткрытьСправкуПоПараметру(); ИначеЕсли Команда = "ПодсказатьПараметрАвто" Тогда #Если ТолстыйКлиентОбычноеПриложение Тогда Если ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы Тогда ОткрытьСправкуПоПараметру(, Ложь); КонецЕсли; #КонецЕсли ИначеЕсли Команда = "Настройка" Тогда ПолучитьФорму("ФормаНастройки", ФормаВладелец).Открыть(); ИначеЕсли Команда = "ВыполнитьШаблон" Тогда ВыполнитьШаблонТекста(); ИначеЕсли Команда = "НайтиСледующееHTML" Тогда НайтиСледующееHTML(); ИначеЕсли Команда = "НайтиПредыдущееHTML" Тогда НайтиПредыдущееHTML(); ИначеЕсли Команда = "ЗаменитьВхожденияHTML" Тогда ЗаменитьВхожденияHTML(); ИначеЕсли Команда = "СочетанияКлавишHTML" Тогда СочетанияКлавишHTML(); ИначеЕсли Команда = "КонструкторФорматнойСтроки" Тогда КонструкторФорматнойСтроки(); КонецЕсли; Если Ложь Или Команда = "ВыделитьСлово" Или Команда = "Форматировать" Или Команда = "ВыполнитьШаблон" Или Команда = "ОткрытьАвтодополнение" Или Команда = "ЗаменитьТабуляции" Или Команда = "УдалитьПереносы" Или Команда = "ПерейтиКОпределению" Или Команда = "КонструкторЗапросов1С" Или Команда = "КонструкторЗапросовИР" Или Команда = "КонструкторЗапросов" Или Команда = "РедакторСтроковогоЛитерала" Тогда Если Результат <> Ложь Тогда УстановитьГраницыВыделения(); Если мОткрытьСправкуПоПараметру Тогда #Если ТолстыйКлиентОбычноеПриложение Тогда ОткрытьСправкуПоПараметру(, Ложь); #КонецЕсли КонецЕсли; КонецЕсли; КонецЕсли; Исключение КончитьОбработкуКоманды(); ВосстановитьФокусВвода(); ВызватьИсключение; КонецПопытки; КончитьОбработкуКоманды(); ВосстановитьФокусВвода(); Возврат Результат; КонецФункции Процедура УстановитьГраницыВыделения() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка,, ФормаВладелец); КонецПроцедуры Процедура ФорматироватьТекст() ТекстЗапроса = ПолеТекста.ПолучитьТекст(); КонструкторЗапроса = ПолучитьФорму("КонструкторЗапроса"); КонструкторЗапроса.ВосстановитьНастройкиФормы(); Попытка Если ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса) Тогда НовыйТекст = КонструкторЗапроса.СобратьПолныйТекст(, Истина); ВыделитьВесьТекст(); ВыделенныйТекст(НовыйТекст); КонецЕсли; Исключение Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; КонецПроцедуры Функция ВыделенныйТекст(Знач НовыйТекст = Неопределено) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли Результат = ПолеТекста.ВыделенныйТекст(НовыйТекст); Если НовыйТекст <> Неопределено Тогда ПослеУстановкиВыделенногоМногострочногоТекста(); КонецЕсли; Возврат Результат; КонецФункции Процедура ДобавитьВТекстЗапросаОтборыПоСтрокеРезультата(ТекущаяСтрокаРезультата, ИменаПолей = Неопределено) Экспорт ТекстЗапроса = ПолеТекста.ПолучитьТекст(); КонструкторЗапроса = ПолучитьФорму("КонструкторЗапроса"); КонструкторЗапроса.ВосстановитьНастройкиФормы(); Если КонструкторЗапроса.ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса) Тогда КонструкторЗапроса.ЗагрузитьПоследнийЗапрос(); КонструкторЗапроса.ДобавитьОтборыПоСтрокеРезультата(ТекущаяСтрокаРезультата,, ИменаПолей); ВыделитьВесьТекст(); ВыделенныйТекст(КонструкторЗапроса.СобратьПолныйТекст(, Истина)); КонструкторЗапроса.ЗагрузитьПараметрыВОбъект(); ПослеУстановкиВыделенногоМногострочногоТекста(); КонецЕсли; КонецПроцедуры Процедура ВыделитьВесьТекст(ПолеТекста = Неопределено) Экспорт Если ПолеТекста = Неопределено Тогда ПолеТекста = ЭтотОбъект.ПолеТекста; КонецЕсли; КоличествоСтрок = ПолеТекста.КоличествоСтрок(); #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ПолеТекста.УстановитьГраницыВыделения(1, 1, Макс(1, КоличествоСтрок), СтрДлина(ПолеТекста.ПолучитьСтроку(КоличествоСтрок) + 1),, ФормаВладелец); КонецПроцедуры Процедура ПослеУстановкиВыделенногоМногострочногоТекста() Перем НачСтрока, НачКолонка, КонСтрока, КонКолонка; #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли Если ФормаВладелец = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(ПолеТекста.ЭлементФормы) = Тип("ПолеТекстовогоДокумента") Тогда // Антибаг платформы https://partners.v8.1c.ru/forum/topic/1860281 , http://www.hostedredmine.com/issues/840411 ПолеТекста.ПолучитьГраницыВыделения(НачСтрока, НачКолонка, КонСтрока, КонКолонка); ПолеТекста.УстановитьГраницыВыделения(1, 1, 1, 1); ПолеТекста.ЭлементФормы.ВыделенныйТекст = ""; ПолеТекста.УстановитьГраницыВыделения(НачСтрока, НачКолонка, КонСтрока, КонКолонка,, ФормаВладелец); //// Антибаг платформы. 8.1.10.50 //Если ирКэш.НомерВерсииПлатформыЛкс() < 801012 Тогда // ПолеТекста.УстановитьТекст(ПолеТекста.ПолучитьТекст()); //КонецЕсли; УстановитьПризнакМодифицированностиФормы(); КонецЕсли; КонецПроцедуры // Устанавливает фокус на связанное поле текста программы Процедура УстановитьФокус() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; ВосстановитьФокусВвода(); КонецПроцедуры // https://www.hostedredmine.com/issues/931798 и куча похожих Процедура ВосстановитьФокусВвода() Если ТипЗнч(ФормаВладелец.ТекущийЭлемент) = Тип("ПолеHTMLДокумента") Тогда // https://github.com/salexdv/bsl_console/issues/122 //ПолеТекста.РедакторHTML().focus(); //ПолеТекста.РедакторHTML().editor.focus(); ирОбщий.УстановитьФокусВводаФормеЛкс(); КонецЕсли; КонецПроцедуры Процедура АвтоОбновитьСправку() Экспорт Если Ложь Или Не ирОбщий.Форма_ВводДоступенЛкс(ФормаВладелец) Или ФормаВладелец.ТекущийЭлемент <> ПолеТекста.ЭлементФормы Тогда Возврат; КонецЕсли; Если мПоследнийРежимВызоваСправки = Неопределено Тогда Возврат; КонецЕсли; Кнопка = ирОбщий.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ЭтотОбъект, мПоследнийРежимВызоваСправки); Нажатие(Кнопка); КонецПроцедуры Функция ПолучитьВыделенныйИлиВесьТекст() Экспорт НовыйТекстЗапроса = ВыделенныйТекст(); Если ПустаяСтрока(НовыйТекстЗапроса) Тогда НовыйТекстЗапроса = ПолеТекста.ПолучитьТекст(); КонецЕсли; Возврат НовыйТекстЗапроса; КонецФункции // <Описание процедуры> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // Процедура КопироватьВБуферОбменаТекстВВидеКода() Экспорт НовыйТекстЗапроса = ПолучитьВыделенныйИлиВесьТекст(); ЛиВыделенВесьТекст = НовыйТекстЗапроса = ПолеТекста.ПолучитьТекст(); Если Прав(НовыйТекстЗапроса, 1) <> Символы.ПС Тогда НовыйТекстЗапроса = НовыйТекстЗапроса + Символы.ПС; КонецЕсли; НовыйТекстЗапроса = ирОбщий.ПолучитьСтроковыйЛитералИзМногострочногоТекстаЛкс(НовыйТекстЗапроса); Если ЛиВыделенВесьТекст Тогда ИменованныеЗапросы = мПлатформа.СтруктураРезультатаПакетногоЗапроса(НовыйТекстЗапроса); НовыйТекстЗапроса = НовыйТекстЗапроса + ";" + Символы.ПС; Для Каждого КлючИЗначение Из ИменованныеЗапросы Цикл НовыйТекстЗапроса = НовыйТекстЗапроса + "Индекс_" + КлючИЗначение.Ключ + " = " + XMLСтрока(КлючИЗначение.Значение) + ";" + Символы.ПС; КонецЦикла; Иначе НовыйТекстЗапроса = "|" + ирОбщий.УдалитьВнешниеСкобкиВыраженияЛкс(НовыйТекстЗапроса, """", Символы.ПС + "|"""); КонецЕсли; ирОбщий.ТекстВБуферОбменаОСЛкс(НовыйТекстЗапроса, "ВстроенныйЯзык"); КонецПроцедуры Процедура Закомментировать() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Новый ТекстовыйДокумент; #КонецЕсли //Для Счетчик = мНачальнаяСтрока По мКонечнаяСтрока Цикл // ПолеТекста.УстановитьГраницыВыделения(Счетчик, 1, Счетчик, 1); // ВыделенныйТекст("//"); //КонецЦикла; //ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); // ПерваяСтрока = мНачальнаяСтрока; ПерваяКолонка = мНачальнаяКолонка; ПоследняяСтрока = мКонечнаяСтрока; ПоследняяКолонка = мКонечнаяКолонка; КоличествоСтрок = Макс(ПолеТекста.КоличествоСтрок(), мКонечнаяСтрока); // Если в последней строке нет символов, то функция КоличествоСтрок() ее почему то не считает ВыделенныйФрагмент = ""; ДлинаПоследнейСтроки = 0; Если ПоследняяКолонка = 1 Тогда ПоследняяСтрока = ПоследняяСтрока - 1; КонецЕсли; Если ПерваяСтрока >= ПоследняяСтрока И ПоследняяКолонка = 1 Тогда ПоследняяКолонка = Макс(1, СтрДлина(ПолеТекста.ПолучитьСтроку(ПерваяСтрока))); ПоследняяСтрока = ПерваяСтрока; КонецЕсли; Для НомерСтроки = 1 По КоличествоСтрок Цикл Фрагмент = ПолеТекста.ПолучитьСтроку(НомерСтроки); Если НомерСтроки >= ПерваяСтрока И НомерСтроки <= ПоследняяСтрока Тогда Если НомерСтроки = ПерваяСтрока Тогда ВыделенныйФрагмент = ВыделенныйФрагмент + "//" + Фрагмент; Иначе ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС + "//" +Фрагмент; КонецЕсли; Если НомерСтроки = ПоследняяСтрока Тогда ДлинаПоследнейСтроки = СтрДлина(Фрагмент) + 3; КонецЕсли; КонецЕсли; КонецЦикла; ЗаменитьФрагментТекстаВПоле(ПолеТекста, ВыделенныйФрагмент, ДлинаПоследнейСтроки, ПерваяСтрока, ПоследняяСтрока, ПоследняяКолонка); КонецПроцедуры Процедура Раскомментировать() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли //Для Счетчик = мНачальнаяСтрока По мКонечнаяСтрока Цикл // СтрокаТекста = СтрПолучитьСтроку(ТекстДоИзменения, Счетчик); // Если Лев(СокрЛ(СтрокаТекста), 2) = "//" Тогда // ПозицияМаркера = Найти(СтрокаТекста, "//"); // ПолеТекста.УстановитьГраницыВыделения(Счетчик, 1, Счетчик, 10000); // ВыделенныйТекст(Сред(СтрокаТекста, 1, ПозицияМаркера - 1) + Сред(СтрокаТекста, ПозицияМаркера + 2)); // КонецЕсли; //КонецЦикла; //ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); // ПерваяСтрока = мНачальнаяСтрока; ПерваяКолонка = мНачальнаяКолонка; ПоследняяСтрока = мКонечнаяСтрока; ПоследняяКолонка = мКонечнаяКолонка; КоличествоСтрок = Макс(ПолеТекста.КоличествоСтрок(), мКонечнаяСтрока); // Если в последней строке нет символов, то функция КоличествоСтрок() ее почему то не считает ВыделенныйФрагмент = ""; ДлинаПоследнейСтроки = ПоследняяКолонка; Если ПоследняяКолонка = 1 Тогда ПоследняяСтрока = ПоследняяСтрока - 1; КонецЕсли; Если ПерваяСтрока >= ПоследняяСтрока И ПоследняяКолонка = 1 Тогда ПоследняяКолонка = СтрДлина(ПолеТекста.ПолучитьСтроку(ПерваяСтрока)); ПоследняяСтрока = ПерваяСтрока; КонецЕсли; Для НомерСтроки = 1 По КоличествоСтрок Цикл Фрагмент = ПолеТекста.ПолучитьСтроку(НомерСтроки); Если НомерСтроки >= ПерваяСтрока И НомерСтроки <= ПоследняяСтрока Тогда Если Лев(СокрЛ(Фрагмент), 2) = "//" Тогда Позиция = Найти(Фрагмент, "//"); Фрагмент = Лев(Фрагмент, Позиция - 1) + Сред(Фрагмент, Позиция + 2); КонецЕсли; Если НомерСтроки = ПерваяСтрока Тогда ВыделенныйФрагмент = ВыделенныйФрагмент + Фрагмент; Иначе ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС + Фрагмент; КонецЕсли; Если НомерСтроки = ПоследняяСтрока Тогда ДлинаПоследнейСтроки = СтрДлина(Фрагмент) + 3; КонецЕсли; КонецЕсли; КонецЦикла; ЗаменитьФрагментТекстаВПоле(ПолеТекста, ВыделенныйФрагмент, ДлинаПоследнейСтроки, ПерваяСтрока, ПоследняяСтрока, ПоследняяКолонка); КонецПроцедуры Процедура ЗаменитьФрагментТекстаВПоле(Знач ПолеТекста, Знач ВыделенныйФрагмент, Знач ДлинаПоследнейСтроки, Знач ПерваяСтрока, Знач ПоследняяСтрока, Знач ПоследняяКолонка) #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли Если ПоследняяКолонка = 1 Тогда ПоследняяСтрока = ПоследняяСтрока + 1; ДлинаПоследнейСтроки = 1; ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС; КонецЕсли; ПолеТекста.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки); ЧислоПереносовСтрокНачальное = СтрЧислоВхождений(ВыделенныйТекст(), Символы.ПС); Если ЧислоПереносовСтрокНачальное > ПоследняяСтрока - ПерваяСтрока Тогда // https://www.hostedredmine.com/issues/925662 Для Счетчик = 1 По Мин(2, ДлинаПоследнейСтроки - 1) Цикл ДлинаПоследнейСтрокиБезПереноса = ДлинаПоследнейСтроки - Счетчик; ПолеТекста.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтрокиБезПереноса); Если СтрЧислоВхождений(ВыделенныйТекст(), Символы.ПС) < ЧислоПереносовСтрокНачальное Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; ВыделенныйТекст(ВыделенныйФрагмент); ПолеТекста.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки,, ФормаВладелец); УстановитьПризнакМодифицированностиФормы(); КонецПроцедуры Процедура ВыделитьНачалоИКонецТекущейСтроки() Экспорт СброситьРезультатРазбораПозицииВТексте(); //ОригинальнаяСтрока = СокрП(ПолеТекста.ПолучитьСтроку(мКонечнаяСтрока)); ОригинальнаяСтрока = ПолеТекста.ПолучитьСтроку(мКонечнаяСтрока); Для Счетчик = 0 По мКонечнаяКолонка - СтрДлина(ОригинальнаяСтрока) - 2 Цикл ОригинальнаяСтрока = ОригинальнаяСтрока + " "; КонецЦикла; ТекущееНачалоСтроки = Лев(ОригинальнаяСтрока, мКонечнаяКолонка - 1); ТекущийКонецСтроки = Сред(ОригинальнаяСтрока, мКонечнаяКолонка); КонецПроцедуры Процедура СброситьРезультатРазбораПозицииВТексте() мНомерПараметра = 0; НачалоКонтекста = ""; НачалоСлова = ""; КонецКонтекста = ""; выхЕстьТочкаСправа = Ложь; мРодительскийКонтекст = ""; мКонтекст = ""; мЭтоСтроковыйЛитерал = Ложь; мЭтоОбъявлениеПсевдонима = Ложь; мЭтоКонструктор = Ложь; мАргументы = ""; мПервыйПараметр = ""; мФактическиеПараметры = Новый Массив; КонецПроцедуры // <Описание функции> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // // Возвращаемое значение: // – <Тип.Вид> – <описание значения> // <продолжение описания значения>; // <Значение2> – <Тип.Вид> – <описание значения> // <продолжение описания значения>. // Функция ПолучитьИнформациюОбОшибке(ТекстДляПроверки = Неопределено, СтартоваяСтрока = 0, СтартоваяКолонка = 0, Контекст = "", СамаяВложеннаяПричина = Ложь) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ТекстИнициализации = ""; Если ЯзыкПрограммы = 0 Тогда Для Каждого ЛокальноеСлово Из ТаблицаЛокальногоКонтекста Цикл Если Истина И ТипТекста = "Алгоритм" И ЛокальноеСлово.ТипСлова = "Свойство" Тогда ТекстИнициализации = ЛокальноеСлово.Слово + " = 0; " + ТекстИнициализации; КонецЕсли; КонецЦикла; Для Каждого СтрокаПараметра Из Параметры Цикл Если ТипТекста = "Алгоритм" И СтрокаПараметра.Вход // Добавил 14.09.2019 Тогда ТекстИнициализации = СтрокаПараметра.Имя + " = 0; " + ТекстИнициализации; КонецЕсли; КонецЦикла; КонецЕсли; Если ТекстДляПроверки = Неопределено Тогда ТекстДляПроверки = ПолеТекста.ПолучитьТекст(); КонецЕсли; СтартоваяСтрока = 0; СтартоваяКолонка = 0; Если ЯзыкПрограммы = 1 Тогда ТекстЗапроса = ТекстДляПроверки; Если ТекстЗапроса <> "" Тогда Если ТипТекста = "Выражение" Тогда лКонтекстВыполнения = КонтекстВыполнения; лМетодВыполнения = МетодВыполнения; Попытка ИнформацияОбОшибке = мПлатформа.ВыполнитьПрограммныйКодВКонтексте(лКонтекстВыполнения, лМетодВыполнения, ТекстЗапроса, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; СтартоваяСтрока = -1; Иначе Если мДиалектSQL <> "1С" Тогда РезультатРазбора = ЗагрузитьТекстВКонструктор(ТекстЗапроса); Если Не РезультатРазбора Тогда ИнформацияОбОшибке = 1; КонецЕсли; Иначе Если ТипЗнч(КонтекстВыполнения) = Тип("Запрос") Тогда ПроверочныйЗапрос = Новый Запрос; ПроверочныйЗапрос.МенеджерВременныхТаблиц = КонтекстВыполнения.МенеджерВременныхТаблиц; ПроверочныйЗапрос.Текст = ТекстЗапроса; Попытка ПроверочныйЗапрос.НайтиПараметры(); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; Иначе КонструкторЗапроса = Новый КонструкторЗапроса; КонструкторЗапроса.РежимКомпоновкиДанных = РежимКомпоновкиДанных; Попытка КонструкторЗапроса.Текст = ТекстЗапроса; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ЯзыкПрограммы = 0 Тогда ТекстДляВыполнения = ТекстИнициализации; Если ТипТекста = "Выражение" Тогда Если ТекстДляПроверки = "" Тогда ТекстДляПроверки = 0; КонецЕсли; ТекстДляВыполнения = ТекстДляВыполнения + "?(Истина, 0, " + Символы.ПС + ТекстДляПроверки + Символы.ПС + ")"; Иначе //ТекстДляВыполнения = ТекстДляВыполнения + "Если Ложь Тогда " + Символы.ПС + ТекстДляПроверки + Символы.ПС + " КонецЕсли"; // Заменено 06.12.2011 ТекстДляВыполнения = "Если Ложь Тогда " + ТекстДляВыполнения + Символы.ПС + ТекстДляПроверки + Символы.ПС + " КонецЕсли"; КонецЕсли; Если Нрег(Контекст) = Нрег("Сервер") Тогда лКонтекстВыполнения = ирСервер; лМетодВыполнения = "ВыполнитьАлгоритм"; Иначе лКонтекстВыполнения = КонтекстВыполнения; лМетодВыполнения = МетодВыполнения; КонецЕсли; Попытка ИнформацияОбОшибке = мПлатформа.ВыполнитьПрограммныйКодВКонтексте(лКонтекстВыполнения, лМетодВыполнения, ТекстДляВыполнения, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; СтартоваяСтрока = - 1; ИначеЕсли ЯзыкПрограммы = 2 Тогда лКонтекстВыполнения = КонтекстВыполнения; лМетодВыполнения = МетодВыполнения; Попытка ИнформацияОбОшибке = мПлатформа.ВыполнитьПрограммныйКодВКонтексте(лКонтекстВыполнения, лМетодВыполнения, ТекстДляПроверки, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; КонецЕсли; Если СамаяВложеннаяПричина И ИнформацияОбОшибке <> Неопределено Тогда #Если Сервер И Не Сервер Тогда ИнформацияОбОшибке = ИнформацияОбОшибке(); #КонецЕсли Пока ИнформацияОбОшибке.Причина <> Неопределено Цикл ИнформацияОбОшибке = ИнформацияОбОшибке.Причина; КонецЦикла; КонецЕсли; Возврат ИнформацияОбОшибке; КонецФункции // Замена операторов внешнего перехода https://partners.v8.1c.ru/forum/t/1849050/m/1849050 Функция ЗаменитьОператорыВнешнегоПерехода(Знач Текст = Неопределено, выхТипыВнешнихПереходов, выхЗаглушкаВозврата = "", выхИмяПараметраТипаВыхода = "") Экспорт Перем ИмяМетода; #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли УникальнаяСтрока = "1092383289"; Если Не ЗначениеЗаполнено(выхЗаглушкаВозврата) Тогда выхЗаглушкаВозврата = "Возврат" + УникальнаяСтрока + "=0"; КонецЕсли; Если Не ЗначениеЗаполнено(выхИмяПараметраТипаВыхода) Тогда выхИмяПараметраТипаВыхода = "ТипВыхода"; КонецЕсли; Если Текст <> Неопределено Тогда ПолеТекста.УстановитьТекст(Текст); КонецЕсли; Если выхТипыВнешнихПереходов = Неопределено Тогда выхТипыВнешнихПереходов = Новый Структура; КонецЕсли; СтартоваяСтрока = 0; Пока Истина Цикл ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(, СтартоваяСтрока,,, Истина); Если ИнформацияОбОшибке = Неопределено Тогда Прервать; КонецЕсли; #Если Сервер И Не Сервер Тогда ИнформацияОбОшибке = ИнформацияОбОшибке(); #КонецЕсли ОписаниеОшибки = ИнформацияОбОшибке.Описание; Если Найти(ОписаниеОшибки, "Оператор Прервать") > 0 Тогда ИмяОператора = "Прервать"; ИначеЕсли Найти(ОписаниеОшибки, "Оператор Продолжить") > 0 Тогда ИмяОператора = "Продолжить"; ИначеЕсли Найти(ОписаниеОшибки, "Оператор Возврат") > 0 Тогда ИмяОператора = "Возврат"; //ИначеЕсли Найти(ОписаниеОшибки, "Оператор Перейти") > 0 Тогда // ИмяОператора = "Перейти"; // TODO Иначе Прервать; КонецЕсли; КоординатыОшибки = КоординатыОшибки(ИнформацияОбОшибке, СтартоваяСтрока); выхТипыВнешнихПереходов.Вставить(ИмяОператора); // Выделяем вхождение имени оператора в ПолеТекста ПолеТекста.УстановитьГраницыВыделения(1, 1, КоординатыОшибки.НомерСтроки, КоординатыОшибки.НомерКолонки); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(СокрП(ВыделенныйТекст())); КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок(); ДлинаПоследнейСтроки = СтрДлина(ТекстовыйДокумент.ПолучитьСтроку(КоличествоСтрок) + 1); ПолеТекста.УстановитьГраницыВыделения(Макс(1, КоличествоСтрок), ДлинаПоследнейСтроки - СтрДлина(ИмяОператора), Макс(1, КоличествоСтрок), ДлинаПоследнейСтроки); ВыделенныйТекст(выхИмяПараметраТипаВыхода + " = """ + ИмяОператора + """; " + выхЗаглушкаВозврата); Если ИмяОператора = "Возврат" Тогда ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(, СтартоваяСтрока,,, Истина); Если ИнформацияОбОшибке <> Неопределено Тогда #Если Сервер И Не Сервер Тогда ИнформацияОбОшибке = ИнформацияОбОшибке(); #КонецЕсли ОписаниеОшибки = ИнформацияОбОшибке.Описание; КоординатыОшибкиПосле = КоординатыОшибки(ИнформацияОбОшибке, СтартоваяСтрока); Если КоординатыОшибкиПосле.НомерСтроки = КоординатыОшибки.НомерСтроки Тогда ВыделенныйТекст("="); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Текст = ПолеТекста.ПолучитьТекст(); Возврат Текст; КонецФункции Функция КоординатыОшибки(Знач ИнформацияОбОшибке, Знач СтартоваяСтрока = 0) Экспорт КоординатыОшибки = Новый Структура("НомерСтроки, НомерКолонки"); RegExp.Pattern = "{[^\(]*\(([^\)]+)\)}"; ТекстКоординат = RegExp.НайтиВхождения(ИнформацияОбОшибке.Описание)[0].SubMatches(0); Фрагменты = ирОбщий.СтрРазделитьЛкс(ТекстКоординат, ",", Истина); КоординатыОшибки.НомерСтроки = Число(Фрагменты[0]) + СтартоваяСтрока; КоординатыОшибки.НомерКолонки = Число(Фрагменты[1]); Возврат КоординатыОшибки; КонецФункции Процедура ВыделитьТекущееСлово() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ТекущееОбъектноеВыражение(); мНачальнаяКолонка = мКонечнаяКолонка - СтрДлина(НачалоКонтекста); Если Не ПустаяСтрока(мРодительскийКонтекст) Тогда мНачальнаяКолонка = мНачальнаяКолонка + СтрДлина(мРодительскийКонтекст) + 1; КонецЕсли; мКонечнаяКолонка = мКонечнаяКолонка + СтрДлина(КонецКонтекста); Если Прав(КонецКонтекста, 1) = "(" Тогда мКонечнаяКолонка = мКонечнаяКолонка - 1; КонецЕсли; ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка,, ФормаВладелец); КонецПроцедуры Процедура ВыделитьТекущееОбъектноеВыражение() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ТекущееОбъектноеВыражение(); мНачальнаяКолонка = мКонечнаяКолонка - СтрДлина(НачалоКонтекста); мКонечнаяКолонка = мКонечнаяКолонка + СтрДлина(КонецКонтекста); Если Прав(КонецКонтекста, 1) = "(" Тогда мКонечнаяКолонка = мКонечнаяКолонка - 1; КонецЕсли; ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка,, ФормаВладелец); КонецПроцедуры // Выполняет проверку синтаксиса программного кода или текста запроса. // // Параметры: // *СообщатьОбУспешнойПроверке - Булево, *Ложь; // *ТекстДляПроверки - Строка, *Неопределено - проверяемый текст (используется весь текст или этот). // // Возвращаемое значение: // Булево – результат проверки. // Функция ПроверитьПрограммныйКод(СообщатьОбУспешнойПроверке = Ложь, ТекстДляПроверки = Неопределено, Контекст = "") Экспорт СтартоваяСтрока = 0; СтартоваяКолонка = 0; ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(ТекстДляПроверки, СтартоваяСтрока, СтартоваяКолонка, Контекст); Если ЗначениеЗаполнено(Контекст) Тогда ПредставлениеКонтекста = " (Проверка " + Контекст + ")"; КонецЕсли; Если ИнформацияОбОшибке <> Неопределено Тогда Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда Если ФормаВладелец <> Неопределено Тогда ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; КонецЕсли; ирОбщий.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекста, СтартоваяСтрока, СтартоваяКолонка, ЯзыкПрограммы, , ИнформацияОбОшибке, , ПредставлениеКонтекста); Иначе // Ошибка обработана и отображена ранее КонецЕсли; Иначе Если СообщатьОбУспешнойПроверке Тогда ирОбщий.СообщитьСУчетомМодальностиЛкс(ирОбщий.ПредставлениеИзИдентификатораЛкс(ПолеТекста.ЭлементФормы.Имя) + ПредставлениеКонтекста + ": Синтаксических ошибок не обнаружено!"); КонецЕсли; КонецЕсли; Возврат ИнформацияОбОшибке = Неопределено; КонецФункции // Получает путь к описанию заданного контекста. // // Параметры: // ПутьКСлову – Строка; // *СтрокаОписания - СтрокаТаблицыЗначений - возвращаемая строка описания; // *ВключатьПутьКОписаниюТипаЗначения - Булево, *Неопределено - признак добавления в список выбора тип значения слова. // Функция НайтиПоказатьСправкуПоСлову(Знач ПутьКСлову, ВключатьПутьКОписаниюТипаЗначения = Ложь, выхФормаВыбора = Неопределено, РазрешитьАнализИмениТипа = Истина, ВладелецФормы = Неопределено) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли МассивЗащитыОтРекурсии.Очистить(); ТаблицаСтруктурТиповКонтекста = ОпределитьТипЗначенияКонтекста(ПутьКСлову, " " + мТекстДляПоискаОпределения, мПредшествующийТекст, РазрешитьАнализИмениТипа, мЭтоКонструктор); ОтносительныйПутьКОписанию = ""; СтруктураТипаКонтекста = ТаблицаСтруктурТиповКонтекста[0]; НайтиПоказатьСправкуПоСтруктуреТипа(ПутьКСлову, СтруктураТипаКонтекста, ВключатьПутьКОписаниюТипаЗначения, выхФормаВыбора, ВладелецФормы, ТаблицаСтруктурТиповКонтекста); КонецФункции Функция НайтиПоказатьСправкуПоСтруктуреТипа(Знач ПутьКСлову, Знач СтруктураТипа, ВключатьПутьКОписаниюТипаЗначения = Ложь, выхФормаВыбора = Неопределено, ВладелецФормы = Неопределено, Знач ТаблицаСтруктурТиповКонтекста = Неопределено) Если Истина И ТипЗнч(СтруктураТипа.СтрокаОписания) <> Тип("СтрокаТаблицыЗначений") И ТипЗнч(СтруктураТипа.Метаданные) = Тип("COMОбъект") Тогда Если мНомерПараметра > 0 Тогда Возврат Неопределено; КонецЕсли; МетаданныеСлова = СтруктураТипа.Метаданные; ИмяТипа = мПлатформа.ПолноеИмяТипаCOMОбъекта(МетаданныеСлова); Попытка Пустышка = МетаданныеСлова.Path_; Исключение Пустышка = Неопределено; КонецПопытки; Слово = ирОбщий.ПоследнийФрагментЛкс(ПутьКСлову, ".", Ложь); Если Прав(ПутьКСлову, 1) = "(" Тогда Слово = СтрЗаменить(Слово, "(", ""); КонецЕсли; Если Пустышка <> Неопределено Тогда // WMI ИмяКлассаWMI = МетаданныеСлова.Path_.Class; Если ЗначениеЗаполнено(Слово) Тогда ОписаниеСлова = ирОбщий.ПолучитьДокументациюСвойстваWMIЛкс(ИмяКлассаWMI, Слово); Если ЗначениеЗаполнено(ОписаниеСлова) Тогда ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(ОписаниеСлова); ТекстовыйДокумент.Показать(ИмяКласса + "." + Слово); КонецЕсли; КонецЕсли; Иначе ЗапуститьПриложение("http://google.com/search?q=" + ирОбщий.ПервыйФрагментЛкс(ИмяТипа, " ") + "+" + Слово); КонецЕсли; Иначе Если ВладелецФормы <> Неопределено И СтруктураТипа.СтрокаОписания <> Неопределено Тогда ТаблицаВладелец = СтруктураТипа.СтрокаОписания.Владелец(); #Если Сервер И Не Сервер Тогда ТаблицаВладелец = Новый ТаблицаЗначений; #КонецЕсли Если ТаблицаВладелец.Колонки.Найти("ЛиЭкспорт") <> Неопределено Тогда ФормаВызовМетода = ФормаВызовМетода(); ФормаВызовМетода.ПараметрСтруктураТипаКонтекста = СтруктураТипа; БылаОткрыта = ФормаВызовМетода.Открыта(); Если ЛиДоступноОткрытиеСвободнойФормы() Тогда ОткрытьПодсказкуПоВызовуМетодаПассивно(ФормаВызовМетода); Если Не БылаОткрыта Тогда ирОбщий.Форма_АктивироватьОткрытьЛкс(ФормаВладелец); КонецЕсли; Иначе ФормаВызовМетода.ОткрытьМодально(); КонецЕсли; Возврат ФормаВызовМетода; КонецЕсли; КонецЕсли; Если СтруктураТипа.ТипЯзыка = "ИмяТипа" Тогда ВключатьПутьКОписаниюТипаЗначения = Истина; КонецЕсли; Слово = ирОбщий.ПоследнийФрагментЛкс(ПутьКСлову); // Возможные роли слова без учета вычисленного контекста ТаблицаСтруктурВозможныхТиповКонтекста = ирОбщий.НайтиВозможныеСтрокиОписанияСловаВСинтаксПомощникеЛкс(Слово, ЯзыкПрограммы); Если ТаблицаСтруктурТиповКонтекста = Неопределено Тогда ТаблицаСтруктурТиповКонтекста = Новый Массив; ТаблицаСтруктурТиповКонтекста.Добавить(СтруктураТипа); КонецЕсли; СтруктураЦикла = Новый Соответствие; СтруктураЦикла.Вставить("1.Предсказанные:", ТаблицаСтруктурТиповКонтекста); СтруктураЦикла.Вставить("2.Возможные:", ТаблицаСтруктурВозможныхТиповКонтекста); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если ВладелецФормы = Неопределено Тогда ВладелецФормы = ФормаВладелец; КонецЕсли; мПлатформа.ВыбратьСтрокуОписанияИзМассиваСтруктурТипов(СтруктураЦикла, ВключатьПутьКОписаниюТипаЗначения, ВладелецФормы, Слово, мНомерПараметра,, выхФормаВыбора, мФактическиеПараметры.Количество()); КонецЕсли; Возврат Неопределено; КонецФункции // Открывает контекстную справку по текущему слову или его типу. // // Параметры: // *ПутьКСлову - Строка, *"" - используется для получения дочерних слов относительно текущего контекста. // Процедура ОткрытьКонтекстнуюСправку(ПутьКСлову = "", ВладелецФормы = Неопределено) Экспорт //Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда // Возврат; //КонецЕсли; //КончитьОбработкуКоманды(); РазобратьТекущийКонтекст(); РазрешитьАнализИмениТипа = Не ЗначениеЗаполнено(ПутьКСлову); Если РазрешитьАнализИмениТипа Тогда ПутьКСлову = мТекущееСлово; КонецЕсли; Если мРодительскийКонтекст <> "" Тогда ПутьКСлову = мРодительскийКонтекст + "." + ПутьКСлову; КонецЕсли; НайтиПоказатьСправкуПоСлову(ПутьКСлову,,, РазрешитьАнализИмениТипа, ВладелецФормы); КонецПроцедуры // <Описание процедуры> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // Процедура ОткрытьСправкуПоЯзыкуПрограммы() Экспорт //Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс() Тогда // Возврат; //КонецЕсли; Если ЯзыкПрограммы = 0 Тогда Книга = "shcntx_ru"; ИначеЕсли ЯзыкПрограммы = 1 Тогда Книга = "shquery_ru"; ИначеЕсли ЯзыкПрограммы = 2 Тогда Книга = "dcsui_ru"; КонецЕсли; ФормаСправка = ирОбщий.ПолучитьФормуЛкс("Обработка.ирСинтаксПомощник.Форма", , ФормаВладелец); ФормаСправка.ОткрытьАдрес("//" + Книга); КонецПроцедуры // Открывает контекстную справку по текущему параметру метода. // // Параметры: // *ПутьКСлову - Строка, *"" - используется для получения дочерних слов относительно текущего контекста. // Процедура ОткрытьСправкуПоПараметру(ПутьКСлову = "", ОткрыватьСинтаксПомощник = Истина) Экспорт //Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда // Возврат; //КонецЕсли; РазобратьТекущийКонтекст(,, Истина); Если ПутьКСлову = "" Тогда ПутьКСлову = мВызовМетода; КонецЕсли; // Если раскомментировать, то при вызове через мОткрытьСправкуПоПараметру не будет открываться окно //Если Не ЗначениеЗаполнено(ПутьКСлову) Тогда // Возврат; //КонецЕсли; Если ОткрыватьСинтаксПомощник И ирКэш.ЛиПлатформаWindowsЛкс() Тогда ФормаСинтаксПомощникаДо = Неопределено; ФормаСинтаксПомощникаПосле = Неопределено; Если Не ЛиДоступноОткрытиеСвободнойФормы() Тогда ФормаСинтаксПомощникаДо = ирОбщий.ПолучитьФормуЛкс("Обработка.ирСинтаксПомощник.Форма"); КонецЕсли; НайтиПоказатьСправкуПоСлову(ПутьКСлову,, ФормаСинтаксПомощникаПосле); КонецЕсли; ФормаПодсказкаПоПараметрам = ФормаВызовМетода(); ФормаПодсказкаПоПараметрам.ПараметрСтруктураТипаКонтекста = Неопределено; Если Не ФормаПодсказкаПоПараметрам.Открыта() И ЗначениеЗаполнено(мИмяМетода) Тогда ФормаПодсказкаПоПараметрам.ЗапомнитьПозициюКаретки(); КонецЕсли; Если ЛиДоступноОткрытиеСвободнойФормы() Тогда Если Ложь Или ОткрыватьСинтаксПомощник Или Не ФормаПодсказкаПоПараметрам.Открыта() Тогда ОткрытьПодсказкуПоВызовуМетодаПассивно(ФормаПодсказкаПоПараметрам); КонецЕсли; Иначе Если Истина И ФормаСинтаксПомощникаДо <> Неопределено И ФормаСинтаксПомощникаДо.Открыта() = ФормаСинтаксПомощникаПосле.Открыта() Тогда ФормаПодсказкаПоПараметрам.ОткрытьМодально(); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ОткрытьПодсказкуПоВызовуМетодаПассивно(Знач ФормаПодсказкаПоПараметрам) ФормаПодсказкаПоПараметрам.Открыть(); ФормаПодсказкаПоПараметрам.Обновить(); // Нужно для ускорения срабатывания установки позиции окна и для 8.2, т.к. там форма форкус получает после завершения ПриОткрытии и только после этого сработает установка позиции окна КонецПроцедуры Функция УдалитьКомментарии(Текст) Экспорт RegExp.Global = Истина; RegExp.Multiline = Ложь; Если Ложь Или ЯзыкПрограммы = 1 Или ЯзыкПрограммы = 2 Тогда // Не проверено RegExp.Pattern = "(?:(?://[^\n]*" + ")|(" + шСтрокаЗапроса + ")|([\s\S])"; ШаблонЗамены = "$1$2$3$4"; ИначеЕсли ЯзыкПрограммы = 0 Тогда шОднострочнаяСтрокаПрограммыСКавычки = """(?:(?:"""")|[^""\n])*""?"; шОднострочнаяСтрокаПрограммыСЧерты = "\n\s*\|(?:(?:"""")|[^""\n])*""?"; RegExp.Pattern = "//[^\n]*|" + "(" + "#[^\n]*" + ")|(" + шОднострочнаяСтрокаПрограммыСКавычки + ")|(" + шОднострочнаяСтрокаПрограммыСЧерты + ")|([\s\S])"; ШаблонЗамены = "$1$2$3$4"; КонецЕсли; Результат = RegExp.Replace(Текст, ШаблонЗамены); Возврат Результат; КонецФункции // Заменяет все печатаемые символы, кроме идентификаторов в кавычках, внутри комментариев и строковых литералов на заданный символ. // // Параметры: // Текст – Строка; // СимволЗамена – Строка. // // Возвращаемое значение: // Строка. // Функция ЗалитьКомментарииИСтроковыеЛитералы(Знач Текст, СимволЗамена = " ", ЗалитьСтроковыеЛитералы = Ложь) Экспорт RegExp.Global = Истина; RegExp.Multiline = Ложь; //// Старый вариант - //Если Ложь // Или ЯзыкПрограммы = 1 // Или ЯзыкПрограммы = 2 //Тогда // RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(" + "//(:)?[^\n]*(?:\n|$)" + ")|(" + шСтрокаЗапроса + ")|(.|\n|\r)"; //ИначеЕсли ЯзыкПрограммы = 0 Тогда // RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(" + "//(:)?[^\n]*(?:\n|$)" + ")|(" + шСтрокаПрограммы + ")|(.|\n|\r)"; //КонецЕсли; //Результат = RegExp.НайтиВхождения(Текст); //RegExp.Pattern = "(\S)"; //ЗалитыйТекст = ""; //Для Каждого Match Из Результат Цикл // НайденныйТекст = Неопределено; // ТекстДляЗаливки = Неопределено; // Если Match.SubMatches(1) <> Неопределено Тогда // Если Истина // И ЯзыкПрограммы = 0 // И Match.SubMatches(2) <> Неопределено // Тогда // НовыйТекстСтроки = Сред(Match.SubMatches(1), СтрДлина("//:") + 1) + Символы.ПС; // Иначе // ТекстДляЗаливки = Match.SubMatches(1); // КонецЕсли; // ИначеЕсли Match.SubMatches(3) <> Неопределено Тогда // ТекстДляЗаливки = Match.SubMatches(3); // ИначеЕсли Match.SubMatches(0) <> Неопределено Тогда // НовыйТекстСтроки = Match.SubMatches(0); // ИначеЕсли Match.SubMatches(4) <> Неопределено Тогда // НовыйТекстСтроки = Match.SubMatches(4); // КонецЕсли; // Если ТекстДляЗаливки <> Неопределено Тогда // ЗалитыйТекст = ЗалитыйТекст + RegExp.Replace(ТекстДляЗаливки, СимволЗамена); // Иначе // ЗалитыйТекст = ЗалитыйТекст + НовыйТекстСтроки; // КонецЕсли; //КонецЦикла; // Новый вариант. Значительно быстрее старого. // Количество символов в тексте меняется, но позиции строк сохраняются Если Ложь Или ЯзыкПрограммы = 1 Или ЯзыкПрограммы = 2 Тогда ////RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(" + "//(:)?[^\n]*" + ")|(" + шСтрокаЗапроса + ")|(.|\n|\r)"; //RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(?:" + "//:([^\n]*)" + ")|(?:" + "//[^\n]*" + ")|(" + шСтрокаЗапроса + ")|(.|\n|\r)"; RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(?:" + "//:([^\n]*)" + ")|(?:" + "//[^\n]*" + ")|(" + шСтрокаЗапроса + ")|([\s\S])"; ШаблонЗамены = "$1$2$3$4"; ИначеЕсли ЯзыкПрограммы = 0 Тогда //RegExp.Pattern = "(""" + шИмя+ "(?:\." + шИмя + ")*"")|(" + "//(:)?[^\n]*" + ")|(" + шСтрокаПрограммы + ")|(.|\n|\r)"; шОднострочнаяСтрокаПрограммыСКавычки = """(?:(?:"""")|[^""\n])*""?"; шОднострочнаяСтрокаПрограммыСЧерты = "(?:(\n)\s*\|(?:(?:"""")|[^""\n])*""?)"; // + шОднострочнаяСтрокаПрограммыСКавычки + "|" + шОднострочнаяСтрокаПрограммыСЧерты + "|(.|\n|\r)"; RegExp.Pattern = "(""" + шИмя + "(?:\.[" + шБуква + "\d]+)*"")" // имена ProgId от COM объектов бывают "Forms.TextBox.1" + "|(""(?:" + шИмя + "\s*,\s*)*" + шИмя + """)" // создание структуры + "|" + "//:([^\n]*)" + "|" + "//[^\n]*|" + "(?:" + "#[^\n]*" + ")|" + "(?:" + "~" + шИмя + ")|"; // Присвоение типа выражению в комментарии ШаблонЗамены = "$1$2$3$4"; Если ЗалитьСтроковыеЛитералы Тогда RegExp.Pattern = RegExp.Pattern + шОднострочнаяСтрокаПрограммыСКавычки + "|" + шОднострочнаяСтрокаПрограммыСЧерты + ""; ШаблонЗамены = ШаблонЗамены + "$5"; Иначе // http://www.hostedredmine.com/issues/885452 КонецЕсли; RegExp.Pattern = RegExp.Pattern + "|([\s\S])"; КонецЕсли; ЗалитыйТекст = RegExp.Replace(Текст, ШаблонЗамены); Если СтрДлина(ОригинальныйТекст) < 10000 Тогда // Долго на больших текстах! // Заливаем условия, чтобы проверка равенства в них не считалась присвоением // В будущем можно отказаться от этого блока и собирать все возможные типы, а потом давать юзеру выбирать. Если ЯзыкПрограммы = 0 Тогда RegExp.Pattern = "(" + шЕсли + ")|(" + шПока + ")"; ЗалитыйТекстОригинал = ЗалитыйТекст; Результат = RegExp.НайтиВхождения(ЗалитыйТекстОригинал); ЗалитыйТекст = Новый ЗаписьXML; ЗалитыйТекст.УстановитьСтроку(""); ТекущаяПозицияВОригинале = 1; Для Каждого Match Из Результат Цикл НайденныйТекст = Неопределено; НачалоТокена = ""; КонецТокена = ""; Если Match.SubMatches(0) <> Неопределено Тогда НайденныйТекст = Match.SubMatches(0); НачалоТокена = Match.SubMatches(1); КонецТокена = Match.SubMatches(3); ИначеЕсли Match.SubMatches(4) <> Неопределено Тогда НайденныйТекст = Match.SubMatches(4); НачалоТокена = Match.SubMatches(5); КонецТокена = Match.SubMatches(7); КонецЕсли; ЗалитыйТекст.ЗаписатьБезОбработки(Сред(ЗалитыйТекстОригинал, ТекущаяПозицияВОригинале, Match.FirstIndex + 1 - ТекущаяПозицияВОригинале)); ЗалитыйТекст.ЗаписатьБезОбработки(НачалоТокена + RegExp.Replace(Сред(НайденныйТекст, 1 + СтрДлина(НачалоТокена), СтрДлина(НайденныйТекст) - СтрДлина(НачалоТокена) - СтрДлина(КонецТокена)), СимволЗамена) + КонецТокена); ТекущаяПозицияВОригинале = Match.FirstIndex + 1 + СтрДлина(Match.Value); КонецЦикла; ЗалитыйТекст.ЗаписатьБезОбработки(Сред(ЗалитыйТекстОригинал, ТекущаяПозицияВОригинале)); ЗалитыйТекст = ЗалитыйТекст.Закрыть(); КонецЕсли; КонецЕсли; Возврат ЗалитыйТекст; КонецФункции // Меняет RegExp! Функция ЭтоРусскийВариантТекстаЗапроса(Текст) Экспорт ТекстБезКомментариев = СокрЛП(ЗалитьКомментарииИСтроковыеЛитералы(Текст)); RegExp.Pattern = "[А-ЯЁ]"; ЭтоРусскийЯзык = RegExp.Test(Лев(ТекстБезКомментариев, 1)); Возврат ЭтоРусскийЯзык; КонецФункции // Добавляет/заменяет/удаляет оператор ПОМЕСТИТЬ в запросе. // Это неточный метод, основанный на regexp. // // Параметры: // ТекстЗапроса – Строка; // *ИмяВременнойТаблицы – Строка - если пустое, то оператор удаляется. // // Возвращаемое значение: // Строка - исправленный текст запроса. // Функция ИзменитьОператорПоместитьЗапроса(ТекстЗапроса, ИмяВременнойТаблицы = "") Экспорт ЭтоРусскийЯзык = ЭтоРусскийВариантТекстаЗапроса(ТекстЗапроса); // Меняет RegExp! RegExp.Global = Истина; шСтрокаЗапроса = """(?:(?:"""")|[^""\n])*(?:" + шРазделитель + "*(?:(?:"""")|[^""\n])*)*(?:""|$)"; ШаблонПОМЕСТИТЬИЗ = "(" + шСтрокаЗапроса + ")|(?:(" + шРазделитель + ")+(" + "(?:ПОМЕСТИТЬ|INTO(?:" + шРазделитель + "+TABLE)?)" + шРазделитель + "+" + шИмя + шРазделитель + "+)" + "|((?:ИЗ|FROM|ГДЕ|WHERE|СГРУППИРОВАТЬ|GROUP|УПОРЯДОЧИТЬ|ORDER|ИМЕЮЩИЕ|HAVING|ОБЪЕДИНИТЬ|UNION)" + шРазделитель + "+))|(.|\r|\n)"; RegExp.Pattern = ШаблонПОМЕСТИТЬИЗ; Если ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда Если ЭтоРусскийЯзык Тогда ТерминПоместить = "ПОМЕСТИТЬ"; Иначе ТерминПоместить = "INTO"; КонецЕсли; Результат = RegExp.НайтиВхождения(ТекстЗапроса); Текст = ""; ПредложениеДобавлено = Ложь; Для Каждого Match Из Результат Цикл Если Ложь Или ПредложениеДобавлено Или Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(Match.SubMatches(0)) Или Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(Match.SubMatches(4)) Тогда Текст = Текст + Match.Value; Иначе Текст = Текст + " |" + ТерминПоместить + " | " + ИмяВременнойТаблицы; Если Match.SubMatches(3) <> 0 Тогда // Видимо здесь ошибка Текст = Текст + Символы.ПС + Match.SubMatches(3); КонецЕсли; ПредложениеДобавлено = Истина; КонецЕсли; КонецЦикла; Если Не ПредложениеДобавлено Тогда Текст = Текст + " |" + ТерминПоместить + " | " + ИмяВременнойТаблицы; КонецЕсли; Иначе Текст = RegExp.Replace(ТекстЗапроса, "$1$2$4$5"); КонецЕсли; Возврат Текст; КонецФункции Функция ШаблонЗапросаДопускаетВстройкуВРодительскийЗапрос(Текст) Экспорт RegExp.Global = Ложь; RegExp.Pattern = шРазделитель + "*(?:ВЫБРАТЬ|SELECT)(?:" + шРазделитель + "+)\*(?:" + шРазделитель + "+)(?:ИЗ|FROM)(?:" + шРазделитель + "+(?:КАК|AS)?(?:" + шРазделитель + "+" + шИмя + "))" + шРазделитель + "*"; Результат = RegExp.Test(Текст); Возврат Результат; КонецФункции Функция ПолучитьКомментарийИзТокеновЯзыкаЗапросов(Токен1, Токен2 = Неопределено, выхИмяЗапросаИзКомментария = "", выхИмяЧастиОбъединенияИзКомментария = "") Экспорт Массив = Новый Массив(); Если Токен1 <> Неопределено И Токен1.Name = "Comment" Тогда Массив.Добавить(Токен1); КонецЕсли; Если Токен2 <> Неопределено И Токен2.Name = "Comment" Тогда Массив.Добавить(Токен2); КонецЕсли; ТекстКомментария = ""; Для Каждого Токен Из Массив Цикл ТекстТокена = ПолучитьТекстИзТокена(Токен); РазобратьКомментарий(ТекстКомментария, выхИмяЗапросаИзКомментария, выхИмяЧастиОбъединенияИзКомментария); КонецЦикла; Возврат ТекстКомментария; КонецФункции Процедура РазобратьКомментарий(ТекстКомментария, выхИмяЗапросаИзКомментария = Неопределено, выхИмяЧастиОбъединенияИзКомментария = Неопределено) Экспорт ЧистыйКомментарий = ""; ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(ТекстКомментария); Для Счетчик = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл СтрокаТекста = ТекстовыйДокумент.ПолучитьСтроку(Счетчик); Если ПустаяСтрока(СтрокаТекста) Тогда Продолжить; КонецЕсли; //Если Счетчик = 1 Тогда Если Найти(СтрокаТекста, мПараметрыДиалектаSQL.СтрочныйКомментарий) = 1 Тогда СтрокаТекста = Сред(СтрокаТекста, СтрДлина(мПараметрыДиалектаSQL.СтрочныйКомментарий) + 1); КонецЕсли; Если Найти(СтрокаТекста, мМаркерСлужебногоКомментария) = 1 Тогда Продолжить; КонецЕсли; Если Найти(СтрокаТекста, мПлатформа.мМаркерИмениЗапросаПакета) = 1 Тогда ИмяЗапросаИзКомментария = ирОбщий.СтрокаМеждуМаркерамиЛкс(СтрокаТекста, мПлатформа.мМаркерИмениЗапросаПакета, " "); Если ирОбщий.ЛиИмяПеременнойЛкс(ИмяЗапросаИзКомментария) Тогда выхИмяЗапросаИзКомментария = ИмяЗапросаИзКомментария; КонецЕсли; // Пропускаем служебные комментарии Продолжить; КонецЕсли; Если Найти(СтрокаТекста, мПлатформа.мМаркерИмениЧастиОбъединения) = 1 Тогда ИмяЧастиОбъединенияИзКомментария = ирОбщий.СтрокаМеждуМаркерамиЛкс(СтрокаТекста, мПлатформа.мМаркерИмениЧастиОбъединения, " "); Если ирОбщий.ЛиИмяПеременнойЛкс(ИмяЧастиОбъединенияИзКомментария) Тогда выхИмяЧастиОбъединенияИзКомментария = ИмяЧастиОбъединенияИзКомментария; КонецЕсли; // Пропускаем служебные комментарии Продолжить; КонецЕсли; //КонецЕсли; Если ЧистыйКомментарий <> "" Тогда ЧистыйКомментарий = ЧистыйКомментарий + Символы.ПС; КонецЕсли; ЧистыйКомментарий = ЧистыйКомментарий + СтрокаТекста; КонецЦикла; ТекстКомментария = ЧистыйКомментарий; КонецПроцедуры // <Описание функции> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // // Возвращаемое значение: // – <Тип.Вид> – <описание значения> // <продолжение описания значения>; // <Значение2> – <Тип.Вид> – <описание значения> // <продолжение описания значения>. // Процедура _РазобратьКонтекстРавенства() Экспорт Если Не мРазбиратьКонтекст Тогда Возврат; КонецЕсли; RegExp.Global = Истина; ВыделитьНачалоИКонецТекущейСтроки(); мКонтекст = ""; ОригинальныйТекст = ПолеТекста.ПолучитьТекст(); мПредшествующийТекст = ""; Если мКонечнаяСтрока > 1 Тогда СлужебноеПолеТекста.УстановитьТекст(ОригинальныйТекст); СлужебноеПолеТекста.УстановитьГраницыВыделения(1, 1, мКонечнаяСтрока - 1, 333); мПредшествующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; ТекстДоКурсора = мПредшествующийТекст + ТекущееНачалоСтроки; Если ЯзыкПрограммы = 0 Тогда мТекстДляПоискаОпределения = мПредшествующийТекст; Иначе мТекстДляПоискаОпределения = ОригинальныйТекст; КонецЕсли; мТекстДляПоискаОпределения = ЗалитьКомментарииИСтроковыеЛитералы(мТекстДляПоискаОпределения); RegExp.Global = Ложь; Если ЯзыкПрограммы = 0 Тогда RegExp.Pattern = "(" + шВыражениеПрограммы + ")" + шРазделитель + "*=" + шРазделитель + "*$"; Иначе RegExp.Pattern = "(" + шВыражениеЗапроса + ")" + шРазделитель + "*=" + шРазделитель + "*$"; КонецЕсли; Результат = RegExp.НайтиВхождения(ТекстДоКурсора); Если Результат.Количество() > 0 Тогда мКонтекст = Результат[0].SubMatches(0); КонецЕсли; НачатьОбработкуКоманды(); КонецПроцедуры // Разбирает текущий контекст по составляющим. // // Параметры: // *ДеструктивныйАнализ - Булево, *Истина - текст для поиска определения оптимизировать. // Процедура РазобратьТекущийКонтекст(ЛиСправаОтРавенства = Ложь, выхЕстьТочкаСправа = Ложь, КакВызовМетода = Ложь, НомерСтроки = 0, НомерКолонки = 0) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если Не мРазбиратьКонтекст Тогда Возврат; КонецЕсли; мПлатформа.ИнициализацияОписанияМетодовИСвойств(); Если Не ЗначениеЗаполнено(НомерСтроки) Тогда ПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); Иначе мНачальнаяСтрока = НомерСтроки; мКонечнаяСтрока = НомерСтроки; мНачальнаяКолонка = НомерКолонки; мКонечнаяКолонка = НомерКолонки; КонецЕсли; ВыделитьНачалоИКонецТекущейСтроки(); мЭтоОбъявлениеПсевдонима = Ложь; мЭтоСтроковыйЛитерал = ирОбщий.ЛиВнутриСтроковогоЛитералаЛкс(ТекущееНачалоСтроки); Если КакВызовМетода Или мЭтоСтроковыйЛитерал Тогда ТекущийКонтекстМетода(); КонецЕсли; RegExp.Global = Ложь; ШаблонПрефиксаПараметра = "(?:&|#|\?|@)?"; // Начало контекста СтрокаШаблона = шПредИмя + "("; Если Ложь Или ЯзыкПрограммы = 1 Или ЯзыкПрограммы = 2 Тогда СтрокаШаблона = "(?:" + шРазделитель + "+(КАК|AS|(?:ПОМЕСТИТЬ|INTO(?:" + шРазделитель + "+TABLE)?))" + шРазделитель + "*)?" + СтрокаШаблона + ШаблонПрефиксаПараметра + "(?:" + шИмя + ")?"; Иначе СтрокаШаблона = "()" + СтрокаШаблона + шИмя; КонецЕсли; СтрокаШаблона = СтрокаШаблона + шСкобки + "?" //+ "((\.(" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*\.?)"; + "((\.(" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*\.?)?"; // 20.08.2020 Если ЛиСправаОтРавенства Тогда СтрокаШаблона = СтрокаШаблона + шРазделитель + "*=" + шРазделитель + "*"; КонецЕсли; СтрокаШаблона = СтрокаШаблона + "$"; RegExp.Pattern = СтрокаШаблона; Результат = RegExp.НайтиВхождения(ТекущееНачалоСтроки); Если Результат.Количество() > 0 Тогда ПервоеВхождение = Результат[0]; НачалоКонтекста = "" + ПервоеВхождение.SubMatches(1); мЭтоОбъявлениеПсевдонима = ПервоеВхождение.SubMatches(0) <> Неопределено И Найти(НачалоКонтекста, ".") = 0; КонецЕсли; ОригинальныйТекст = ПолеТекста.ПолучитьТекст(); мПредшествующийТекст = ""; // Старый вариант //Для Счетчик = 1 По мКонечнаяСтрока - 1 Цикл // мПредшествующийТекст = мПредшествующийТекст + ПолеТекста.ПолучитьСтроку(Счетчик); //КонецЦикла; Если мКонечнаяСтрока > 1 Тогда СлужебноеПолеТекста.УстановитьТекст(ОригинальныйТекст); СлужебноеПолеТекста.УстановитьГраницыВыделения(1, 1, мКонечнаяСтрока - 1, 333); мПредшествующийТекст = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; мПредшествующийТекст = мПредшествующийТекст + Лев(ТекущееНачалоСтроки, СтрДлина(ТекущееНачалоСтроки) - СтрДлина(НачалоКонтекста)); // Конец контекста RegExp.Global = Ложь; Если Не ЛиСправаОтРавенства Тогда RegExp.Pattern = "([" + шБуква + "\d]*\(?)(\.)?"; Результат = RegExp.НайтиВхождения(ТекущийКонецСтроки); Если Результат.Количество() > 0 Тогда КонецКонтекста = Результат[0].SubMatches(0); выхЕстьТочкаСправа = Результат[0].SubMatches(1) <> Неопределено; КонецЕсли; КонецЕсли; Если Ложь Или ЯзыкПрограммы = 1 Или ЯзыкПрограммы = 2 Тогда СтрокаШаблона = ШаблонПрефиксаПараметра + "(?:" + шИмя + ")?"; Иначе СтрокаШаблона = шИмя; КонецЕсли; СтрокаШаблона = "(?:((?:" + шИмяСкобки + "?" + "(?:(?:\." + шИмяСкобки + "?)|" + шИндекс + ")*))\.)?(" + СтрокаШаблона + ")?$"; // Родительский контекст по позиции курсора RegExp.Pattern = СтрокаШаблона; Результат = RegExp.НайтиВхождения(НачалоКонтекста); Если Результат.Количество() > 0 Тогда ПервоеВхождение = Результат[0]; Если ПервоеВхождение.SubMatches(0) <> Неопределено Тогда мРодительскийКонтекст = ПервоеВхождение.SubMatches(0); КонецЕсли; Если ПервоеВхождение.SubMatches(4) <> Неопределено Тогда НачалоСлова = ПервоеВхождение.SubMatches(4); КонецЕсли; КонецЕсли; мТекущееСлово = НачалоСлова + ирОбщий.ПервыйФрагментЛкс(КонецКонтекста); мКонтекст = НачалоКонтекста + КонецКонтекста; ТекстБезКомментариевИОпасныхСтрок = ЗалитьКомментарииИСтроковыеЛитералы(ОригинальныйТекст); СлужебноеПолеТекста.УстановитьТекст(ТекстБезКомментариевИОпасныхСтрок); мПозицияТекстаДляПоискаОпределения = 0; мТекстДляПоискаОпределения = ""; Если ЯзыкПрограммы = 0 Тогда Если мКонечнаяСтрока > 1 Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(1, 1, мКонечнаяСтрока - 1, 333); мТекстДляПоискаОпределения = СлужебноеПолеТекста.ВыделенныйТекст; КонецЕсли; // Здесь не учтена возможность наличия комментария слева от текущей позиции мТекстДляПоискаОпределения = мТекстДляПоискаОпределения + Лев(ТекущееНачалоСтроки, СтрДлина(ТекущееНачалоСтроки) - СтрДлина(НачалоКонтекста)); Иначе // мПредшествующийТекст не должен использоваться потом ПозицииЗапросовПакета = Новый Массив; ЗапросыПакета = мПлатформа.РазбитьГрубоТекстПакетногоЗапросаНаТекстыЗапросов(ТекстБезКомментариевИОпасныхСтрок, СтрДлина(мПредшествующийТекст), ПозицииЗапросовПакета); Если ЗапросыПакета.Количество() > 0 Тогда НомерПервойСтрокиЗапроса = 1; Для ИндексЗапроса = 0 По ЗапросыПакета.ВГраница() Цикл ЗапросПакета = ЗапросыПакета[ИндексЗапроса]; мТекстДляПоискаОпределения = ЗапросПакета; мПозицияТекстаДляПоискаОпределения = ПозицииЗапросовПакета[ИндексЗапроса]; НомерПервойСтрокиЗапроса = НомерПервойСтрокиЗапроса + СтрЧислоВхождений(ЗапросПакета, Символы.ПС); Если НомерПервойСтрокиЗапроса >= мНачальнаяСтрока Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; НачатьОбработкуКоманды(); КонецПроцедуры // Выполняет программу на внутреннем языке. // // Параметры: // Нет. // // Возвращаемое значение: // Булево – безошибочность выполнения кода. // Функция ВыполнитьПрограммныйКод() Экспорт ТекстДляВыполнения = ПолеТекста.ПолучитьТекст(); Попытка мПлатформа.ВыполнитьПрограммныйКодВКонтексте(КонтекстВыполнения, МетодВыполнения, ТекстДляВыполнения); Возврат Истина; Исключение // Баг платформы. Зависает приложение, если пытаемся установить выделение на невидимой странице. ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; ирОбщий.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекста,,,,, ИнформацияОбОшибке()); Возврат Ложь; КонецПопытки; КонецФункции // ВыполнитьПрограммныйКод() Процедура УстановитьКонфигурациюМетаданных(пКонфигурация = Неопределено, пКонтекстВыполнения = Неопределено, Знач ДиалектSQL = Неопределено, РасширенноеПолучениеМетаданныхADO = Ложь) Экспорт //Если ЯзыкПрограммы = 1 Тогда Если ДиалектSQL = Неопределено Тогда Если пКонфигурация <> Неопределено Тогда ЭтотОбъект.Конфигурация = пКонфигурация; Иначе ЭтотОбъект.Конфигурация = мПлатформа.мМетаданные; КонецЕсли; Если ТипЗнч(Конфигурация) = Тип("ОбъектМетаданныхКонфигурация") Тогда ЭтотОбъект.мДиалектSQL = "1С"; Иначе ЭтотОбъект.мДиалектSQL = "MSSQL"; Попытка Пустышка = Конфигурация.Provider; Исключение Пустышка = Неопределено; КонецПопытки; Если Пустышка <> Неопределено Тогда // Это ADODB.Connection Если Конфигурация.State = 1 Тогда ДиалектSQL = Конфигурация.Properties("DBMS Name").Value; Иначе // Не меняем мДиалектSQL! КонецЕсли; Иначе ДиалектSQL = "WQL"; КонецЕсли; КонецЕсли; Иначе Если ирОбщий.СтрокиРавныЛкс(ДиалектSQL, "1С") Тогда ЭтотОбъект.Конфигурация = мПлатформа.мМетаданные; Иначе ЭтотОбъект.Конфигурация = пКонфигурация; КонецЕсли; КонецЕсли; Если мДиалектыSQL = Неопределено Тогда Если мПлатформа.мДиалектыSQL = Неопределено Тогда мПлатформа.мДиалектыSQL = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("ДиалектыSQL"),,, Ложь, Истина); КонецЕсли; ЭтотОбъект.мДиалектыSQL = мПлатформа.мДиалектыSQL; КонецЕсли; Если мДиалектыSQL.Найти(ДиалектSQL, "Диалект") <> Неопределено Тогда ЭтотОбъект.мДиалектSQL = ДиалектSQL; КонецЕсли; ЭтотОбъект.мПараметрыДиалектаSQL = мДиалектыSQL.Найти(мДиалектSQL, "Диалект"); ЭтотОбъект.мРасширенноеПолучениеМетаданныхADO = РасширенноеПолучениеМетаданныхADO = Истина; //Иначе // Если пКонфигурация <> Неопределено Тогда // ЭтотОбъект.Конфигурация = пКонфигурация; // Иначе // ЭтотОбъект.Конфигурация = мПлатформа.мМетаданные; // КонецЕсли; //КонецЕсли; //Если ирОбщий.СтрокиРавныЛкс(мДиалектSQL, "1С") Тогда // мДоступныеТаблицыПолучены = Истина; //ИначеЕсли ирОбщий.СтрокиРавныЛкс(мДиалектSQL, "WQL") Тогда // //ЗаполнитьДоступныеТаблицыWQL(); // Слишком долго // мДоступныеТаблицыПолучены = Истина; //Иначе // мДоступныеТаблицыПолучены = Ложь; //КонецЕсли; ЭтотОбъект.КонтекстВыполнения = пКонтекстВыполнения; КонецПроцедуры Функция ЗаполнитьДоступныеТаблицыWQL() Экспорт ////Если мДоступныеТаблицыПолучены Тогда //// Возврат Неопределено; ////КонецЕсли; ////ЭтотОбъект.мДоступныеТаблицыПолучены = Истина; //ДоступныеТаблицы.Очистить(); ОчиститьДоступныеНеВременныеТаблицы(); Если Конфигурация = Неопределено Тогда Возврат Неопределено; КонецЕсли; Состояние("Подготовка метаданных..."); wbemFlagUseAmendedQualifiers = 131072; //&H20000 КоллекцияКлассов = Конфигурация.SubclassesOf(, wbemFlagUseAmendedQualifiers); ВидимостьКолонкиСхема = Ложь; ВидимостьКолонкиОписание = Ложь; Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияКлассов.Count, "Получаем метаданные"); Для Каждого ЭлементКоллекции Из КоллекцияКлассов Цикл ирОбщий.ОбработатьИндикаторЛкс(Индикатор); СтрокаТаблицы = ДоступныеТаблицы.Добавить(); СтрокаТаблицы.Имя = ЭлементКоллекции.Path_.Class; //СтрокаТаблицы.Схема = СтрокаТЗ.TABLE_SCHEMA; //СтрокаТаблицы.Тип = СтрокаТЗ.TABLE_TYPE; СтрокаТаблицы.Описание = ирОбщий.ПолучитьОписаниеЭлементаWMIЛкс(ЭлементКоллекции); ПолноИмя = СтрокаТаблицы.Имя; Если ЗначениеЗаполнено(СтрокаТаблицы.Схема) Тогда ПолноИмя = СтрокаТаблицы.Схема + "." + ПолноИмя; КонецЕсли; СтрокаТаблицы.ПолноеИмя = ПолноИмя; СтрокаТаблицы.НПолноеИмя = НРег(СтрокаТаблицы.ПолноеИмя); ВидимостьКолонкиСхема = ВидимостьКолонкиСхема Или ЗначениеЗаполнено(СтрокаТаблицы.Схема); ВидимостьКолонкиОписание = ВидимостьКолонкиСхема Или ЗначениеЗаполнено(СтрокаТаблицы.Описание); КонецЦикла; ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); Возврат Неопределено; КонецФункции Функция ЗаполнитьДоступныеТаблицыADO() Экспорт ////Если мДоступныеТаблицыПолучены Тогда //// Возврат Неопределено; ////КонецЕсли; ////мДоступныеТаблицыПолучены = Истина; //ДоступныеТаблицы.Очистить(); ОчиститьДоступныеНеВременныеТаблицы(); Если Ложь Или Конфигурация = Неопределено Или Конфигурация.State = 0 Тогда Возврат Неопределено; КонецЕсли; Состояние("Подготовка метаданных..."); Если Не мРасширенноеПолучениеМетаданныхADO Тогда Фильтры = Новый Массив(); Фильтры.Добавить(); // TABLE_CATALOG Фильтры.Добавить(); // TABLE_SCHEMA Фильтры.Добавить(); // TABLE_NAME Если Не мРасширенноеПолучениеМетаданныхADO Тогда Фильтры.Добавить("TABLE"); // TABLE_TYPE КонецЕсли; Фильтры = Новый COMSafeArray(Фильтры, "VT_VARIANT"); ОписаниеТаблицRecordSet = Конфигурация.OpenSchema(20, Фильтры); //adSchemaTables // Может выполняться долго (oracle) Иначе ОписаниеТаблицRecordSet = Конфигурация.OpenSchema(20); //adSchemaTables // Может выполняться долго (oracle) КонецЕсли; ОписаниеТаблицТЗ = ирОбщий.РезультатЗапросаADOВТаблицуЗначенийОбщийЛкс(ОписаниеТаблицRecordSet); // Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах. #Если Сервер И Не Сервер Тогда Для Каждого СтрокаТЗ Из ОписаниеТаблицТЗ Цикл ТипТаблицы = СтрокаТЗ.TABLE_TYPE; Если Истина И Не ирОбщий.СтрокиРавныЛкс(ТипТаблицы, "table") И Не ирОбщий.СтрокиРавныЛкс(ТипТаблицы, "view") Тогда Продолжить; КонецЕсли; СтрокаТаблицы = ДоступныеТаблицы.Добавить(); СтрокаТаблицы.Имя = СтрокаТЗ.TABLE_NAME; СтрокаТаблицы.Схема = СтрокаТЗ.TABLE_SCHEMA; СтрокаТаблицы.Тип = ТипТаблицы; СтрокаТаблицы.Описание = СтрокаТЗ.DESCRIPTION; ПолноеИмяДоступнойТаблицы = ПолноеИмяДоступнойТаблицы(СтрокаТаблицы.Имя, СтрокаТаблицы.Схема); СтрокаТаблицы.ПолноеИмя = ПолноеИмяДоступнойТаблицы; СтрокаТаблицы.НПолноеИмя = НРег(ПолноеИмяДоступнойТаблицы); КонецЦикла; #КонецЕсли // Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru) Для Каждого СтрокаТЗ Из ОписаниеТаблицТЗ Цикл   ТипТаблицы = СтрокаТЗ.TABLE_TYPE;   Если Истина   И Не ирОбщий.СтрокиРавныЛкс(ТипТаблицы, "table")   И Не ирОбщий.СтрокиРавныЛкс(ТипТаблицы, "view")   Тогда   Продолжить;   КонецЕсли;   СтрокаТаблицы = ДоступныеТаблицы.Добавить();   СтрокаТаблицы.Имя = СтрокаТЗ.TABLE_NAME;   СтрокаТаблицы.Схема = СтрокаТЗ.TABLE_SCHEMA;   СтрокаТаблицы.Тип = ТипТаблицы;   СтрокаТаблицы.Описание = СтрокаТЗ.DESCRIPTION;   ПолноеИмяДоступнойТаблицы = ПолноеИмяДоступнойТаблицы(СтрокаТаблицы.Имя, СтрокаТаблицы.Схема);   СтрокаТаблицы.ПолноеИмя = ПолноеИмяДоступнойТаблицы;   СтрокаТаблицы.НПолноеИмя = НРег(ПолноеИмяДоступнойТаблицы);   КонецЦикла;   Возврат Неопределено; КонецФункции Функция ПолучитьИмяТаблицыADO(Знач ИмяИсходное) Если Лев(ИмяИсходное, 1) <> "[" Тогда ИмяИсходное = "[" + ИмяИсходное + "]"; КонецЕсли; Возврат ИмяИсходное; КонецФункции Функция НайтиДобавитьДоступнуюВременнуюТаблицу(Знач ЛюбоеИмяТаблицы, ПородившийЗапрос = Неопределено, выхБылиДобавления = Ложь, ИсточникДанных1С = Неопределено) Экспорт КраткоеИмяТаблицы = КраткоеИмяВременнойТаблицы(ЛюбоеИмяТаблицы); ПолноеИмяТаблицы = ПолноеИмяДоступнойТаблицы(ЛюбоеИмяТаблицы); ПолноеИмяТаблицы = ПолноеИмяВременнойТаблицы(ПолноеИмяТаблицы, ИсточникДанных1С); СтрокаДоступнойТаблицы = ДоступныеТаблицы.Найти(НРег(ПолноеИмяТаблицы), "НПолноеИмя"); Если СтрокаДоступнойТаблицы = Неопределено Тогда СтрокаДоступнойТаблицы = ДоступныеТаблицы.Добавить(); СтрокаДоступнойТаблицы.Имя = КраткоеИмяТаблицы; СтрокаДоступнойТаблицы.ПолноеИмя = ПолноеИмяТаблицы; СтрокаДоступнойТаблицы.Схема = ИсточникДанных1С; ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаДоступнойТаблицы, "ПолноеИмя"); СтрокаДоступнойТаблицы.Тип = "ВременнаяТаблица"; СтрокаДоступнойТаблицы.ЕстьДоступ = Истина; выхБылиДобавления = Истина; КонецЕсли; Если ПородившийЗапрос <> Неопределено Тогда Для Каждого СтараяСтрока Из ДоступныеТаблицы.НайтиСтроки(Новый Структура("ПородившийЗапрос", ПородившийЗапрос)) Цикл Если СтараяСтрока = СтрокаДоступнойТаблицы Тогда Продолжить; КонецЕсли; ДоступныеТаблицы.Удалить(СтараяСтрока); КонецЦикла; СтрокаДоступнойТаблицы.ПородившийЗапрос = ПородившийЗапрос; КонецЕсли; Возврат СтрокаДоступнойТаблицы; КонецФункции Функция ПолноеИмяДоступнойТаблицы(Знач ИмяДоступнойТаблицы, ИмяСхемы = Неопределено) Экспорт Если Истина И Найти(ИмяДоступнойТаблицы, ".") = 0 И мПараметрыДиалектаSQL.Диалект <> "1С" И мПараметрыДиалектаSQL.Диалект <> "WQL" Тогда ИмяДоступнойТаблицы = ПолучитьИмяТаблицыADO(ИмяДоступнойТаблицы); Если ИмяСхемы = Неопределено И ДоступныеТаблицы.Количество() > 0 Тогда ИмяСхемы = ДоступныеТаблицы[0].Схема; КонецЕсли; Если ЗначениеЗаполнено(ИмяСхемы) Тогда ИмяДоступнойТаблицы = ИмяСхемы + "." + ИмяДоступнойТаблицы; КонецЕсли; КонецЕсли; Возврат ИмяДоступнойТаблицы; КонецФункции Функция ПолноеИмяВременнойТаблицы(Знач КраткоеИмяТаблицы, Знач ИсточникДанных1С = Неопределено) Экспорт Результат = КраткоеИмяТаблицы; Если Истина И Найти(КраткоеИмяТаблицы, ".") = 0 И мПараметрыДиалектаSQL.Диалект = "1С" И ЗначениеЗаполнено(ИсточникДанных1С) И ИсточникДанных1С <> "<Локальный>" Тогда Результат = "ВнешнийИсточникДанных." + ИсточникДанных1С + ".ВременнаяТаблица." + Результат; КонецЕсли; Возврат Результат; КонецФункции Функция КраткоеИмяВременнойТаблицы(ЛюбоеИмяТаблицы) Экспорт Результат = ЛюбоеИмяТаблицы; Если Истина И мПараметрыДиалектаSQL.Диалект = "1С" И Найти(Результат, ".") > 0 Тогда Результат = ирОбщий.ПоследнийФрагментЛкс(Результат); КонецЕсли; Возврат Результат; КонецФункции Процедура ОчиститьДоступныеВременныеТаблицы(ТаблицаДоступныхТаблиц = Неопределено) Экспорт Если ТаблицаДоступныхТаблиц = Неопределено Тогда ТаблицаДоступныхТаблиц = ДоступныеТаблицы; КонецЕсли; СтрокиКУдалению = ТаблицаДоступныхТаблиц.НайтиСтроки(Новый Структура("Тип", "ВременнаяТаблица")); Для Каждого СтрокаКУдалению Из СтрокиКУдалению Цикл ТаблицаДоступныхТаблиц.Удалить(СтрокаКУдалению);; КонецЦикла; КонецПроцедуры Процедура ОчиститьДоступныеНеВременныеТаблицы() Экспорт ДоступныеВременныеТаблицы = ДоступныеТаблицы.Выгрузить(Новый Структура("Тип", "ВременнаяТаблица")); ДоступныеТаблицы.Очистить(); ДоступныеТаблицы.Загрузить(ДоступныеВременныеТаблицы); КонецПроцедуры Функция ПрефиксПараметра() Экспорт Возврат мПараметрыДиалектаSQL.ПрефиксПараметра; КонецФункции // Вызывает конструктор запросов и передает ему текст из текстового поля. // // Параметры: // Нет. // Функция ВызватьКонструкторЗапросов(Знач ИспользуемСобственныйКонструктор = Неопределено) Экспорт Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда Возврат Ложь; КонецЕсли; #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли РежимТолькоПросмотр = Ложь Или ПолеТекста.ТолькоПросмотр() Или ФормаВладелец.ТолькоПросмотр; Если РежимТолькоПросмотр Тогда Ответ = Вопрос("Текст запроса не может быть изменен. Открыть конструктор без возможности сохранения изменений?", РежимДиалогаВопрос.ОКОтмена); Если Ответ = КодВозвратаДиалога.Отмена Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда ИспользуемСобственныйКонструктор = Ложь КонецЕсли; ПредпочитаюСобственныйКонструкторЗапроса = Ложь; Если ИспользуемСобственныйКонструктор = Неопределено Тогда ПредпочитаюСобственныйКонструкторЗапроса = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ПредпочитаюСобственныйКонструкторЗапроса"); Если ПредпочитаюСобственныйКонструкторЗапроса = Неопределено Тогда Ответ = Вопрос("Подсистема имеет собственный конструктор запроса. Приоритет его использования задается в настройках компоненты ""Контекстная подсказка"". |Хотите установить приоритет его использования?", РежимДиалогаВопрос.ДаНет); ПредпочитаюСобственныйКонструкторЗапроса = Ответ = КодВозвратаДиалога.Да; КонецЕсли; КонецЕсли; ИспользуемСобственныйКонструктор = Ложь Или ИспользуемСобственныйКонструктор = Истина Или мДиалектSQL <> "1С" Или ПредпочитаюСобственныйКонструкторЗапроса; Если ИспользуемСобственныйКонструктор Тогда КонструкторЗапроса = ПолучитьФорму("КонструкторЗапроса"); КонструкторЗапроса.Конфигурация = Конфигурация; Иначе КонструкторЗапроса = Новый КонструкторЗапроса; КонецЕсли; //ОбрамитьСобранныйТекстСкобками = Ложь; Если ЯзыкПрограммы = 1 Тогда Если СтрДлина(СокрЛП(ВыделенныйТекст())) < 6 И Не ЭтоЧастичныйЗапрос Тогда ТекстЗапроса = ПолеТекста.ПолучитьТекст(); НачальнаяСтрокаЗапроса = 0; НачальнаяКолонкаЗапроса = 0; Иначе ТекстЗапроса = ВыделенныйТекст(); //Если Не ЗначениеЗаполнено(ТекстЗапроса) И ЭтоЧастичныйЗапрос Тогда // ТекстЗапроса = "ВЫБРАТЬ 1"; // ОбрамитьСобранныйТекстСкобками = Истина; //КонецЕсли; НачальнаяСтрокаЗапроса = мНачальнаяСтрока - 1; НачальнаяКолонкаЗапроса = мНачальнаяКолонка - 1; КонецЕсли; КонструкторЗапроса.РежимКомпоновкиДанных = РежимКомпоновкиДанных; //КонструкторЗапроса.АвтодобавлениеПредставлений = Истина; МассивВременныхТаблиц = Новый Массив; Если Не ПустаяСтрока(ТекстЗапроса) Тогда Если Истина И ТипЗнч(КонтекстВыполнения) = Тип("Запрос") И Не ИспользуемСобственныйКонструктор Тогда СтарыйТекстЗапроса = ТекстЗапроса; ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(ТекстЗапроса); Попытка ТекстЗапроса = мПлатформа.ЗамаскироватьВременныеТаблицы(КонтекстВыполнения, ТекстЗапроса, МассивВременныхТаблиц); Исключение ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; ирОбщий.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекста, , , Истина,, ИнформацияОбОшибке()); Возврат Ложь; КонецПопытки; НоваяИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(ТекстЗапроса); Если Истина И НоваяИнформацияОбОшибке <> Неопределено И ИнформацияОбОшибке = Неопределено И Найти(ПодробноеПредставлениеОшибки(НоваяИнформацияОбОшибке), "Ожидается псевдоним запроса") > 0 Тогда // Сюда попадаем, когда у временной таблицы нет псевдонима ирОбщий.СообщитьСУчетомМодальностиЛкс("В запросе присутствуют временные таблицы без псевдонимов. " + "Для максимальной функциональности рекомендуется задать каждой временной таблице псевдоним",, СтатусСообщения.Внимание); МассивВременныхТаблиц = Новый Массив; ТекстЗапроса = СтарыйТекстЗапроса; КонецЕсли; КонецЕсли; КонецЕсли; Иначе РазобратьТекущийКонтекст(); ТекстПоля = ПолеТекста.ПолучитьТекст(); RegExp.Global = Истина; RegExp.MultiLine = Истина; RegExp.Pattern = шСтрокаПрограммы; Результат = RegExp.НайтиВхождения(ТекстПоля); Успех = Ложь; ДлинаТекстаДо = СтрДлина(мПредшествующийТекст); Для Каждого Вхождение Из Результат Цикл Если Истина И (Вхождение.FirstIndex + 1) <= ДлинаТекстаДо И (Вхождение.FirstIndex + Вхождение.Length + 1) >= ДлинаТекстаДо Тогда ПолеТекста.УстановитьГраницыВыделения(Вхождение.FirstIndex + 1, Вхождение.FirstIndex + Вхождение.Length + 1); Успех = Истина; Прервать; КонецЕсли; КонецЦикла; ПолеТекста.ПолучитьГраницыВыделения(НачальнаяСтрокаЗапроса, НачальнаяКолонкаЗапроса, , ); НачальнаяСтрокаЗапроса = НачальнаяСтрокаЗапроса - 1; НачальнаяКолонкаЗапроса = НачальнаяСтрокаЗапроса - 1; Если Успех Тогда ТекстЗапроса = ВыделенныйТекст(); Если Прав(ТекстЗапроса, 1) <> """" Тогда ТекстЗапроса = ТекстЗапроса + """"; КонецЕсли; ТекстЗапроса = Вычислить(ТекстЗапроса); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "|", ""); Иначе ТекстЗапроса = ""; КонецЕсли; КонецЕсли; Если ИспользуемСобственныйКонструктор Тогда Парсер = мПлатформа.мПолучитьПарсер("ГрамматикаЯзыкаЗапросов"); Если Парсер = Неопределено Тогда ирОбщий.СообщитьСУчетомМодальностиЛкс("Компонента анализа текста запроса не подключена"); Возврат Ложь; КонецЕсли; КонецЕсли; Если Не ПустаяСтрока(ТекстЗапроса) Тогда Если ИспользуемСобственныйКонструктор Тогда РезультатРазбора = ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса,, мДиалектSQL,, НачальнаяСтрокаЗапроса); Если Не РезультатРазбора Тогда Возврат Ложь; КонецЕсли; Иначе СтруктуруРезультатаПакетногоЗапроса = мПлатформа.СтруктураРезультатаПакетногоЗапроса(ТекстЗапроса); Если СтруктуруРезультатаПакетногоЗапроса.Количество() > 0 Тогда Ответ = Вопрос("В комментариях обнаружены имена запросов. Стандартный конструктор запросов их удалит. Продолжить?", РежимДиалогаВопрос.ОКОтмена); Если Ответ <> КодВозвратаДиалога.ОК Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Попытка КонструкторЗапроса.Текст = ТекстЗапроса; Исключение ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; ирОбщий.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекста, НачальнаяСтрокаЗапроса, НачальнаяКолонкаЗапроса, Истина,, ИнформацияОбОшибке()); Возврат Ложь; КонецПопытки; КонецЕсли; Иначе Если ИспользуемСобственныйКонструктор Тогда //КонструкторЗапроса.УстановитьДиалектSQL(мДиалектSQL); КонструкторЗапроса.УстановитьДанные(); КонецЕсли; КонецЕсли; ирОбщий.СохранитьЗначениеЛкс(ИмяКласса + ".ПредпочитаюСобственныйКонструкторЗапроса", ПредпочитаюСобственныйКонструкторЗапроса); РезультатФормы = КонструкторЗапроса.ОткрытьМодально(); Если РезультатФормы = Истина Тогда Если Не РежимТолькоПросмотр Тогда НовыйТекстЗапроса = КонструкторЗапроса.Текст; Если Истина И ТипЗнч(Конфигурация) = Тип("ОбъектМетаданныхКонфигурация") И ТипЗнч(КонтекстВыполнения) = Тип("Запрос") Тогда //RegExp.Global = Истина; //RegExp.MultiLine = Истина; //RegExp.IgnoreCase = Истина; //// Допустим 1 уровень скобок. //шОдинарныеСкобки = "\([^\)\(]*?\)"; //шИмяВременнойТаблицы = ""; //Для Каждого ПодмененнаяВременнаяТаблица Из МассивВременныхТаблиц Цикл // шИмяВременнойТаблицы = шИмяВременнойТаблицы + "|" + ПодмененнаяВременнаяТаблица; //КонецЦикла; //шИмяВременнойТаблицы = Сред(шИмяВременнойТаблицы, 2); //RegExp.Pattern = "\(ВЫБРАТЬ(?:" + шОдинарныеСкобки + "|[^$\(\)])*?""ВременнаяТаблица"" = ""(" + шИмяВременнойТаблицы + ")""\)"; //НовыйТекстЗапроса = RegExp.Replace(НовыйТекстЗапроса, "$1"); НовыйТекстЗапроса = мПлатформа.РазмаскироватьВременныеТаблицы(НовыйТекстЗапроса, МассивВременныхТаблиц); КонецЕсли; Если ЯзыкПрограммы = 1 Тогда Если Не ЭтоЧастичныйЗапрос И НачальнаяСтрокаЗапроса = 0 Тогда ВыделитьВесьТекст(); КонецЕсли; //Если ОбрамитьСобранныйТекстСкобками Тогда // НовыйТекстЗапроса = "(" + НовыйТекстЗапроса + ")"; //КонецЕсли; Если ИспользуемСобственныйКонструктор Тогда ПолучитьНомерТекущейСтроки(); ВыделенныйТекст(НовыйТекстЗапроса); мНачальнаяСтрока = мНачальнаяСтрока + КонструкторЗапроса.мНомерТекущейСтрокиВСобранномТексте; мНачальнаяКолонка = 1; мКонечнаяСтрока = мНачальнаяСтрока; мКонечнаяКолонка = мНачальнаяКолонка; Иначе ВыделенныйТекст(НовыйТекстЗапроса); КонецЕсли; ПослеУстановкиВыделенногоМногострочногоТекста(); Иначе НовыйТекстЗапроса = ирОбщий.ПолучитьСтроковыйЛитералИзМногострочногоТекстаЛкс(НовыйТекстЗапроса); ЧислоСтрокЗамены = СтрЧислоСтрок(НовыйТекстЗапроса); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(НовыйТекстЗапроса); СдвинутыйТекст = ТекстовыйДокумент.ПолучитьСтроку(1); ЗаменаТабуляции = ирОбщий.СтрокаПовторомЛкс(" ", ШиринаТабуляции); ТекстНачальнойСтроки = ПолеТекста.ПолучитьСтроку(мНачальнаяСтрока); ДлинаНачалаСтроки = СтрДлина(ТекстНачальнойСтроки) - СтрДлина(СокрЛ(ТекстНачальнойСтроки)); НачалоСтроки = Лев(ТекстНачальнойСтроки, ДлинаНачалаСтроки); ДлинаРазвернутогоНачалаСтроки = СтрДлина(СтрЗаменить(НачалоСтроки, Символы.Таб, ЗаменаТабуляции)); ЧислоТабуляций = ДлинаРазвернутогоНачалаСтроки / ШиринаТабуляции; ЧислоПробелов = ДлинаРазвернутогоНачалаСтроки % ШиринаТабуляции; НачалоНовойСтроки = ирОбщий.СтрокаПовторомЛкс(Символы.Таб, ЧислоТабуляций); НачалоНовойСтроки = НачалоНовойСтроки + ирОбщий.СтрокаПовторомЛкс(" ", ЧислоПробелов); Для Счетчик = 2 По ЧислоСтрокЗамены Цикл ТекущаяСтрокаВставки = ТекстовыйДокумент.ПолучитьСтроку(Счетчик); СдвинутыйТекст = СдвинутыйТекст + Символы.ПС + НачалоНовойСтроки + ТекущаяСтрокаВставки; КонецЦикла; ВыделенныйТекст(СдвинутыйТекст); ПослеУстановкиВыделенногоМногострочногоТекста(); КонецЕсли; Возврат Истина; КонецЕсли; КонецЕсли; Возврат Ложь; КонецФункции Процедура ПоказатьТекущиеКоординаты(ПолеТекста, СтартоваяСтрокаДляОтображенияОшибок = 0) #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли // Антибаг платформы 8.1 . Терялся фокус ФормаВладелец.ТекущийЭлемент = ПолеТекста.ЭлементФормы; ПолеТекста.ПоказатьОшибку(мПарсер.CurrentLineNumber() + СтартоваяСтрокаДляОтображенияОшибок, мПарсер.CurrentColumnNumber()); КонецПроцедуры Функция ПолучитьКоординатыВТекстеЗапроса(ПолеТекста, СтартоваяСтрокаДляОтображенияОшибок = 0) НомерСтроки = СтартоваяСтрокаДляОтображенияОшибок + мПарсер.CurrentLineNumber(); Результат = ""; Если ПолеТекста <> Неопределено Тогда Результат = Результат + ирОбщий.ПредставлениеИзИдентификатораЛкс(ПолеТекста.ЭлементФормы.Имя) + ": "; КонецЕсли; Результат = Результат + "Строка " + НомерСтроки + ": {(" + НомерСтроки + "," + мПарсер.CurrentColumnNumber() + ")}: "; Возврат Результат; КонецФункции Функция ПолучитьСтрокуОжидаемыхТокенов() СтрокаОжидаемыхТокенов = ""; Для й = 0 по мПарсер.TokenCount() - 1 Цикл Токен = мПарсер.Tokens(й); СтрокаОжидаемыхТокенов = СтрокаОжидаемыхТокенов + ", " + Токен.Text; КонецЦикла; Возврат Сред(СтрокаОжидаемыхТокенов, 3); КонецФункции // ПолучитьСтрокуОжидаемыхТокенов() Функция _ПолучитьГраничныйТерминалПравила(Данные, ИндексГраницы = 0, ЗахватыватьКрайниеКомментарии = Ложь) Экспорт КоличествоТокенов = Данные.TokenCount; Для Сч1 = 1 По КоличествоТокенов Цикл Если ИндексГраницы = 1 Тогда УзелКандидат = Данные.Tokens(КоличествоТокенов - Сч1); Иначе УзелКандидат = Данные.Tokens(Сч1 - 1); КонецЕсли; Если ТипЗнч(УзелКандидат.Data) = Тип("Строка") Тогда Если ЗахватыватьКрайниеКомментарии И ИндексГраницы = 1 И УзелКандидат.EndNoise <> Неопределено Тогда Возврат УзелКандидат.EndNoise; ИначеЕсли ЗахватыватьКрайниеКомментарии И ИндексГраницы = 0 И УзелКандидат.BeginNoise <> Неопределено Тогда Возврат УзелКандидат.BeginNoise; Иначе Возврат УзелКандидат; КонецЕсли; ИначеЕсли ТипЗнч(УзелКандидат.Data) = Тип("COMОбъект") Тогда Если УзелКандидат.Data.TokenCount > 0 Тогда УзелСнизу = _ПолучитьГраничныйТерминалПравила(УзелКандидат.Data, ИндексГраницы, ЗахватыватьКрайниеКомментарии); Если УзелСнизу <> Неопределено Тогда Возврат УзелСнизу; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции Функция ПолучитьТекстИзТокена(Токен, выхНачальнаяСтрока = 0, выхНачальнаяКолонка = 0, выхКонечнаяСтрока = 0, выхКонечнаяКолонка = 0) Экспорт Если Токен = Неопределено Тогда Возврат ""; КонецЕсли; НачальныйТокен = Токен.GetBorderToken(0); Если НачальныйТокен = Неопределено Тогда Возврат ""; КонецЕсли; выхНачальнаяКолонка = НачальныйТокен.ColumnNumber; выхНачальнаяСтрока = НачальныйТокен.LineNumber; КонечныйТокен = Токен.GetBorderToken(1); Если КонечныйТокен = Неопределено Тогда Возврат ""; КонецЕсли; выхКонечнаяКолонка = КонечныйТокен.ColumnNumber + СтрДлина(КонечныйТокен.Data); выхКонечнаяСтрока = КонечныйТокен.LineNumber + СтрЧислоСтрок(КонечныйТокен.Data) - 1; СлужебноеПолеТекста.УстановитьГраницыВыделения(выхНачальнаяСтрока, выхНачальнаяКолонка, выхКонечнаяСтрока, выхКонечнаяКолонка); ТекстОпределения = СлужебноеПолеТекста.ВыделенныйТекст; ТекстОпределения = СокрЛП(ТекстОпределения); Возврат ТекстОпределения; КонецФункции Функция _ПолучитьТекстИзДанныхТокена(ДанныеТокена, выхНачальнаяСтрока = 0, выхНачальнаяКолонка = 0, выхКонечнаяСтрока = 0, выхКонечнаяКолонка = 0) Экспорт НачальныйТокен = _ПолучитьГраничныйТерминалПравила(ДанныеТокена, 0); Если НачальныйТокен = Неопределено Тогда Возврат ""; КонецЕсли; выхНачальнаяКолонка = НачальныйТокен.ColumnNumber; выхНачальнаяСтрока = НачальныйТокен.LineNumber; КонечныйТокен = _ПолучитьГраничныйТерминалПравила(ДанныеТокена, 1); Если КонечныйТокен = Неопределено Тогда Возврат ""; КонецЕсли; выхКонечнаяКолонка = КонечныйТокен.ColumnNumber + СтрДлина(КонечныйТокен.Data); выхКонечнаяСтрока = КонечныйТокен.LineNumber + СтрЧислоСтрок(КонечныйТокен.Data) - 1; СлужебноеПолеТекста.УстановитьГраницыВыделения(выхНачальнаяСтрока, выхНачальнаяКолонка, выхКонечнаяСтрока, выхКонечнаяКолонка); ТекстОпределения = СлужебноеПолеТекста.ВыделенныйТекст; ТекстОпределения = СокрЛП(ТекстОпределения); Возврат ТекстОпределения; КонецФункции Функция ЗагрузитьТекстВКонструктор(ТекстЗапроса = Неопределено, Знач КонструкторЗапроса = Неопределено, Знач СокращенноеДерево = Ложь, ДиалектSQL = Неопределено, ИменованныеПараметры = Неопределено, СтартоваяСтрокаДляОтображенияОшибок = 0) Экспорт Если ТекстЗапроса = Неопределено Тогда ТекстЗапроса = ПолеТекста.ПолучитьТекст(); КонецЕсли; Если КонструкторЗапроса <> Неопределено Тогда КонструкторЗапроса.УстановитьДиалектSQL(ДиалектSQL, ИменованныеПараметры); КонецЕсли; ТаблицаКомментариев = Неопределено; БылиПотери = Неопределено; НачальныйТокен = РазобратьТекстЗапроса(ТекстЗапроса, СокращенноеДерево,,, Истина, ТаблицаКомментариев, БылиПотери, СтартоваяСтрокаДляОтображенияОшибок); Если Истина И НачальныйТокен <> Неопределено И КонструкторЗапроса <> Неопределено Тогда КонструкторЗапроса.СлужебноеПолеТекста.УстановитьТекст(ТекстЗапроса); Если ДиалектSQL = Неопределено Тогда ДиалектSQL = мДиалектSQL; КонецЕсли; КонструкторЗапроса.ЗапросыПакета.Очистить(); КонструкторЗапроса.УстановитьДанные(НачальныйТокен, ТаблицаКомментариев, БылиПотери,, ПолучитьНомерТекущейСтроки()); КонецЕсли; Возврат НачальныйТокен <> Неопределено; КонецФункции // Возвращает начальный токен (Структура) построенной структуры запроса. Функция РазобратьТекстЗапроса(ТекстЗапроса, СокращенноеДерево = Ложь, ОбновлятьСостояние = Истина, Знач пПолеТекста = Неопределено, СообщатьОПропущенныхТерминалах = Ложь, выхТаблицаКомментариев = Неопределено, выхБылиПотери = Неопределено, СтартоваяСтрокаДляОтображенияОшибок = 0) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли мПарсер = мПлатформа.мПолучитьПарсер("ГрамматикаЯзыкаЗапросов"); Если мПарсер = Неопределено Тогда Возврат Неопределено; КонецЕсли; Если пПолеТекста = Неопределено Тогда пПолеТекста = ПолеТекста; Иначе пПолеТекста = ирОбщий.ОболочкаПоляТекстаЛкс(пПолеТекста); КонецЕсли; Если ОбновлятьСостояние Тогда ирОбщий.СостояниеЛкс("Синтаксический разбор..."); КонецЕсли; выхТаблицаКомментариев = Новый ТаблицаЗначений; выхТаблицаКомментариев.Колонки.Добавить("Позиция", Новый ОписаниеТипов("Число")); выхТаблицаКомментариев.Колонки.Добавить("Текст", Новый ОписаниеТипов("Строка")); выхТаблицаКомментариев.Колонки.Добавить("ЭтоРасширение", Новый ОписаниеТипов("Булево")); gpMsgTokenRead = 1; gpMsgReduction = 2; gpMsgAccept = 3; gpMsgNotLoadedError = 4; gpMsgLexicalError = 5; gpMsgSyntaxError = 6; gpMsgCommentError = 7; gpMsgInternalError = 8; gpMsgCommentBlockRead = 9; gpMsgCommentLineRead = 10; мПарсер.OpenTextString(ТекстЗапроса + Символы.ПС); Закончили = Ложь; //ПоследниеТокены = Новый Массив(); ПоследнееПравилоНеКомментарий = Неопределено; TrimReductions = СокращенноеДерево; мПарсер.TrimReductions = СокращенноеДерево; // Была Истина Пока Не Закончили Цикл ОбработкаПрерыванияПользователя(); Ответ = мПарсер.Parse(); Если Истина И СокращенноеДерево И TrimReductions <> Истина Тогда мПарсер.TrimReductions = Истина; TrimReductions = Истина; КонецЕсли; Если Ложь Или Ответ = gpMsgLexicalError Или (Истина // Хотя Builder в этом случае диагностирует лексическую ошибку, этот парсер почему то бесконечно выдает статус 7 И Ответ = 7 И мПарсер.CurrentReduction = Неопределено) Тогда мПарсер.PopInputToken(); Закончили = Истина; КоординатыВТекстеЗапроса = ПолучитьКоординатыВТекстеЗапроса(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); ирОбщий.СообщитьСУчетомМодальностиЛкс(КоординатыВТекстеЗапроса + "Лексическая ошибка!",, СтатусСообщения.Важное); Если пПолеТекста <> Неопределено Тогда ПоказатьТекущиеКоординаты(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); КонецЕсли; ИначеЕсли Ответ = gpMsgSyntaxError Тогда ТекущийТокен = мПарсер.CurrentToken(); Если Истина И ТекущийТокен.Kind = 1 И (Ложь Или ТекущийТокен.Name = "MultiCommentLine" //Или ТекущийТокен.Name = "ExtensionBlock" Или ТекущийТокен.Name = "CommentBlock") Тогда Если СообщатьОПропущенныхТерминалах Тогда КоординатыВТекстеЗапроса = ПолучитьКоординатыВТекстеЗапроса(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); ирОбщий.СообщитьСУчетомМодальностиЛкс(КоординатыВТекстеЗапроса + "Проигнорирован комментарий """ + СокрЛП(ТекущийТокен.Data) + """" //+ ", ожидается: " + ПолучитьСтрокуОжидаемыхТокенов() , , СтатусСообщения.Внимание); КонецЕсли; мПарсер.PopInputToken(); Иначе КоординатыВТекстеЗапроса = ПолучитьКоординатыВТекстеЗапроса(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); ТекстОшибки = КоординатыВТекстеЗапроса + "Синтаксическая ошибка """ + ТекущийТокен.Data + """" + ", ожидается: " + ПолучитьСтрокуОжидаемыхТокенов(); ирОбщий.СообщитьСУчетомМодальностиЛкс(ТекстОшибки,, СтатусСообщения.Важное); Если пПолеТекста <> Неопределено Тогда ПоказатьТекущиеКоординаты(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); КонецЕсли; Закончили = Истина; КонецЕсли; ИначеЕсли Ответ = gpMsgReduction Тогда Если СокращенноеДерево Тогда //ИмяПравила = мПарсер.CurrentReduction.ParentRule.RuleNonterminal.Name; ИмяПравила = мПарсер.CurrentRuleName(); Если Ложь // Есть сомнения, что это работает как задумано Или ИмяПравила = "Table" Или ИмяПравила = "TableName" Тогда мПарсер.TrimReductions = Ложь; TrimReductions = Ложь; КонецЕсли; КонецЕсли; ИначеЕсли Ответ = gpMsgAccept Тогда Закончили = Истина; ИначеЕсли Ответ = gpMsgCommentError Тогда ИначеЕсли Ответ = gpMsgTokenRead Тогда Если мПарсер.IsCurrentTokenComment() Тогда // Храним 2 последних токена ТекущийТокен = мПарсер.CurrentToken(); ПрочитатьКомментарий(выхТаблицаКомментариев, ТекущийТокен, пПолеТекста, СообщатьОПропущенныхТерминалах, СтартоваяСтрокаДляОтображенияОшибок); КонецЕсли; ИначеЕсли Ответ = gpMsgInternalError Тогда Закончили = Истина; ИначеЕсли Ответ = gpMsgNotLoadedError Тогда Закончили = Истина; КонецЕсли; КонецЦикла; Если ОбновлятьСостояние Тогда ирОбщий.СостояниеЛкс(""); КонецЕсли; Если Ответ = gpMsgAccept Тогда НачальныйТокен = Новый Структура("Data, LineNumber, ColumnNumber, Name, Kind", мПарсер.CurrentReduction, 0, 0, "", 0); Возврат НачальныйТокен; Иначе Возврат Неопределено; КонецЕсли; КонецФункции Процедура ПрочитатьКомментарий(Знач выхТаблицаКомментариев, Знач ТекущийТокен, Знач пПолеТекста, Знач СообщатьОПропущенныхТерминалах, Знач СтартоваяСтрокаДляОтображенияОшибок) ТекстКомментария = СокрЛП(ТекущийТокен.Data); МаркерХАРАКТЕРИСТИКИ = "ХАРАКТЕРИСТИКИ"; ЭтоРасширение = Ложь; Если Лев(ТекстКомментария, 1) = "{" Тогда ТекстКомментария = Сред(ТекстКомментария, 2, СтрДлина(ТекстКомментария) - 2); ЭтоРасширение = мПараметрыДиалектаSQL.Это1С; ИначеЕсли Лев(ТекстКомментария, 2) = "//" Тогда ТекстКомментария = Сред(ТекстКомментария, 3); ИначеЕсли Лев(ТекстКомментария, 2) = "/*" Тогда ТекстКомментария = Сред(ТекстКомментария, 3, СтрДлина(ТекстКомментария) - 4); КонецЕсли; Если ЭтоРасширение И Лев(ТекстКомментария, СтрДлина(МаркерХАРАКТЕРИСТИКИ)) = МаркерХАРАКТЕРИСТИКИ Тогда выхБылиПотери = Истина; Если СообщатьОПропущенныхТерминалах Тогда КоординатыВТекстеЗапроса = ПолучитьКоординатыВТекстеЗапроса(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок); ирОбщий.СообщитьСУчетомМодальностиЛкс(КоординатыВТекстеЗапроса + "Проигнорирован комментарий """ + СокрЛП(ТекущийТокен.Data) + """" //+ ", ожидается: " + ПолучитьСтрокуОжидаемыхТокенов() , , СтатусСообщения.Внимание); КонецЕсли; ИначеЕсли ЗначениеЗаполнено(ТекстКомментария) Тогда СтрокаРасширения = выхТаблицаКомментариев.Добавить(); СтрокаРасширения.ЭтоРасширение = ЭтоРасширение; СтрокаРасширения.Позиция = ПолучитьОтносительнуюПозициюТокена(ТекущийТокен); СтрокаРасширения.Текст = ТекстКомментария; // Убираем крайние фигурные скобки КонецЕсли; КонецПроцедуры Функция ПолучитьОтносительнуюПозициюТокена(Токен) Экспорт Результат = Токен.LineNumber * 1000 + Токен.ColumnNumber; Возврат Результат; КонецФункции // Вызывает конструктор запросов и передает ему текст из текстового поля. // // Параметры: // Нет. // Функция ОткрытьРедакторСтроковогоЛитерала() Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда Возврат Ложь; КонецЕсли; РежимТолькоПросмотр = Ложь Или ПолеТекста.ТолькоПросмотр() Или ФормаВладелец.ТолькоПросмотр; Если РежимТолькоПросмотр Тогда Ответ = Вопрос("Текст не может быть изменен. Открыть редактор без возможности сохранения измений?", РежимДиалогаВопрос.ОКОтмена); Если Ответ = КодВозвратаДиалога.Отмена Тогда Возврат Ложь; КонецЕсли; КонецЕсли; ТекстСтроковогоЛитерала = ВыделитьТекстТекущегоСтроковогоЛитерала(); ФормаРедактора = мПлатформа.ПолучитьФорму("Текст", , Новый УникальныйИдентификатор); ФормаРедактора.НачальноеЗначениеВыбора = ТекстСтроковогоЛитерала; Если ФормаРедактора.ОткрытьМодально() <> Неопределено Тогда Если Не РежимТолькоПросмотр Тогда НовыйТекстЗапроса = ФормаРедактора.Текст; НовыйТекстЗапроса = ирОбщий.ПолучитьСтроковыйЛитералИзМногострочногоТекстаЛкс(НовыйТекстЗапроса); ЧислоСтрокЗамены = СтрЧислоСтрок(НовыйТекстЗапроса); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(НовыйТекстЗапроса); СдвинутыйТекст = ТекстовыйДокумент.ПолучитьСтроку(1); ЗаменаТабуляции = ирОбщий.СтрокаПовторомЛкс(" ", ШиринаТабуляции); ТекстНачальнойСтроки = ПолеТекста.ПолучитьСтроку(мНачальнаяСтрока); ДлинаНачалаСтроки = СтрДлина(ТекстНачальнойСтроки) - СтрДлина(СокрЛ(ТекстНачальнойСтроки)); НачалоСтроки = Лев(ТекстНачальнойСтроки, ДлинаНачалаСтроки); ДлинаРазвернутогоНачалаСтроки = СтрДлина(СтрЗаменить(НачалоСтроки, Символы.Таб, ЗаменаТабуляции)); ЧислоТабуляций = ДлинаРазвернутогоНачалаСтроки / ШиринаТабуляции; ЧислоПробелов = ДлинаРазвернутогоНачалаСтроки % ШиринаТабуляции; НачалоНовойСтроки = ирОбщий.СтрокаПовторомЛкс(Символы.Таб, ЧислоТабуляций); НачалоНовойСтроки = НачалоНовойСтроки + ирОбщий.СтрокаПовторомЛкс(" ", ЧислоПробелов); Для Счетчик = 2 По ЧислоСтрокЗамены Цикл ТекущаяСтрокаВставки = ТекстовыйДокумент.ПолучитьСтроку(Счетчик); СдвинутыйТекст = СдвинутыйТекст + Символы.ПС + НачалоНовойСтроки + ТекущаяСтрокаВставки; КонецЦикла; ВыделенныйТекст(СдвинутыйТекст); ПослеУстановкиВыделенногоМногострочногоТекста(); Возврат Истина; КонецЕсли; КонецЕсли; Возврат Ложь; КонецФункции Функция ВыделитьТекстТекущегоСтроковогоЛитерала() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РазобратьТекущийКонтекст(); ТекстПоля = ПолеТекста.ПолучитьТекст(); RegExp.Global = Истина; RegExp.MultiLine = Истина; RegExp.IgnoreCase = Истина; RegExp.Pattern = шСтрокаПрограммы; Результат = RegExp.НайтиВхождения(ТекстПоля); Успех = Ложь; ДлинаТекстаДо = СтрДлина(мПредшествующийТекст) + 1; // +1 добавлено для срабатывания на однострочном литерале Для Каждого Match Из Результат Цикл Если Истина И (Match.FirstIndex + 1) <= ДлинаТекстаДо И (Match.FirstIndex + Match.Length + 1) >= ДлинаТекстаДо Тогда ПолеТекста.УстановитьГраницыВыделения(Match.FirstIndex + 1, Match.FirstIndex + Match.Length + 1,, ФормаВладелец); Успех = Истина; Прервать; КонецЕсли; КонецЦикла; НачальнаяСтрокаЗапроса = 0; НачальнаяКолонкаЗапроса = 0; ПолеТекста.ПолучитьГраницыВыделения(НачальнаяСтрокаЗапроса, НачальнаяКолонкаЗапроса, , ); НачальнаяСтрокаЗапроса = НачальнаяСтрокаЗапроса - 1; НачальнаяКолонкаЗапроса = НачальнаяСтрокаЗапроса - 1; Если Успех Тогда ТекстСтроковогоЛитерала = ВыделенныйТекст(); Если Ложь Или Прав(ТекстСтроковогоЛитерала, 1) <> """" Или СтрДлина(ТекстСтроковогоЛитерала) = 1 Тогда ТекстСтроковогоЛитерала = ТекстСтроковогоЛитерала + """"; КонецЕсли; ТекстСтроковогоЛитерала = Вычислить(ТекстСтроковогоЛитерала); ////ТекстСтроковогоЛитерала = СтрЗаменить(ТекстСтроковогоЛитерала, "|", ""); //RegExp.Pattern = "(\s*)\|((.|"""")*(\n|\r|""))"; //ТекстСтроковогоЛитерала = RegExp.Replace(ТекстСтроковогоЛитерала, "$1 $2"); Иначе ТекстСтроковогоЛитерала = Неопределено; КонецЕсли; Возврат ТекстСтроковогоЛитерала; КонецФункции // Осуществляет переход к определению контекста. // // Параметры: // Нет. // Процедура ПерейтиКОпределению(НомерСтроки = 0, НомерКолонки = 0, ТолькоТипы = Ложь) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда Возврат; КонецЕсли; РазобратьТекущийКонтекст(,,, НомерСтроки, НомерКолонки); Если ПустаяСтрока(мКонтекст) Тогда Возврат; КонецЕсли; ПоследнееВхождение = Неопределено; ПоследнееОпределение = Неопределено; НайтиОпределениеСлова(мКонтекст, ПоследнееОпределение, ПоследнееВхождение); Если ПоследнееВхождение <> Неопределено Тогда НачальнаяПозицияОпределения = мПозицияТекстаДляПоискаОпределения + ПоследнееВхождение.FirstIndex + Найти(ПоследнееВхождение.Value, ПоследнееОпределение); КонечнаяПозицияОпределения = НачальнаяПозицияОпределения + СтрДлина(ПоследнееОпределение); СлужебноеПолеТекста.УстановитьГраницыВыделения(НачальнаяПозицияОпределения, КонечнаяПозицияОпределения); СлужебноеПолеТекста.ПолучитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка); // Там текст без комментариев и опасных строковых литералов ПолеТекста.УстановитьГраницыВыделения(мНачальнаяСтрока, мНачальнаяКолонка, мКонечнаяСтрока, мКонечнаяКолонка,, ФормаВладелец); ИначеЕсли ЯзыкПрограммы = 0 Тогда ТаблицаСлов.Найти(НРег(мКонтекст), "НСлово"); ТаблицаСтруктурТипов = ОпределитьТипЗначенияКонтекста(мКонтекст, " " + мТекстДляПоискаОпределения, мПредшествующийТекст, Истина); // TODO Сделать диалог выбора варианта Для Каждого СтруктураТипа Из ТаблицаСтруктурТипов Цикл Если ОткрытьОпределениеСтруктурыТипа(СтруктураТипа) Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры Функция ОткрытьОпределениеСтруктурыТипа(Знач СтруктураТипа) Если СтруктураТипа.СтрокаОписания <> Неопределено Тогда ТаблицаВладелец = СтруктураТипа.СтрокаОписания.Владелец(); #Если Сервер И Не Сервер Тогда ТаблицаВладелец = Новый ТаблицаЗначений; #КонецЕсли Если ТаблицаВладелец.Колонки.Найти("ЛиЭкспорт") <> Неопределено Тогда // Экспортный метод модуля СтрокаСозданияРодителя = ТаблицаВладелец.Колонки.Имя.Заголовок; Если ЗначениеЗаполнено(СтрокаСозданияРодителя) Тогда Ответ = Вопрос("Перейти к определению метода через открытие вспомогательной внешней обработки в открытом конфигураторе?", РежимДиалогаВопрос.ОКОтмена); Если Ответ = КодВозвратаДиалога.ОК Тогда ирОбщий.ПерейтиКОпределениюМетодаВКонфигуратореЛкс(СтрокаСозданияРодителя + "." + ирОбщий.СтрокаБезКонцаЛкс(мТекущееСлово, 1)); КонецЕсли; Возврат Истина; КонецЕсли; ИначеЕсли Истина И ТаблицаВладелец.Колонки.Найти("Значение") <> Неопределено И ирОбщий.ЛиСсылкаНаОбъектБДЛкс(СтруктураТипа.СтрокаОписания.Значение) И ЗначениеЗаполнено(СтруктураТипа.СтрокаОписания.Значение) Тогда //ирОбщий.ОткрытьСсылкуВРедактореОбъектаБДЛкс(СтруктураТипа.СтрокаОписания.Значение); ОткрытьЗначение(СтруктураТипа.СтрокаОписания.Значение); Возврат Истина; ИначеЕсли Истина И ТаблицаВладелец.Колонки.Найти("ТипЗначения") <> Неопределено И СтруктураТипа.СтрокаОписания.ТипЗначения = "Картинка" И ТипЗнч(СтруктураТипа.Метаданные) = Тип("ОбъектМетаданных") Тогда ирОбщий.ОткрытьЗначениеЛкс(БиблиотекаКартинок[СтруктураТипа.Метаданные.Имя]); Возврат Истина; КонецЕсли; КонецЕсли; Если ТипЗнч(СтруктураТипа.Метаданные) = Тип("ОбъектМетаданных") Тогда ПолноеИмяМД = СтруктураТипа.Метаданные.ПолноеИмя(); ирОбщий.ОткрытьОбъектМетаданныхЛкс(СтруктураТипа.Метаданные); Возврат Истина; КонецЕсли; НайтиПоказатьСправкуПоСтруктуреТипа(мКонтекст, СтруктураТипа); Возврат Ложь; КонецФункции // Ищем в мТекстДляПоискаОпределения Функция НайтиОпределениеСлова(Слово, ПоследнееОпределение = Неопределено, ПоследнееВхождение = Неопределено) Экспорт ПоследнееОпределение = Неопределено; Если ЯзыкПрограммы = 1 Тогда RegExp.Global = Ложь; RegExp.Pattern = СтрЗаменить(шПоискОписанияТаблицы, "#Идентификатор#", ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(Слово)); РезультатТекста = RegExp.НайтиВхождения(мТекстДляПоискаОпределения); Если РезультатТекста.Количество() > 0 Тогда ПоследнееВхождение = РезультатТекста[0]; ПоследнееОпределение = ПоследнееВхождение.SubMatches(3); Иначе МаркерЗначение = "ЗНАЧЕНИЕ("; Если Прав(мПредшествующийТекст, СтрДлина(МаркерЗначение)) = МаркерЗначение Тогда RegExp.Global = Ложь; RegExp.Pattern = шИмя; Если RegExp.Test(Слово) Тогда Попытка ПредопределенноеЗначение = ПредопределенноеЗначение(Слово); Исключение ПредопределенноеЗначение = Неопределено; КонецПопытки; Если ПредопределенноеЗначение <> Неопределено Тогда ОткрытьЗначение(ПредопределенноеЗначение); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Иначе RegExp.Global = Истина; //шПрисваивание = "(" + шРазделитель + "*=" + шРазделитель + "*((Новый|New)" + шРазделитель + "+(" + шИмя + ")|(" + шИмяСкобки + "?" + шИндекс // + "?(\." + шИмяСкобки + "?" + шИндекс + "?)*)" + "|(" + шЧисло + ")|(" + шСтрокаПрограммы + ")))"; ШаблонКоллекции = "(" + шРазделитель + "+Из" + шРазделитель + "+(" + шИмяСкобки + "?" + шИндекс + "?" + "(\." + шИмяСкобки + "?" + шИндекс + "?)*))"; RegExp.Pattern = шПредИмя + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(Слово) + "(" + шПрисваивание + "|" + ШаблонКоллекции + ")"; РезультатТекста = RegExp.НайтиВхождения(мТекстДляПоискаОпределения); Если РезультатТекста.Количество() > 0 Тогда ПоследнееВхождение = РезультатТекста[РезультатТекста.Количество() - 1]; ПоследнееОпределение = ПоследнееВхождение.SubMatches(0); //Если ПоследнееВхождение.SubMatches(1) <> Неопределено Тогда // // Это присвоение // ПоследнееОпределение = ПоследнееВхождение.SubMatches(1); //Иначе // // Это обход коллекции // ПоследнееОпределение = ПоследнееВхождение.SubMatches(20); //КонецЕсли; КонецЕсли; КонецЕсли; Возврат ПоследнееОпределение; КонецФункции // <Описание процедуры> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // Процедура ДобавитьТипЭлементаКоллекцииВТаблицуСтруктурТипов(СтруктураТипаКоллекции, СтруктураТипаЭлементаКоллекции, ТаблицаСтруктурТипов) БазовыеТипы = мПлатформа.ПолучитьТипыЭлементовКоллекции(СтруктураТипаКоллекции); Если БазовыеТипы.Количество() > 0 Тогда Для Каждого БазовыйТип Из БазовыеТипы Цикл СтруктураКлюча = Новый Структура("БазовыйТип, ЯзыкПрограммы", БазовыйТип, ЯзыкПрограммы); НайденныеСтроки = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча); Если НайденныеСтроки.Количество() > 0 Тогда СтруктураТипаЭлементаКоллекции.СтрокаОписания = НайденныеСтроки[0]; СтруктураТипаЭлементаКоллекции.ИмяОбщегоТипа = НайденныеСтроки[0].Слово; Если ТипЗнч(СтруктураТипаКоллекции.Метаданные) <> Тип("КоллекцияОбъектовМетаданных") Тогда СтруктураТипаЭлементаКоллекции.Метаданные = СтруктураТипаКоллекции.Метаданные; КонецЕсли; Иначе СтруктураТипаЭлементаКоллекции.ИмяОбщегоТипа = БазовыйТип; КонецЕсли; мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипаЭлементаКоллекции); КонецЦикла; Иначе мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипаЭлементаКоллекции); КонецЕсли; КонецПроцедуры // ДобавитьТипЭлементаКоллекцииВТаблицуСтруктурТипов() // Вычисляет массив структур типа дочернего контекста. // // Параметры: // МассивРодительскихСтрутурТипа – Массив – родительских структур типа; // ТекущееСлово – Строка – дочернеее слово; // ТипСлова - Строка - тип слова; // *ТекущийИндекс - Строка, *Неопределено - выражение в квадратных скобках; // *ТекущиеАргументы – Строка, *"" – аргументы метода; // *ПредшествующийТекст – Строка, *"" – текст для поиска определения таблицы в режиме языка запросов. // // Возвращаемое значение: // МассивСтрутурТипа - Массив – дочерних структур типа. // Функция ОпределитьТипДочернегоКонтекста(МассивРодительскихСтрутурТипа, ТекущееСлово, ТипСлова, ТекущийИндекс = Неопределено, ТекущиеАргументы = "", ПредшествующийТекст = "", ПолныйАнализ = Истина) #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ТаблицаСвойствТипа = мПлатформа.НоваяТаблицаСвойствТипа(); // Ускорение ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); СчетчикТипов = 0; Для Каждого РодительскаяСтрутураТипа Из МассивРодительскихСтрутурТипа Цикл СчетчикТипов = СчетчикТипов + 1; Если Истина И Не ПолныйАнализ И СчетчикТипов > 50 Тогда Прервать; КонецЕсли; Если РодительскаяСтрутураТипа.ИмяОбщегоТипа <> "Неизвестный контекст" Тогда МетаданныеРодителя = РодительскаяСтрутураТипа.Метаданные; Если Не ЗначениеЗаполнено(ТекущийИндекс) Тогда // Ищем правило вычисления Если ТипСлова = "Метод" Тогда КлючСтроки = Новый Структура; КлючСтроки.Вставить("ТипКонтекста", РодительскаяСтрутураТипа.ИмяОбщегоТипа); КлючСтроки.Вставить("НСлово", НРег(ТекущееСлово)); НайденныеСтроки = ПравилаВычисленияФункций.НайтиСтроки(КлючСтроки); Если НайденныеСтроки.Количество() > 0 Тогда RegExp.Global = Истина; Если ЯзыкПрограммы = 0 Тогда RegExp.Pattern = "(" + шВыражениеПрограммы + ")?" + шРазделитель + "*,"; Иначе RegExp.Pattern = "(" + шВыражениеЗапроса + ")?" + шРазделитель + "*,"; КонецЕсли; Результат = RegExp.НайтиВхождения(Нрег(Сред(ТекущиеАргументы, 2, СтрДлина(ТекущиеАргументы) - 2) + ",")); МассивПараметров = Новый Массив; Для Каждого Вхождение Из Результат Цикл МассивПараметров.Добавить(СокрЛП(Вхождение.SubMatches(0))); КонецЦикла; //Попытка лТаблицаСтруктурТипов = Вычислить(НайденныеСтроки[0].Правило + "(ТаблицаЛокальногоКонтекста, МассивПараметров)"); ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(лТаблицаСтруктурТипов, ТаблицаСтруктурТипов); Продолжить; //Исключение КонецПопытки; КонецЕсли; КонецЕсли; // Ищем предопределенное слово Если Истина И РодительскаяСтрутураТипа.ИмяОбщегоТипа = "Локальный" //И (Ложь // Или ЯзыкПрограммы = 0 // Или ЯзыкПрограммы = 2) Тогда СтруктураКлюча = Новый Структура("НСлово", Нрег(ТекущееСлово)); Если ТипСлова <> Неопределено Тогда СтруктураКлюча.Вставить("ТипСлова", ТипСлова); КонецЕсли; НайденныеСтроки = ТаблицаЛокальногоКонтекста.НайтиСтроки(СтруктураКлюча); Если НайденныеСтроки.Количество() > 0 Тогда ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(НайденныеСтроки[0].ТаблицаСтруктурТипов, ТаблицаСтруктурТипов); Продолжить; КонецЕсли; КонецЕсли; Если ЯзыкПрограммы = 1 Тогда ВиртуальнаяТаблица = Новый Структура("Выражение, НомерСтроки"); ВиртуальнаяТаблица.Выражение = "." + ТекущееСлово; Если ЗначениеЗаполнено(ТекущиеАргументы) Тогда ВиртуальнаяТаблица.Выражение = ВиртуальнаяТаблица.Выражение + "." + ТекущиеАргументы; КонецЕсли; ВиртуальнаяТаблица.НомерСтроки = СтрЧислоСтрок(ПредшествующийТекст); Иначе ВиртуальнаяТаблица = Неопределено; КонецЕсли; ТаблицаСвойствТипа.Очистить(); мПлатформа.СвойстваТипаПредопределенные(РодительскаяСтрутураТипа, ТекущееСлово, ТипСлова, ВиртуальнаяТаблица, ЯзыкПрограммы, Конфигурация,,, ТаблицаСвойствТипа); Если ТаблицаСвойствТипа.Количество() > 0 Тогда МаксКоличествоВариантов = 5; КоличествоВариантов = 0; Для Каждого СтрокаСлова Из ТаблицаСвойствТипа Цикл ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(СтрокаСлова.ТаблицаСтруктурТипов, ТаблицаСтруктурТипов); КоличествоВариантов = КоличествоВариантов + 1; Если КоличествоВариантов >= МаксКоличествоВариантов Тогда Прервать; КонецЕсли; КонецЦикла; Если Истина И РодительскаяСтрутураТипа.ИмяОбщегоТипа = "БлокировкаДанных" И ТипСлова = "Метод" И ТекущееСлово = "Добавить" Тогда ТаблицаСтруктурТипов.ЗаполнитьЗначения(ирОбщий.СтрокаМеждуМаркерамиЛкс(ТекущиеАргументы, """", """"), "Метаданные"); КонецЕсли; Продолжить; ИначеЕсли Истина И ЗначениеЗаполнено(РодительскаяСтрутураТипа.ТипЯзыка) И РодительскаяСтрутураТипа.ИмяОбщегоТипа = "Строка" Тогда ЗаполнитьЗначенияСвойств(ТаблицаСтруктурТипов.Добавить(), РодительскаяСтрутураТипа); Продолжить; КонецЕсли; Иначе //Попытка // Пустышка = Новый Структура(ТекущееСлово); //Исключение // Пустышка = Неопределено; //КонецПопытки; //Если Ложь // Или Пустышка = Неопределено // Или НРег(ТекущийИндекс) <> НРег("""" + ТекущееСлово + """") // Противный случай отработается внутри СвойстваТипаМетаданные //Тогда // // Это - произвольный элемент коллекции // ДобавитьТипЭлементаКоллекцииВТаблицуСтруктурТипов(РодительскаяСтрутураТипа, СтруктураТипа, ТаблицаСтруктурТипов); // Продолжить; //КонецЕсли; КонецЕсли; ТаблицаСвойствТипа.Очистить(); мПлатформа.СвойстваТипаМетаданные(РодительскаяСтрутураТипа, ТекущееСлово, ТипСлова, ВиртуальнаяТаблица, ЯзыкПрограммы, ТекущийИндекс,,, ЛиСерверныйКонтекст, мМодульМетаданных, ТаблицаСвойствТипа); Если ТаблицаСвойствТипа.Количество() > 0 Тогда Для Каждого СтрокаСлова Из ТаблицаСвойствТипа Цикл Если СтрокаСлова.ТаблицаСтруктурТипов <> Неопределено Тогда ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(СтрокаСлова.ТаблицаСтруктурТипов, ТаблицаСтруктурТипов); КонецЕсли; КонецЦикла; Продолжить; КонецЕсли; КонецЕсли; КонецЦикла; Возврат ТаблицаСтруктурТипов; КонецФункции // Определяет тип значения слова в режиме внутреннего языка. // // Параметры: // ТекстДляПоискаОпределения – Строка - где ищем определение; // Контекст – Строка - последовательность идентификаторов через "." без круглых и квадратных скобок. // // Возвращаемое значение: // Структура – "ИмяОбщегоТипа", "ПерсональныйТип". // Функция ОпределитьТипЗначенияКонтекста(Знач Контекст = "", Знач ТекстДляПоискаОпределения = "", Знач ПредшествующийТекст = "", Знач РазрешитьАнализИмениТипа = Ложь, Знач ЭтоВызовКонструктора = Ложь, ПолныйАнализ = Истина) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); СтруктураТипа = мПлатформа.НоваяСтруктураТипа(); //Если ЗначениеЗаполнено(Конфигурация) Тогда СтруктураТипа.Метаданные = Конфигурация; //Иначе // СтруктураТипа.Метаданные = мПлатформа.мМетаданные; //КонецЕсли; Если РазрешитьАнализИмениТипа Тогда Если ЯзыкПрограммы = 1 Тогда мТолькоСсылочныеИменаТипов = Истина; RegExp.Global = Истина; RegExp.Pattern = шПредИмя + "(?:ССЫЛКА|REFS)" + шРазделитель + "+$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ИмяТипа"; КонецЕсли; RegExp.Pattern = шПредИмя + "(?:ВЫРАЗИТЬ|CAST)" + шРазделитель + "*\(" + шВыражениеЗапроса + шРазделитель + "+(?:КАК|AS)" + шРазделитель + "+$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ИмяТипа"; мТолькоСсылочныеИменаТипов = Ложь; КонецЕсли; RegExp.Pattern = шПредИмя + "(?:ТИП|TYPE)" + шРазделитель + "*\(" + шРазделитель + "*$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ИмяТипа"; мТолькоСсылочныеИменаТипов = Ложь; КонецЕсли; RegExp.Pattern = шПредИмя + "(?:ЗНАЧЕНИЕ|VALUE)" + шРазделитель + "*\(" + шРазделитель + "*$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ЗначениеВЗапросе"; КонецЕсли; Иначе RegExp.Global = Истина; RegExp.Pattern = шПредИмя + "(?:Новый|New)" + шРазделитель + "+$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.Вставить("Конструктор", Истина); СтруктураТипа.ТипЯзыка = "ИмяТипа"; КонецЕсли; RegExp.Pattern = шПредИмя + "(?:Новый|New)" + шРазделитель + "*\(" + шРазделитель + "*""$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда // Активная следующая строка блокирует недокументированные возможности. //СтруктураТипа.Вставить("Конструктор", Истина); СтруктураТипа.ТипЯзыка = "ИмяТипа"; КонецЕсли; RegExp.Pattern = шПредИмя + "Тип" + шРазделитель + "*\(" + шРазделитель + "*""$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ИмяТипа"; КонецЕсли; RegExp.Pattern = шПредИмя + "(?:Новый|New)" + шРазделитель + "*ОписаниеТипов\(" + шРазделитель + "*""[^""]*$"; Результат = RegExp.НайтиВхождения(ПредшествующийТекст); Если Результат.Количество() > 0 Тогда СтруктураТипа.ТипЯзыка = "ИмяТипа"; КонецЕсли; КонецЕсли; Если Ложь Или СтруктураТипа.ТипЯзыка = "ИмяТипа" Или СтруктураТипа.ТипЯзыка = "ЗначениеВЗапросе" Тогда СтруктураТипа.ИмяОбщегоТипа = ""; Иначе Если мЭтоСтроковыйЛитерал Тогда Результат = ОпределитьТипЗначенияКонтекста(мВызовМетода, ТекстДляПоискаОпределения, ПредшествующийТекст,,, ПолныйАнализ); Возврат Результат; КонецЕсли; КонецЕсли; КонецЕсли; Если Ложь Или Контекст = Неопределено Или Контекст = "" Тогда Если СтруктураТипа.ИмяОбщегоТипа = "Неизвестный контекст" Тогда СтруктураТипа.ИмяОбщегоТипа = "Локальный"; КонецЕсли; Иначе RegExp.Global = Ложь; RegExp.Pattern = "(((\.(" + шИмя + "|\?|)" + шСкобки + "?)|" + шИндекс + ")*)" + "((\.(" + шИмя + "|\?|)" + шНачалоСкобок + "?)|" + шИндекс + ")$"; Результат = RegExp.НайтиВхождения("." + Контекст); Если Результат.Количество() > 0 Тогда МассивРодительскихСтрутурТипа = Новый Массив; РодительскийКонтекст = Сред(Результат[0].SubMatches(0), 2); ТекущееСлово = Результат[0].SubMatches(8); ТекущийИндекс = Результат[0].SubMatches(10); ТекущиеАргументы = Результат[0].SubMatches(9); ТипСлова = "Свойство"; Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ТекущийИндекс) Тогда ТекущееСлово = Сред(ТекущийИндекс, 2, СтрДлина(ТекущийИндекс) - 2); КонецЕсли; Если ЯзыкПрограммы = 1 Тогда ТипСлова = Неопределено; Если РодительскийКонтекст = "" Тогда Если ЗначениеЗаполнено(ТекущееСлово) Тогда RegExp.Global = Ложь; RegExp.Pattern = СтрЗаменить(шПоискОписанияТаблицы, "#Идентификатор#", ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(ТекущееСлово)); РезультатТекста = RegExp.НайтиВхождения(ТекстДляПоискаОпределения); Если РезультатТекста.Количество() > 0 Тогда ПоследнееВхождение = РезультатТекста[0]; СледРекурсии = МассивЗащитыОтРекурсии.Найти(ПоследнееВхождение.FirstIndex); Если СледРекурсии = Неопределено Тогда МассивЗащитыОтРекурсии.Добавить(ПоследнееВхождение.FirstIndex); ПрисвоенныйКонтекст = ПоследнееВхождение.SubMatches(3); Если ПрисвоенныйКонтекст <> Контекст Тогда МассивСтруктурПрисвоенныхТипов = ОпределитьТипЗначенияКонтекста(ПрисвоенныйКонтекст, ТекстДляПоискаОпределения, Лев(ТекстДляПоискаОпределения, ПоследнееВхождение.FirstIndex - 1), РазрешитьАнализИмениТипа,, ПолныйАнализ); ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(МассивСтруктурПрисвоенныхТипов, ТаблицаСтруктурТипов); КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ЗначениеЗаполнено(ТекущиеАргументы) Тогда ТекущееСлово = ирОбщий.УдалитьВнешниеСкобкиВыраженияЛкс(ТекущиеАргументы); Если ирОбщий.СтрНачинаетсяСЛкс(ТекущееСлово, "Выразить(") Тогда ТекущиеАргументы = ирОбщий.СтрокаМеждуМаркерамиЛкс(ТекущееСлово, "(", ")", Ложь, Истина); ТекущееСлово = "ВЫРАЗИТЬ"; RegExp.Pattern = шРазделитель + "(?:КАК|AS)" + шРазделитель + "+(" + шИмя + "(?:\." + шИмя + ")*)"; Результат = RegExp.НайтиВхождения(ТекущиеАргументы); Если Результат.Количество() > 0 Тогда ИмяТипаВыражения = Результат[Результат.Количество() - 1].Submatches(0); Если Найти(ИмяТипаВыражения, ".") > 0 Тогда ИмяТипаВыражения = ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(ИмяТипаВыражения); КонецЕсли; СтруктураТипа = мПлатформа.СтруктураТипаИзКонкретногоТипа(Тип(ИмяТипаВыражения)); СтруктураТипа.ИмяОбщегоТипа = СтрЗаменить(СтруктураТипа.ИмяОбщегоТипа, ирОбщий.ПеревестиСтроку("Ссылка") + ".", "."); ЗаполнитьЗначенияСвойств(ТаблицаСтруктурТипов.Добавить(), СтруктураТипа); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Иначе ТипСлова = "Свойство"; Если Истина И Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ТекущиеАргументы) И Не СтруктураТипа.ТипЯзыка = "ИмяТипа" Тогда // Это метод или функция Если ЭтоВызовКонструктора Тогда ТипСлова = "Конструктор"; Иначе ТипСлова = "Метод"; КонецЕсли; КонецЕсли; RegExp.Global = Истина; ШаблонКоллекции = "(" + шРазделитель + "+Из" + шРазделитель + "+(" + шИмяСкобки + "?" + шИндекс + "?" + "(\." + шИмяСкобки + "?" + шИндекс + "?)*))"; RegExp.Pattern = шПредИмя + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(Контекст) + "(" + шПрисваивание + "|" + ШаблонКоллекции + ")"; РезультатТекста = RegExp.НайтиВхождения(ТекстДляПоискаОпределения); Если РезультатТекста.Количество() > 0 Тогда СтруктураТипа = мПлатформа.НоваяСтруктураТипа(); ПоследнееВхождение = РезультатТекста[РезультатТекста.Количество() - 1]; Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ПоследнееВхождение.SubMatches(1)) Тогда // Это присвоение ПрисвоенныйКонтекст = ПоследнееВхождение.SubMatches(2); СловоНовый = НРег(ПоследнееВхождение.SubMatches(3)); Если СловоНовый = Нрег("Новый") Или СловоНовый = Нрег("New") Тогда //СтруктураТипа = мПлатформа.НоваяСтруктураТипа(); //Если ПоследнееВхождение.SubMatches(4) <> Неопределено Тогда // Попытка // ТипНового = Тип(ПоследнееВхождение.SubMatches(4)); // СтруктураТипа = мПлатформа.СтруктураТипаИзКонкретногоТипа(ТипНового, ЯзыкПрограммы); // Исключение // СтруктураТипа.ИмяОбщегоТипа = ПоследнееВхождение.SubMatches(4); // КонецПопытки; //КонецЕсли; //Если ПоследнееВхождение.SubMatches(5) <> Неопределено Тогда // Если ТипНового = Тип("COMОбъект") Тогда // СтруктураТипа.ИмяОбщегоТипа = СтруктураТипа.ИмяОбщегоТипа + "." + ПоследнееВхождение.SubMatches(5); // Иначе // СтруктураТипа.ИмяОбщегоТипа = ПоследнееВхождение.SubMatches(5); // КонецЕсли; //КонецЕсли; Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ПоследнееВхождение.SubMatches(4)) Тогда ИмяТипа = ПоследнееВхождение.SubMatches(4); ИначеЕсли Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ПоследнееВхождение.SubMatches(5)) Тогда ИмяТипа = ПоследнееВхождение.SubMatches(5); Иначе ИмяТипа = Неопределено; КонецЕсли; Если ЗначениеЗаполнено(ИмяТипа) Тогда Попытка ТипНового = Тип(ИмяТипа); Исключение ТипНового = Неопределено; СтруктураТипа.ИмяОбщегоТипа = ИмяТипа; КонецПопытки; Если Истина И ТипНового = Тип("COMОбъект") И Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ПоследнееВхождение.SubMatches(5)) Тогда ПолноеИмяОсновногоКлассаCOM = ПоследнееВхождение.SubMatches(5); СтруктураКОМТипа = мИменаОбщихТиповПоИменамКлассовCOM[ПолноеИмяОсновногоКлассаCOM]; Если СтруктураКОМТипа = Неопределено Тогда СтруктураКОМТипа = Новый Структура; МетаданныеСлова = мПлатформа.ПолучитьОбразецCOMОбъекта(ПолноеИмяОсновногоКлассаCOM); // При этом может открыться форма Automation-сервера например RegexBuddy так делает Если МетаданныеСлова = Неопределено Тогда ИмяОсновногоКлассаCOM = ирОбщий.ПоследнийФрагментЛкс(ПолноеИмяОсновногоКлассаCOM); ИмяОбщегоТипа = ИмяОсновногоКлассаCOM + " {" + ПолноеИмяОсновногоКлассаCOM + "}"; Иначе ИмяОбщегоТипа = мПлатформа.ПолноеИмяТипаCOMОбъекта(МетаданныеСлова); Если ирОбщий.СтрокиРавныЛкс(ИмяОбщегоТипа, "COMОбъект") Тогда ИмяОсновногоКлассаCOM = ирОбщий.ПоследнийФрагментЛкс(ПолноеИмяОсновногоКлассаCOM); ИмяОбщегоТипа = ИмяОсновногоКлассаCOM + " {" + ПолноеИмяОсновногоКлассаCOM + "}"; КонецЕсли; СтруктураКОМТипа.Вставить("Метаданные", МетаданныеСлова); КонецЕсли; СтруктураКОМТипа.Вставить("ИмяОбщегоТипа", ИмяОбщегоТипа); мИменаОбщихТиповПоИменамКлассовCOM[ПолноеИмяОсновногоКлассаCOM] = СтруктураКОМТипа; КонецЕсли; ЗаполнитьЗначенияСвойств(СтруктураТипа, СтруктураКОМТипа); ИначеЕсли ТипНового <> Неопределено Тогда СтруктураТипа = мПлатформа.СтруктураТипаИзКонкретногоТипа(ТипНового, ЯзыкПрограммы); КонецЕсли; КонецЕсли; мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); ИначеЕсли Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ПоследнееВхождение.SubMatches(6)) Тогда ТаблицаСтруктурТипов = ОпределитьТипЗначенияКонтекста(ПрисвоенныйКонтекст, Лев(ТекстДляПоискаОпределения, ПоследнееВхождение.FirstIndex - 1), Лев(ТекстДляПоискаОпределения, ПоследнееВхождение.FirstIndex - 1), РазрешитьАнализИмениТипа,, ПолныйАнализ); Для Каждого СтруктураТипа Из ТаблицаСтруктурТипов Цикл СтруктураКлюча = Новый Структура("Слово, ЯзыкПрограммы", СтруктураТипа.ИмяОбщегоТипа, ЯзыкПрограммы); СтруктураТипа.СтрокаОписания = Неопределено; // Было закомментировано //НайденныеСтроки = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча); //Если НайденныеСтроки.Количество() > 0 Тогда // СтруктураТипа.СтрокаОписания = НайденныеСтроки[0]; //КонецЕсли; КонецЦикла; Иначе // **** TODO Сделать определение примитивного типа СтруктураТипа.ИмяОбщегоТипа = "Примитивный"; мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); КонецЕсли; Иначе // Это обход коллекции ПрисвоенныйКонтекст = ПоследнееВхождение.SubMatches(15); // **** Раньше текст для поиска определения передавался неизменным. Тестовый режим ТаблицаСтруктурТиповКоллекции = ОпределитьТипЗначенияКонтекста(ПрисвоенныйКонтекст, Лев(ТекстДляПоискаОпределения, ПоследнееВхождение.FirstIndex - 1), Лев(ТекстДляПоискаОпределения, ПоследнееВхождение.FirstIndex - 1),,, ПолныйАнализ); //// Структура типов коллекции всегда имеет ровно один элемент //СтруктураКлюча = Новый Структура("Слово, ЯзыкПрограммы", СтруктураТипаКоллекции.ИмяОбщегоТипа, ЯзыкПрограммы); //НайденныеСтроки = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча); //Если НайденныеСтроки.Количество() > 0 Тогда // БазовыеТипы = ирОбщий.СтрРазделитьЛкс(НайденныеСтроки[0].ТипЭлементаКоллекции, ",", Истина); // Для Каждого БазовыйТип Из БазовыеТипы Цикл // СтруктураКлюча = Новый Структура("БазовыйТип, ЯзыкПрограммы", БазовыйТип, ЯзыкПрограммы); // НайденныеСтроки = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(СтруктураКлюча); // Если НайденныеСтроки.Количество() > 0 Тогда // СтруктураТипа.СтрокаОписания = НайденныеСтроки[0]; // СтруктураТипа.ИмяОбщегоТипа = НайденныеСтроки[0].Слово; // СтруктураТипа.Метаданные = СтруктураТипаКоллекции.Метаданные; // КонецЕсли; // мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); // КонецЦикла; //Иначе // мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); //КонецЕсли; ДобавитьТипЭлементаКоллекцииВТаблицуСтруктурТипов(ТаблицаСтруктурТиповКоллекции[0], СтруктураТипа, ТаблицаСтруктурТипов); КонецЕсли; Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ТекущийИндекс) Тогда МассивРодительскихСтрутурТипа = ТаблицаСтруктурТипов; ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); КонецЕсли; КонецЕсли; КонецЕсли; Если МассивРодительскихСтрутурТипа.Количество() = 0 Тогда МассивРодительскихСтрутурТипа = ОпределитьТипЗначенияКонтекста(РодительскийКонтекст, ТекстДляПоискаОпределения, ПредшествующийТекст, РазрешитьАнализИмениТипа,, ПолныйАнализ); КонецЕсли; МассивДочернихСтруктурТипа = ОпределитьТипДочернегоКонтекста(МассивРодительскихСтрутурТипа, ТекущееСлово, ТипСлова, ТекущийИндекс, ТекущиеАргументы, ПредшествующийТекст, ПолныйАнализ); ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(МассивДочернихСтруктурТипа, ТаблицаСтруктурТипов); Если ТипСлова = "Свойство" И Не СтруктураТипа.Конструктор Тогда ТекстДляЗаполненияМетаданных = ТекстДляПоискаОпределения; Для Каждого СтруктураТипаЦикл Из ТаблицаСтруктурТипов Цикл Если Ложь Или СтруктураТипаЦикл.ИмяОбщегоТипа = "Структура" Или СтруктураТипаЦикл.ИмяОбщегоТипа = "ФиксированнаяСтруктура" Тогда RegExp.Global = Ложь; ШаблонКонструкторСоСвойствами = Контекст + "\s*=\s*Новый\s+Структура\s*\(\s*""((?:" + шИмя + "\s*,\s*)*" + шИмя + ")"""; RegExp.Pattern = ШаблонКонструкторСоСвойствами; РезультатСвойств = RegExp.НайтиВхождения(ТекстДляЗаполненияМетаданных); Если РезультатСвойств.Количество() > 0 Тогда СтруктураТипаЦикл.Метаданные = Новый Структура(РезультатСвойств[0].SubMatches(0)); ИначеЕсли Истина И ТипЗнч(СтруктураТипаЦикл.Метаданные) <> Тип("Структура") И ТипЗнч(СтруктураТипаЦикл.Метаданные) <> Тип("ФиксированнаяСтруктура") Тогда СтруктураТипаЦикл.Метаданные = Новый Структура; КонецЕсли; ШаблонУстановкаТекста = Контекст + "\s*\.\s*Вставить\s*\(\s*""(" + шИмя + ")"""; RegExp.Pattern = ШаблонУстановкаТекста; RegExp.Global = Истина; РезультатСвойств = RegExp.НайтиВхождения(ТекстДляЗаполненияМетаданных); Для Каждого ВхождениеСвойства Из РезультатСвойств Цикл СтруктураТипаЦикл.Метаданные.Вставить(ВхождениеСвойства.SubMatches(0)); КонецЦикла; ИначеЕсли Ложь Или СтруктураТипаЦикл.ИмяОбщегоТипа = "ТаблицаЗначений" Или СтруктураТипаЦикл.ИмяОбщегоТипа = "ДеревоЗначений" Тогда RegExp.Global = Ложь; Если Истина И ТипЗнч(СтруктураТипаЦикл.Метаданные) <> Тип("ДеревоЗначений") И ТипЗнч(СтруктураТипаЦикл.Метаданные) <> Тип("ТаблицаЗначений") Тогда СтруктураТипаЦикл.Метаданные = Новый ТаблицаЗначений; КонецЕсли; ШаблонУстановкаТекста = Контекст + "\s*\.\s*Колонки\s*.\s*Добавить\s*\(\s*""(" + шИмя + ")"""; RegExp.Pattern = ШаблонУстановкаТекста; RegExp.Global = Истина; РезультатСвойств = RegExp.НайтиВхождения(ТекстДляЗаполненияМетаданных); Колонки = СтруктураТипаЦикл.Метаданные.Колонки; Для Каждого ВхождениеСвойства Из РезультатСвойств Цикл ИмяКолонки = ВхождениеСвойства.SubMatches(0); Попытка Колонки.Добавить(ИмяКолонки); Исключение Пустышка = 0; КонецПопытки; КонецЦикла; ИначеЕсли Ложь Или СтруктураТипаЦикл.ИмяОбщегоТипа = "Запрос" Или СтруктураТипаЦикл.ИмяОбщегоТипа = "ПостроительЗапроса" Или СтруктураТипаЦикл.ИмяОбщегоТипа = "ПостроительОтчета" Тогда RegExp.Global = Ложь; ШаблонУстановкаТекста = Контекст + "\s*\.\s*Текст\s*=\s*(" + шСтрокаПрограммы + ")"; RegExp.Pattern = ШаблонУстановкаТекста; RegExp.Global = Истина; РезультатСвойств = RegExp.НайтиВхождения(ТекстДляЗаполненияМетаданных); Для Каждого ВхождениеСвойства Из РезультатСвойств Цикл ПрисвоенноеЗначение = ВхождениеСвойства.SubMatches(0); Если Лев(ПрисвоенноеЗначение, 1) = """" Тогда Попытка ТекстЗапроса = Вычислить(ПрисвоенноеЗначение); Прервать; Исключение ТекстЗапроса = ""; КонецПопытки; КонецЕсли; КонецЦикла; Если ЗначениеЗаполнено(ТекстЗапроса) Тогда ПостроительЗапроса = Новый ПостроительЗапроса; Попытка ПостроительЗапроса.Текст = ТекстЗапроса; ПостроительЗапроса.ЗаполнитьНастройки(); Исключение ПостроительЗапроса = Неопределено; КонецПопытки; Если ПостроительЗапроса <> Неопределено Тогда СтруктураТипаЦикл.Метаданные = ПостроительЗапроса; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Если Истина И ЯзыкПрограммы = 1 И РодительскийКонтекст = "" И СтруктураТипа.ИмяОбщегоТипа = "Неизвестный контекст" И ТипЗнч(КонтекстВыполнения) = Тип("Запрос") Тогда ВременныйЗапрос = Новый Запрос; ВременныйЗапрос.МенеджерВременныхТаблиц = КонтекстВыполнения.МенеджерВременныхТаблиц; ВременныйЗапрос.Текст = "ВЫБРАТЬ * ИЗ " + ТекущееСлово + " ГДЕ ЛОЖЬ"; Попытка // Активное вычисление! СтруктураТипа.Метаданные = ВременныйЗапрос.Выполнить(); СтруктураТипа.ИмяОбщегоТипа = "ВременнаяТаблица"; СтруктураТипа.ВиртуальнаяТаблица.Выражение = ТекущееСлово; // Используем не по назначению Исключение КонецПопытки; КонецЕсли; КонецЕсли; КонецЕсли; Если ТаблицаСтруктурТипов.Количество() = 0 Тогда мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); КонецЕсли; Возврат ТаблицаСтруктурТипов; КонецФункции Процедура ЗаполнитьЛокальныеСвойстваИМетодыПоТексту(ОчиститьТаблицуСлов = Истина, ВключатьКонструкции = Истина, УчитыватьРодительскийКонтекст = Ложь, ОбновитьТекстДляАнализа = Истина, ВключатьГлобальныйКонтекст = Ложь, Знач ТекстДляАнализа = "") Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(, "Заполнение параметров", Истина) Тогда Возврат; КонецЕсли; Если Не ЗначениеЗаполнено(ТекстДляАнализа) Тогда Если ОбновитьТекстДляАнализа Тогда ТекстДляАнализа = ПолеТекста.ПолучитьТекст(); КонецЕсли; КонецЕсли; Если ЗначениеЗаполнено(ТекстДляАнализа) Тогда ТекстБезКомментариевИОпасныхСтрок = ЗалитьКомментарииИСтроковыеЛитералы(ТекстДляАнализа,, Истина); КонецЕсли; Если ОчиститьТаблицуСлов Тогда ТаблицаСлов.Очистить(); КонецЕсли; Если ВключатьКонструкции Тогда Если ЯзыкПрограммы = 0 Тогда СписокСловЯзыка = мПлатформа.ПолучитьСписокКлючевыхСловВстроенногоЯзыка(); ИначеЕсли ЯзыкПрограммы = 1 Тогда ВключаяРусские = ТипЗнч(Конфигурация) = Тип("ОбъектМетаданныхКонфигурация"); СписокСловЯзыка = мПлатформа.ПолучитьСписокКлючевыхСловЯзыкаЗапросов(РежимКомпоновкиДанных, ВключаяРусские, Истина); ИначеЕсли ЯзыкПрограммы = 2 Тогда //СписокСловЯзыка = мПлатформа.ПолучитьСписокКлючевыхСловЯзыкаЗапросов(); СписокСловЯзыка = Новый СписокЗначений; СписокСловЯзыка.Добавить("РАЗЛИЧНЫЕ"); // Криво https://www.hostedredmine.com/issues/931487 КонецЕсли; Для Каждого ЭлементСписка Из СписокСловЯзыка Цикл НоваяСтрока = ТаблицаСлов.Добавить(); НоваяСтрока.Слово = ЭлементСписка.Значение; НоваяСтрока.НСлово = НРег(НоваяСтрока.Слово); НоваяСтрока.ТипСлова = "Конструкция"; НоваяСтрока.Определение = "Предопределенный"; КонецЦикла; КонецЕсли; Если ВключатьГлобальныйКонтекст Тогда СтруктураТипа = мПлатформа.НоваяСтруктураТипа(); СтруктураТипа.ИмяОбщегоТипа = "Глобальный"; СтруктураТипа.Метаданные = Метаданные; ТаблицаГлобальногоКонтекста = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа); Для Каждого СтрокаСлова Из ТаблицаГлобальногоКонтекста Цикл НоваяСтрока = ТаблицаСлов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСлова); НоваяСтрока.НСлово = НРег(НоваяСтрока.Слово); //НоваяСтрока.Слово = ЭлементСписка.Значение; //НоваяСтрока.ТипСлова = "Конструкция"; //НоваяСтрока.Определение = "Предопределенный"; КонецЦикла; КонецЕсли; //Поиск использованных свойств и методов данного контекста. Если Ложь Или Не УчитыватьРодительскийКонтекст Или мРодительскийКонтекст = "" Тогда Шаблон = "(?:(" + шИмя + ")\()" + "|(?:(" + шПараметрЗапроса + ")" + "|(" + шИмя + ")(?=(?:\.(?:" + шИмя + ")?)+|[^\(?:\." + шБуква + "\d]|$))" + "|(?:[" + шБуква + "\d\.]+)"; // Эта часть нужна чтобы не находить дочерние свойства и методы КоличествоПодгрупп = 3; Иначе Шаблон = "(?:" + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(мРодительскийКонтекст) + "\.(" + шИмя + ")\()" + "|(?:" + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(мРодительскийКонтекст) + "\.(" + шИмя + ")(?=[^\(?:" + шБуква + "\d]|$))" + "|(?:[" + шБуква + "\d\.]+)"; КоличествоПодгрупп = 2; КонецЕсли; RegExp.Global = Истина; ТаблицаСловТЗ = ТаблицаСлов.Выгрузить(, "НСлово, ТипСлова, Частота"); ТаблицаСловТЗ.Индексы.Добавить("НСлово"); RegExp.Pattern = "(?:" + шСтрокаПрограммы + "|" + шКомментарий + "|(?:Новый|New)\s+" + шИмя + "|" + Шаблон + ")"; Результат = RegExp.НайтиВхождения(" " + ТекстБезКомментариевИОпасныхСтрок); Для Каждого Match Из Результат Цикл Подгруппа1 = Match.SubMatches(0); Подгруппа2 = Match.SubMatches(1); Если КоличествоПодгрупп = 3 Тогда Подгруппа3 = Match.SubMatches(2); Иначе Подгруппа3 = Неопределено; КонецЕсли; Если Подгруппа1 <> Неопределено Тогда Слово = Подгруппа1; ТипСлова = "Метод"; ИначеЕсли Подгруппа2 <> Неопределено Тогда Слово = Подгруппа2; ТипСлова = "Свойство"; ИначеЕсли Подгруппа3 <> Неопределено Тогда Слово = Подгруппа3; ТипСлова = "Свойство"; Иначе Продолжить; КонецЕсли; СтруктураКлюча = Новый Структура("НСлово", НРег(Слово)); НайденныеСтроки = ТаблицаСловТЗ.НайтиСтроки(СтруктураКлюча); НоваяСтрока = Неопределено; Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл Если Ложь Или ЯзыкПрограммы = 1 Или (Истина И ТипСлова = "Метод" И НайденнаяСтрока.ТипСлова = "Метод") Или (Истина И ТипСлова <> "Метод" И НайденнаяСтрока.ТипСлова <> "Метод") Тогда НоваяСтрока = НайденнаяСтрока; Прервать; КонецЕсли; КонецЦикла; Если НоваяСтрока = Неопределено Тогда НоваяСтрока = ТаблицаСлов.Добавить(); НоваяСтрока.Определение = "Статистический"; НоваяСтрока.Слово = Слово; НоваяСтрока.НСлово = НРег(НоваяСтрока.Слово); НоваяСтрока.ТипСлова = ТипСлова; КонецЕсли; НоваяСтрока.Частота = НоваяСтрока.Частота + 1; КонецЦикла; ТаблицаСлов.ЗагрузитьКолонку(ТаблицаСловТЗ.ВыгрузитьКолонку("Частота"), "Частота"); КонецПроцедуры Процедура ОбновитьКонтекстВыраженияЗапросаПоНастройкеКомпоновкиЛкс(НастройкаКомпоновки) Экспорт #Если Сервер И Не Сервер Тогда НастройкаКомпоновки = Новый НастройкиКомпоновкиДанных; #КонецЕсли ОчиститьТаблицуСловЛокальногоКонтекста(); Для Каждого ДоступноеПоле Из НастройкаКомпоновки.ДоступныеПоляОтбора.Элементы Цикл НрегПервыйФрагмент = ирОбщий.ПервыйФрагментЛкс(НРег(ДоступноеПоле.Поле)); Если НрегПервыйФрагмент = НРег("ПараметрыДанных") Тогда Для Каждого ДоступныйПараметр Из ДоступноеПоле.Элементы Цикл ИмяСвойства = мПараметрыДиалектаSQL.ПрефиксПараметра + ирОбщий.ПоследнийФрагментЛкс(ДоступныйПараметр.Поле); ДобавитьСловоЛокальногоКонтекста(ИмяСвойства, "Свойство", , ДоступныйПараметр,,,, "СтрокаТаблицы"); // Виртуальный тип КонецЦикла; Иначе ДобавитьСловоЛокальногоКонтекста("" + ДоступноеПоле.Поле, "Свойство",, ДоступноеПоле,,,, "СтрокаТаблицы"); // Виртуальный тип КонецЕсли; КонецЦикла; КонецПроцедуры Процедура УстановитьПризнакМодифицированностиФормы() Если ПолеТекста.ЭлементФормы.ИзменяетДанные Тогда ФормаВладелец.Модифицированность = Истина; КонецЕсли; КонецПроцедуры Функция ПолучитьСтруктуруТипаСправаОтРавно() Экспорт КончитьОбработкуКоманды(); ТаблицаСтруктурТипов = ТаблицаСтруктурТиповТекущегоВыражения(Истина); КончитьОбработкуКоманды(); СписокТиповКонтекста = Новый СписокЗначений; МассивДляПроверкиДублей = Новый Массив; Для Каждого СтруктураТипаКонтекста Из ТаблицаСтруктурТипов Цикл ИмяОбщегоТипа = СтруктураТипаКонтекста.ИмяОбщегоТипа; Если Ложь Или Не мПлатформа.ЭтоАгрегатныйОбщийТип(ИмяОбщегоТипа, ЯзыкПрограммы) Или ТипЗнч(СтруктураТипаКонтекста.Метаданные) <> Тип("ОбъектМетаданных") Или (Истина И ЯзыкПрограммы = 0 И Найти(ИмяОбщегоТипа, "Ссылка.") = 0) Тогда Продолжить; КонецЕсли; ПредставлениеКонкретногоТипа = ""; ПредставлениеКонкретногоТипа = ПредставлениеКонкретногоТипа + мПлатформа.ИмяТипаИзСтруктурыТипа(СтруктураТипаКонтекста); Если МассивДляПроверкиДублей.Найти(ПредставлениеКонкретногоТипа) = Неопределено Тогда СписокТиповКонтекста.Добавить(СтруктураТипаКонтекста, ПредставлениеКонкретногоТипа); МассивДляПроверкиДублей.Добавить(ПредставлениеКонкретногоТипа); КонецЕсли; КонецЦикла; Если СписокТиповКонтекста.Количество() > 0 Тогда Ответ = Вопрос("Хотите использовать предсказанные равенством метаданные?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат Неопределено; КонецЕсли; КонецЕсли; Если СписокТиповКонтекста.Количество() = 1 Тогда ВыбраннаяСтруктураТипа = СписокТиповКонтекста[0].Значение; КонкретныйТип = СписокТиповКонтекста[0].Представление; ИначеЕсли СписокТиповКонтекста.Количество() > 1 Тогда СписокТиповКонтекста.СортироватьПоПредставлению(); ВыбранныйТип = СписокТиповКонтекста.ВыбратьЭлемент("Выберите тип контекста"); Если ВыбранныйТип <> Неопределено Тогда ВыбраннаяСтруктураТипа = ВыбранныйТип.Значение; КонкретныйТип = ВыбранныйТип.Представление; КонецЕсли; КонецЕсли; //Если ВыбраннаяСтруктураТипа <> Неопределено Тогда // СтруктураТипаКонтекста = мПлатформа.НоваяСтруктураТипа(); // ЗаполнитьЗначенияСвойств(СтруктураТипаКонтекста, ВыбраннаяСтруктураТипа); //КонецЕсли; Возврат ВыбраннаяСтруктураТипа; КонецФункции//ПолучитьСтруктуруТипаСправоОтРавно Функция ТаблицаСтруктурТиповТекущегоВыражения(ЛиСправаОтРавенства = Ложь, БезКонструкторов = Ложь, ПолныйАнализ = Истина) Экспорт РазобратьТекущийКонтекст(ЛиСправаОтРавенства); лКонтекст = ?(ЛиСправаОтРавенства, мКонтекст, мРодительскийКонтекст); МассивЗащитыОтРекурсии.Очистить(); Попытка ТаблицаСтруктурТиповКонтекста = ОпределитьТипЗначенияКонтекста(лКонтекст, " " + мТекстДляПоискаОпределения, мПредшествующийТекст, Истина,, ПолныйАнализ); Исключение Ошибка = ИнформацияОбОшибке(); Если Ошибка.Описание = "ОшибкаВычисленияВиртуальнойТаблицы" Тогда Возврат Новый ТаблицаЗначений; КонецЕсли; ВызватьИсключение; КонецПопытки; Если БезКонструкторов Тогда Для Каждого СтрокаТаблицы Из ТаблицаСтруктурТиповКонтекста.НайтиСтроки(Новый Структура("Конструктор", Истина)) Цикл ТаблицаСтруктурТиповКонтекста.Удалить(СтрокаТаблицы); КонецЦикла; КонецЕсли; Возврат ТаблицаСтруктурТиповКонтекста; КонецФункции Функция ПодготовитьИмяПараметраМетода(ИмяПараметра) Экспорт //ирОбщий.ДекодироватьТекстИзXMLЛкс(СтрокаПараметра.Параметр); ИмяПараметра = СтрЗаменить(ИмяПараметра, ">", ""); ИмяПараметра = СтрЗаменить(ИмяПараметра, "<", ""); Возврат ИмяПараметра; КонецФункции // Вызывает контекстную подсказку в текстовом поле. // // Параметры: // Нет. // Процедура ОткрытьАвтодополнение(КодКлавиши = "") Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда Возврат; КонецЕсли; #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если Ложь Или ПолеТекста.ТолькоПросмотр() Или ФормаВладелец.ТолькоПросмотр Тогда Возврат; КонецЕсли; Если Истина //И Найти(КодКлавиши, "04128") = 1 // CTRL+SPACE И КодКлавиши = "" // Вызов из обработчика нажатия кнопки И ТипЗнч(ПолеТекста.ЭлементФормы) = Тип("ПолеHTMLДокумента") И ирКэш.НомерВерсииПлатформыЛкс() <= 803016 Тогда // https://github.com/salexdv/bsl_console/issues/124 ПолеТекста.РедакторHTML().triggerSuggestions(); Возврат; КонецЕсли; //Если Истина // И ЯзыкПрограммы = 1 // И Не мДоступныеТаблицыПолучены //Тогда // Если ирОбщий.СтрокиРавныЛкс(мДиалектSQL, "1С") Тогда // ИначеЕсли ирОбщий.СтрокиРавныЛкс(мДиалектSQL, "WQL") Тогда // Иначе // ЗаполнитьДоступныеТаблицыADO(); // Для Каждого СтрокаДоступнойТаблицы Из ДоступныеТаблицы Цикл // ДобавитьСловоЛокальногоКонтекста(СтрокаДоступнойТаблицы.Имя,,,, Истина,,, "ВременнаяТаблица"); // КонецЦикла; // КонецЕсли; //КонецЕсли; КонкретныйТип = Неопределено; СтруктураТипаКонтекста = Неопределено; ТаблицаСтруктурТиповКонтекста = Неопределено; Пока Истина Цикл Успешно = ЗаполнитьТаблицуСлов(ТаблицаСтруктурТиповКонтекста, КонкретныйТип, СтруктураТипаКонтекста); Если Не Успешно Тогда Возврат; КонецЕсли; Если Истина И ТаблицаСлов.Количество() = 0 И Не ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ЛиОткрыватьПустойСписок") = Истина Тогда Возврат; КонецЕсли; ТаблицаСлов.Сортировать("НСлово, ТипСлова, Определение, ТипЗначения, Частота"); КлючПоискаСтатистики = Новый Структура("ЯзыкПрограммы, ТипКонтекста", ЯзыкПрограммы, КонкретныйТип); НайденныеСтроки = мПлатформа.ТаблицаСтатистикиВыбора.НайтиСтроки(КлючПоискаСтатистики); ТаблицаСловТЗ = ТаблицаСлов.Выгрузить(, "НСлово, Рейтинг"); ТаблицаСловТЗ.Индексы.Добавить("НСлово"); Для Каждого СтрокаРейтинга Из НайденныеСтроки Цикл СтрокаСлова = ТаблицаСловТЗ.Найти(НРег(СтрокаРейтинга.Слово), "НСлово"); Если СтрокаСлова <> Неопределено Тогда СтрокаСлова.Рейтинг = СтрокаРейтинга.Рейтинг; КонецЕсли; КонецЦикла; ТаблицаСлов.ЗагрузитьКолонку(ТаблицаСловТЗ.ВыгрузитьКолонку("Рейтинг"), "Рейтинг"); Если мФормаАвтодополнение = Неопределено Тогда Если Ложь Или Не ирКэш.ЛиПлатформаWindowsЛкс() Или ирОбщий.ЛиПерехватКлавиатурногоВводаЛкс() Тогда ИмяФормы = "Автодополнение"; Иначе ИмяФормы = "АвтодополнениеCOM"; КонецЕсли; мФормаАвтодополнение = ПолучитьФорму(ИмяФормы, ФормаВладелец); мФормаАвтодополнение.КлючСохраненияПоложенияОкна = ЯзыкПрограммы; КонецЕсли; Попытка мФормаАвтодополнение.СтруктураТипаКонтекста = СтруктураТипаКонтекста; Исключение ВызватьИсключение "Экземпляр формы автодополнения контекстной подсказки сломан ошибкой платформы. Переоткройте форму чтобы восстановить ее работу"; КонецПопытки; Если ЗначениеЗаполнено(СтруктураТипаКонтекста.ТипЯзыка) Тогда мФормаАвтодополнение.Контекст = СтруктураТипаКонтекста.ТипЯзыка; Иначе мФормаАвтодополнение.Контекст = мРодительскийКонтекст; КонецЕсли; мФормаАвтодополнение.ТекущееСлово = НачалоСлова; мФормаАвтодополнение.ЗапомнитьПозициюКаретки(); ФормаВладелец.Активизировать(); //ирОбщий.Форма_АктивироватьОткрытьЛкс(ФормаВладелец); // https://www.hostedredmine.com/issues/911214 ПараметрЗакрытияПодсказки = мФормаАвтодополнение.ОткрытьМодально(); Если ПараметрЗакрытияПодсказки = Неопределено Тогда Возврат; КонецЕсли; СтрокаРезультата = мФормаАвтодополнение.СтрокаСловаРезультата; Если СтрокаРезультата = Неопределено Тогда Возврат; КонецЕсли; ВставитьВыбранноеСловоАвтодополнения(СтрокаРезультата, КонкретныйТип, СтруктураТипаКонтекста, ТаблицаСтруктурТиповКонтекста, ПараметрЗакрытияПодсказки); КонецЦикла; КонецПроцедуры Функция ЗаполнитьТаблицуСлов(ТаблицаСтруктурТиповКонтекста = Неопределено, выхКонкретныйТип = Неопределено, выхСтруктураТипаКонтекста = Неопределено, РазрешитьОткрытиеОкон = Истина) Экспорт ВычислятьТипы = ПоказыватьВсеТипыВСпискеАвтодополненияHTML(); RegExp.Global = Истина; ТаблицаСтатистикиВыбора = мПлатформа.ТаблицаСтатистикиВыбора; #Если Сервер И Не Сервер Тогда ТаблицаСтатистикиВыбора = Новый ТаблицаЗначений; мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если ТаблицаСтруктурТиповКонтекста = Неопределено Тогда ТаблицаСтруктурТиповКонтекста = ТаблицаСтруктурТиповТекущегоВыражения(); КонецЕсли; Если ТаблицаСтруктурТиповКонтекста.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; ТаблицаСлов.Очистить(); Если мЭтоСтроковыйЛитерал Тогда ВыбраннаяСтруктураТипа = ТаблицаСтруктурТиповКонтекста[0]; Иначе СписокТиповКонтекста = Новый СписокЗначений; СоответствиеСтруктурТипов = Новый Соответствие; МассивДляПроверкиДублей = Новый Массив; Для Каждого СтруктураТипаКонтекста Из ТаблицаСтруктурТиповКонтекста Цикл ИмяОбщегоТипа = СтруктураТипаКонтекста.ИмяОбщегоТипа; Если Истина И Не ЗначениеЗаполнено(СтруктураТипаКонтекста.ТипЯзыка) И Не мПлатформа.ЭтоАгрегатныйОбщийТип(ИмяОбщегоТипа, ЯзыкПрограммы) Тогда Продолжить; КонецЕсли; ПредставлениеКонкретногоТипа = ""; //Если СтруктураТипаКонтекста.СтрокаОписания <> Неопределено Тогда // // Наверное логичнее было бы из ОпределитьТипЗначенияКонтекста ее получать // РодительскаяСтруктураТипа = мПлатформа.НоваяСтруктураТипа(); // Если СтруктураТипаКонтекста.СтрокаОписания.Владелец().Колонки.Найти("ТипКонтекста") <> Неопределено Тогда // ЗаполнитьЗначенияСвойств(РодительскаяСтруктураТипа, СтруктураТипаКонтекста); // РодительскаяСтруктураТипа.ИмяОбщегоТипа = СтруктураТипаКонтекста.СтрокаОписания.ТипКонтекста; // КонецЕсли; // ПредставлениеКонкретногоТипа = ПредставлениеКонкретногоТипа // + мПлатформа.ИмяТипаИзСтруктурыТипа(РодительскаяСтруктураТипа) + " / "; //КонецЕсли; ПредставлениеКонкретногоТипа = ПредставлениеКонкретногоТипа + мПлатформа.ИмяТипаИзСтруктурыТипа(СтруктураТипаКонтекста); Если МассивДляПроверкиДублей.Найти(ПредставлениеКонкретногоТипа) = Неопределено Тогда СписокТиповКонтекста.Добавить(ПредставлениеКонкретногоТипа, ПредставлениеКонкретногоТипа); МассивДляПроверкиДублей.Добавить(ПредставлениеКонкретногоТипа); КонецЕсли; МассивСтруктурТипа = СоответствиеСтруктурТипов[ПредставлениеКонкретногоТипа]; Если МассивСтруктурТипа = Неопределено Тогда МассивСтруктурТипа = Новый Массив; КонецЕсли; МассивСтруктурТипа.Добавить(СтруктураТипаКонтекста); СоответствиеСтруктурТипов[ПредставлениеКонкретногоТипа] = МассивСтруктурТипа; КонецЦикла; Если СписокТиповКонтекста.Количество() = 0 Тогда ВыбраннаяСтруктураТипа = ТаблицаСтруктурТиповКонтекста[0]; выхКонкретныйТип = мПлатформа.ИмяТипаИзСтруктурыТипа(СтруктураТипаКонтекста); Иначе ВыбраннаяСтруктураТипа = Неопределено; Если СписокТиповКонтекста.Количество() > 1 Тогда Если Не РазрешитьОткрытиеОкон Тогда Возврат Ложь; КонецЕсли; СписокТиповКонтекста.СортироватьПоПредставлению(); НачальныйВыбор = Неопределено; КлючПоискаСтатистики = Новый Структура("ЯзыкПрограммы, ТипКонтекста", ЯзыкПрограммы, "<Выбор типа>"); ВыбранныеРанееТипы = ТаблицаСтатистикиВыбора.Скопировать(КлючПоискаСтатистики); ВыбранныеРанееТипы.Сортировать("Рейтинг Убыв"); Для Каждого СтрокаТипа Из ВыбранныеРанееТипы Цикл Для Каждого ЭлементСписка Из СписокТиповКонтекста Цикл Если СтрокаТипа.Слово = ЭлементСписка.Представление Тогда НачальныйВыбор = ЭлементСписка; Прервать; КонецЕсли; КонецЦикла; Если НачальныйВыбор <> Неопределено Тогда Прервать; КонецЕсли; КонецЦикла; ВыбранныйЭлементСписка = СписокТиповКонтекста.ВыбратьЭлемент("Выберите тип контекста", НачальныйВыбор); Если ВыбранныйЭлементСписка = Неопределено Тогда Возврат Ложь; КонецЕсли; выхКонкретныйТип = ВыбранныйЭлементСписка.Представление; // Обновим статистику выбора КлючПоискаСтатистики.Вставить("Слово", выхКонкретныйТип); НайденныеСтроки = ТаблицаСтатистикиВыбора.НайтиСтроки(КлючПоискаСтатистики); Если НайденныеСтроки.Количество() > 0 Тогда СтрокаСтатистикиВыбора = НайденныеСтроки[0]; Иначе СтрокаСтатистикиВыбора = ТаблицаСтатистикиВыбора.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаСтатистикиВыбора, КлючПоискаСтатистики); КонецЕсли; СтрокаСтатистикиВыбора.Рейтинг = СтрокаСтатистикиВыбора.Рейтинг + 1; Иначе ВыбранныйЭлементСписка = СписокТиповКонтекста[0]; выхКонкретныйТип = ВыбранныйЭлементСписка.Представление; КонецЕсли; МассивСтруктурТипа = СоответствиеСтруктурТипов[выхКонкретныйТип]; Для Каждого СтруктураТипа Из МассивСтруктурТипа Цикл Если Ложь Или ВыбраннаяСтруктураТипа = Неопределено Или ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("ОбъектМетаданныхКонфигурация") Тогда ВыбраннаяСтруктураТипа = СтруктураТипа; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; выхСтруктураТипаКонтекста = мПлатформа.НоваяСтруктураТипа(); Если ВыбраннаяСтруктураТипа.ТипЯзыка <> "ИмяТипа" И мЭтоСтроковыйЛитерал Тогда // Находимся внутри строкового литерала на позиции параметра КоллекцияЭлементовМД = Новый Массив; Если Истина И ВыбраннаяСтруктураТипа.СтрокаОписания <> Неопределено И ВыбраннаяСтруктураТипа.СтрокаОписания.Владелец().Колонки.Найти("ЛиЭкспорт") = Неопределено Тогда ИмяПараметра = ""; Отбор = Новый Структура; Отбор.Вставить("ТипКонтекста", ВыбраннаяСтруктураТипа.СтрокаОписания.ТипКонтекста); Отбор.Вставить("Слово", мИмяМетода); Отбор.Вставить("ЯзыкПрограммы", ЯзыкПрограммы); СтрокиПараметров = мПлатформа.ТаблицаПараметров.Скопировать(Отбор); СтрокиПараметров = СтрокиПараметров.НайтиСтроки(Новый Структура("Номер", мНомерПараметра)); Для Каждого СтрокаПараметра Из СтрокиПараметров Цикл Если Найти(СтрокаПараметра.ТипЗначения, "Строка") > 0 Тогда ИмяПараметра = ПодготовитьИмяПараметраМетода(СтрокаПараметра.Параметр); Прервать; КонецЕсли; КонецЦикла; // Имена свойств Если Ложь Или ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("ТаблицаЗначений") Или ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("ДеревоЗначений") Или ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("РезультатЗапроса") Тогда КоллекцияЭлементовМД = ВыбраннаяСтруктураТипа.Метаданные.Колонки; ИначеЕсли ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("ОбъектМетаданных") Тогда Если ИмяПараметра = "Макет" Тогда КоллекцияЭлементовМД = ВыбраннаяСтруктураТипа.Метаданные.Макеты; ИначеЕсли ИмяПараметра = "Форма" Тогда КоллекцияЭлементовМД = ВыбраннаяСтруктураТипа.Метаданные.Формы; Иначе ИмяТаблицыБД = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ВыбраннаяСтруктураТипа.Метаданные.ПолноеИмя()); Если ЗначениеЗаполнено(ИмяТаблицыБД) Тогда КоллекцияЭлементовМД = ирОбщий.ПоляТаблицыБДЛкс(ИмяТаблицыБД); КонецЕсли; КонецЕсли; ИначеЕсли ИмяПараметра = "ИмяПользователяИБ" Тогда ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); Для Каждого Пользователь Из ПользователиИБ Цикл КоллекцияЭлементовМД.Добавить(Пользователь.Имя); КонецЦикла; ИначеЕсли ИмяПараметра = "Роль" Тогда КоллекцияЭлементовМД = Метаданные.Роли; ИначеЕсли ИмяПараметра = "ИмяПользователяИБ" Тогда ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); Для Каждого Пользователь Из ПользователиИБ Цикл КоллекцияЭлементовМД.Добавить(Пользователь.Имя); КонецЦикла; ИначеЕсли ИмяПараметра = "ОбщийМакет" Тогда КоллекцияЭлементовМД = Метаданные.ОбщиеМакеты; ИначеЕсли Истина И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "ПолучитьОбщуюФорму" И ИмяПараметра = "Форма" Тогда КоллекцияЭлементовМД = Метаданные.ОбщиеФормы; ИначеЕсли Истина И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "НайтиПредопределенное" И ВыбраннаяСтруктураТипа.СтрокаОписания.ТипКонтекста = "МенеджерРегламентныхЗаданий" И ИмяПараметра = "Метаданные" Тогда КоллекцияЭлементовМД = Метаданные.РегламентныеЗадания; ИначеЕсли Истина И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "ПравоДоступа" И ИмяПараметра = "Право" Тогда КоллекцияЭлементовМД = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(мПлатформа.ПолучитьМакет("ВидыПравДоступа")); ИначеЕсли Истина И (Ложь Или ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "ПолучитьФункциональнуюОпцию" Или ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "ПолучитьФункциональнуюОпциюИнтерфейса" Или ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "ПолучитьФункциональнуюОпциюФормы") И ИмяПараметра = "Имя" Тогда КоллекцияЭлементовМД = Метаданные.ФункциональныеОпции; ИначеЕсли Истина И ТипЗнч(ВыбраннаяСтруктураТипа.Метаданные) = Тип("ПостроительЗапроса") И (Ложь Или ИмяПараметра = "ПутьКДанным" Или ИмяПараметра = "Описание") Тогда ИмяПараметра = "ПутьКДанным"; ПостроительЗапроса = ВыбраннаяСтруктураТипа.Метаданные; #Если Сервер И Не Сервер Тогда ПостроительЗапроса = Новый ПостроительЗапроса; #КонецЕсли КоллекцияЭлементовМД = ПостроительЗапроса.ДоступныеПоля; КонецЕсли; //Если Ложь // // ФоновыеЗадания.Выполнить("") // Или (Истина // И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "Выполнить" // И ВыбраннаяСтруктураТипа.СтрокаОписания.ТипКонтекста = "МенеджерФоновыхЗаданий" // И ИмяПараметра = "ИмяМетода") // // БлокировкаДанных.Добавить("") // Или (Истина // И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "Добавить" // И ВыбраннаяСтруктураТипа.СтрокаОписания.ТипКонтекста = "БлокировкаДанных" // И ИмяПараметра = "ПространствоБлокировки") // Или (Истина // И ВыбраннаяСтруктураТипа.СтрокаОписания.Слово = "УстановитьЗначение" // И ВыбраннаяСтруктураТипа.СтрокаОписания.ТипКонтекста = "ЭлементБлокировкиДанных" // И ИмяПараметра = "ПолеПространстваБлокировок") //Тогда ВыбраннаяСтруктураТипа.ТипЯзыка = ИмяПараметра; выхСтруктураТипаКонтекста.ТипЯзыка = ИмяПараметра; //КонецЕсли; КонецЕсли; Если ВыбраннаяСтруктураТипа.ТипЯзыка = "ИмяМетода" Тогда Если ЗначениеЗаполнено(мРодительскийКонтекст) Тогда выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "ОбщийМодуль"; выхСтруктураТипаКонтекста.Метаданные = Метаданные.ОбщиеМодули.Найти(мРодительскийКонтекст); ВнутренняяТаблицаСлов = мПлатформа.СвойстваТипаМетаданные(выхСтруктураТипаКонтекста,, "Метод",,,,,, Истина); ВнутренняяТаблицаСлов.Колонки.Добавить("Определение"); ВнутренняяТаблицаСлов.ЗаполнитьЗначения("Метаданные", "Определение"); ЗагрузитьВТаблицуСловИзВнутреннейТаблицыСлов(ВнутренняяТаблицаСлов, ТаблицаСлов); Иначе КоллекцияЭлементовМД = Новый Массив; Для Каждого КлючИЗначение Из ирКэш.ДоступныеОбщиеМодулиЛкс(Истина) Цикл КоллекцияЭлементовМД.Добавить(КлючИЗначение.Значение); КонецЦикла; КонецЕсли; ИначеЕсли ВыбраннаяСтруктураТипа.ТипЯзыка = "ИмяПредопределенногоЗначения" Тогда КоллекцияЭлементовМД = Новый Массив; Если ЗначениеЗаполнено(мРодительскийКонтекст) Тогда ТаблицаТиповМетаОбъектов = ирКэш.ТипыМетаОбъектов(Ложь); КорневойТип = ирОбщий.ПервыйФрагментЛкс(мРодительскийКонтекст); КоллекцияЭлементовМД.Добавить("ПустаяСсылка"); Если Найти(мРодительскийКонтекст, ".") > 0 Тогда ОбъектМД = Метаданные.НайтиПоПолномуИмени(мРодительскийКонтекст); Если ирОбщий.ЛиКорневойТипПеречисленияЛкс(КорневойТип) Тогда #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Перечисления.ABCКлассификация; #КонецЕсли Для Каждого ЗначениеПеречисления Из ОбъектМД.ЗначенияПеречисления Цикл КоллекцияЭлементовМД.Добавить(ЗначениеПеречисления.Имя); КонецЦикла; Иначе #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.Валюты; #КонецЕсли Если ирКэш.НомерВерсииПлатформыЛкс() > 803004 Тогда Для Каждого ИмяЭлемента Из ОбъектМД.ПолучитьИменаПредопределенных() Цикл КоллекцияЭлементовМД.Добавить(ИмяЭлемента); КонецЦикла; КонецЕсли; КонецЕсли; Иначе МножественноеИмяМД = ирОбщий.МножественноеИмяМДЛкс(КорневойТип); Если МножественноеИмяМД <> Неопределено Тогда Для Каждого МетаОбъект Из Метаданные[МножественноеИмяМД] Цикл КоллекцияЭлементовМД.Добавить(МетаОбъект); КонецЦикла; КонецЕсли; КонецЕсли; Иначе Для Каждого СтрокаТипаМетаОбъекта Из ирКэш.ТипыМетаОбъектов(Ложь, Ложь, Ложь) Цикл Если Ложь Или ирОбщий.ЛиКорневойТипПеречисленияЛкс(СтрокаТипаМетаОбъекта.Единственное) Или ирОбщий.ЛиКорневойТипОбъектаСПредопределеннымЛкс(СтрокаТипаМетаОбъекта.Единственное) Тогда КоллекцияЭлементовМД.Добавить(СтрокаТипаМетаОбъекта.Единственное); КонецЕсли; КонецЦикла; КонецЕсли; ИначеЕсли Ложь Или ВыбраннаяСтруктураТипа.ТипЯзыка = "Местоположение" Или ВыбраннаяСтруктураТипа.ТипЯзыка = "ИмяФормы" Тогда Если ВыбраннаяСтруктураТипа.ТипЯзыка = "Местоположение" Тогда ИмяДочернегоТипаМД = "Макет"; ИмКорневогоТипаМД = "ОбщийМакет"; Иначе ИмяДочернегоТипаМД = "Форма"; ИмКорневогоТипаМД = "ОбщаяФорма"; КонецЕсли; КоллекцияЭлементовМД = Новый Массив; Если ЗначениеЗаполнено(мРодительскийКонтекст) Тогда Если ирОбщий.СтрокиРавныЛкс(ИмКорневогоТипаМД, ирОбщий.ПервыйФрагментЛкс(мРодительскийКонтекст)) Тогда Если СтрЧислоВхождений(мРодительскийКонтекст, ".") = 0 Тогда Для Каждого МетаМакет Из Метаданные[ирОбщий.МножественноеИмяМДЛкс(ИмКорневогоТипаМД)] Цикл КоллекцияЭлементовМД.Добавить(МетаМакет.Имя); КонецЦикла; КонецЕсли; Иначе Если СтрЧислоВхождений(мРодительскийКонтекст, ".") = 0 Тогда КорневойТип = ирОбщий.ПервыйФрагментЛкс(мРодительскийКонтекст); МножественноеИмяМД = ирОбщий.МножественноеИмяМДЛкс(КорневойТип); Если МножественноеИмяМД <> Неопределено Тогда Попытка КоллекцияМД = Метаданные[МножественноеИмяМД]; Исключение КоллекцияМД = Новый Массив; КонецПопытки; Для Каждого МетаОбъект Из КоллекцияМД Цикл КоллекцияЭлементовМД.Добавить(МетаОбъект); КонецЦикла; КонецЕсли; ИначеЕсли СтрЧислоВхождений(мРодительскийКонтекст, ".") = 1 Тогда КоллекцияЭлементовМД.Добавить(ИмяДочернегоТипаМД); ИначеЕсли СтрЧислоВхождений(мРодительскийКонтекст, ".") = 2 Тогда ОбъектМД = Метаданные.НайтиПоПолномуИмени(ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(мРодительскийКонтекст, ".")); #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.Валюты; #КонецЕсли Для Каждого МетаМакет Из ОбъектМД[ирОбщий.МножественноеИмяМДЛкс(ИмяДочернегоТипаМД)] Цикл КоллекцияЭлементовМД.Добавить(МетаМакет.Имя); КонецЦикла; КонецЕсли; КонецЕсли; Иначе Для Каждого СтрокаТипаМетаОбъекта Из ирКэш.ТипыМетаОбъектов(Истина, Ложь) Цикл НадоДобавить = ирОбщий.СтрокиРавныЛкс(ИмКорневогоТипаМД, СтрокаТипаМетаОбъекта.Единственное); Если Не НадоДобавить Тогда ОтборСвойств = Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка, НСлово, ТипСлова", "ОбъектМетаданных: " + СтрокаТипаМетаОбъекта.Единственное, 0, "", НРег(ирОбщий.МножественноеИмяМДЛкс(ИмяДочернегоТипаМД)), "Свойство"); НадоДобавить = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(ОтборСвойств).Количество() > 0; КонецЕсли; Если НадоДобавить Тогда КоллекцияЭлементовМД.Добавить(СтрокаТипаМетаОбъекта.Единственное); КонецЕсли; КонецЦикла; КонецЕсли; ИначеЕсли ВыбраннаяСтруктураТипа.ТипЯзыка = "ПространствоБлокировки" Тогда КоллекцияЭлементовМД = Новый Массив; Если ЗначениеЗаполнено(мРодительскийКонтекст) Тогда КорневойТип = ирОбщий.ПервыйФрагментЛкс(мРодительскийКонтекст); ЭтоТаблицаВнешнейБД = ирОбщий.ЛиКорневойТипВнешнегоИсточникаДанныхЛкс(КорневойТип); Если Истина И ЭтоТаблицаВнешнейБД И СтрЧислоВхождений(мРодительскийКонтекст, ".") = 1 Тогда КоллекцияЭлементовМД.Добавить("Таблица"); ИначеЕсли Истина И ЭтоТаблицаВнешнейБД И СтрЧислоВхождений(мРодительскийКонтекст, ".") = 2 Тогда Для Каждого МетаОбъект Из ирКэш.ОбъектМДПоПолномуИмениЛкс(ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(мРодительскийКонтекст)).Таблицы Цикл КоллекцияЭлементовМД.Добавить(МетаОбъект.Имя); КонецЦикла; ИначеЕсли Найти(мРодительскийКонтекст, ".") > 0 Тогда Если ирОбщий.ЛиКорневойТипРегистраБДЛкс(КорневойТип) Тогда КоллекцияЭлементовМД.Добавить("НаборЗаписей"); КонецЕсли; Если ирОбщий.ЛиКорневойТипПоследовательностиЛкс(КорневойТип) Тогда КоллекцияЭлементовМД.Добавить("Записи"); КонецЕсли; Иначе МножественноеИмяМД = ирОбщий.МножественноеИмяМДЛкс(КорневойТип); Если МножественноеИмяМД <> Неопределено Тогда Для Каждого МетаОбъект Из Метаданные[МножественноеИмяМД] Цикл КоллекцияЭлементовМД.Добавить(МетаОбъект); КонецЦикла; КонецЕсли; КонецЕсли; Иначе Для Каждого СтрокаТипаМетаОбъекта Из ирКэш.ТипыМетаОбъектов(Ложь, Ложь, Ложь) Цикл КоллекцияЭлементовМД.Добавить(СтрокаТипаМетаОбъекта.Единственное); КонецЦикла; КонецЕсли; ИначеЕсли ВыбраннаяСтруктураТипа.ТипЯзыка = "ПолеПространстваБлокировок" Тогда ПространствоБлокировки = ВыбраннаяСтруктураТипа.Метаданные; КорневойТип = ирОбщий.ПервыйФрагментЛкс(ПространствоБлокировки); ОбъектМД = ирОбщий.ПолучитьМетаданныеЛкс(ПространствоБлокировки); ЭтоТаблицаВнешнейБД = ирОбщий.ЛиКорневойТипВнешнегоИсточникаДанныхЛкс(КорневойТип); Если ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(ОбъектМД) Тогда КоллекцияЭлементовМД.Добавить("Ссылка"); Если ОбъектМД <> Неопределено Тогда #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.Пользователи; #КонецЕсли Для Каждого ПолеБлокировки Из ОбъектМД.ПоляБлокировкиДанных Цикл КоллекцияЭлементовМД.Добавить(ПолеБлокировки.Имя); КонецЦикла; КонецЕсли; Иначе Если ОбъектМД <> Неопределено Тогда #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.РегистрыСведений.КурсыВалют; #КонецЕсли Если Найти(ПространствоБлокировки, "." + "НаборЗаписей") > 0 Тогда СтруктураКлюча = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя()), Ложь); Иначе СтруктураКлюча = Новый Структура; Если ирОбщий.ЛиКорневойТипРегистраСведенийЛкс(КорневойТип) Тогда Если ОбъектМД.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда СтруктураКлюча.Вставить(ирОбщий.ПеревестиСтроку("Период")); КонецЕсли; Если ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда СтруктураКлюча.Вставить(ирОбщий.ПеревестиСтроку("Регистратор")); КонецЕсли; КонецЕсли; Если ирОбщий.ЛиКорневойТипРегистраРасчетаЛкс(КорневойТип) Тогда СтруктураКлюча.Вставить(ирОбщий.ПеревестиСтроку("ПериодРегистрации")); СтруктураКлюча.Вставить(ирОбщий.ПеревестиСтроку("ПериодДействия")); КонецЕсли; Если ЭтоТаблицаВнешнейБД Тогда Для Каждого ПолеКлюча Из ОбъектМД.ПоляКлюча Цикл СтруктураКлюча.Вставить(ПолеКлюча.Имя); КонецЦикла; Иначе Для Каждого Измерение Из ОбъектМД.Измерения Цикл СтруктураКлюча.Вставить(Измерение.Имя); КонецЦикла; КонецЕсли; КонецЕсли; Для Каждого КлючИЗначение Из СтруктураКлюча Цикл КоллекцияЭлементовМД.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; КонецЕсли; ИначеЕсли Истина И ирОбщий.СтрокиРавныЛкс(мИмяМетода, "COMОбъект") И мНомерПараметра = 1 И ВыбраннаяСтруктураТипа.ИмяОбщегоТипа = "Неизвестный контекст" Тогда Если МассивКОМКлассов = Неопределено Тогда Компьютер = "localhost"; МассивКОМКлассов = Новый Массив; КаталогПриложений = Новый COMОбъект("COMAdmin.COMAdminCatalog"); КаталогПриложений.Connect(Компьютер); Компоненты = КаталогПриложений.GetCollection("InprocServers"); Компоненты.Populate(); ДобавитьCOMКлассыВСписокСлов(МассивКомКлассов, Компоненты); Компоненты = КаталогПриложений.GetCollection("WOWLegacyServers"); Компоненты.Populate(); ДобавитьCOMКлассыВСписокСлов(МассивКомКлассов, Компоненты); Компоненты = КаталогПриложений.GetCollection("LegacyServers"); Компоненты.Populate(); ДобавитьCOMКлассыВСписокСлов(МассивКомКлассов, Компоненты); КонецЕсли; КоллекцияЭлементовМД = МассивКОМКлассов; КонецЕсли; выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Строка"; Для Каждого ЭлементКоллекцииМД Из КоллекцияЭлементовМД Цикл СтрокаСлова = ТаблицаСлов.Добавить(); Если ТипЗнч(ЭлементКоллекцииМД) = Тип("Строка") Тогда СтрокаСлова.Слово = ЭлементКоллекцииМД; Иначе СтрокаСлова.Слово = ЭлементКоллекцииМД.Имя; КонецЕсли; СтрокаСлова.ТипСлова = "Свойство"; СтрокаСлова.Определение = "Метаданные"; СтрокаСлова.ТипЗначения = "Строка"; КонецЦикла; Иначе Если Истина И ЯзыкПрограммы = 1 И ВыбраннаяСтруктураТипа.ТипЯзыка = "ИмяТипа" И Не мТолькоСсылочныеИменаТипов И Найти(мКонтекст, ".") = 0 Тогда ИменаФиксированныхТипов = Новый Массив; ИменаФиксированныхТипов.Добавить("БУЛЕВО"); ИменаФиксированныхТипов.Добавить("ДАТА"); ИменаФиксированныхТипов.Добавить("СТРОКА"); ИменаФиксированныхТипов.Добавить("ЧИСЛО"); Для Каждого ЭлементКоллекцииМД Из ИменаФиксированныхТипов Цикл СтрокаСлова = ТаблицаСлов.Добавить(); СтрокаСлова.Слово = ЭлементКоллекцииМД; СтрокаСлова.ТипСлова = "Свойство"; СтрокаСлова.Определение = "Предопределенный"; СтрокаСлова.ТипЗначения = "Тип"; КонецЦикла; КонецЕсли; ЗаполнитьЗначенияСвойств(выхСтруктураТипаКонтекста, ВыбраннаяСтруктураТипа); КонецЕсли; ТаблицаСтруктурТиповКонтекста.Очистить(); Попытка ВыгрузкаТаблицыСлов = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(выхСтруктураТипаКонтекста, ЯзыкПрограммы, Конфигурация, ВнешниеФункцииКомпоновкиДанных, ВычислятьТипы,,, ЛиСерверныйКонтекст); СловаДляУточненияТипа = ВыгрузкаТаблицыСлов.НайтиСтроки(Новый Структура("МожноУточнитьТип", Истина)); //Если ВычислятьТипы Или СловаДляУточненияТипа.Количество() < 100 Тогда Для Каждого ВнутренняяСтрокаСлова Из СловаДляУточненияТипа Цикл ОбновитьТипЗначенияИзТаблицыСтруктурТипов(ВнутренняяСтрокаСлова, ВнутренняяСтрокаСлова.ТаблицаСтруктурТипов, Ложь); КонецЦикла; //КонецЕсли; #Если Сервер И Не Сервер Тогда ВыгрузкаТаблицыСлов = Новый ТаблицаЗначений; #КонецЕсли Если Ложь Или выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Локальный" Или выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "ВнешнийИсточникДанных.<Имя внешнего источника>.ВременнаяТаблица" Тогда ВыгрузкаТаблицыСлов.Индексы.Добавить("Слово, ТипСлова"); Если выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Локальный" Тогда // Добавим слова из таблицы локального контекста Для Каждого СтрокаСлова Из ТаблицаЛокальногоКонтекста Цикл НоваяСтрока = мПлатформа.ДобавитьВТаблицуСлов(ВыгрузкаТаблицыСлов, СтрокаСлова.Слово, СтрокаСлова.ТипСлова); Если Не ЗначениеЗаполнено(НоваяСтрока.Определение) Тогда НоваяСтрока.Определение = "Локальный"; КонецЕсли; //Если ЗаполнятьТипы Тогда // Если откладывать вычисление типа, то потом через метод УточнитьТипЗначенияВСтрокеТаблицыСлов он не вычислится НоваяСтрока.ТипЗначения = мПлатформа.ПредставлениеМассиваСтруктурТипов(СтрокаСлова.ТаблицаСтруктурТипов); //КонецЕсли; КонецЦикла; КонецЕсли; Если выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "ВнешнийИсточникДанных.<Имя внешнего источника>.ВременнаяТаблица" Тогда Для Каждого СтрокаВременнойТаблицы Из ДоступныеТаблицы.НайтиСтроки(Новый Структура("Тип", "ВременнаяТаблица")) Цикл НоваяСтрока = мПлатформа.ДобавитьВТаблицуСлов(ВыгрузкаТаблицыСлов, СтрокаВременнойТаблицы.Имя, "Свойство",, "ВременнаяТаблица"); НоваяСтрока.Определение = "Локальный"; КонецЦикла; КонецЕсли; КонецЕсли; ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ВыгрузкаТаблицыСлов, ТаблицаСлов); Исключение Ошибка = ИнформацияОбОшибке(); Если Ошибка.Описание = "ОшибкаВычисленияВиртуальнойТаблицы" Тогда Возврат Ложь; КонецЕсли; ВызватьИсключение; КонецПопытки; СтруктураКлюча = Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка", выхСтруктураТипаКонтекста.ИмяОбщегоТипа, ЯзыкПрограммы, выхСтруктураТипаКонтекста.ТипЯзыка); ДобавлятьЛокальныйКонтекст = Ложь Или выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Неизвестный контекст" Или выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Локальный" Или мПлатформа.ТаблицаШаблоновКонтекстов.НайтиСтроки(СтруктураКлюча).Количество() > 0; Если РазрешитьОткрытиеОкон Или ВычислятьТипы Или ДобавлятьЛокальныйКонтекст Тогда Для Каждого СтрокаСлова Из ТаблицаСлов Цикл СтрокаСлова.НСлово = НРег(СтрокаСлова.Слово); КонецЦикла; Если ДобавлятьЛокальныйКонтекст Тогда ЗаполнитьЛокальныеСвойстваИМетодыПоТексту(Ложь, выхСтруктураТипаКонтекста.ИмяОбщегоТипа = "Локальный", Истина, Ложь); КонецЕсли; Если Прав(мТекущееСлово, 1) = "(" Тогда ЧистоеТекущееСлово = Лев(мТекущееСлово, СтрДлина(мТекущееСлово) - 1); ТипТекущегоСлова = "Метод"; Иначе ЧистоеТекущееСлово = мТекущееСлово; ТипТекущегоСлова = "Свойство"; КонецЕсли; КлючПоиска = Новый Структура("НСлово, Определение, ТипСлова", НРег(ЧистоеТекущееСлово), "Статистический", ТипТекущегоСлова); НайденныеСтроки = ТаблицаСлов.НайтиСтроки(КлючПоиска); Если НайденныеСтроки.Количество() > 0 Тогда НайденнаяСтрока = НайденныеСтроки[0]; НайденнаяСтрока.Частота = НайденнаяСтрока.Частота - 1; Если НайденнаяСтрока.Частота = 0 Тогда ТаблицаСлов.Удалить(НайденнаяСтрока); КонецЕсли; КонецЕсли; ТаблицаСлов.Свернуть("НСлово, Слово, ТипСлова, Определение, ТипЗначения", "Частота"); КонецЕсли; Возврат Истина; КонецФункции Процедура ВставитьВыбранноеСловоАвтодополнения(СтрокаРезультата, КонкретныйТип, СтруктураТипаКонтекста, ТаблицаСтруктурТиповКонтекста = Неопределено, ПараметрЗакрытияПодсказки = Истина) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ТаблицаСтатистикиВыбора = мПлатформа.ТаблицаСтатистикиВыбора; Если Найти(НРег(СтрокаРезультата.Слово), НРег(НачалоСлова + КонецКонтекста)) = 1 Тогда НеобрабатываемыйКонецСтроки = Сред(ТекущийКонецСтроки, СтрДлина(КонецКонтекста) + 1); Иначе НеобрабатываемыйКонецСтроки = ТекущийКонецСтроки; RegExp.Pattern = "[" + шБуква + "\d]"; Если RegExp.Test(Лев(НеобрабатываемыйКонецСтроки, 1)) Тогда НеобрабатываемыйКонецСтроки = " " + НеобрабатываемыйКонецСтроки; КонецЕсли; КонецЕсли; СтрокаНачала = ""; Если Не мЭтоСтроковыйЛитерал И СтрокаРезультата.ТипСлова = "Метод" Тогда Если Лев(КонецКонтекста, 1) = "(" Тогда НеобрабатываемыйКонецСтроки = Сред(НеобрабатываемыйКонецСтроки, 2); КонецЕсли; СтрокаОкончания = "()"; Если Истина И ПараметрЗакрытияПодсказки = Истина И Прав(мТекущееСлово, 1) = "(" Тогда СтрокаОкончания = "("; Иначе Если Истина И ЯзыкПрограммы = 0 И Лев(НеобрабатываемыйКонецСтроки, 1) <> ";" И СтрокаРезультата.ТипЗначения = "" И СтрокаРезультата.Определение <> "Статистический" Тогда СтрокаОкончания = СтрокаОкончания + ";" КонецЕсли; КонецЕсли; СмещениеКурсораВОкончании = СтрДлина(СтрокаОкончания); Если ПараметрЗакрытияПодсказки = Истина Тогда ТаблицаМетодовМодуля = мПлатформа.СвойстваТипаМетаданные(СтруктураТипаКонтекста, СтрокаРезультата.Слово, "Метод"); Если ТаблицаМетодовМодуля.Количество() > 0 Тогда СтрокаОписания = ТаблицаМетодовМодуля[0].ТаблицаСтруктурТипов[0].СтрокаОписания; Если Ложь Или (Истина И ТипЗнч(СтрокаОписания) = Тип("COMОбъект") И СтрокаОписания.Parameters.Count > 0) Или (Истина И ТипЗнч(СтрокаОписания) = Тип("СтрокаТаблицыЗначений") И СтрокаОписания.Параметры <> Неопределено) Тогда СмещениеКурсораВОкончании = 1; КонецЕсли; Иначе МассивОбщихТипов = мПлатформа.ТаблицаОбщихТиповИзСтруктурыТипа(СтруктураТипаКонтекста); КлючПоискаПараметров = Новый Структура("ТипКонтекста, Слово, ЯзыкПрограммы"); КлючПоискаПараметров.Слово = СтрокаРезультата.Слово; КлючПоискаПараметров.ЯзыкПрограммы = ЯзыкПрограммы; СмещениеКурсораВОкончании = 2; Для Каждого СтрокаОбщегоТипа Из МассивОбщихТипов Цикл ОбщийТип = СтрокаОбщегоТипа.ИмяОбщегоТипа; КлючПоискаПараметров.ТипКонтекста = ОбщийТип; НайденныеСтроки = мПлатформа.ТаблицаПараметров.НайтиСтроки(КлючПоискаПараметров); Если НайденныеСтроки.Количество() > 0 Тогда СмещениеКурсораВОкончании = 1; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; ИначеЕсли Истина И ПараметрЗакрытияПодсказки = "." И ЯзыкПрограммы <> 0 И СтрокаРезультата.ТипСлова = "Свойство" И Найти(СтрокаРезультата.Слово, мПараметрыДиалектаSQL.ПрефиксПараметра) = 1 Тогда СтрокаНачала = "("; СтрокаОкончания = ")"; СмещениеКурсораВОкончании = 1; Иначе СтрокаОкончания = ""; СмещениеКурсораВОкончании = 0; КонецЕсли; // Обновим статистику выбора Если Истина И СтрокаРезультата.Определение <> "Локальный" И СтрокаРезультата.Определение <> "Статистический" Тогда КлючПоиска = Новый Структура("ЯзыкПрограммы, ТипКонтекста, Слово", ЯзыкПрограммы, КонкретныйТип, СтрокаРезультата.Слово); НайденныеСтроки = ТаблицаСтатистикиВыбора.НайтиСтроки(КлючПоиска); Если НайденныеСтроки.Количество() > 0 Тогда СтрокаСтатистикиВыбора = НайденныеСтроки[0]; Иначе СтрокаСтатистикиВыбора = ТаблицаСтатистикиВыбора.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаСтатистикиВыбора, КлючПоиска); КонецЕсли; СтрокаСтатистикиВыбора.Рейтинг = СтрокаСтатистикиВыбора.Рейтинг + 1; КонецЕсли; СтрокаДобавка = СтрокаНачала + СтрокаРезультата.Слово + СтрокаОкончания; Если мРодительскийКонтекст <> "" Тогда СтрокаДобавка = мРодительскийКонтекст + "." + СтрокаДобавка; КонецЕсли; мРодительскийКонтекст = СтрокаДобавка; Если Истина И ПараметрЗакрытияПодсказки <> Истина Тогда СтрокаДобавка = СтрокаДобавка + ПараметрЗакрытияПодсказки; мТекущееСлово = СтрокаРезультата.Слово; Если ПараметрЗакрытияПодсказки = "." Тогда Если СтрокаРезультата.Определение = "Статистический" Тогда ТаблицаСтруктурТиповКонтекста = ОпределитьТипЗначенияКонтекста(мРодительскийКонтекст, " " + мТекстДляПоискаОпределения, мПредшествующийТекст, Истина); Иначе ТаблицаСтруктурТиповКонтекста = ОпределитьТипДочернегоКонтекста(ирОбщий.БыстрыйМассивЛкс(СтруктураТипаКонтекста), мТекущееСлово, СтрокаРезультата.ТипСлова); КонецЕсли; КонецЕсли; КонецЕсли; ТекущееНачалоСтроки = Лев(ТекущееНачалоСтроки, мКонечнаяКолонка - 1 - СтрДлина(НачалоКонтекста)) + СтрокаДобавка; ТекущаяСтрока = ТекущееНачалоСтроки + НеобрабатываемыйКонецСтроки; Если ОригинальныйТекст = "" Тогда ВыделенныйТекст("" + ТекущаяСтрока); Иначе Если ПолеТекста.КоличествоСтрок() < мКонечнаяСтрока Тогда ПолеТекста.ДобавитьСтроку(ТекущаяСтрока); Иначе ПолеТекста.ЗаменитьСтроку(мКонечнаяСтрока, ТекущаяСтрока); КонецЕсли; КонецЕсли; УстановитьПризнакМодифицированностиФормы(); Если АвтоматическаяПодсказкаПоВызовуМетода() Тогда мОткрытьСправкуПоПараметру = СмещениеКурсораВОкончании = 1; КонецЕсли; мКонечнаяКолонка = мКонечнаяКолонка + СтрДлина(СтрокаДобавка) - СтрДлина(НачалоКонтекста) - СтрДлина(СтрокаОкончания) + СмещениеКурсораВОкончании; мНачальнаяКолонка = мКонечнаяКолонка; НачалоКонтекста = мРодительскийКонтекст + "."; НачалоСлова = ""; УстановитьГраницыВыделения(); КонецПроцедуры Функция АвтоматическаяПодсказкаПоВызовуМетода(Обновить = Ложь) Экспорт Если АвтоматическаяПодсказкаПоВызовуМетода = Неопределено Или Обновить Тогда АвтоматическаяПодсказкаПоВызовуМетода = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".АвтоматическаяПодсказкаПоВызовуМетода") <> Ложь; КонецЕсли; Возврат АвтоматическаяПодсказкаПоВызовуМетода; КонецФункции Функция АвтоматическаяПодсказкаАвтодополненияHTML(Обновить = Ложь) Экспорт Если АвтоматическаяПодсказкаАвтодополненияHTML = Неопределено Или Обновить Тогда АвтоматическаяПодсказкаАвтодополненияHTML = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".АвтоматическаяПодсказкаАвтодополненияHTML") <> Ложь; КонецЕсли; Возврат АвтоматическаяПодсказкаАвтодополненияHTML; КонецФункции Функция ПоказыватьВсеТипыВСпискеАвтодополненияHTML(Обновить = Ложь) Экспорт Если ПоказыватьВсеТипыВСпискеАвтодополненияHTML = Неопределено Или Обновить Тогда ПоказыватьВсеТипыВСпискеАвтодополненияHTML = ирОбщий.ВосстановитьЗначениеЛкс(ИмяКласса + ".ПоказыватьВсеТипыВСпискеАвтодополненияHTML") = Истина; КонецЕсли; Возврат ПоказыватьВсеТипыВСпискеАвтодополненияHTML; КонецФункции Процедура ДобавитьCOMКлассыВСписокСлов(Знач КоллекцияКолонок, Знач Компоненты) Для Каждого Класс Из Компоненты Цикл Если Не ЗначениеЗаполнено(Класс.Name) Тогда Продолжить; КонецЕсли; ИмяКласса = Класс.Name; КоллекцияКолонок.Добавить(ИмяКласса); КонецЦикла; КонецПроцедуры Процедура ЗагрузитьВТаблицуСловИзВнутреннейТаблицыСлов(Знач ВнутренняяТаблицаСлов, Знач ВыгрузкаТаблицыСлов) Для Каждого ВнутренняяСтрокаСлова Из ВнутренняяТаблицаСлов Цикл НоваяСтрока = ВыгрузкаТаблицыСлов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ВнутренняяСтрокаСлова); ТаблицаСтруктурТипов = ВнутренняяСтрокаСлова.ТаблицаСтруктурТипов; Если ТаблицаСтруктурТипов <> Неопределено Тогда ОбновитьТипЗначенияИзТаблицыСтруктурТипов(НоваяСтрока, ТаблицаСтруктурТипов); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ОбновитьТипЗначенияИзТаблицыСтруктурТипов(Знач НоваяСтрока, Знач ТаблицаСтруктурТипов, ЗаменитьСуществующий = Истина) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если Лев(НоваяСтрока.ТипЗначения, 2) = "??" Тогда НовыйТипЗначения = мПлатформа.ПредставлениеМассиваСтруктурТипов(ТаблицаСтруктурТипов); Если Истина И ЗначениеЗаполнено(НовыйТипЗначения) И Найти(НРег(НоваяСтрока.ТипЗначения), НРег(НовыйТипЗначения)) > 0 И НовыйТипЗначения <> "??" Тогда НовыйТипЗначения = ""; КонецЕсли; НоваяСтрока.ТипЗначения = СтрЗаменить(НоваяСтрока.ТипЗначения, "??", НовыйТипЗначения); Если Не ЗначениеЗаполнено(НоваяСтрока.ТипЗначения) Тогда НоваяСтрока.ТипЗначения = "?"; ИначеЕсли Лев(НоваяСтрока.ТипЗначения, 1) = "," Тогда НоваяСтрока.ТипЗначения = СокрЛ(Сред(НоваяСтрока.ТипЗначения, 2)); КонецЕсли; ИначеЕсли Ложь Или ЗаменитьСуществующий Или Не ЗначениеЗаполнено(НоваяСтрока.ТипЗначения) Или Найти(НоваяСтрока.ТипЗначения, "<") > 0 Тогда НовыйТипЗначения = мПлатформа.ПредставлениеМассиваСтруктурТипов(ТаблицаСтруктурТипов); НоваяСтрока.ТипЗначения = НовыйТипЗначения; КонецЕсли; КонецПроцедуры Функция УточнитьТипЗначенияВСтрокеТаблицыСлов(Знач СтруктураТипаКонтекста, Знач ТекущаяСтрока, Знач ВернутьСтруктуруТипа = Ложь) Экспорт #Если Сервер И Не Сервер Тогда ТекущаяСтрока = ТаблицаСлов.Добавить(); #КонецЕсли НужноУточнитьТип = Ложь Или Лев(ТекущаяСтрока.ТипЗначения, 2) = "??" Или Найти(ТекущаяСтрока.ТипЗначения, "<") > 0; Если НужноУточнитьТип Или ВернутьСтруктуруТипа Тогда #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ОписанияСлов = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипаКонтекста, ЯзыкПрограммы, Конфигурация,, Истина,, ТекущаяСтрока.ТипСлова, ЛиСерверныйКонтекст, ТекущаяСтрока.Слово, мМодульМетаданных, Истина); Если ОписанияСлов.Количество() > 0 Тогда Если НужноУточнитьТип Тогда ОбновитьТипЗначенияИзТаблицыСтруктурТипов(ТекущаяСтрока, ОписанияСлов[0].ТаблицаСтруктурТипов, ТекущаяСтрока.Определение <> "Метаданные"); КонецЕсли; Возврат ОписанияСлов[0].ТаблицаСтруктурТипов; КонецЕсли; КонецЕсли; Возврат Неопределено; КонецФункции Процедура ПоискОбщегоМетода() ФормаВыбора = ПолучитьФорму("ОбщиеМетоды"); ФормаВыбора.Открыть(); КонецПроцедуры // Заменяет все символы табуляции в строке после первого печатного символа эквивалентным количеством пробелов. // // Параметры: // Строка - Строка; // // Возвращаемое значение: // Строка. // Функция ЗаменитьТабуляцииВСтроке(Знач Строка, ЛиТекущая = Ложь) Табы = ""; А = 1; НачалоСтроки = Истина; Пока А <= СтрДлина(Строка) Цикл Если Сред(Строка, А, 1) <> Символы.Таб И НачалоСтроки Тогда // Найдем начало строки без табов Табы = Лев(Строка, А-1); Строка = Прав(Строка, СтрДлина(Строка) - А + 1); НачалоСтроки = Ложь; ИначеЕсли Сред(Строка, А, 1) = Символы.Таб И НЕ НачалоСтроки Тогда // Удалим табы из строки Строка = Лев(Строка, А - 1) + Лев(" ", 4 - СтрДлина(Лев(Строка, А - 1)) % 4) + Прав(Строка, СтрДлина(Строка) - А); Если Истина И ЛиТекущая И мКонечнаяКолонка > А Тогда мКонечнаяКолонка = мКонечнаяКолонка + 3 - СтрДлина(Лев(Строка, А - 1)) % 4; КонецЕсли; КонецЕсли; А = А + 1; КонецЦикла; Возврат Табы + Строка; КонецФункции // Заменяет все символы табуляции в каждой строке текста после первого печатного символа эквивалентным // количеством пробелов. // // Параметры: // Нет. // Процедура ЗаменитьТабуляции() Если Ложь Или ПолеТекста.ТолькоПросмотр() Или ФормаВладелец.ТолькоПросмотр Тогда Возврат; КонецЕсли; КоличествоСтрок = ПолеТекста.КоличествоСтрок(); Для А = 1 По КоличествоСтрок Цикл Строка = ЗаменитьТабуляцииВСтроке(ПолеТекста.ПолучитьСтроку(А), (А = мКонечнаяСтрока)); ПолеТекста.ЗаменитьСтроку(А, Строка); КонецЦикла; УстановитьПризнакМодифицированностиФормы(); мНачальнаяКолонка = мКонечнаяКолонка; КонецПроцедуры // ЗаменитьТабуляции() Процедура УстановитьАвтоКонтекстнаяПомощь(НовыйРежим) Кнопка = ирОбщий.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ЭтотОбъект, "АвтоКонтекстнаяПомощь"); Если Кнопка = Неопределено Тогда // Это сделано временно для работы в ссылочном режиме Возврат; КонецЕсли; мАвтоКонтекстнаяПомощь = НовыйРежим; Если мАвтоКонтекстнаяПомощь Тогда ФормаВладелец.ПодключитьОбработчикОжидания("КлсПолеТекстаПрограммыАвтоОбновитьСправку", 1); Иначе ФормаВладелец.ОтключитьОбработчикОжидания("КлсПолеТекстаПрограммыАвтоОбновитьСправку"); КонецЕсли; Кнопка.Пометка = мАвтоКонтекстнаяПомощь; КонецПроцедуры // Удаляет все символы переноса строки из текста. // // Параметры: // Нет. // Процедура УдалитьПереносы() Если Ложь Или ПолеТекста.ТолькоПросмотр() Или ФормаВладелец.ТолькоПросмотр Тогда Возврат; КонецЕсли; Текст = ПолеТекста.ПолучитьТекст(); Текст = СокрЛП(Текст); Если Истина И Лев(Текст, 1) = """" И Лев(Текст, 2) <> """""" Тогда Текст = Сред(Текст, 2); КонецЕсли; Если Истина И Прав(Текст, 1) = """" И Прав(Текст, 2) <> """""" Тогда Текст = Лев(Текст, СтрДлина(Текст) - 1); КонецЕсли; Если Истина И Прав(Текст, 2) = """;" И Прав(Текст, 3) <> """"";" Тогда Текст = Лев(Текст, СтрДлина(Текст) - 2); КонецЕсли; Текст = СтрЗаменить(Текст, "|", ""); Текст = СтрЗаменить(Текст, """""", """"); ПолеТекста.УстановитьТекст(Текст); УстановитьПризнакМодифицированностиФормы(); КонецПроцедуры // УдалитьПереносы() // Добавляет слово локального контекста. // // Параметры: // Слово – Строка; // ТипСлова – Строка - "Метод", "Свойство"; // *ТипЗначения - ОписаниеТипов, *Неопределено; // *Метаданные - Произвольный, *Неопределено - используется, если ТипЗначения задан; // *Глобальное - Булево, *Ложь - это слово глобального контекста; // *ТаблицаСтруктурТипа - ТаблицаЗначений, *Неопределено; // Процедура ДобавитьСловоЛокальногоКонтекста(Слово, ТипСлова = "Свойство", ТипЗначения = Неопределено, пМетаданные = Неопределено, Глобальное = Ложь, Значение = Неопределено, ТаблицаСтруктурТипов = Неопределено, ИмяОбщегоТипа = "") Экспорт КлючСтроки = Новый Структура; КлючСтроки.Вставить("нСлово", Нрег(Слово)); КлючСтроки.Вставить("ТипСлова", ТипСлова); НайденныеСтроки = ТаблицаЛокальногоКонтекста.НайтиСтроки(КлючСтроки); Если НайденныеСтроки.Количество() = 0 Тогда НоваяСтрока = ТаблицаЛокальногоКонтекста.Добавить(); Иначе НоваяСтрока = НайденныеСтроки[0]; КонецЕсли; НоваяСтрока.ТаблицаСтруктурТипов = ТаблицаСтруктурТипов; Если НоваяСтрока.ТаблицаСтруктурТипов = Неопределено Тогда НоваяСтрока.ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); КонецЕсли; Если ЗначениеЗаполнено(ИмяОбщегоТипа) Тогда СтруктураТипа = НоваяСтрока.ТаблицаСтруктурТипов.Добавить(); СтруктураТипа.ИмяОбщегоТипа = ИмяОбщегоТипа; СтруктураТипа.Метаданные = пМетаданные; КонецЕсли; ЗаполнитьЗначенияСвойств(НоваяСтрока, КлючСтроки); //Если ТипЗначения = Неопределено Тогда НоваяСтрока.Значение = Значение; НоваяСтрока.Слово = Слово; НоваяСтрока.Глобальное = Глобальное; Если Значение <> Неопределено Тогда СтруктураТипа = мПлатформа.СтруктураТипаИзЗначения(Значение, ЯзыкПрограммы, Новый Структура("СтрокаОписания, Метаданные", НоваяСтрока, пМетаданные)); // Циклическая ссылка СтрокаОписания ЗаполнитьЗначенияСвойств(НоваяСтрока.ТаблицаСтруктурТипов.Добавить(), СтруктураТипа); КонецЕсли; Если ТипЗначения <> Неопределено Тогда Для Каждого Тип Из ТипЗначения.Типы() Цикл СтруктураТипа = мПлатформа.СтруктураТипаИзКонкретногоТипа(Тип, ЯзыкПрограммы, Новый Структура("СтрокаОписания, Метаданные", НоваяСтрока, пМетаданные)); // Циклическая ссылка СтрокаОписания ЗаполнитьЗначенияСвойств(НоваяСтрока.ТаблицаСтруктурТипов.Добавить(), СтруктураТипа); КонецЦикла; КонецЕсли; Если Значение <> Неопределено Тогда Если ТипЗначения = Неопределено Тогда ТипЗначения = Новый ОписаниеТипов; КонецЕсли; ТипЗначения = Новый ОписаниеТипов(ТипЗначения, ирОбщий.БыстрыйМассивЛкс(ТипЗнч(Значение))); КонецЕсли; НоваяСтрока.ТипЗначения = ТипЗначения; КонецПроцедуры // Добавляет правило вычисления типа значения функции. // При вызове правила вычисляется "Правило(<СтрокаАргументов>)", а оно должно вернуть ТаблицаСтруктурТипов. // // Параметры: // Слово – Строка; // ТипСлова – Строка - "Метод", "Свойство"; // *ТипЗначения - ОписаниеТипов, *Неопределено; // *Метаданные - Произвольный, *Неопределено; // *Глобальное - Булево, *Ложь - это слово глобального контекста. // Процедура ДобавитьПравилоВычисленияФункции(Слово, Правило, ТипКонтекста = "Локальный") Экспорт КлючСтроки = Новый Структура; КлючСтроки.Вставить("НСлово", Нрег(Слово)); КлючСтроки.Вставить("ТипКонтекста", ТипКонтекста); НайденныеСтроки = ПравилаВычисленияФункций.НайтиСтроки(КлючСтроки); Если НайденныеСтроки.Количество() = 0 Тогда НоваяСтрока = ПравилаВычисленияФункций.Добавить(); Иначе НоваяСтрока = НайденныеСтроки[0]; КонецЕсли; ЗаполнитьЗначенияСвойств(НоваяСтрока, КлючСтроки); НоваяСтрока.Правило = Правило; НоваяСтрока.Слово = Слово; КонецПроцедуры // Добавляет переменную локального контекста. // // Параметры: // ИмяПеременной – Строка; // ДопустимыеТипы – Строка, ТаблицаЗначений; // Процедура ДобавитьПеременнуюЛокальногоКонтекста(ИмяПеременной, ДопустимыеТипы) Экспорт КлючСтроки = Новый Структура; КлючСтроки.Вставить("нСлово", НРег(ИмяПеременной)); КлючСтроки.Вставить("ТипСлова", "Свойство"); НайденныеСтроки = ТаблицаЛокальногоКонтекста.НайтиСтроки(КлючСтроки); Если НайденныеСтроки.Количество() = 0 Тогда НоваяСтрока = ТаблицаЛокальногоКонтекста.Добавить(); НоваяСтрока.ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); Иначе НоваяСтрока = НайденныеСтроки[0]; КонецЕсли; ЗаполнитьЗначенияСвойств(НоваяСтрока, КлючСтроки); НоваяСтрока.Слово = ИмяПеременной; Если ТипЗнч(ДопустимыеТипы) = Тип("Строка") Тогда МассивСериализованныхТипов = ирОбщий.СтрРазделитьЛкс(ДопустимыеТипы, ";"); //ТаблицаСтруктурТипов = мПлатформа.НоваяТаблицаСтруктурТипа(); ТаблицаСтруктурТипов = НоваяСтрока.ТаблицаСтруктурТипов; Для Каждого СериализованныйТип Из МассивСериализованныхТипов Цикл СтруктураТипа = мПлатформа.СтруктураТипаИзСтрокиВнутр(СериализованныйТип); СтруктураТипа.Вставить("СтрокаОписания", НоваяСтрока); // Циклическая ссылка СтрокаОписания мПлатформа.ДобавитьВТаблицуСтруктурТипов(ТаблицаСтруктурТипов, СтруктураТипа); КонецЦикла; НоваяСтрока.ТаблицаСтруктурТипов = ТаблицаСтруктурТипов; Иначе НоваяСтрока.ТаблицаСтруктурТипов = ДопустимыеТипы; КонецЕсли; КонецПроцедуры // Очишает таблицу слов локального контекста. // // Параметры: // Нет. // Процедура ОчиститьТаблицуСловЛокальногоКонтекста() Экспорт Для Каждого СтрокаЛокальногоКонтекста Из ТаблицаЛокальногоКонтекста Цикл // Разрываем циклические ссылки в СтрокаОписания СтрокаЛокальногоКонтекста.ТаблицаСтруктурТипов = Неопределено; КонецЦикла; ТаблицаЛокальногоКонтекста.Очистить(); КонецПроцедуры // Удаляет слово локального контекста. // // Параметры: // Слово – Строка; // ТипСлова – Строка. // Процедура УдалитьСловоЛокальногоКонтекста(Слово, ТипСлова) Экспорт КлючСтроки = Новый Структура; КлючСтроки.Вставить("нСлово", НРег(Слово)); КлючСтроки.Вставить("ТипСлова", ТипСлова); СтрокиСлова = ТаблицаЛокальногоКонтекста.НайтиСтроки(КлючСтроки); Если СтрокиСлова.Количество() > 0 Тогда ТаблицаЛокальногоКонтекста.Удалить(СтрокиСлова[0]); КонецЕсли; КонецПроцедуры // Устанавливает доступность действий, изменяющих данные. // // Параметры: // НовыйТолькоПросмотр – Булево. // Процедура УстановитьТолькоПросмотр(НовыйТолькоПросмотр) Экспорт ФормаКласса = ПолучитьФорму("ФормаМакет"); МассивКоллекцийКнопок = Новый Массив; МассивКоллекцийКнопок.Добавить(ФормаКласса.ЭлементыФормы["КоманднаяПанель" + Формат(ЯзыкПрограммы, "ЧН=")].Кнопки); МассивКоллекцийКнопок.Добавить(ФормаКласса.ЭлементыФормы.КоманднаяПанельОбщая.Кнопки); Для Каждого КнопкиМакета Из МассивКоллекцийКнопок Цикл Для Каждого КнопкаМакета Из КнопкиМакета Цикл Если КнопкаМакета.ТипКнопки <> ТипКнопкиКоманднойПанели.Действие Тогда Продолжить; КонецЕсли; КонечноеИмя = ирОбщий.СформироватьИмяЭлементаУправленияЭкземпляраЛкс(ЭтотОбъект, КнопкаМакета.Имя); Кнопка = КоманднаяПанель.Кнопки.Найти(КонечноеИмя); Если Кнопка.ИзменяетДанные Тогда Кнопка.Доступность = Не НовыйТолькоПросмотр; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры // УстановитьТолькоПросмотр() Процедура ОформитьЯчейкуТипаЗначения(ОформлениеСтроки, ДанныеСтроки) Экспорт Если Истина И ОформлениеСтроки.Ячейки.ТипЗначения.Видимость И ЗначениеЗаполнено(ДанныеСтроки.ТипЗначения) И Найти(ДанныеСтроки.ТипЗначения, ",") = 0 Тогда Попытка ОписаниеТипов = Новый ОписаниеТипов(ДанныеСтроки.ТипЗначения); Исключение ОписаниеТипов = Неопределено; КонецПопытки; Если ОписаниеТипов <> Неопределено Тогда Типы = ОписаниеТипов.Типы(); Если Типы.Количество() > 0 Тогда КартинкаТипа = ирОбщий.КартинкаТипаЛкс(Типы[0]); Если КартинкаТипа <> Неопределено Тогда ОформлениеСтроки.Ячейки.ТипЗначения.УстановитьКартинку(КартинкаТипа); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры // Выполняет шаблон текста. // // Параметры: // Нет. // Процедура ВыполнитьШаблонТекста() ВыделитьНачалоИКонецТекущейСтроки(); НадежноУстановитьФокус = Ложь; ПоследняяПозицияКурсора = 0; ТаблицаШаблоновТекста = мПлатформа.ПолучитьТаблицуШаблоновТекста(ИмяКласса); КонечныйТекстЗамены = " "; Если Ложь Или ТаблицаШаблоновТекста = Неопределено Или ТаблицаШаблоновТекста.Количество() = 0 Тогда // Иначе RegExp.Global = Ложь; СтрокаРазделителейШаблоновТекста = ";.,:()[]"; RegExp.Pattern = "([^\s" + ирОбщий.ПреобразоватьТекстДляРегулярныхВыраженийЛкс(СтрокаРазделителейШаблоновТекста) + "]*)$"; Результат = RegExp.НайтиВхождения(ТекущееНачалоСтроки); Если Результат.Количество() > 0 Тогда НачалоКонтекста = Результат[0].SubMatches(0); Если ЗначениеЗаполнено(НачалоКонтекста) Тогда //СтрокаШаблона = ТаблицаШаблоновТекста.Найти(НРег(НачалоКонтекста), "ШаблонБезКвадратныхСкобок"); СтрокаШаблона = Неопределено; Для каждого ТекСтрокаШаблона Из ТаблицаШаблоновТекста Цикл Если ТекСтрокаШаблона.Шаблон = НРег(НачалоКонтекста) Тогда СтрокаШаблона = ТекСтрокаШаблона; Прервать; КонецЕсли; МинимальнаяДлинаСовпадения = Найти(ТекСтрокаШаблона.Шаблон, "["); Если МинимальнаяДлинаСовпадения > 0 Тогда Если СтрДлина(НачалоКонтекста) < МинимальнаяДлинаСовпадения - 1 Тогда Продолжить; КонецЕсли; ШаблонБезСкобок = СтрЗаменить(ТекСтрокаШаблона.Шаблон, "[", ""); ШаблонБезСкобок = СтрЗаменить(ШаблонБезСкобок, "]", ""); Если Найти(ШаблонБезСкобок, НРег(НачалоКонтекста)) = 1 Тогда СтрокаШаблона = ТекСтрокаШаблона; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если СтрокаШаблона = Неопределено Тогда НачалоКонтекста = ""; Иначе RegExp.Global = Истина; RegExp.MultiLine = Истина; RegExp.Pattern = "(<\?\s*(""[^""\^]*"")?(?:.|\r|\n)*?>)|(.|\r|\n)"; Результат = RegExp.НайтиВхождения(СтрокаШаблона.Замена); КонечныйТекстЗамены = ""; КешПараметров = Новый ТаблицаЗначений; КешПараметров.Колонки.Добавить("ИмяПараметра"); КешПараметров.Колонки.Добавить("ЗначениеПараметра"); Для Каждого Match Из Результат Цикл УправляющаяКонструкция = Match.SubMatches(0); Если ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(УправляющаяКонструкция) Тогда КонечныйТекстЗамены = КонечныйТекстЗамены + Match.SubMatches(2); Иначе ИмяПараметраШаблона = Match.SubMatches(1); Если Не ирОбщий.ЛиПустаяПодгруппаRegExpЛкс(ИмяПараметраШаблона) Тогда ИмяПараметраШаблона = Сред(ИмяПараметраШаблона, 2, СтрДлина(ИмяПараметраШаблона) - 2); ВведеннаяСтрока = ""; Если ИмяПараметраШаблона <> "" Тогда СтрокаКэша = КешПараметров.Найти(ИмяПараметраШаблона, "ИмяПараметра"); Если СтрокаКэша <> Неопределено Тогда ВведеннаяСтрока = СтрокаКэша.ЗначениеПараметра; Иначе СтрокаКэша = КешПараметров.Добавить(); СтрокаКэша.ИмяПараметра = ИмяПараметраШаблона; НадежноУстановитьФокус = Истина; ВвестиЗначение(ВведеннаяСтрока, ИмяПараметраШаблона, Тип("Строка")); СтрокаКэша.ЗначениеПараметра = ВведеннаяСтрока; КонецЕсли; КонецЕсли; КонечныйТекстЗамены = КонечныйТекстЗамены + ВведеннаяСтрока; Иначе ПоследняяПозицияКурсора = СтрДлина(КонечныйТекстЗамены) + 1; КонецЕсли; КонецЕсли; КонецЦикла; ЗаменаТабуляции = ирОбщий.СтрокаПовторомЛкс(" ", ШиринаТабуляции); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Если КонечныйТекстЗамены <> Неопределено Тогда КонечныйТекстЗаменыТД = Новый ТекстовыйДокумент; КонечныйТекстЗаменыТД.УстановитьТекст(КонечныйТекстЗамены); лКонечнаяСтрока = 0; лКонечнаяКолонка = 0; Если ПоследняяПозицияКурсора > 0 Тогда СлужебноеПолеТекста.УстановитьТекст(КонечныйТекстЗамены); Если ПоследняяПозицияКурсора <= СтрДлина(КонечныйТекстЗамены) Тогда СлужебноеПолеТекста.УстановитьГраницыВыделения(ПоследняяПозицияКурсора, ПоследняяПозицияКурсора); СлужебноеПолеТекста.ПолучитьГраницыВыделения(лКонечнаяСтрока, лКонечнаяКолонка, лКонечнаяСтрока, лКонечнаяКолонка); Иначе лКонечнаяСтрока = КонечныйТекстЗаменыТД.КоличествоСтрок(); лКонечнаяКолонка = СтрДлина(КонечныйТекстЗаменыТД.ПолучитьСтроку(КонечныйТекстЗаменыТД.КоличествоСтрок())) + 1; КонецЕсли; КонецЕсли; ЧислоСтрокЗамены = КонечныйТекстЗаменыТД.КоличествоСтрок(); СтрокаДобавка = КонечныйТекстЗаменыТД.ПолучитьСтроку(1); ДлинаНачалаСтроки = мКонечнаяКолонка - СтрДлина(НачалоКонтекста) - 1; НачалоСтроки = Лев(ТекущееНачалоСтроки, ДлинаНачалаСтроки); ТекущееНачалоСтроки = НачалоСтроки + СтрокаДобавка; ТекущаяСтрока = ТекущееНачалоСтроки; Если ЧислоСтрокЗамены = 1 Тогда ТекущаяСтрока = ТекущаяСтрока + ТекущийКонецСтроки; КонецЕсли; ПолеТекста.ЗаменитьСтроку(мКонечнаяСтрока, "" + ТекущаяСтрока); ДлинаРазвернутогоНачалаСтроки = СтрДлина(СтрЗаменить(НачалоСтроки, Символы.Таб, ЗаменаТабуляции)); ЧислоТабуляций = ДлинаРазвернутогоНачалаСтроки / ШиринаТабуляции; ЧислоПробелов = ДлинаРазвернутогоНачалаСтроки % ШиринаТабуляции; НачалоНовойСтроки = ирОбщий.СтрокаПовторомЛкс(Символы.Таб, ЧислоТабуляций); НачалоНовойСтроки = НачалоНовойСтроки + ирОбщий.СтрокаПовторомЛкс(" ", ЧислоПробелов); Для Счетчик = 2 По ЧислоСтрокЗамены - 1 Цикл ТекущаяСтрокаВставки = КонечныйТекстЗаменыТД.ПолучитьСтроку(Счетчик); ПолеТекста.ВставитьСтроку(мКонечнаяСтрока + Счетчик - 1, НачалоНовойСтроки + ТекущаяСтрокаВставки); КонецЦикла; Если ЧислоСтрокЗамены > 1 Тогда ТекущаяСтрокаВставки = КонечныйТекстЗаменыТД.ПолучитьСтроку(ЧислоСтрокЗамены); ПолеТекста.ВставитьСтроку(мКонечнаяСтрока + ЧислоСтрокЗамены - 1, НачалоНовойСтроки + ТекущаяСтрокаВставки + ТекущийКонецСтроки); КонецЕсли; Если лКонечнаяСтрока > 0 Тогда Если лКонечнаяСтрока = 1 Тогда лКонечнаяКолонка = лКонечнаяКолонка + СтрДлина(НачалоСтроки); Иначе лКонечнаяКолонка = лКонечнаяКолонка + СтрДлина(НачалоНовойСтроки); КонецЕсли; лКонечнаяСтрока = лКонечнаяСтрока + мКонечнаяСтрока - 1; мКонечнаяКолонка = лКонечнаяКолонка; мКонечнаяСтрока = лКонечнаяСтрока; Иначе Если ЧислоСтрокЗамены > 0 Тогда мКонечнаяСтрока = мКонечнаяСтрока + ЧислоСтрокЗамены - 1; КонецЕсли; Если ЧислоСтрокЗамены > 1 Тогда мКонечнаяКолонка = СтрДлина(НачалоСтроки + ТекущаяСтрокаВставки) + 1; Иначе мКонечнаяКолонка = мКонечнаяКолонка + СтрДлина(КонечныйТекстЗамены) - СтрДлина(НачалоКонтекста); КонецЕсли; КонецЕсли; мНачальнаяСтрока = мКонечнаяСтрока; мНачальнаяКолонка = мКонечнаяКолонка; КонецЕсли; УстановитьФокус(); КонецПроцедуры Процедура ОкружитьВыделенныеСтроки(Знач НачалоОкружения, Знач КонецОкружения) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли НомерНачальнойСтроки = ПолучитьНомерТекущейСтроки(Истина); ВыделенныйТекст = ПолеТекста.ВыделенныйТекст(); СмещениеПервойСтроки = Лев(ВыделенныйТекст, СтрДлина(ВыделенныйТекст) - СтрДлина(СокрЛ(ВыделенныйТекст))); ирОбщий.ПолеТекстаУстановитьВставитьТекстИПереносСтрокиЛкс(ПолеТекста, "" + СмещениеПервойСтроки + НачалоОкружения + " |" + Символы.Таб + ирОбщий.ДобавитьМногострочнуюСтрокуВТекстЛкс("", ВыделенныйТекст, Символы.Таб) + " |" + СмещениеПервойСтроки + КонецОкружения); НомерНачальнойКолонки = СтрДлина(СмещениеПервойСтроки) + 1; ПолеТекста.УстановитьГраницыВыделения(НомерНачальнойСтроки, НомерНачальнойКолонки, НомерНачальнойСтроки, НомерНачальнойКолонки,, ФормаВладелец); КонецПроцедуры /////////////////// // Редактор HTML Процедура РедакторHTML_Инициировать(ПолеHTML) Экспорт #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ФормаКласса = мПлатформа.ПолучитьМакетКомпоненты(ЭтотОбъект); КнопкиМакета = ФормаКласса.ЭлементыФормы.КПРедакторHTML.Кнопки.КонтекстноеМеню.Кнопки; КонтекстноеМеню = ПолеHTML.КонтекстноеМеню; Если КонтекстноеМеню = Неопределено Тогда КонтекстноеМеню = ФормаВладелец.ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КонтекстноеМеню" + ПолеHTML.Имя, Ложь); КонтекстноеМеню.ИсточникДействий = ПолеHTML; ПолеHTML.КонтекстноеМеню = КонтекстноеМеню; КонецЕсли; ирОбщий.ДобавитьКнопкиКоманднойПанелиКомпонентыЛкс(ЭтотОбъект, КнопкиМакета, КонтекстноеМеню); ПолеТекстаHTML = ирОбщий.ОболочкаПоляТекстаЛкс(ПолеHTML); #Если Сервер И Не Сервер Тогда ПолеТекстаHTML = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ПолеТекстаHTML.Инициировать(); РедакторHTML = ПолеHTML.Документ.defaultView; Инфо = Новый СистемнаяИнформация(); РедакторHTML.setOption("disableContextQueryConstructor", Истина); РедакторHTML.setOption("disableNativeSuggestions", Истина); // События не перестают вызываться РедакторHTML.setOption("disableNativeSignatures", Истина); // События не перестают вызываться РедакторHTML.setOption("disableNativeHovers", Истина); // События не перестают вызываться РедакторHTML.setOption("skipInsertSuggestionAcceptor", Истина); // Отключаем вставку точки при выборе слова из списка https://github.com/salexdv/bsl_console/issues/120#issuecomment-844372676 РедакторHTML.setOption("skipAcceptionSelectedSuggestion", Истина); // Отключаем стандартную обработку вставки активного пункта подсказки. Практически 'СтандартнаяОбработка = Ложь' РедакторHTML.setOption("renderQueryDelimiters", Истина); // Разделители запросов пакета https://github.com/salexdv/bsl_console/issues/218 РедакторHTML.minimap(Ложь); РедакторHTML.init(Инфо.ВерсияПриложения); Если ЯзыкПрограммы = 1 Тогда РедакторHTML.switchQueryMode(); ИначеЕсли ЯзыкПрограммы = 2 Тогда РедакторHTML.switchDCSMode(); КонецЕсли; РедакторHTML.enableBeforeSignatureEvent(Истина); РедакторHTML.enableBeforeShowSuggestEvent(Истина); РедакторHTML.enableSelectSuggestEvent(Истина); РедакторHTML.enableModificationEvent(Истина); РедакторHTML.enableBeforeHoverEvent(Истина); РедакторHTML.disableKeyBinding(2082); // CTRL(2048)+D(34) - CTRL+D РедакторHTML.setActiveSuggestionAcceptors("."); // По нажатию точки выполняется вставка активного слова и ввод точки // Много нежелательных срабатываний КонецПроцедуры Функция ДобавитьПодсказкуПоЗначениюВыражения(Знач ЗначениеВыражения = Неопределено, Знач ОбъектноеВыражение, Знач ПодсказкаМассив, СтруктураТипа = Неопределено) Экспорт #Если Сервер И Не Сервер Тогда ПодсказкаМассив = Новый Массив; #КонецЕсли ЕстьОписаниеТипа = Ложь; Если СтруктураТипа = Неопределено Тогда СтруктураТипа = мПлатформа.СтруктураТипаИзЗначения(ЗначениеВыражения); КонецЕсли; ИмяТипаЗначения = мПлатформа.ИмяТипаИзСтруктурыТипа(СтруктураТипа); ИмяОбщегоТипа = СтруктураТипа.ИмяОбщегоТипа; СтрокаОбщегоТипа = мПлатформа.ТаблицаОбщихТипов.Найти(НРег(ИмяОбщегоТипа), "НСлово"); Если СтрокаОбщегоТипа <> Неопределено Тогда ЕстьОписаниеТипа = ЗначениеЗаполнено(СтрокаОбщегоТипа.ПутьКОписанию); КонецЕсли; Если ИмяТипаЗначения = "Строка" Тогда ПодсказкаЗначения = "Знач: """ + ЗначениеВыражения + """"; Иначе Если ТипЗнч(ЗначениеВыражения) = Тип("Строка") Тогда ПодсказкаЗначения = ЗначениеВыражения; Иначе ПодсказкаЗначения = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(ЗначениеВыражения,, Ложь, Истина); КонецЕсли; Если Ложь Или ТипЗнч(ЗначениеВыражения) = Тип("Неопределено") Или ТипЗнч(ЗначениеВыражения) = Тип("Null") Тогда ПодсказкаЗначения = "Знач: " + ПодсказкаЗначения; Иначе ПодсказкаЗначения = "[Знач](" + ОбъектноеВыражение + "): " + ПодсказкаЗначения; КонецЕсли; Если ПодсказкаЗначения = ИмяТипаЗначения Тогда ПодсказкаЗначения = ""; Иначе ПодсказкаЗначения = ПодсказкаЗначения + " "; КонецЕсли; Если ЕстьОписаниеТипа Тогда ИмяСсылкиТипа = "_Тип" + XMLСтрока(мСтруктурыТиповПодсказкиУдержания.Количество()); ПодсказкаЗначения = ПодсказкаЗначения + "[[" + ИмяТипаЗначения + "]](" + ИмяСсылкиТипа + ")"; мСтруктурыТиповПодсказкиУдержания.Вставить(ИмяСсылкиТипа, СтруктураТипа); Иначе ПодсказкаЗначения = ПодсказкаЗначения + "[" + ИмяТипаЗначения + "]"; КонецЕсли; КонецЕсли; ПодсказкаМассив.Добавить(ПодсказкаЗначения); Возврат ИмяТипаЗначения; КонецФункции Функция ДобавитьПодсказкуПоДопустимымТипам(Знач ИмяТипаЗначения, Знач ПодсказкаМассив, Знач ОбъектноеВыражение) Экспорт ТаблицаСтруктурТипов = ТаблицаСтруктурТиповТекущегоВыражения(Истина, Истина, Ложь); Если Истина И ЯзыкПрограммы = 1 И ТаблицаСтруктурТипов[0].ИмяОбщегоТипа = "ВременнаяТаблица" Тогда ВременныйЗапрос = Новый Запрос; ВременныйЗапрос.МенеджерВременныхТаблиц = КонтекстВыполнения.МенеджерВременныхТаблиц; ИмяВременнойТаблицы = ТаблицаСтруктурТипов[0].ВиртуальнаяТаблица.Выражение; ВременныйЗапрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ " + ИмяВременнойТаблицы; КоличествоСтрокВТаблице = ВременныйЗапрос.Выполнить().Выгрузить()[0][0]; ДобавитьПодсказкуПоЗначениюВыражения(ИмяВременнойТаблицы + "(" + КоличествоСтрокВТаблице + ")", ОбъектноеВыражение, ПодсказкаМассив, ТаблицаСтруктурТипов[0]); КонецЕсли; ПредставлениеДопустимыхТипов = мПлатформа.ПредставлениеМассиваСтруктурТипов(ТаблицаСтруктурТипов, Истина); Если Истина И ПредставлениеДопустимыхТипов <> "?" И ПредставлениеДопустимыхТипов <> "ОбщийМодуль" И ПредставлениеДопустимыхТипов <> "ВременнаяТаблица" И ЗначениеЗаполнено(ПредставлениеДопустимыхТипов) И ПредставлениеДопустимыхТипов <> ИмяТипаЗначения Тогда ИмяСсылкиТипа = "_Тип" + XMLСтрока(мСтруктурыТиповПодсказкиУдержания.Количество()); мСтруктурыТиповПодсказкиУдержания.Вставить(ИмяСсылкиТипа, ТаблицаСтруктурТипов); ПредставлениеДопустимыхТипов = "[Допустимые типы](" + ИмяСсылкиТипа + "): " + ПредставлениеДопустимыхТипов; ПодсказкаМассив.Добавить(ПредставлениеДопустимыхТипов); КонецЕсли; Если ПредставлениеДопустимыхТипов <> "ОбщийМодуль" Тогда ПодсказкаМассив.Добавить("[Определение](" + XMLСтрока(мКонечнаяСтрока) + "," + XMLСтрока(мКонечнаяКолонка) + ")"); КонецЕсли; Возврат ПредставлениеДопустимыхТипов; КонецФункции Процедура ОткрытьОписаниеТипаПоГиперссылке(Знач ИмяОбщегоТипа) Экспорт Если Истина И ирОбщий.СтрНачинаетсяСЛкс(ИмяОбщегоТипа, "_Тип") И мСтруктурыТиповПодсказкиУдержания.Свойство(ИмяОбщегоТипа) Тогда СтруктураТипа = мСтруктурыТиповПодсказкиУдержания[ИмяОбщегоТипа]; Если ТипЗнч(СтруктураТипа) = Тип("ТаблицаЗначений") Тогда ТаблицаДляПользователя = мПлатформа.ТаблицаСтруктурТиповДляПользователя(СтруктураТипа, Ложь); СписокВыбора = Новый СписокЗначений; Для Каждого СтрокаТаблицы Из ТаблицаДляПользователя Цикл Если ирОбщий.СтрокиРавныЛкс(СтрокаТаблицы.Имя, "null") Тогда Продолжить; КонецЕсли; СписокВыбора.Добавить(СтрокаТаблицы.СтруктураТипа, СтрокаТаблицы.Имя); КонецЦикла; СписокВыбора = ирОбщий.СвернутьСписокЗначенийПоПредставлениюЛкс(СписокВыбора); Если СписокВыбора.Количество() = 1 Тогда СтруктураТипа = СписокВыбора[0]; Иначе СтруктураТипа = СписокВыбора.ВыбратьЭлемент("Выберите тип значения"); Если СтруктураТипа = Неопределено Тогда Возврат; КонецЕсли; КонецЕсли; СтруктураТипа = СтруктураТипа.Значение; КонецЕсли; ОткрытьОпределениеСтруктурыТипа(СтруктураТипа); Иначе ирОбщий.ОткрытьОписаниеТипаПоИмениТипаЛкс(ИмяОбщегоТипа); КонецЕсли; КонецПроцедуры // антибаг редактора https://github.com/salexdv/bsl_console/issues/78#issuecomment-836447865 Функция ЧистоеСловоСпискаПодсказкиHTML(ВыбранноеСлово) Экспорт Возврат ирОбщий.СтрокаМеждуМаркерамиЛкс(ВыбранноеСлово, "Элемент ", ",", Истина); КонецФункции Процедура РедакторHTML_ПередПоказомПодсказкиУдержания(Знач Событие, Знач ФункцияВычислитьВыражение) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли НомерКолонки23 = Событие.params.column; НомерСтроки23 = Событие.params.line; ТекущееСлово = Событие.params.word; мСтруктурыТиповПодсказкиУдержания = Новый Структура; Если ТекущееСлово = Неопределено Тогда Возврат; КонецЕсли; КончитьОбработкуКоманды(); ОбъектноеВыражение = ТекущееОбъектноеВыражение(НомерСтроки23, НомерКолонки23,, Ложь); ПодсказкаМассив = Новый Массив; Если Истина И (Ложь Или Найти(ОбъектноеВыражение, "(") = 0 Или ирОбщий.СтрКончаетсяНаЛкс(ОбъектноеВыражение, "(") Или ирОбщий.СтрНачинаетсяСЛкс(ОбъектноеВыражение, "(")) И (Ложь Или ирОбщий.ЛиИмяПеременнойЛкс(Лев(ОбъектноеВыражение, 1)) Или Лев(ОбъектноеВыражение, 1) = мПараметрыДиалектаSQL.ПрефиксПараметра Или Лев(ОбъектноеВыражение, 1) = "(") Тогда ИмяТипаЗначения = ""; Если Ложь Или (ЯзыкПрограммы > 0 И Лев(ОбъектноеВыражение, 1) = мПараметрыДиалектаSQL.ПрефиксПараметра) Или (ЯзыкПрограммы = 0 И Не ирОбщий.СтрКончаетсяНаЛкс(ОбъектноеВыражение, "(")) Тогда УспехЗначения = Истина; ЗначениеВыражения = Вычислить("ФормаВладелец." + ФункцияВычислитьВыражение + "(ОбъектноеВыражение, УспехЗначения)"); Если УспехЗначения Тогда ИмяТипаЗначения = ДобавитьПодсказкуПоЗначениюВыражения(ЗначениеВыражения, ОбъектноеВыражение, ПодсказкаМассив); КонецЕсли; КонецЕсли; ПредставлениеДопустимыхТипов = ДобавитьПодсказкуПоДопустимымТипам(ИмяТипаЗначения, ПодсказкаМассив, ОбъектноеВыражение); КонецЕсли; КончитьОбработкуКоманды(); СтруктураПодсказки = Новый Соответствие; СтруктураПодсказки.Вставить(ТекущееСлово.word, ПодсказкаМассив); РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.setCustomHovers(ирОбщий.ОбъектВСтрокуJSONЛкс(СтруктураПодсказки)); КонецПроцедуры Процедура РедакторHTML_ПередПоказомСигнатуры(НомерПараметра, ИмяМетодаОтРедактора, НомерСигнатуры, Триггер) Экспорт Если enableBeforeShowSuggestEvent = Ложь Или НомерСигнатуры > 0 Тогда // https://github.com/salexdv/bsl_console/issues/182 enableBeforeShowSuggestEvent = Истина; Возврат; КонецЕсли; #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); //РедакторHTML.hideSignatureList(); Если Не ЛиДоступноОткрытиеСвободнойФормы() Тогда КончитьОбработкуКоманды(); СтруктураПодсказки = СтруктураПодсказкиМетода(, Триггер <> Неопределено); Если СтруктураПодсказки.Количество() = 0 Тогда Возврат; КонецЕсли; ВариантыСинтаксиса = Новый Соответствие; ВариантыСинтаксиса.Вставить(ирОбщий.ПоследнийФрагментЛкс(ИмяМетодаОтРедактора, " "), СтруктураПодсказки); РедакторHTML.setCustomSignatures(ирОбщий.ОбъектВСтрокуJSONЛкс(ВариантыСинтаксиса)); РедакторHTML.enableBeforeShowSuggestEvent(Ложь); enableBeforeShowSuggestEvent = Ложь; РедакторHTML.triggerSigHelp(); РедакторHTML.enableBeforeShowSuggestEvent(Истина); //ИмяМетодаОтРедактора = ФормаВызовМетода.ИмяМетода; //НомерПараметра = мНомерПараметра - 1; КонецЕсли; КонецПроцедуры Функция СтруктураПодсказкиМетода(Знач ПараметрСтруктураТипаКонтекста = Неопределено, Знач ТолькоПолезноеОписание = Истина, Знач ДляСпискаАвтодополнения = Ложь) СтруктураПодсказки = Новый Массив; ФормаВызовМетода = ФормаВызовМетода(); ФормаВызовМетода.ПараметрСтруктураТипаКонтекста = ПараметрСтруктураТипаКонтекста; ФормаВызовМетода.ОбновитьИлиЗакрытьФорму(, Истина); Если Не ФормаВызовМетода.ЕстьПолезнаяИнформация И ТолькоПолезноеОписание Тогда Возврат СтруктураПодсказки; КонецЕсли; Для ИндексВарианта = 0 По ФормаВызовМетода.ВариантыСинтаксиса.Количество() - 1 Цикл Если Истина И ФормаВызовМетода.ВариантыСинтаксиса.Количество() > 1 Тогда ФормаВызовМетода.УстановитьВариантСинтаксисаПоИндексу(ИндексВарианта); КонецЕсли; ПодсказкаСлова = Новый Структура(); ПараметрыМетода = Новый Массив; КраткиеОписанияПараметров = Новый Массив; Для Каждого СтрокаПараметра Из ФормаВызовМетода.ТаблицаПараметров Цикл ЛиНеОбязательный = ФормаВызовМетода.ЛиНеОбязательныйПараметр(СтрокаПараметра); СтруктураПараметра = Новый Структура(); КраткоеПредставлениеПараметра = "" //+ ?(СтрокаПараметра.Знач = "Знач", "`", СтрокаПараметра.Знач) + СтрокаПараметра.Имя + ?(ЛиНеОбязательный, "?", ""); // Мало пользы, лишние неудобства при поиске нужного параметра. Поэтому пока отключено //Если ЗначениеЗаполнено(СтрЗаменить(СтрокаПараметра.ТипЗначения, "?", "")) Тогда // КраткоеПредставлениеПараметра = КраткоеПредставлениеПараметра + " [" + ирОбщий.ПредставлениеЗначенияСОграничениемДлиныЛкс(СокрЛП(СтрокаПараметра.ТипЗначения), 20) + "]"; //КонецЕсли; КраткиеОписанияПараметров.Добавить(КраткоеПредставлениеПараметра); СтруктураПараметра.Вставить("label", КраткоеПредставлениеПараметра); ОписаниеПараметра = "Обяз.: " + ?(Не ЛиНеОбязательный, "Да", "Нет, " + СтрокаПараметра.Значение) + "; Возвр.: " + ?(Не ЗначениеЗаполнено(СтрокаПараметра.Знач), "?", ?(СтрокаПараметра.Знач = "Знач", "Нет", "Да")) + " |Тип: " + ирОбщий.ПредставлениеЗначенияСОграничениемДлиныЛкс(СокрЛП(СтрокаПараметра.ТипЗначения), 200) + "."; Если ЗначениеЗаполнено(СтрокаПараметра.Описание) Тогда ОписаниеПараметра = ОписаниеПараметра + " |> " + СтрокаПараметра.Описание; КонецЕсли; СтруктураПараметра.Вставить("documentation", ОписаниеПараметра); ПараметрыМетода.Добавить(СтруктураПараметра); КонецЦикла; ПредставлениеМетода = ""; Если Не ДляСпискаАвтодополнения Тогда ПредставлениеМетода = ПредставлениеМетода + ирОбщий.ПредставлениеЗначенияСОграничениемДлиныЛкс(ФормаВызовМетода.ИмяМетода, 13); КонецЕсли; ПредставлениеМетода = ПредставлениеМетода + "(" + ирОбщий.СтрСоединитьЛкс(КраткиеОписанияПараметров, ", ") + ")"; Если ЗначениеЗаполнено(ФормаВызовМетода.ТипЗначенияМетода) Тогда Если Не ДляСпискаАвтодополнения Тогда ПредставлениеМетода = ПредставлениеМетода + " [" + ирОбщий.ПредставлениеЗначенияСОграничениемДлиныЛкс(СокрЛП(ФормаВызовМетода.ТипЗначенияМетода), 15) + "]"; КонецЕсли; КонецЕсли; ПодсказкаСлова.Вставить("label", ПредставлениеМетода); ПодсказкаСлова.Вставить("parameters", ПараметрыМетода); ОписаниеМетода = ""; Если ЗначениеЗаполнено(ФормаВызовМетода.ТекущийВариант) Тогда ОписаниеМетода = ОписаниеМетода + "Вариант: " + ФормаВызовМетода.ТекущийВариант + "." + Символы.ПС; КонецЕсли; ОписаниеМетода = ОписаниеМетода + ФормаВызовМетода.ОписаниеМетода; ПодсказкаСлова.Вставить("documentation", ОписаниеМетода); СтруктураПодсказки.Добавить(ПодсказкаСлова); КонецЦикла; Возврат СтруктураПодсказки; КонецФункции Процедура РедакторHTML_ПередПоказомАвтодополнения(Триггер, ПоследнееВыражение, ПоследнееСлово) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); //РедакторHTML.hideSuggestionsList(); Последние2Символа = Прав(ПоследнееВыражение, 2); ПрефиксПараметра = мПараметрыДиалектаSQL.ПрефиксПараметра; //Сообщить(Триггер); Если Ложь Или Триггер = "space" Или (Истина И АвтоматическаяПодсказкаАвтодополненияHTML() И (Ложь Или Триггер = Неопределено // ввод буквы или после выбора слова списка вводом "." Или Триггер = "." И Последние2Символа <> ".." Или ЯзыкПрограммы <> 0 И Триггер = ПрефиксПараметра И Последние2Символа <> (ПрефиксПараметра + ПрефиксПараметра) Или ЯзыкПрограммы = 0 И Триггер = """" И Последние2Символа <> """""" Или ирОбщий.ЛиИмяПеременнойЛкс(Триггер) // Иначе слишком часто вызывается затратное обновление списка слов локального контекста Или ЯзыкПрограммы = 0 И ирОбщий.СтрокиРавныЛкс(ПоследнееСлово, "новый") Или ЯзыкПрограммы = 0 И ирОбщий.СтрокиРавныЛкс(ПоследнееСлово, "new"))) Тогда Если Триггер = "backspace" Тогда РедакторHTML.enableBeforeShowSuggestEvent(Ложь); РедакторHTML.showPreviousCustomSuggestions(); РедакторHTML.enableBeforeShowSuggestEvent(Истина); Иначе ФормаВызовМетода = ФормаВызовМетода(); Если ФормаВызовМетода.Открыта() Тогда ФормаВызовМетода.Закрыть(); КонецЕсли; КончитьОбработкуКоманды(); РазобратьТекущийКонтекст(); Если ЯзыкПрограммы = 0 И Триггер = """" Тогда ПоказатьСписок = мЭтоСтроковыйЛитерал; ИначеЕсли Истина И Триггер <> "space" И ЯзыкПрограммы = 1 И мЭтоОбъявлениеПсевдонима Тогда ПоказатьСписок = Ложь; Иначе ПоказатьСписок = Не (мКонтекст = "" И Триггер = "."); КонецЕсли; Если ПоказатьСписок Тогда РедакторHTML.enableSuggestActivationEvent(Истина, Истина); // Второй параметр включает отображение типов для всех слов списка автодополнения https://github.com/salexdv/bsl_console/issues/119 УспехЗаполнения = ЗаполнитьТаблицуСлов(, мКонкретныйТипКонтекста, мСтруктураТипаКонтекста, Триггер = "space"); Если Истина И УспехЗаполнения И (Ложь Или Триггер = "space" Или ТаблицаСлов.Количество() > 0) Тогда СтруктураПодсказки = Новый Массив; КодыТиповСлов = Новый Структура; СоответствиеТипаСлова(); Для Каждого СтрокаСоответствия Из мСоответствиеТиповСловHTML Цикл Если Не ЗначениеЗаполнено(СтрокаСоответствия.Имя) Тогда Продолжить; КонецЕсли; КодыТиповСлов.Вставить(СтрокаСоответствия.Имя, СоответствиеТипаСлова(СтрокаСоответствия.Имя).Код); КонецЦикла; Для Каждого СтрокаСлова Из ТаблицаСлов Цикл ПодсказкаСлова = Новый Структура(); ПодсказкаСлова.Вставить("name", СтрокаСлова.Слово); //ТекстВставки = СтрокаСлова.Слово; //ПодсказкаСлова.Вставить("text", ТекстВставки); // Закомментировал, т.к. пользы от этого нет, а вред есть https://github.com/salexdv/bsl_console/issues/171 ПодсказкаСлова.Вставить("kind", КодыТиповСлов[СтрокаСлова.ТипСлова]); ПодсказкаСлова.Вставить("detail", СтрокаСлова.ТипЗначения); ПодсказкаСлова.Вставить("documentation", "_"); // Нужно чтобы окно детального описания открывалось СтруктураПодсказки.Добавить(ПодсказкаСлова); КонецЦикла; СтрокаСпискаАвтодополненияHTML = ирОбщий.ОбъектВСтрокуJSONЛкс(СтруктураПодсказки); Иначе СтрокаСпискаАвтодополненияHTML = Неопределено; КонецЕсли; Если СтрокаСпискаАвтодополненияHTML <> Неопределено Тогда РедакторHTML.enableBeforeShowSuggestEvent(Ложь); РедакторHTML.showCustomSuggestions(СтрокаСпискаАвтодополненияHTML); РедакторHTML.enableBeforeShowSuggestEvent(Истина); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры Функция СоответствиеТипаСлова(Знач ВстроенныйТипСлова = "", Знач ИмяКлюча = "Имя") Если мСоответствиеТиповСловHTML = Неопределено Тогда мСоответствиеТиповСловHTML = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("ТипыСловHTML")); #Если Сервер И Не Сервер Тогда мСоответствиеТиповСловHTML = Новый ТаблицаЗначений; #КонецЕсли мСоответствиеТиповСловHTML.Колонки.Добавить("НКод"); мСоответствиеТиповСловHTML.Индексы.Добавить("Имя"); мСоответствиеТиповСловHTML.Индексы.Добавить("НКод"); Для Каждого СтрокаТЗ Из мСоответствиеТиповСловHTML Цикл СтрокаТЗ.НКод = НРег(СтрокаТЗ.Код); КонецЦикла; КонецЕсли; НайденнаяСтрока = мСоответствиеТиповСловHTML.Найти(ВстроенныйТипСлова, ИмяКлюча); //Если НайденнаяСтрока = Неопределено Тогда // НайденнаяСтрока = мСоответствиеТиповСловHTML[0]; //КонецЕсли; Возврат НайденнаяСтрока; КонецФункции Процедура РедакторHTML_ПриВыбореСтрокиАвтодополнения(Триггер, ПоследнееВыражение, ВыбранноеСлово, ТипСловаHTML) Экспорт Если ирОбщий.СтрНачинаетсяСЛкс(Триггер, "force-") Тогда ПараметрЗакрытия = Прав(Триггер, 1); Если Найти(ПоследнееВыражение, ".") > 0 Тогда ВыделенныйТекст(ПараметрЗакрытия); Возврат; КонецЕсли; Иначе ПараметрЗакрытия = Истина; КонецЕсли; #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.hideSuggestionsList(); КончитьОбработкуКоманды(); РазобратьТекущийКонтекст(); ОтборСлов = Новый Структура("Слово", ЧистоеСловоСпискаПодсказкиHTML(ВыбранноеСлово)); ТипСлова = СоответствиеТипаСлова(ирОбщий.ПоследнийФрагментЛкс(ТипСловаHTML, "-"), "НКод").Имя; Если ЗначениеЗаполнено(ТипСлова) Тогда ОтборСлов.Вставить("ТипСлова", ТипСлова); КонецЕсли; НайденныеСтроки = ТаблицаСлов.НайтиСтроки(ОтборСлов); Если НайденныеСтроки.Количество() = 0 Тогда Возврат; КонецЕсли; СтрокаТаблицыСлов = НайденныеСтроки[0]; ВставитьВыбранноеСловоАвтодополнения(СтрокаТаблицыСлов, мКонкретныйТипКонтекста, мСтруктураТипаКонтекста,, ПараметрЗакрытия); Если ПараметрЗакрытия = "." Тогда РедакторHTML.triggerSuggestions(); КонецЕсли; Если мОткрытьСправкуПоПараметру = Истина Тогда Если ЛиДоступноОткрытиеСвободнойФормы() Тогда ОткрытьСправкуПоПараметру(, Ложь); Иначе РедакторHTML.triggerSigHelp(); КонецЕсли; КонецЕсли; КонецПроцедуры Функция ЛиДоступноОткрытиеСвободнойФормы() Возврат Не (ирКэш.ЛиСеансТолстогоКлиентаУПЛкс() Или ФормаВладелец.МодальныйРежим); КонецФункции Процедура РедакторHTML_ОбработатьСобытие(Событие) Экспорт //Сообщить("Отладка. " + Событие.event); Если Событие.event = "EVENT_BEFORE_SIGNATURE" Тогда РедакторHTML_ПередПоказомСигнатуры(Событие.params.activeParameter, Событие.params.word, Событие.params.activeSignature, Событие.params.triggerCharacter); ИначеЕсли Событие.event = "EVENT_ON_SELECT_SUGGEST_ROW" Тогда РедакторHTML_ПриВыбореСтрокиАвтодополнения(Событие.params.trigger, Событие.params.last_expression, Событие.params.selected, Событие.params.kind); ИначеЕсли Ложь Или Событие.event = "EVENT_ON_ACTIVATE_SUGGEST_ROW" Или Событие.event = "EVENT_ON_DETAIL_SUGGEST_ROW" Тогда РедакторHTML_ПриАктивацииСтрокиАвтодополнения(Событие.params.trigger, Событие.params.focused, Событие.params.row_id, Событие.params.sideDetailIsOpened); ИначеЕсли Событие.event = "EVENT_BEFORE_SHOW_SUGGEST" Тогда РедакторHTML_ПередПоказомАвтодополнения(Событие.params.trigger, Событие.params.last_expression, Событие.params.last_word); КонецЕсли; КонецПроцедуры Процедура РедакторHTML_ПриАктивацииСтрокиАвтодополнения(Триггер, ТекущееСлово, НомерСлова, ЛиОтдельноеОписаниеАктивно) Экспорт // Показывать надо обязательно каждый раз, т.к. редактор забывает предыдущие уточнения типа #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); СтрокаТаблицыСлов = ТаблицаСлов.Найти(ЧистоеСловоСпискаПодсказкиHTML(ТекущееСлово), "Слово"); Если СтрокаТаблицыСлов <> Неопределено Тогда ТаблицаСтруктурТипов = УточнитьТипЗначенияВСтрокеТаблицыСлов(мСтруктураТипаКонтекста, СтрокаТаблицыСлов, ЛиОтдельноеОписаниеАктивно); СтруктураОписания = Новый Массив; Если мСтруктураТипаКонтекста.Конструктор Тогда ДетальноеОписаниеДляСписка = ""; Иначе ДетальноеОписаниеДляСписка = СтрокаТаблицыСлов.ТипЗначения; Если ЗначениеЗаполнено(ДетальноеОписаниеДляСписка) Тогда СтруктураОписания.Добавить("> Тип: " + ДетальноеОписаниеДляСписка); КонецЕсли; КонецЕсли; Если ЛиОтдельноеОписаниеАктивно И ТаблицаСтруктурТипов <> Неопределено Тогда Если Ложь Или мСтруктураТипаКонтекста.Конструктор Или СтрокаТаблицыСлов.ТипСлова = "Метод" Тогда Если мСтруктураТипаКонтекста.Конструктор Тогда СтруктураТипа = мПлатформа.НоваяСтруктураТипа(); СтруктураТипа.ИмяОбщегоТипа = "Глобальный"; ТаблицаСтруктурТипов = мПлатформа.СвойстваТипаПредопределенные(СтруктураТипа, СтрокаТаблицыСлов.Слово, "Конструктор",, ЯзыкПрограммы, Конфигурация)[0].ТаблицаСтруктурТипов; КонецЕсли; //ПараметрыМетода = мПлатформа.ТаблицаПараметровМетода(ТаблицаСтруктурТипов[0]); СтруктураПодсказкиМетода = СтруктураПодсказкиМетода(ТаблицаСтруктурТипов[0], Триггер <> Неопределено, Истина); Если СтруктураПодсказкиМетода.Количество() > 0 Тогда СтруктураОписания.Вставить(0, "> Параметры: " + СтруктураПодсказкиМетода[0].label); Если СтруктураПодсказкиМетода.Количество() > 1 Тогда СтруктураОписания.Вставить(0, "> Варианты: " + СтруктураПодсказкиМетода.Количество()); КонецЕсли; ОписаниеСлова = СтруктураПодсказкиМетода[0].documentation; Если ЗначениеЗаполнено(ОписаниеСлова) Тогда СтруктураОписания.Добавить("> Описание: " + ОписаниеСлова); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; СтруктураОписания.Добавить("> Определение: " + СтрокаТаблицыСлов.Определение); ДетальноеОписаниеОтдельное = ирОбщий.СтрСоединитьЛкс(СтруктураОписания, Символы.ПС); Если Триггер = "hover" Тогда РедакторHTML.setSuggestItemDetailById(НомерСлова, ДетальноеОписаниеДляСписка, ДетальноеОписаниеОтдельное); Иначе МаксВысотаТочек = 800; РедакторHTML.setActiveSuggestDetail(ДетальноеОписаниеДляСписка, ДетальноеОписаниеОтдельное, МаксВысотаТочек); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура РедакторHTML_ОтключитьСочетанияПереключенияСигнатуры() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); // https://github.com/salexdv/bsl_console/issues/130 // Коды клавиш https://microsoft.github.io/monaco-editor/api/enums/monaco.keycode.html РедакторHTML.disableKeyBinding(512+16); // ALT(512)+ArrowUp(16) РедакторHTML.disableKeyBinding(512+18); // ALT(512)+ArrowDown(18) КонецПроцедуры Процедура РедакторHTML_ВключитьСочетанияПереключенияСигнатуры() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); // https://github.com/salexdv/bsl_console/issues/130 РедакторHTML.enableKeyBinding(528); // ALT(512)+ArrowUp(16) РедакторHTML.enableKeyBinding(530); // ALT(512)+ArrowDown(18) КонецПроцедуры Процедура РедакторHTML_ОбработатьКликНаГиперссылке(Событие, ФункцияПерейтиКОпределению, ФункцияВычислитьВыражение) Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли Если ПолеТекста.ОбработатьКликНаГиперссылке(Событие) Тогда Возврат; КонецЕсли; РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.hideHoverList(); ЗаголовокГиперссылки = Событие.params.label; ЗначениеГиперссылки = Событие.params.href; Если ЗаголовокГиперссылки = "Определение" Тогда Координаты = ирОбщий.СтрРазделитьЛкс(ЗначениеГиперссылки, ","); НомерСтроки = Число(Координаты[0]); НомерКолонки = Число(Координаты[1]); Если Не Вычислить("ФормаВладелец." + ФункцияПерейтиКОпределению + "(НомерСтроки, НомерКолонки)") Тогда ПерейтиКОпределению(НомерСтроки, НомерКолонки); КонецЕсли; ИначеЕсли ЗаголовокГиперссылки = "Знач" Тогда УспехВычисления = Истина; ЗначениеВыражения = Вычислить("ФормаВладелец." + ФункцияВычислитьВыражение + "(ЗначениеГиперссылки, УспехВычисления)"); Если УспехВычисления Тогда ирОбщий.ОткрытьЗначениеЛкс(ЗначениеВыражения); КонецЕсли; ИначеЕсли Ложь Или Лев(ЗаголовокГиперссылки, 1) = "[" Или ЗаголовокГиперссылки = "Допустимые типы" Тогда ОткрытьОписаниеТипаПоГиперссылке(ЗначениеГиперссылки); Иначе ОткрытьКонтекстнуюСправку(ЗначениеГиперссылки); КонецЕсли; КонецПроцедуры Процедура КомандаРедактораHTML(Команда) #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.editor.trigger("", Команда); КонецПроцедуры Процедура ЗаменитьВхожденияHTML() КомандаРедактораHTML("editor.action.changeAll"); КонецПроцедуры Процедура СочетанияКлавишHTML() ирОбщий.ОткрытьТекстЛкс(ПолучитьМакет("СочетанияКлавишHTML").ПолучитьТекст(), "Сочетания клавиш HTML редактора", "Обычный", Истина, "СочетанияКлавишHTML"); КонецПроцедуры Процедура ОткрытьКонструкторФорматнойСтроки(ФорматнаяСтрока) Конструктор = Новый КонструкторФорматнойСтроки(); Попытка Конструктор.Текст = ФорматнаяСтрока; Исключение Инфо = ИнформацияОбОшибке(); ирОбщий.СообщитьЛкс("Ошибка в тексте форматной строки:" + Символы.ПС + Инфо.Причина.Описание); Возврат; КонецПопытки; Если Конструктор.ОткрытьМодально() Тогда Результат = Конструктор.Текст; Результат = СтрЗаменить(Результат, "'", ""); Результат = """" + Результат + """"; ВыделенныйТекст(Результат); КонецЕсли; КонецПроцедуры Процедура КонструкторФорматнойСтроки() ФорматнаяСтрока = СтрЗаменить(СтрЗаменить(ВыделитьТекстТекущегоСтроковогоЛитерала(), "|", ""), """", ""); ОткрытьКонструкторФорматнойСтроки(ФорматнаяСтрока); КонецПроцедуры Процедура НайтиСледующееHTML() #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.nextMatch(); КонецПроцедуры Процедура НайтиПредыдущееHTML() #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли РедакторHTML = ПолеТекста.РедакторHTML(); РедакторHTML.previousMatch(); КонецПроцедуры Процедура РедакторHTML_Перерисовать() Экспорт #Если Сервер И Не Сервер Тогда ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли //ПолеТекста.Перерисовать(); //ОбновитьПодсказкуПоВызовуМетода(); КонецПроцедуры Процедура ПанельРедактораКодаПриСменеСтраницы(Знач ПанельРедактора, Знач Поле1, Знач Поле2, Знач ИсходныйТекст) Экспорт #Если Сервер И Не Сервер Тогда Поле1 = Обработки.ирОболочкаПолеТекста.Создать(); Поле2 = Обработки.ирОболочкаПолеТекста.Создать(); #КонецЕсли ТекущаяСтраница = ПанельРедактора.ТекущаяСтраница; Если ТекущаяСтраница = ПанельРедактора.Страницы.РедакторHTML Тогда ЭтотОбъект.ПолеТекста = Поле2; ПолеТекста.ЗагрузитьСостояниеИзПоляТекстаЛкс(Поле1, ИсходныйТекст); Иначе ЭтотОбъект.ПолеТекста = Поле1; ПолеТекста.ЗагрузитьСостояниеИзПоляТекстаЛкс(Поле2, ИсходныйТекст); КонецЕсли; КонецПроцедуры //ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла); //ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf"; //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный ирПортативный.Открыть(); //ирПортативный КонецЕсли; //ирПортативный #Иначе //ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта //ирПортативный #КонецЕсли //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ТаблицаЛокальногоКонтекста = Новый ТаблицаЗначений; ТаблицаЛокальногоКонтекста.Колонки.Добавить("Слово"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("нСлово"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("Глобальное", Новый ОписаниеТипов("Булево")); ТаблицаЛокальногоКонтекста.Колонки.Добавить("ТипСлова"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("ТипЗначения"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("Метаданные"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("ТаблицаСтруктурТипов"); ТаблицаЛокальногоКонтекста.Колонки.Добавить("Значение"); ТаблицаЛокальногоКонтекста.Индексы.Добавить("Слово, ТипСлова"); ПравилаВычисленияФункций = Новый ТаблицаЗначений; ПравилаВычисленияФункций.Колонки.Добавить("Слово"); ПравилаВычисленияФункций.Колонки.Добавить("нСлово"); ПравилаВычисленияФункций.Колонки.Добавить("ТипКонтекста"); ПравилаВычисленияФункций.Колонки.Добавить("Правило"); ПравилаВычисленияФункций.Индексы.Добавить("Слово, ТипКонтекста"); МассивЗащитыОтРекурсии = Новый Массив; мРазбиратьКонтекст = Истина; мРасширенноеПолучениеМетаданныхADO = Ложь; //мДоступныеТаблицыПолучены = Ложь; мАвтоКонтекстнаяПомощь = Ложь; СлужебноеПолеТекста = мПлатформа.СлужебноеПолеТекста; мИменаОбщихТиповПоИменамКлассовCOM = Новый Соответствие; мСтруктурыТиповПодсказкиУдержания = Новый Структура; ШиринаТабуляции = 4; RegExp = ирОбщий.НовыйВычислительРегВыражений(); RegExp.IgnoreCase = Истина; RegExp.MultiLine = Ложь; шЛюбой = мПлатформа.шЛюбой; шБуква = мПлатформа.шБуква; шИмя = мПлатформа.шИмя; шЧисло = мПлатформа.шЧисло; шИндекс = мПлатформа.шИндекс; шСкобки = мПлатформа.шСкобки; шРазделитель = мПлатформа.шРазделитель; шКомментарий = мПлатформа.шКомментарий; шНачалоЧисла = "\d+(?:\.)?\d*"; шНачалоСкобок = "(\((?:[^\)\(]*?(?:(?:\([^\)]*?\)[^\)\(]*?)*)*\))?)"; шИмяСкобки = "(?:" + шИмя + "|\?|)" + шСкобки; // Шаблоны программы шДирективаПрепроцессора = "#[^\n]*\n"; шСтрокаПрограммы = """(?:(?:"""")|[^""\n])*(?:" + шРазделитель + "*\|(?:(?:"""")|[^""\n])*)*(?:""|$)"; шНачалоСтрокиПрограммы = """(?:(?:"""")|[^""\n])*(?:" + шРазделитель + "*\|(?:(?:"""")|[^""\n])*)*(?:""|$)?"; шОператорПрограммы = "(?:(?:=|>|<|<>|<=|>=|\*|\/|\+|\-)|" + шРазделитель + "(?:И|ИЛИ|НЕ)" + шРазделитель + ")+"; шФрагментСтрокиПрограммы = "(?:""|\|)(?:(?:"""")|[^""\n$])*(?:""|\n|$)"; шНачалоТокена = "([" + шБуква + "\d]" + шРазделитель + "+|(?:\]|\)|" + шФрагментСтрокиПрограммы + "|;|^)" + шРазделитель + "*)"; шКонецТокена = "(" + шРазделитель + "+[" + шБуква + "\d]|" + шРазделитель + "*(?:\[|\(|" + шФрагментСтрокиПрограммы + "|;|$))"; шЕсли = шНачалоТокена + "(?:Если|ИначеЕсли)" + шКонецТокена + "(?:" + шФрагментСтрокиПрограммы + "|\." + шРазделитель + "*Тогда|\r|\n|.)*?" + "[^" + шБуква + "\d\.]" + "Тогда" + шКонецТокена; шПока = шНачалоТокена + "Пока" + шКонецТокена + "(?:" + шФрагментСтрокиПрограммы + "|\r|\n|.)*?" + "[^" + шБуква + "\d\.]" + "Цикл" + шКонецТокена; шВызватьИсключение = шНачалоТокена + "ВызватьИсключение" + шКонецТокена + "(?:" + шФрагментСтрокиПрограммы + "|\." + шРазделитель + "*;|\r|\n|.)*?;"; шОписаниеФункции = "Функция" + шРазделитель + "*(" + шИмя + ")" + шРазделитель + "*\(([^\)]*)\)(" + шРазделитель + "*Экспорт)?" + "((?:(?:" + шСтрокаПрограммы + "|\." + шРазделитель + "*КонецФункции|\r|\n|.)*?))" + "[^" + шБуква + "\d\.""]КонецФункции[^" + шБуква + "\d\.""]"; шОписаниеПроцедуры = "Процедура" + шРазделитель + "*(" + шИмя + ")" + шРазделитель + "*\(([^\)]*)\)(" + шРазделитель + "*Экспорт)?" + "((?:(?:" + шСтрокаПрограммы + "|\." + шРазделитель + "*КонецПроцедуры|\r|\n|.)*?))" + "[^" + шБуква + "\d\.""]КонецПроцедуры[^" + шБуква + "\d\.""]"; шОписаниеПеременной = "Перем" + шРазделитель + "*(" + шИмя + ")(" + шРазделитель + "+Экспорт)?" + шРазделитель + "*;"; шМодуль = "^((?:" + шОписаниеПеременной + "|" + шРазделитель + "|" + шДирективаПрепроцессора + ")*)" + "((?:" + шОписаниеФункции + "|" + шОписаниеПроцедуры + "|" + шДирективаПрепроцессора + "|" + шРазделитель + ")*)((?:\r|\n|.)*)$"; //шВыражениеПрограммы = "(?:" + шРазделитель + "*(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" // + шЧисло + "|" + шСтрокаПрограммы + ")" + шРазделитель + "*" + шОператорПрограммы + ")*" // + шРазделитель + "*(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" // + шЧисло + "|" + шСтрокаПрограммы + ")"; //шВыражениеПрограммы = "(?:" + шРазделитель + "*" + шОператорПрограммы + шРазделитель + "*" // + "(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" // + шЧисло + "|" + шСтрокаПрограммы + ")*)*"; //шВыражениеПрограммы = "(?:" + шРазделитель + "*" // + "(?:новый)" + "(?:" + шРазделитель + "(?:" + шИмя + "))?" + шРазделитель + "*" + "(?:\(""(?:" + шИмя+ "(?:\." + шИмя + ")*))?|(?:" // + "(?:*" + шОператорПрограммы + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" // + шЧисло + "|" + шСтрокаПрограммы + ")" + шРазделитель + ")*" // + шРазделитель + "*(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" // + шЧисло + "|" + шСтрокаПрограммы + ")"; шВыражениеПрограммы1 = "(?:(?:новый|New)" + "(?:" + шРазделитель + "(?:" + шИмя + "))?" + шРазделитель + "*" + "(?:\(""(?:" + шИмя+ "(?:\." + шИмя + ")*)""\))?" + "|(?:(?:не|not)" + шРазделитель + "+)?(?:(?:(?:новый|New)" + шРазделитель + ")?" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" + шЧисло + "|" + шСтрокаПрограммы + ")"; шВыражениеПрограммы = шРазделитель + "*" + шВыражениеПрограммы1 + "(?:" + шРазделитель + "*" + шОператорПрограммы + шРазделитель + "*" + шВыражениеПрограммы1 + ")*"; шНачалоВыраженияПрограммы = "(?:" + шРазделитель + "*(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" + шЧисло + "|" + шСтрокаПрограммы + ")" + шРазделитель + "*" + шОператорПрограммы + ")*" + шРазделитель + "*(?:(?:" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*)|" + шНачалоЧисла + "|" + шНачалоСтрокиПрограммы + ")?"; шВызовМетодаПрограммы = "(?:" + шПредИмя + "(Новый|New)\s+)?(" + шИмяСкобки + "?" + "(?:(?:\.(?:" + шИмя + ")" + шСкобки + "?)|" + шИндекс + ")*?)" + "\(((?:(?:" + шВыражениеПрограммы + ")?" + шРазделитель + "*,)*)" + "(" + шНачалоВыраженияПрограммы + ")?" + шРазделитель + "*"; шПрисваивание = "(" + шРазделитель + "*=" + шРазделитель + "*((новый|New)" // Изменение для поддержки ProgID типа Forms.TextBox.1 + "(?:" + шРазделитель + "+(" + шИмя + "))?" + шРазделитель + "*(?:\(""(" + шИмя+ "(?:\.[" + шБуква + "\d]+)*)"")?|" + "(" + шИмяСкобки + "?" + шИндекс + "?(?:\." + шИмяСкобки + "?" + шИндекс + "?)*)" + "|" + "(" + шЧисло + ")|(" + шСтрокаПрограммы + ")))"; // Шаблоны запроса шПараметрЗапроса = "(?:&|\?|@)[" + шБуква + "][" + шБуква + "\d]*"; шСтрокаЗапроса = """(?:(?:"""")|[^""\n])*(?:""|\n|$)"; шНачалоСтрокиЗапроса = """(?:(?:"""")|[^""\n])*(?:""|\n|$)?"; шОператорЗапроса = "(?:(?:=|>|<|<>|<=|>=|\*|\/|\+|\-)|" + шРазделитель + "(?:И|AND|ИЛИ|OR|НЕ|NOT|МЕЖДУ|BETWEEN|ПОДОБНО|LIKE|ССЫЛКА|REFS|(?:ЕСТЬ|IS)" + шРазделитель + "+NULL|В|IN" + "|В" + шРазделитель + "+ИЕРАРХИИ|IN" + шРазделитель + "+HIERARCHY)" + шРазделитель + ")+"; ШаблонВыбора = "(?:ВЫБОР|CASE)" + шЛюбой + "+?(?:КОГДА|WHEN)" + шЛюбой + "+?(?:ТОГДА|THEN)" + шЛюбой + "+?(?:ИНАЧЕ|ELSE)" + шЛюбой + "+?(?:КОНЕЦ|END)"; ШаблонНачалаВыбора = "(?:ВЫБОР|CASE)" + шЛюбой + "+?(?:КОНЕЦ|END)?"; шИмяЗапроса = "(?:" + шИмя + "|\[[^\]]+\])"; ШаблонТаблицы = "(" + шИмяЗапроса + "\.)*" + шИмяЗапроса + шСкобки + "?"; ШаблонСоединения = шРазделитель + "+((ПРАВОЕ|RIGHT|ЛЕВОЕ|LEFT|ВНУТРЕННЕЕ|INNER|ПОЛНОЕ|FULL|ВНЕШНЕЕ|OUTER)" + шРазделитель + "+)?(?:СОЕДИНЕНИЕ|JOIN)" + шРазделитель + "+"; ШаблонОписанияТаблицы = "(" + шСкобки + "|" + ШаблонТаблицы + "|&" + шИмя + ")" + шРазделитель + "+(?:КАК|AS)" + шРазделитель + "+" + шИмяЗапроса; шВыражениеЗапроса = "(?:" + шРазделитель + "*(?:" + шСкобки + "|(?:&|\?|@)" + шИмя + "|" + шЧисло + "|" + шСтрокаЗапроса + "|" + ШаблонВыбора + "|" + шИмяСкобки + "?" + "(?:\." + шИмяСкобки + "?" + ")*)" + шРазделитель + "*" + шОператорЗапроса + ")*" + шРазделитель + "*" + "(?:" + шСкобки + "|(?:&|\?|@)" + шИмя + "|" + шЧисло + "|" + шСтрокаЗапроса + "|" + ШаблонВыбора + "|" + шИмяСкобки + "?" + "(?:\." + шИмяСкобки + "?" + ")*)"; шНачалоВыраженияЗапроса = "(?:" + шРазделитель + "*(?:" + шСкобки + "|(?:&|\?|@)" + шИмя + "|" + шЧисло + "|" + шСтрокаЗапроса + "|" + ШаблонВыбора + "|" + шИмяЗапроса + шСкобки + "?" + "(?:\." + шИмяЗапроса + шСкобки + "?" + ")*)" + шРазделитель + "*" + шОператорЗапроса + ")*" + шРазделитель + "*" + "(?:" + шСкобки + "|(?:&|\?|@)" + шИмя + "|" + шЧисло + "|" + шНачалоСтрокиЗапроса + "|" + ШаблонНачалаВыбора + "|" + шИмяЗапроса + шСкобки + "?" + "(?:\." + шИмяЗапроса + шСкобки + "?" + ")*)?"; шВызовМетодаЗапроса = "()?(" + шИмяЗапроса + шСкобки + "?" + "(?:(?:\.(?:" + шИмяЗапроса + ")" + шСкобки + "?)|" + шИндекс + ")*)" + "\(((?:(?:" + шВыражениеЗапроса + ")?" + шРазделитель + "*,)*)" + "(" + шНачалоВыраженияЗапроса + ")?" + шРазделитель + "*"; ШаблонОписанияПоля = шВыражениеЗапроса + шРазделитель + "+КАК" + шРазделитель + "+" + шИмяЗапроса; ШаблонВЫБРАТЬ = "(?:ВЫБРАТЬ|SELECT)(" + шРазделитель + "+(?:РАЗРЕШЕННЫЕ|ALLOWED))?(" + ШаблонОписанияПоля + ",)*" + ШаблонОписанияПоля; шИЗ = "(?:ИЗ|FROM)" + шРазделитель + "+" + ШаблонОписанияТаблицы + "(" + ШаблонСоединения + ШаблонОписанияТаблицы + шРазделитель + "+(?:ПО|ON)" + шРазделитель + "+" + шВыражениеЗапроса + "|" + шРазделитель + "*," + шРазделитель + "*" + ШаблонОписанияТаблицы + ")*"; шПоискОписанияТаблицы = "(" + ШаблонСоединения + ")?(" + шСкобки + "|" + ШаблонТаблицы + "|&" + шИмя + ")" + шРазделитель + "+(?:КАК|AS)" + шРазделитель + "+" + "#Идентификатор#(" + шРазделитель + "+(?:ПО|ON)" + шРазделитель + "+" + шВыражениеЗапроса + "|" + шРазделитель + "|,|\)|$)"; // К нему привязаны имена методов-трансляторов событий ИмяКласса = "ПолеТекстаПрограммы"; мМаркерСлужебногоКомментария = "{: "; СброситьРезультатРазбораПозицииВТексте(); #КонецЕсли