RDT1C/CommonForms/ирКонсольКода/Ext/Form/Module.bsl
2016-12-04 00:14:16 +03:00

862 lines
57 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

Перем мСписокВнешнихПараметров Экспорт;
Перем КоличествоВнешнихПараметров;
Перем ТекстМодуляТекущейВнешнейОбработки;
Перем ФайлВнешнейОбработки;
Перем ИмяВнешнейОбработки;
Перем ВнешняяОбработка;
Перем СтартоваяСтрока;
Перем ДатаИзмененияВнешнейОбработки;
Перем НаСервере Экспорт;
Перем РежимВнешнейОбработки Экспорт;
Перем АвтоПараметрыВыхода Экспорт;
Перем мСтруктураВосстановления;
Перем мАнализТехножурнала;
Перем мПлатформа;
// @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой
// Транслятор обработки событий нажатия на кнопки командной панели в компоненту.
// Является обязательным.
//
// Параметры:
// Кнопка КнопкаКоманднойПанели.
//
Процедура КлсПолеТекстовогоДокументаСКонтекстнойПодсказкойНажатие(Кнопка)
ИнициализироватьГлобальныйКонтекстПодсказки(ПолеВстроенногоЯзыка);
Попытка
Выполнить("Ядро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");