Перем мСписокВнешнихПараметров Экспорт; Перем КоличествоВнешнихПараметров; Перем ТекстМодуляТекущейВнешнейОбработки; Перем ФайлВнешнейОбработки; Перем ИмяВнешнейОбработки; Перем ВнешняяОбработка; Перем СтартоваяСтрока; Перем ДатаИзмененияВнешнейОбработки; Перем НаСервере Экспорт; Перем РежимВнешнейОбработки Экспорт; Перем АвтоПараметрыВыхода Экспорт; Перем мСтруктураВосстановления; Перем мАнализТехножурнала; Перем мПлатформа; // @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой // Транслятор обработки событий нажатия на кнопки командной панели в компоненту. // Является обязательным. // // Параметры: // Кнопка – КнопкаКоманднойПанели. // Процедура КлсПолеТекстовогоДокументаСКонтекстнойПодсказкойНажатие(Кнопка) ИнициализироватьГлобальныйКонтекстПодсказки(ПолеВстроенногоЯзыка); Попытка Выполнить("Ядро2iS.ДобавитьГлобальныйКонтекстВКонтекстнуюПодсказку2iS(ПолеВстроенногоЯзыка)"); Исключение КонецПопытки; ЭтоВыполнениеКода = (Кнопка = ЛксПолучитьКнопкуКоманднойПанелиЭкземпляраКомпоненты(ПолеВстроенногоЯзыка, "Выполнить")); Для Каждого СтрокаПараметра Из Параметры Цикл Если Истина //И СтрокаПараметра.Значение <> Неопределено //И СтрокаПараметра.Вход Тогда ЗначениеПараметра = СтрокаПараметра.Значение; Если Истина И Не СтрокаПараметра.Вход И ЭтоВыполнениеКода Тогда ЗначениеПараметра = Неопределено; // Это нужно для избежания залипания блокирующих объектов типа ЗаписьСообщения КонецЕсли; //МассивТипов = Новый Массив; //МассивТипов.Добавить(ТипЗнч(СтрокаПараметра.Значение)); ПолеВстроенногоЯзыка.ДобавитьСловоЛокальногоКонтекста( СтрокаПараметра.Имя, "Свойство", , ЗначениеПараметра, , ЗначениеПараметра); КонецЕсли; КонецЦикла; Если Ложь Или Кнопка = ЛксПолучитьКнопкуКоманднойПанелиЭкземпляраКомпоненты(ПолеВстроенногоЯзыка, "Проверить") Или ЭтоВыполнениеКода Тогда Если Не Справочники.ирАлгоритмы.ПараметрыКорректны(Параметры) Тогда Возврат; КонецЕсли; КонецЕсли; Если ЭтоВыполнениеКода Тогда Если Не ПолеВстроенногоЯзыка.ПроверитьПрограммныйКод() Тогда Возврат; КонецЕсли; СохранитьВФайл(мСтруктураВосстановления.ФайлВосстановления.ПолноеИмя); КонецЕсли; ПолеВстроенногоЯзыка.Нажатие(Кнопка); КонецПроцедуры // @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой Процедура КлсПолеТекстовогоДокументаСКонтекстнойПодсказкойАвтоОбновитьСправку() ПолеВстроенногоЯзыка.АвтоОбновитьСправку(); КонецПроцедуры Процедура ПриОткрытии() ПолеВстроенногоЯзыка.Инициализировать(, ЭтаФорма, ЭлементыФормы.ВстроенныйЯзык, ЭлементыФормы.КоманднаяПанельВстроенныйЯзык, Ложь, "ВыполнитьЛокально", ЭтаФорма); ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.УстановитьТекст(Текст); ЭтаФорма.Модифицированность = Ложь; Если мСписокВнешнихПараметров.Количество() > 0 Тогда Для Каждого ВнешнийПараметр Из мСписокВнешнихПараметров Цикл СтрокаПараметра = Параметры.Добавить(); СтрокаПараметра.Имя = ВнешнийПараметр.Представление; СтрокаПараметра.НИмя = НРег(СтрокаПараметра.Имя); СтрокаПараметра.Вход = Истина; СтрокаПараметра.Выход = Истина; СтрокаПараметра.Значение = ВнешнийПараметр.Значение; ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметра); СтрокаПараметра.Позиция = Параметры.Количество(); КонецЦикла; ИначеЕсли Не МодальныйРежим Тогда ИмяФайлаВосстановления = ирНеглобальный.ПроверитьВыбратьФайлВосстановленияКонсолиЛкс(мСтруктураВосстановления); Если ИмяФайлаВосстановления <> "" Тогда ЗагрузитьИзФайла(ИмяФайлаВосстановления); Модифицированность = Истина; УдалитьФайлы(ИмяФайлаВосстановления); КонецЕсли; КонецЕсли; Если Ложь Или Параметры.Количество() = 0 Или Не МодальныйРежим Тогда Кнопки = ЭлементыФормы.ОсновныеДействияФормы.Кнопки; Кнопки.Удалить(Кнопки.Применить); КонецЕсли; КонецПроцедуры // <Описание процедуры> // // Параметры: // <Параметр1> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>; // <Параметр2> – <Тип.Вид> – <описание параметра> // <продолжение описания параметра>. // Процедура ОбновитьЗначенияПараметровВыхода(СтруктураПараметров) Для Каждого СтрокаПараметра Из Параметры Цикл Если СтрокаПараметра.Выход Тогда СтрокаПараметра.Значение = СтруктураПараметров[СтрокаПараметра.Имя]; ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметра); КонецЕсли; КонецЦикла; КонецПроцедуры // ОбновитьЗначенияПараметровВыхода() Функция ПолучитьТелоМетода(ТекстДляВыполнения = Неопределено, СтруктураПараметров = Неопределено, ЛиСинтаксическийКонтроль = Ложь, РежимВнешнейОбработки = Ложь) Если ТекстДляВыполнения = Неопределено Тогда ТекстДляВыполнения = ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.ПолучитьТекст(); КонецЕсли; ТекстВхода = ""; ТекстВыхода = ""; СтартоваяСтрока = 0; // Строка инициализации параметров Для Каждого СтрокаПараметра Из Параметры Цикл Если СтруктураПараметров <> Неопределено Тогда СтруктураПараметров.Вставить(СтрокаПараметра.Имя); КонецЕсли; //Если СтрокаПараметра.Вход Тогда // Здесь отрезаются параметры выхода полученные из определения типа в комментариях ТекстВхода = ТекстВхода + СтрокаПараметра.Имя + " = _АлгоритмОбъект." + СтрокаПараметра.Имя + ";"; //Если РежимВнешнейОбработки Тогда // ТекстВхода = ТекстВхода + Символы.ПС; // СтартоваяСтрока = СтартоваяСтрока + 1; //КонецЕсли; Если СтрокаПараметра.Вход Тогда Если СтруктураПараметров <> Неопределено Тогда СтруктураПараметров[СтрокаПараметра.Имя] = СтрокаПараметра.Значение; КонецЕсли; КонецЕсли; Если Не ЛиСинтаксическийКонтроль Тогда Если СтрокаПараметра.Выход Тогда Если РежимВнешнейОбработки Тогда ТекстВыхода = ТекстВыхода + Символы.ПС; КонецЕсли; ТекстВыхода = ТекстВыхода + "_АлгоритмОбъект." + СтрокаПараметра.Имя + " = " + СтрокаПараметра.Имя + ";" ; КонецЕсли; КонецЕсли; КонецЦикла; Если РежимВнешнейОбработки Тогда ТекстВхода = ТекстВхода + Символы.ПС; СтартоваяСтрока = СтартоваяСтрока + 1; КонецЕсли; // Для обновления значений выходных параметров в случае ошибки выполнения добавляем попытку ТелоМетода = ""; ТелоМетода = ТелоМетода + ТекстВхода; ТелоМетода = ТелоМетода + "Попытка "; Если РежимВнешнейОбработки Тогда ТелоМетода = ТелоМетода + Символы.ПС; СтартоваяСтрока = СтартоваяСтрока + 1; ТелоМетода = ТелоМетода + "///////////////////////// Текст НАЧАЛО" + Символы.ПС; СтартоваяСтрока = СтартоваяСтрока + 1; КонецЕсли; ТелоМетода = ТелоМетода + ТекстДляВыполнения; Если РежимВнешнейОбработки Тогда ТелоМетода = ТелоМетода + Символы.ПС + "///////////////////////// Текст КОНЕЦ"; КонецЕсли; ТелоМетода = ТелоМетода + " |Исключение " + ТекстВыхода + " |ВызватьИсключение; |КонецПопытки; |~Конец:" + ТекстВыхода; Возврат ТелоМетода; КонецФункции // @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой // Процедура служит для выполнения программы поля текстового документа в локальном контексте. // Вызывается из компоненты ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой в режиме внутреннего языка. // Не является обязательной. // // Параметры: // ТекстДляВыполнения – Строка; // *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля. // Функция ВыполнитьЛокально(ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт Если Истина И Не ЛиСинтаксическийКонтроль И АвтоПараметрыВыхода Тогда ЗаполнитьПараметры(Ложь, Истина); КонецЕсли; СтруктураПараметров = Новый Структура; Если Истина И Не ЛиСинтаксическийКонтроль И РежимВнешнейОбработки Тогда ПолучитьОбновитьФайлВнешнейОбработки(СтруктураПараметров); Иначе ТекстДляВыполнения = ПолучитьТелоМетода(ТекстДляВыполнения, СтруктураПараметров, ЛиСинтаксическийКонтроль); КонецЕсли; Если Не ЛиСинтаксическийКонтроль Тогда ОбновитьЗначенияПараметровВыхода(СтруктураПараметров); КонецЕсли; мАнализТехножурнала = Обработки.ирАнализТехножурнала.Создать(); Если Не ЛиСинтаксическийКонтроль Тогда мАнализТехножурнала.НачатьТрассу("КонсольКода"); КонецЕсли; Попытка Если Истина И Не ЛиСинтаксическийКонтроль И РежимВнешнейОбработки Тогда ВнешняяОбработка = ВнешниеОбработки.Создать(ФайлВнешнейОбработки.ПолноеИмя, Ложь); Если ЛиЗамерВремени Тогда ВремяНачала = ЛксПолучитьТекущееВремяВМиллисекундах(); КонецЕсли; ВнешняяОбработка.мМетод(СтруктураПараметров); Иначе Если НаСервере Тогда КонтекстВыполнения = ирСервер; Иначе КонтекстВыполнения = ирНеглобальный; КонецЕсли; Если ЛиЗамерВремени Тогда ВремяНачала = ЛксПолучитьТекущееВремяВМиллисекундах(); КонецЕсли; КонтекстВыполнения.ВыполнитьАлгоритм(ТекстДляВыполнения, СтруктураПараметров); КонецЕсли; Исключение Если Не ЛиСинтаксическийКонтроль Тогда Если ЛиЗамерВремени Тогда ВремяКонца = ЛксПолучитьТекущееВремяВМиллисекундах(); Сообщить("Время выполнения - " + Строка(ВремяКонца - ВремяНачала) + " мс"); КонецЕсли; мАнализТехножурнала.КончитьТрассу(); //ОбновитьЗначенияПараметровВыхода(СтруктураПараметров); КонецЕсли; ИмяМодуля = ПолучитьИмяМодуляВнешнейОбработки(); ИнформацияОбОшибке = ИнформацияОбОшибке(); //Если ИнформацияОбОшибке.Причина <> Неопределено Тогда // ИнформацияОбОшибке = ИнформацияОбОшибке.Причина; //КонецЕсли; //НрегОписание = НРег(ИнформацияОбОшибке.Описание); Если ИнформацияОбОшибке.Причина <> Неопределено Тогда НрегОписание = НРег(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке.Причина)); Маркер = "мутабельного значения"; ПозицияМаркера = Найти(НрегОписание, НРег(Маркер)); Если Истина И ПозицияМаркера > 0 И Найти(НрегОписание, НРег("параметра метода ВыполнитьАлгоритм")) > 0 Тогда Ошибка = Лев(ИнформацияОбОшибке.Причина.Описание, ПозицияМаркера - 1) + Маркер; ВызватьИсключение Ошибка; КонецЕсли; КонецЕсли; // Перенес ниже //Если Не ЛиСинтаксическийКонтроль Тогда // ОбновитьЗначенияПараметровВыхода(СтруктураПараметров); //КонецЕсли; Если Истина И Не ЛиСинтаксическийКонтроль И РежимВнешнейОбработки Тогда ЛксПоказатьОшибкуВЗапросеИлиПрограммномКоде(ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента, -СтартоваяСтрока,,, МодальныйРежим, ИнформацияОбОшибке, ИмяМодуля); Иначе Если Не ЛиСинтаксическийКонтроль Тогда ОбновитьЗначенияПараметровВыхода(СтруктураПараметров); ЛксПоказатьОшибкуВЗапросеИлиПрограммномКоде(ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента, -СтартоваяСтрока,,, МодальныйРежим, ИнформацияОбОшибке); Иначе ВызватьИсключение; КонецЕсли; КонецЕсли; Возврат Неопределено; КонецПопытки; Если Не ЛиСинтаксическийКонтроль Тогда Если ЛиЗамерВремени Тогда ВремяКонца = ЛксПолучитьТекущееВремяВМиллисекундах(); Сообщить("Время выполнения - " + Строка(ВремяКонца - ВремяНачала) + " мс"); КонецЕсли; мАнализТехножурнала.КончитьТрассу(); ОбновитьЗначенияПараметровВыхода(СтруктураПараметров); КонецЕсли; КонецФункции // ВыполнитьЛокально() Функция ПолучитьИмяМодуляВнешнейОбработки() ИмяМодуля = "ВнешняяОбработка." + ИмяВнешнейОбработки + ".МодульОбъекта"; Возврат ИмяМодуля; КонецФункции Процедура ПриЗакрытии() ирНеглобальный.УдалитьФайлВосстановленияКонсолиСБлокировкойЛкс(мСтруктураВосстановления); // +++.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой // Уничтожение всех экземпляров компоненты. Обязательный блок. ПолеВстроенногоЯзыка.Уничтожить(); // ---.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой КонецПроцедуры Процедура ПараметрыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) //Если ДанныеСтроки.Позиция > 0 Тогда // ОформлениеСтроки.ЦветФона = Новый Цвет(246, 252, 255); //КонецЕсли; //ОформлениеСтроки.Ячейки.Имя.ТолькоПросмотр = ДанныеСтроки.Позиция > 0; ОформлениеСтроки.Ячейки.Вход.ТолькоПросмотр = ДанныеСтроки.Позиция > 0; //ОформлениеСтроки.Ячейки.Выход.ТолькоПросмотр = ДанныеСтроки.Позиция > 0; ОформлениеСтроки.Ячейки.ПредставлениеЗначения.ТолькоПросмотр = Не ДанныеСтроки.Вход; ЛксОформитьЯчейкуСРасширеннымЗначением(ОформлениеСтроки.Ячейки.ПредставлениеЗначения, ДанныеСтроки.Значение, Элемент.Колонки.ПредставлениеЗначения); ирНеглобальный.ТабличноеПолеПриВыводеСтрокиЛкс(Элемент, ОформлениеСтроки, ДанныеСтроки); КонецПроцедуры Процедура ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаТаблицы = Неопределено) Если СтрокаТаблицы = Неопределено Тогда СтрокаТаблицы = ЭлементыФормы.Параметры.ТекущиеДанные; КонецЕсли; СтрокаТаблицы.ТипЗначения = ТипЗнч(СтрокаТаблицы.Значение); СтрокаТаблицы.ПредставлениеЗначения = СтрокаТаблицы.Значение; КонецПроцедуры Процедура ПараметрыЗначениеПриИзменении(Элемент) ТабличноеПоле = ЭтаФорма.ЭлементыФормы.Параметры; ТабличноеПоле.ТекущиеДанные.Значение = Элемент.Значение; ОбновитьПредставлениеИТипЗначенияВСтроке(); КонецПроцедуры Процедура ОсновныеДействияФормыПрименить(Кнопка) ВозвращаемыеПараметры = Новый Структура; Для Счетчик = 1 По мСписокВнешнихПараметров.Количество() Цикл ВнешнийПараметр = мСписокВнешнихПараметров[Счетчик - 1]; ИмяПараметра = ВнешнийПараметр.Представление; СтрокаПараметра = Параметры.Найти(Счетчик, "Позиция"); Если СтрокаПараметра <> Неопределено Тогда ВнешнийПараметр.Значение = СтрокаПараметра.Значение; КонецЕсли; КонецЦикла; Закрыть(мСписокВнешнихПараметров); КонецПроцедуры Процедура ПараметрыПередУдалением(Элемент, Отказ) Отказ = (Элемент.ТекущиеДанные.Позиция > 0); КонецПроцедуры Процедура ПараметрыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) Если Истина И Колонка.Имя = "ПредставлениеЗначения" И Не ВыбраннаяСтрока.Вход Тогда ирНеглобальный.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(Элемент, СтандартнаяОбработка, ВыбраннаяСтрока.Значение); КонецЕсли; КонецПроцедуры Процедура ПараметрыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если Не ЗначениеЗаполнено(Элемент.ТекущиеДанные.Имя) Тогда Элемент.ТекущиеДанные.Имя = "в" + (Элемент.Значение.Индекс(Элемент.ТекущиеДанные) + 1); Элемент.ТекущиеДанные.НИмя = НРег(Элемент.ТекущиеДанные.Имя); КонецЕсли; Если НоваяСтрока Тогда Элемент.ТекущиеДанные.Вход = Истина; Элемент.ТекущиеДанные.Значение = ""; ОбновитьПредставлениеИТипЗначенияВСтроке(); КонецЕсли; КонецПроцедуры Процедура ПараметрыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) ПараметрыПеретаскивания.Значение = Элемент.ТекущаяСтрока.Имя; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкСсылкаНаОбъектБД(Кнопка) СтрокаПараметра = ПолеВстроенногоЯзыка.ВставитьСсылкуНаОбъектБД(ЭлементыФормы.Параметры); Если СтрокаПараметра = Неопределено Тогда Возврат; КонецЕсли; СтрокаПараметра.НИмя = НРег(СтрокаПараметра.Имя); СтрокаПараметра.Вход = Истина; СтрокаПараметра.Выход = Ложь; ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметра); КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкВыполнятьНаСервере(Кнопка) НаСервере = Не Кнопка.Пометка; Кнопка.Пометка = НаСервере; ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ОткрытьВОтладчике.Доступность = Не НаСервере; ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.РежимВнешнейОбработки.Доступность = Не НаСервере; КонецПроцедуры Процедура КоманднаяПанельПараметрыИсследоватьТаблицуПараметров(Кнопка) Если ЭлементыФормы.Параметры.ТекущаяСтрока <> Неопределено Тогда Исследовать(ЭлементыФормы.Параметры.ТекущаяСтрока.Значение); КонецЕсли; КонецПроцедуры Процедура ПараметрыПриИзмененииФлажка(Элемент, Колонка) Если Истина И Элемент.ТекущиеДанные.Вход = Ложь И Элемент.ТекущиеДанные.Выход = Ложь Тогда Если Колонка.Имя = "Вход" Тогда Элемент.ТекущиеДанные.Выход = Истина; ИначеЕсли Колонка.Имя = "Выход" Тогда Элемент.ТекущиеДанные.Вход = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ПараметрыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка) Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("СтрокаТаблицыЗначений") Тогда ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.Копирование; СтандартнаяОбработка = Ложь КонецЕсли; КонецПроцедуры Процедура ПараметрыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка) Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Строка") Тогда ЭлементыФормы.Параметры.ДобавитьСтроку(); СтрокаПараметра = ЭлементыФормы.Параметры.ТекущиеДанные; СтрокаПараметра.Имя = ПараметрыПеретаскивания.Значение; СтрокаПараметра.НИмя = НРег(СтрокаПараметра.Имя); ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование; КонецЕсли; КонецПроцедуры Процедура ЗаполнитьПараметры(ПараметрыВхода = Истина, ПараметрыВыхода = Истина) Если ПараметрыВхода Тогда Пока Истина Цикл ИнформацияОбОшибке = ПолеВстроенногоЯзыка.ПолучитьИнформациюОбОшибке(); НеопределеннаяПеременная = мПлатформа.ПолучитьИмяНеопределеннойПеременнойИзИнформацииОбОшибке(ИнформацияОбОшибке); Если Не ЗначениеЗаполнено(НеопределеннаяПеременная) Тогда ПолеВстроенногоЯзыка.ПроверитьПрограммныйКод(Ложь); Прервать; КонецЕсли; СтрокаПараметра = Параметры.Найти(НРег(НеопределеннаяПеременная), "НИмя"); Если СтрокаПараметра = Неопределено Тогда СтрокаПараметра = Параметры.Добавить(); СтрокаПараметра.Имя = НеопределеннаяПеременная; СтрокаПараметра.НИмя = НРег(СтрокаПараметра.Имя); ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметра); КонецЕсли; СтрокаПараметра.Вход = Истина; //ЭтаФорма.Модифицированность = Истина; КонецЦикла; КонецЕсли; Если ПараметрыВыхода Тогда РекомендуемыеПараметрыВыхода = Новый Массив; ПолеВстроенногоЯзыка.ЗаполнитьЛокальныеСвойстваИМетодыПоТексту(,,,, Истина); СтрокиЛокальныхПеременных = ПолеВстроенногоЯзыка.ТаблицаСлов.НайтиСтроки(Новый Структура("ТипСлова, Определение", "Свойство", "Статистический")); Для Каждого СтрокаПеременной Из СтрокиЛокальныхПеременных Цикл СтрокаПараметра = Параметры.Найти(СтрокаПеременной.НСлово, "НИмя"); Если СтрокаПараметра = Неопределено Тогда СтрокаПараметра = Параметры.Добавить(); СтрокаПараметра.Имя = СтрокаПеременной.Слово; СтрокаПараметра.НИмя = НРег(СтрокаПараметра.Имя); ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметра); КонецЕсли; СтрокаПараметра.Выход = Истина; //ЭтаФорма.Модифицированность = Истина; РекомендуемыеПараметрыВыхода.Добавить(СтрокаПараметра.Имя); КонецЦикла; СтрокиПараметровТолькоВыхода = Параметры.НайтиСтроки(Новый Структура("Вход, Выход", Ложь, Истина)); Для Каждого СтрокаПараметра Из СтрокиПараметровТолькоВыхода Цикл Если РекомендуемыеПараметрыВыхода.Найти(СтрокаПараметра.Имя) = Неопределено Тогда Параметры.Удалить(СтрокаПараметра); КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры // ЗаполнитьПараметры() Процедура КоманднаяПанельПараметрыЗаполнить(Кнопка) ЗаполнитьПараметры(); КонецПроцедуры Процедура ПараметрыИмяПриИзменении(Элемент) Если Не ЛксЛиИмяПеременной(Элемент.Значение) Тогда Элемент.Значение = мПлатформа.ПолучитьИдентификаторИзПредставления(Элемент.Значение); КонецЕсли; ЭлементыФормы.Параметры.ТекущиеДанные.НИмя = Нрег(Элемент.Значение); КонецПроцедуры Процедура КоманднаяПанельПараметрыАвтоПараметрыВыхода(Кнопка) АвтоПараметрыВыхода = Не Кнопка.Пометка; Кнопка.Пометка = АвтоПараметрыВыхода; КонецПроцедуры Процедура КоманднаяПанельПараметрыОчистить(Кнопка) НачальноеКоличество = Параметры.Количество(); Для СчетчикПараметры = 1 По НачальноеКоличество Цикл СтрокаПараметра = Параметры[НачальноеКоличество - СчетчикПараметры]; Если СтрокаПараметра.Позиция = 0 Тогда Параметры.Удалить(СтрокаПараметра); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ПараметрыПредставлениеЗначенияОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка) ирНеглобальный.ПолеВвода_ОкончаниеВводаТекстаЛкс(Элемент, Текст, Значение, СтандартнаяОбработка, ЭлементыФормы.Параметры.ТекущаяСтрока.Значение); КонецПроцедуры Процедура ОсновныеДействияФормыСохранить(Кнопка) РезультатВыбора = ЛксВыбратьСсылку(Метаданные.Справочники.ирАлгоритмы, ТекущийАлгоритм); Если ЗначениеЗаполнено(РезультатВыбора) Тогда //Если Не ЗначениеЗаполнено(ТекущийАлгоритм) Тогда ТекущийАлгоритм = РезультатВыбора; //КонецЕсли; //АлгоритмОбъект = РезультатВыбора.ПолучитьОбъект(); АлгоритмОбъект = РезультатВыбора; Иначе АлгоритмОбъект = Справочники.ирАлгоритмы.СоздатьЭлемент(); ТекущийАлгоритм = ирНеглобальный.ПолучитьТочнуюСсылкуОбъектаЛкс(АлгоритмОбъект); КонецЕсли; ФормаАлгоритма = АлгоритмОбъект.ПолучитьФорму(); АлгоритмОбъект = ФормаАлгоритма.ЭтотОбъект; #Если _ Тогда АлгоритмОбъект = Справочники.ирАлгоритмы.СоздатьЭлемент(); #КонецЕсли ФормаАлгоритма.ТекстАлгоритма = ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.ПолучитьТекст(); //СтрокиПараметровКонсоли = Параметры.НайтиСтроки(Новый Структура("Вход", Истина)); СтрокиПараметровКонсоли = Параметры; Для Каждого СтрокаПараметраКонсоли Из СтрокиПараметровКонсоли Цикл СтрокаПараметраАлгоритма = АлгоритмОбъект.Параметры.Найти(СтрокаПараметраКонсоли.Имя, "Имя"); Если СтрокаПараметраАлгоритма = Неопределено Тогда СтрокаПараметраАлгоритма = АлгоритмОбъект.Параметры.Добавить(); СтрокаПараметраАлгоритма.Имя = СтрокаПараметраКонсоли.Имя; КонецЕсли; ЗаполнитьЗначенияСвойств(СтрокаПараметраАлгоритма, СтрокаПараметраКонсоли); Попытка СтрокаПараметраАлгоритма.ЗначениеХранилище = Новый ХранилищеЗначения(СтрокаПараметраКонсоли.Значение); Исключение Сообщить("Значение параметра """ + СтрокаПараметраКонсоли.Имя + """ типа """ + ТипЗнч(СтрокаПараметраКонсоли.Значение) + """ не сохранено, т.к. имеет несериализуемый тип", СтатусСообщения.Внимание); КонецПопытки; КонецЦикла; ФормаАлгоритма.СправочникОбъект = ФормаАлгоритма.СправочникОбъект; ФормаАлгоритма.Открыть(); ФормаАлгоритма.Модифицированность = Истина; КонецПроцедуры Функция ПолучитьОбновитьФайлВнешнейОбработки(СтруктураПараметров = Неопределено) Экспорт ТекстМодуля = ПолучитьТелоМетода(, СтруктураПараметров,, Истина); ТекстМодуля = "Процедура мМетод(_АлгоритмОбъект) Экспорт |Перем ЭтотОбъект; |" + ТекстМодуля + " |КонецПроцедуры"; СтартоваяСтрока = СтартоваяСтрока + 2; Если Ложь Или (Истина И ФайлВнешнейОбработки.Существует() И ФайлВнешнейОбработки.ПолучитьВремяИзменения() > ДатаИзмененияВнешнейОбработки И мПлатформа.ФайловыйКэшАлгоритмовДопускаетРедактирование) Или (Истина И ФайлВнешнейОбработки.Существует() И ФайлВнешнейОбработки.ПолучитьВремяИзменения() = ДатаИзмененияВнешнейОбработки И ТекстМодуляТекущейВнешнейОбработки = ТекстМодуля) Тогда Возврат ФайлВнешнейОбработки; КонецЕсли; мПлатформа.СформироватьВнешнююОбработку(ИмяВнешнейОбработки, ФайлВнешнейОбработки, ТекстМодуля); ТекстМодуляТекущейВнешнейОбработки = ТекстМодуля; ДатаИзмененияВнешнейОбработки = ФайлВнешнейОбработки.ПолучитьВремяИзменения(); Возврат ФайлВнешнейОбработки; КонецФункции // ПолучитьОбновитьФайлВнешнейОбработки() Процедура КоманднаяПанельВстроенныйЯзыкОткрытьВОтладчике(Кнопка) Если Не РежимВнешнейОбработки Тогда КоманднаяПанельВстроенныйЯзыкРежимВнешнейОбработки(); КонецЕсли; Если Не ПолеВстроенногоЯзыка.ПроверитьПрограммныйКод() Тогда Возврат; КонецЕсли; Если Не мПлатформа.ФайловыйКэшАлгоритмовДопускаетРедактирование Тогда Сообщить("Т.к. не включено разрешение редактирования файлового кэша, изменения файла будут игнорироваться", СтатусСообщения.Информация); КонецЕсли; ФайлВнешнейОбработки = ПолучитьОбновитьФайлВнешнейОбработки(); НомерСтрокиВАлгоритме = ПолеВстроенногоЯзыка.ПолучитьНомерТекущейСтроки(); НомерСтрокиВМодуле = НомерСтрокиВАлгоритме + СтартоваяСтрока; Если ФайлВнешнейОбработки <> Неопределено Тогда ИдентификаторПроцессаОтладчика = ирНеглобальный.ПроверитьЗапуститьОтладчик(); Если ИдентификаторПроцессаОтладчика = Неопределено Тогда ИдентификаторПроцессаОтладчика = 0; КонецЕсли; мПлатформа.ОткрытьМодульВнешнейОбработкиВОтладчике(ФайлВнешнейОбработки.ПолноеИмя, НомерСтрокиВМодуле, ИдентификаторПроцессаОтладчика); КонецЕсли; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкРежимВнешнейОбработки(Кнопка = Неопределено) Кнопка = ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.РежимВнешнейОбработки; ЭтаФорма.РежимВнешнейОбработки = Не Кнопка.Пометка; Кнопка.Пометка = РежимВнешнейОбработки; ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ВыполнятьНаСервере.Доступность = Не РежимВнешнейОбработки; //ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ОткрытьВОтладчике.Доступность = РежимВнешнейОбработки; КонецПроцедуры Процедура КоманднаяПанельПараметрыНовоеОкно(Кнопка) ОткрытьФорму("ОбщаяФорма.ирКонсольКода",,, Новый УникальныйИдентификатор); КонецПроцедуры Процедура ПараметрыПредставлениеЗначенияНачалоВыбора(Элемент, СтандартнаяОбработка) ирНеглобальный.ПолеВводаРасширенногоЗначения_НачалоВыбораЛкс(ЭлементыФормы.Параметры, СтандартнаяОбработка, ЭлементыФормы.Параметры.ТекущаяСтрока.Значение); ОбновитьПредставлениеИТипЗначенияВСтроке(); КонецПроцедуры Процедура ОсновныеДействияФормыЗагрузить(Кнопка) РезультатВыбора = ЛксВыбратьСсылку(Метаданные.Справочники.ирАлгоритмы, ТекущийАлгоритм); Если Не ЗначениеЗаполнено(РезультатВыбора) Тогда Возврат; КонецЕсли; ТекущийАлгоритм = РезультатВыбора; #Если _ Тогда ТекущийАлгоритм = Справочники.ирАлгоритмы.ПустаяСсылка(); #КонецЕсли ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.УстановитьТекст(ТекущийАлгоритм.ТекстАлгоритма); Если Параметры.Количество() > 0 Тогда Ответ = Вопрос("Очистить параметры перед загрузкой?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда Параметры.Очистить(); КонецЕсли; КонецЕсли; Для Каждого СтрокаПараметраАлгоритма Из ТекущийАлгоритм.Параметры Цикл СтрокаПараметраКонсоли = Параметры.Найти(СтрокаПараметраАлгоритма.Имя, "Имя"); Если СтрокаПараметраКонсоли = Неопределено Тогда СтрокаПараметраКонсоли = Параметры.Добавить(); СтрокаПараметраКонсоли.Имя = СтрокаПараметраАлгоритма.Имя; СтрокаПараметраКонсоли.НИмя = НРег(СтрокаПараметраКонсоли.Имя); КонецЕсли; ЗаполнитьЗначенияСвойств(СтрокаПараметраКонсоли, СтрокаПараметраАлгоритма); ЗначениеИзХранилища = СтрокаПараметраАлгоритма.ЗначениеХранилище.Получить(); Если ЗначениеИзХранилища <> Неопределено Тогда СтрокаПараметраКонсоли.Значение = ЗначениеИзХранилища; КонецЕсли; ОбновитьПредставлениеИТипЗначенияВСтроке(СтрокаПараметраКонсоли); КонецЦикла; ЭтаФорма.Модифицированность = Ложь; КонецПроцедуры Процедура КоманднаяПанельПараметрыМенеджерТабличногоПоля(Кнопка) Обработки.ирМенеджерТабличногоПоля.ПолучитьФорму(, ЭтаФорма, ).УстановитьСвязь(ЭлементыФормы.Параметры); КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкЗамерВремени(Кнопка) Кнопка.Пометка = Не Кнопка.Пометка; ЛиЗамерВремени = Кнопка.Пометка; КонецПроцедуры Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если ЭтаФорма.Модифицированность Тогда Ответ = Вопрос("Данные в форме были изменены. Закрыть форму?", РежимДиалогаВопрос.ОКОтмена); Отказ = Ответ <> КодВозвратаДиалога.ОК; КонецЕсли; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкВозврат(Кнопка) ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "Перейти ~Конец;"; КонецПроцедуры Процедура КоманднаяПанельПараметрыОткрытьФайл(Кнопка) ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбораФайла.Заголовок = "Выберите файл для загрузки"; ДиалогВыбораФайла.Фильтр = ирНеглобальный.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс("f1c", "Файлы консоли кода"); ДиалогВыбораФайла.Расширение = "f1c"; Если ДиалогВыбораФайла.Выбрать() Тогда ЗагрузитьИзФайла(ДиалогВыбораФайла.ПолноеИмяФайла); КонецЕсли; КонецПроцедуры Процедура ЗагрузитьИзФайла(ИмяФайла) Попытка ДанныеФайла = ЗначениеИзФайла(ИмяФайла); Исключение Предупреждение("Неправильный файл"); Возврат; КонецПопытки; ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.УстановитьТекст(ДанныеФайла.Текст); Параметры = ДанныеФайла.Параметры; КонецПроцедуры Процедура КоманднаяПанельПараметрыСохранитьФайл(Кнопка) СохранитьВФайл(); КонецПроцедуры Процедура СохранитьВФайл(ИмяФайла = "") ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); ДиалогВыбораФайла.Заголовок = "Выберите файл для сохранения"; ДиалогВыбораФайла.Фильтр = ирНеглобальный.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс("f1c", "Файлы консоли кода"); ДиалогВыбораФайла.Расширение = "f1c"; ДанныеДляФайла = Новый Структура(); ДанныеДляФайла.Вставить("Текст", ПолеВстроенногоЯзыка.ПолеТекстовогоДокумента.ПолучитьТекст()); ДанныеДляФайла.Вставить("Параметры", Параметры); ЗапрашиватьИмяФайла = Не ЗначениеЗаполнено(ИмяФайла); ФайлВыбран = ирНеглобальный.СохранитьФайлВКонсолиСВосстановлениемЛкс(ДиалогВыбораФайла, ИмяФайла, , ДанныеДляФайла, мСтруктураВосстановления, ЗапрашиватьИмяФайла); КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкВыполнитьАнализТрассы(Кнопка) Если мАнализТехножурнала <> Неопределено Тогда мАнализТехножурнала.ПоказатьТрассу(,,, 0); КонецЕсли; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкНачалоЗамера(Кнопка) ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "ЛксНачатьЗамер(); |"; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкКонецЗамера(Кнопка) ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "ЛксКончитьЗамер(); |"; КонецПроцедуры Процедура КоманднаяПанельВстроенныйЯзыкАдаптироватьТекстИзМодуля(Кнопка) ТекстАлгоритма = ЭлементыФормы.ВстроенныйЯзык.ПолучитьТекст(); ТекстАлгоритма = ЗаменитьВозвратыНаПерейтиВТекстеМетода1С(ТекстАлгоритма); ЭлементыФормы.ВстроенныйЯзык.УстановитьТекст(ТекстАлгоритма); КонецПроцедуры Функция ЗаменитьВозвратыНаПерейтиВТекстеМетода1С(Знач Текст) Экспорт ОбработкаРегулярныхВыражений = мПлатформа.RegExp; ОбработкаРегулярныхВыражений.Global = Истина; ОбработкаРегулярныхВыражений.MultiLine = Истина; // Шаблон тут можно улучшить конечно ОбработкаРегулярныхВыражений.Pattern = "((?:^|\n|\r)(?:\t| )*)Возврат(?:\t| )+(\s*[^\r;]+)(\r|;)"; Текст = ОбработкаРегулярныхВыражений.Replace(Текст, "$1Результат = $2;" + Символы.ПС + "$1Перейти ~Конец$3"); ОбработкаРегулярныхВыражений.Pattern = "((?:^|\n|\r)(?:\t| )*)Возврат(?:\t| )*(\n|\r|;)"; Текст = ОбработкаРегулярныхВыражений.Replace(Текст, "$1Перейти ~Конец$2"); //Вхождения = ОбработкаРегулярныхВыражений.Execute(Текст); //Для Каждого Вхождение Из Вхождения Цикл // СтрокаЗамены = ""; // Если Вхождение.SubMatches(1) <> Неопределено Тогда // СтрокаЗамены = СтрокаЗамены + Вхождение.SubMatches(0) + "Результат = " + Вхождение.SubMatches(1) + ";"; // КонецЕсли; // //СтрокаЗамены = СтрокаЗамены + Вхождение.SubMatches(0) + "Перейти ~Конец"; // СтрокаЗамены = СтрокаЗамены + " Перейти ~Конец"; // Текст = СтрЗаменить(Текст, Вхождение.Value, СтрокаЗамены); //КонецЦикла; Результат = Текст; Возврат Результат; КонецФункции мПлатформа = ирКэш.Получить(); НаСервере = Ложь; РежимВнешнейОбработки = Ложь; ДатаИзмененияВнешнейОбработки = Дата("00010101"); ДатаИзмененияВнешнейОбработки = ТекущаяДата() + 100000; АвтоПараметрыВыхода = ЭтаФорма.ЭлементыФормы.КоманднаяПанельПараметры.Кнопки.АвтоПараметрыВыхода.Пометка; // В управляемом приложении даже в файловой базе есть контекст сервера //ЭтаФорма.ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ВыполнятьНаСервере.Доступность = Не мПлатформа.ЭтоФайловаяБаза; Параметры.Колонки.Добавить("Значение"); Параметры.Колонки.Добавить("НИмя"); мСписокВнешнихПараметров = Новый СписокЗначений; ИмяВнешнейОбработки = "DynamicExternalProcessorOfCodeConsole"; ФайлВнешнейОбработки = Новый Файл(мПлатформа.КаталогФайловогоКэша + "\" + ИмяВнешнейОбработки + ".epf"); мПлатформа.ПолучитьФайлОткрывателя1С(); мСтруктураВосстановления = ирНеглобальный.ПолучитьСтруктуруВосстановленияКонсолиЛкс("irCodeConsole");