// +++.КЛАСС.ПолеТекстаПрограммы
Перем ПолеТекстаПрограммы;
// ---.КЛАСС.ПолеТекстаПрограммы

Перем мТекущийНаборПолей;
Перем мТекущийШаблон;
Перем мДоступныеПрава;

// @@@.КЛАСС.ПолеТекстаПрограммы
Функция КлсПолеТекстаПрограммыОбновитьКонтекст(Знач Компонента = Неопределено, Знач Кнопка = Неопределено) Экспорт 
	#Если Сервер И Не Сервер Тогда
	    Компонента = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	КомпонентаТекстОграничения = ПолеТекстаПрограммы.ТекстОграничения;
	КомпонентаТекстШаблона = ПолеТекстаПрограммы.ТекстШаблона;
	Компонента.ОчиститьТаблицуСловЛокальногоКонтекста();
	Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
		Если ирОбщий.ЛиКорневойТипКонстантыЛкс(ирОбщий.ПервыйФрагментЛкс(ФункциональнаяОпция.Хранение.ПолноеИмя())) Тогда
			Компонента.ДобавитьСловоЛокальногоКонтекста("&" + ФункциональнаяОпция.Имя,, ФункциональнаяОпция.Хранение.Тип);
		КонецЕсли; 
	КонецЦикла;
	Для Каждого ПараметрСеанса Из Метаданные.ПараметрыСеанса Цикл
		Компонента.ДобавитьСловоЛокальногоКонтекста("&" + ПараметрСеанса.Имя,, ПараметрСеанса.Тип);
	КонецЦикла;
	Если Ложь
		Или Компонента = КомпонентаТекстОграничения
		Или Компонента = КомпонентаТекстШаблона
	Тогда
		Если Компонента = КомпонентаТекстШаблона Тогда
			Компонента.ДобавитьСловоЛокальногоКонтекста("#Параметр");
		КонецЕсли; 
		Компонента.ДобавитьСловоЛокальногоКонтекста("#ИмяТекущегоПраваДоступа");
		Компонента.ДобавитьСловоЛокальногоКонтекста("#ИмяТекущейТаблицы");
		Компонента.ДобавитьСловоЛокальногоКонтекста("#ТекущаяТаблица");
	КонецЕсли; 
	Если Компонента = КомпонентаТекстОграничения Тогда
		Для Каждого СтрокаШаблона Из Шаблоны Цикл
			Компонента.ДобавитьСловоЛокальногоКонтекста("#" + СтрокаШаблона.Имя, "Метод");
		КонецЦикла;
	КонецЕсли; 
КонецФункции

// @@@.КЛАСС.ПолеТекстаПрограммы
// Транслятор обработки событий нажатия на кнопки командной панели в компоненту.
//
// Параметры:
//  Кнопка       - КнопкаКоманднойПанели.
//
Процедура КлсПолеТекстаПрограммыНажатие(Кнопка)
	
	// Специальная обработка команд компоненты ДО
	Компонента = ПолучитьТекущуюКомпонентуКонтекстнойПодсказки(Кнопка);
	КомпонентаТекстОграничения = ПолеТекстаПрограммы.ТекстОграничения;
	КомпонентаТекстПослеЗаменыШаблонов = ПолеТекстаПрограммы.ТекстПослеЗаменыШаблонов;
	#Если Сервер И Не Сервер Тогда
	    КомпонентаТекстОграничения = Обработки.ирКлсПолеТекстаПрограммы.Создать();
		Компонента = КомпонентаТекстОграничения;
	#КонецЕсли
	Если Кнопка = ирКлиент.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(КомпонентаТекстОграничения, "ПодсказатьПараметр") Тогда
		КонтекстПараметра = КомпонентаТекстОграничения.ПолучитьТекущийКонтекстПараметра();
		ОбъектноеВыражение = КонтекстПараметра.ОбъектноеВыражение;
		// Пока не стал ломать шаблоны разбора выражений языка запросов ради префикса #
		//ПрефиксКодовогоСлова = "#";
		//Если Лев(ОбъектноеВыражение, 1) = ПрефиксКодовогоСлова Тогда
		//	ОбъектноеВыражение = Сред(ОбъектноеВыражение, СтрДлина(ПрефиксКодовогоСлова) + 1);
			СтрокаШаблона = Шаблоны.Найти(НРег(ирОбщий.ПервыйФрагментЛкс(ОбъектноеВыражение, "(")), "НИмя");
			Если СтрокаШаблона <> Неопределено Тогда
				ЭлементыФормы.Шаблоны.ТекущаяСтрока = СтрокаШаблона;
				СтрокаПараметра = ПараметрыШаблона.Найти(КонтекстПараметра.НомерПараметра, "Имя");
				Если СтрокаПараметра = Неопределено И ПараметрыШаблона.Количество() >= КонтекстПараметра.НомерПараметра Тогда
					СтрокаПараметра = ПараметрыШаблона[КонтекстПараметра.НомерПараметра - 1];
				КонецЕсли; 
				Если СтрокаПараметра <> Неопределено Тогда
					ЭлементыФормы.ПараметрыШаблона.ТекущаяСтрока = СтрокаПараметра;
					НайтиПоказатьПараметрШаблона(СтрокаПараметра);
					ЭтаФорма.ТекущийЭлемент = КомпонентаТекстОграничения.ПолеТекста;
				КонецЕсли; 
			КонецЕсли; 
			Возврат;
		//КонецЕсли; 
	КонецЕсли;
	Если Ложь
		Или Кнопка = ирКлиент.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(КомпонентаТекстОграничения, "ПерейтиКОпределению") 
		Или Кнопка = ирКлиент.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(КомпонентаТекстПослеЗаменыШаблонов, "ПерейтиКОпределению")
	Тогда
		ОбъектноеВыражение = Компонента.ТекущееОбъектноеВыражение();
		Если Компонента = КомпонентаТекстОграничения Тогда
			ПрефиксКодовогоСлова = "#";
			Если Лев(ОбъектноеВыражение, 1) = ПрефиксКодовогоСлова Тогда
				ОбъектноеВыражение = Сред(ОбъектноеВыражение, СтрДлина(ПрефиксКодовогоСлова) + 1);
				СтрокаШаблона = Шаблоны.Найти(НРег(ирОбщий.ПервыйФрагментЛкс(ОбъектноеВыражение, "(")), "НИмя");
				Если СтрокаШаблона <> Неопределено Тогда
					ЭлементыФормы.Шаблоны.ТекущаяСтрока = СтрокаШаблона;
					Возврат;
				КонецЕсли; 
			КонецЕсли; 
		ИначеЕсли Компонента = КомпонентаТекстПослеЗаменыШаблонов Тогда
			ОбъектноеВыражение = Компонента.ТекущееОбъектноеВыражение();
			ПрефиксКодовогоСлова = "&";
			Если Лев(ОбъектноеВыражение, 1) = ПрефиксКодовогоСлова Тогда
				ОбъектноеВыражение = Сред(ОбъектноеВыражение, СтрДлина(ПрефиксКодовогоСлова) + 1);
				СтрокаПараметра = ТаблицаПараметров.Найти(НРег(ОбъектноеВыражение), "НИмя");
				Если СтрокаПараметра <> Неопределено Тогда
					ЭлементыФормы.ТаблицаПараметров.ТекущаяСтрока = СтрокаПараметра;
					Возврат;
				КонецЕсли; 
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли;
	//Если Кнопка = ирКлиент.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(КомпонентаТекстШаблона, "ПерейтиКОпределению") Тогда
	//	ОбъектноеВыражение = КомпонентаТекстОграничения.ТекущееОбъектноеВыражение();
	//	СтрокаПараметра = ПараметрыШаблона.Найти(НРег(ОбъектноеВыражение), "НИмя");
	//	Если СтрокаПараметра <> Неопределено Тогда
	//		ЭлементыФормы.ПараметрыШаблона.ТекущаяСтрока = СтрокаПараметра;
	//	КонецЕсли; 
	//	Возврат;
	//КонецЕсли;
	КлсПолеТекстаПрограммыОбновитьКонтекст(Компонента, Кнопка);
	Если Компонента <> Неопределено Тогда
		Результат = Компонента.Нажатие(Кнопка);
	КонецЕсли;
	
КонецПроцедуры

// @@@.КЛАСС.ПолеТекстаПрограммы
Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	Если ПолеТекстаПрограммы = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Компонента = ПолучитьТекущуюКомпонентуКонтекстнойПодсказки();
	#Если Сервер И Не Сервер Тогда
	    Компонента = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	Компонента.ВнешнееСобытиеОбъекта(Источник, Событие, Данные);
	
КонецПроцедуры

Функция ПолучитьТекущуюКомпонентуКонтекстнойПодсказки(Кнопка = Неопределено)

	Если ПолеТекстаПрограммы.Свойство(ТекущийЭлемент.Имя) Тогда
		ЭкземплярКомпоненты = ПолеТекстаПрограммы[ТекущийЭлемент.Имя];
	Иначе
		ЭкземплярКомпоненты = ПолеТекстаПрограммы.ТекстОграничения;
	КонецЕсли;
	Возврат ЭкземплярКомпоненты;

КонецФункции

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	
	// +++.КЛАСС.ПолеТекстаПрограммы
	ПолеТекстаПрограммы = Новый Структура;
	лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
	#Если Сервер И Не Сервер Тогда
		лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	лПолеТекстаПрограммы.Инициализировать(ПолеТекстаПрограммы, ЭтаФорма, ЭлементыФормы.ТекстОграничения,, 1);
	лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
	#Если Сервер И Не Сервер Тогда
		лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	лПолеТекстаПрограммы.Инициализировать(ПолеТекстаПрограммы, ЭтаФорма, ЭлементыФормы.ТекстШаблона,, 1);
	лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
	#Если Сервер И Не Сервер Тогда
		лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	лПолеТекстаПрограммы.Инициализировать(ПолеТекстаПрограммы, ЭтаФорма, ЭлементыФормы.ТекстПослеЗаменыШаблонов,, 1);
	// ---.КЛАСС.ПолеТекстаПрограммы
	
	мДоступныеПрава = ирОбщий.ПраваСОграничениямиДоступаКДаннымЛкс();
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(ЭлементыФормы.Роль, ЭтаФорма);
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(ЭлементыФормы.ТаблицаБД, ЭтаФорма);
	ПрочитатьОграниченияИлиОчистить();
	
КонецПроцедуры

Процедура ПрочитатьОграниченияИлиОчистить()
	
	Если ЗначениеЗаполнено(Роль) Тогда 
		ДействияФормыПеречитать();
	Иначе
		Шаблоны.Очистить();
		ЭлементыФормы.ТекстШаблона.Очистить();
		ПараметрыШаблона.Очистить();
		НаборыПолей.Очистить();
		ТаблицаПараметров.Очистить();
		ЭлементыФормы.ТекстПослеЗаменыШаблонов.Очистить();
		ЭлементыФормы.ТекстОграничения.Очистить();
	КонецЕсли;
	СписокВыбора = ЭлементыФормы.Право.СписокВыбора;
	СписокВыбора.Очистить();
	Для Каждого ЭлементСписка Из мДоступныеПрава Цикл
		СписокВыбора.Добавить(ЭлементСписка.Значение);
	КонецЦикла;
	НастроитьЭлементыФормы();

КонецПроцедуры

Функция ДействияФормыПеречитать(Кнопка = Неопределено)
	
	Если Не мПроверитьМодифицированность() Тогда
		Возврат Ложь;
	КонецЕсли;
	мТекущийНаборПолей = Неопределено;
	ЭлементыФормы.ТекстПослеЗаменыШаблонов.Очистить();
	ЭлементыФормы.ТекстОграничения.Очистить();
	НаборыПолей.Очистить();
	ТаблицаПараметров.Очистить();
	Если Не ЗначениеЗаполнено(ТаблицаБД) Тогда
		Возврат Ложь;
	КонецЕсли;
	ЭтаФорма.Модифицированность = Ложь;
	ПолноеИмяМДАнгл = ирОбщий.ПеревестиПолноеИмяМДВАнглийскийЛкс(ТаблицаБД);
	ФайлРоли = ФайлРоли();
	#Если Сервер И Не Сервер Тогда
		ФайлРоли = Новый файл;
	#КонецЕсли
	Если Не ФайлРоли.Существует() Тогда
		ирОбщий.СообщитьЛкс("В кэше ролей не обнаружен файл роли """ + Роль + """. Необходимо обновить кэш ролей.");
		Возврат Ложь;
	КонецЕсли; 
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ФайлРоли.ПолноеИмя);
	ДокументДом = ирОбщий.ТекстВДокументDOMЛкс(ТекстовыйДокумент.ПолучитьТекст());
	#Если Сервер И Не Сервер Тогда
		ДокументДом = Новый ДокументDOM;
	#КонецЕсли
	// https://infostart.ru/public/280340/
	Разыменователь = Новый РазыменовательПространствИменDOM("s", ДокументДом.ЭлементДокумента.URIПространстваИмен);
	
	Если ЭлементыФормы.Шаблоны.ТекущаяСтрока <> Неопределено Тогда
		СтарыйИДШаблона = ЭлементыФормы.Шаблоны.ТекущаяСтрока.Имя;
	КонецЕсли; 
	мТекущийШаблон = Неопределено;
	Шаблоны.Очистить();
	СтрокаЗапроса = "//s:restrictionTemplate";
	Результат = ДокументДом.ВычислитьВыражениеXPath(СтрокаЗапроса, ДокументДом, Разыменователь, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
	Пока Истина Цикл
		УзелШаблона = Результат.ПолучитьСледующий();
		Если УзелШаблона = Неопределено Тогда
			Прервать;
		КонецЕсли; 
		Шаблон = Шаблоны.Добавить();
		Шаблон.Определение = УзелШаблона.ПолучитьЭлементыПоИмени("name")[0].ТекстовоеСодержимое;
		Шаблон.Имя = ирОбщий.ПервыйФрагментЛкс(Шаблон.Определение, "(");
		ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(Шаблон);
		Шаблон.Текст = УзелШаблона.ПолучитьЭлементыПоИмени("condition")[0].ТекстовоеСодержимое;
		Если Шаблон.Имя = СтарыйИДШаблона Тогда
			ЭлементыФормы.Шаблоны.ТекущаяСтрока = Шаблон;
		КонецЕсли; 
	КонецЦикла; 
	Шаблоны.Сортировать("Имя");
	Если ЭлементыФормы.Шаблоны.ТекущаяСтрока = Неопределено И Шаблоны.Количество() > 0 Тогда
		ЭлементыФормы.Шаблоны.ТекущаяСтрока = Шаблоны[0];
	КонецЕсли; 
	
	Если ЭлементыФормы.НаборыПолей.ТекущаяСтрока <> Неопределено Тогда
		СтарыйИДНабора = ЭлементыФормы.НаборыПолей.ТекущаяСтрока.Имя;
	КонецЕсли; 
	Если ЗначениеЗаполнено(Право) Тогда
		ИмяПраваАнгл = мДоступныеПрава.НайтиПоЗначению(Право).Представление;
		СтрокаЗапроса = "//s:object/s:name[1][text()='" + ПолноеИмяМДАнгл + "']/../s:right/s:name[1][text()='" + ИмяПраваАнгл + "']/following-sibling::s:restrictionByCondition";
		Результат = ДокументДом.ВычислитьВыражениеXPath(СтрокаЗапроса, ДокументДом, Разыменователь, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
		Пока Истина Цикл
			УзелНабораПолей = Результат.ПолучитьСледующий();
			Если УзелНабораПолей = Неопределено Тогда
				Прервать;
			КонецЕсли; 
			Поля = Новый СписокЗначений;
			Для Каждого УзелПоля Из УзелНабораПолей.ПолучитьЭлементыПоИмени("field") Цикл
				#Если Сервер И Не Сервер Тогда
					УзелПоля = ДокументДом.СоздатьЭлемент();
				#КонецЕсли
				Поля.Добавить(ирОбщий.ПеревестиВРусский(УзелПоля.ТекстовоеСодержимое));
			КонецЦикла;
			Поля.СортироватьПоЗначению();
			Идентификатор = "" + Поля;
			НаборПолей = НаборыПолей.Добавить();
			НаборПолей.Поля = Поля;
			НаборПолей.Имя = Идентификатор;
			НаборПолей.Текст = УзелНабораПолей.ПолучитьЭлементыПоИмени("condition")[0].ТекстовоеСодержимое;
			Если Идентификатор = СтарыйИДНабора Тогда
				ЭлементыФормы.НаборыПолей.ТекущаяСтрока = Шаблон;
			КонецЕсли; 
		КонецЦикла; 
		НаборыПолей.Сортировать("Поля");
		Если ЭлементыФормы.НаборыПолей.ТекущаяСтрока = Неопределено И НаборыПолей.Количество() > 0 Тогда
			ЭлементыФормы.НаборыПолей.ТекущаяСтрока = НаборыПолей[0];
		КонецЕсли; 
	КонецЕсли; 
	Возврат Истина;
	
КонецФункции

Функция ФайлРоли()
	
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ФайлРоли = мПлатформа.ФайлРоли(Роль);
	Возврат ФайлРоли;

КонецФункции

Функция мПроверитьМодифицированность()
	
	Если Модифицированность Тогда
		Ответ = Вопрос("При продолжении все изменения будут потеряны. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
	Иначе
		Ответ = КодВозвратаДиалога.ОК;
	КонецЕсли; 
	Результат = Ответ = КодВозвратаДиалога.ОК;
	Возврат Результат;

КонецФункции

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	
	Отказ = Не мПроверитьМодифицированность();

КонецПроцедуры

Процедура НаборыПолейПриАктивизацииСтроки(Элемент = Неопределено)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	Если мТекущийНаборПолей <> Неопределено Тогда
		ирОбщий.ПрисвоитьЕслиНеРавноЛкс(мТекущийНаборПолей.Текст, ЭлементыФормы.ТекстОграничения.ПолучитьТекст(), мТекущийНаборПолей.Изменено);
	КонецЕсли; 
	мТекущийНаборПолей = ЭлементыФормы.НаборыПолей.ТекущаяСтрока;
	Если мТекущийНаборПолей <> Неопределено Тогда
		ЭлементыФормы.ТекстОграничения.УстановитьТекст(мТекущийНаборПолей.Текст);
	Иначе
		ЭлементыФормы.ТекстОграничения.Очистить();
	КонецЕсли; 
	ЭлементыФормы.ПанельЗапроса.ТекущаяСтраница = ЭлементыФормы.ПанельЗапроса.Страницы.ТекстОграничения;
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура ШаблоныПриАктивизацииСтроки(Элемент = Неопределено)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	СохранитьШаблонВТаблицу();
	мТекущийШаблон = ЭлементыФормы.Шаблоны.ТекущаяСтрока;
	Если мТекущийШаблон <> Неопределено Тогда
		ЭлементыФормы.ТекстШаблона.УстановитьТекст(мТекущийШаблон.Текст);
		ЗаполнитьПараметрыШаблона();
	Иначе
		ЭлементыФормы.ТекстШаблона.Очистить();
		ПараметрыШаблона.Очистить();
	КонецЕсли; 
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура СохранитьШаблонВТаблицу()
	
	Если мТекущийШаблон <> Неопределено Тогда
		ирОбщий.ПрисвоитьЕслиНеРавноЛкс(мТекущийШаблон.Текст, ЭлементыФормы.ТекстШаблона.ПолучитьТекст(), мТекущийШаблон.Изменено);
	КонецЕсли;

КонецПроцедуры

Процедура ЗаполнитьПараметрыШаблона()
	
	ПараметрыШаблона.Очистить();
	ТекстШаблона = ЭлементыФормы.ТекстШаблона.ПолучитьТекст();
	Вхождения = ирОбщий.НайтиРегВыражениеЛкс(ТекстШаблона, "#Параметр\((\d+)\)");
	СоответствиеПараметров = Новый Соответствие;
	Для Каждого Вхождение Из Вхождения Цикл
		СоответствиеПараметров.Вставить(Число(Вхождение.Подгруппа0), ВхождениеСОкружением(Вхождение, ТекстШаблона));
	КонецЦикла;
	Для Каждого КлючИЗначение Из СоответствиеПараметров Цикл
		СтрокаПараметра = ПараметрыШаблона.Добавить();
		СтрокаПараметра.Имя = КлючИЗначение.Ключ;
		СтрокаПараметра.ПоследнееИспользование = КлючИЗначение.Значение;
	КонецЦикла;
	ПараметрыШаблона.Сортировать("Имя");
	НомерПараметра = 1;
	ТекстПараметров = ирОбщий.ТекстМеждуМаркерамиЛкс(мТекущийШаблон.Определение, "(", ")", Ложь);
	Если ЗначениеЗаполнено(ТекстПараметров) Тогда
		Для Каждого Фрагмент Из ирОбщий.СтрРазделитьЛкс(ТекстПараметров, ",", Истина) Цикл
			СтрокаПараметра = ПараметрыШаблона.Найти(НомерПараметра, "Имя");
			Если СтрокаПараметра = Неопределено Тогда
				СтрокаПараметра = ПараметрыШаблона.Вставить(НомерПараметра - 1);
				ШаблонПоискаСловаЦеликом = ирОбщий.ШаблонПоискаСловаЛкс("#" + Фрагмент);
				Вхождения = ирОбщий.НайтиРегВыражениеЛкс(ТекстШаблона, ШаблонПоискаСловаЦеликом);
				Если Вхождения.Количество() > 0 Тогда 
					ПоследнееВхождение = Вхождения[Вхождения.Количество() - 1];
					СтрокаПараметра.ПоследнееИспользование = ВхождениеСОкружением(ПоследнееВхождение, ТекстШаблона);
				КонецЕсли; 
			КонецЕсли; 
			СтрокаПараметра.Имя = Фрагмент;
			НомерПараметра = НомерПараметра + 1;
		КонецЦикла;
	КонецЕсли; 

КонецПроцедуры

Функция ВхождениеСОкружением(Знач Вхождение, Знач ТекстШаблона)
	
	#Если Сервер И Не Сервер Тогда
	    Вхождение = Обработки.ирПлатформа.Создать().ВхожденияРегВыражения.Добавить();
	#КонецЕсли
	Возврат "..." + Сред(ТекстШаблона, Макс(1, Вхождение.ПозицияВхождения - 100), Вхождение.ДлинаВхождения + 200) + "...";

КонецФункции

Процедура НаборыПолейПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	Если ДанныеСтроки.Поля.Количество() = 0 Тогда
		ОформлениеСтроки.Ячейки.Поля.УстановитьТекст("<Прочие поля>");
	КонецЕсли; 
	
КонецПроцедуры

Процедура ДействияФормыСобратьЗапрос(Кнопка)
	
	ОбновитьТекстПослеЗаменыШаблонов();
	ирОбщий.СостояниеЛкс("Сборка запроса", Истина);
	Текст = ЭлементыФормы.ТекстПослеЗаменыШаблонов.ПолучитьТекст();
	ВычислениеКонструкцийСтрСодержит(Текст, ТаблицаПараметров);
	ВычислитьВсеИнструкцииПрепроцессора(Текст, ТаблицаПараметров);
	УдалитьИзТекстаПустыеСтроки(Текст);
	Текст = СокрЛП(Текст);
	мПлатформа = ирКэш.Получить();
	ВычислительРегВыражений = ирКэш.ВычислительРегВыраженийЛкс();
	#Если Сервер И Не Сервер Тогда
		ВычислительРегВыражений = Обработки.ирОболочкаРегВыражение.Создать();
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ВычислительРегВыражений.Multiline = Ложь;
	ВычислительРегВыражений.IgnoreCase = Истина;
	ВычислительРегВыражений.Global = Ложь;
	// Вариант 1
	// ТекущаяТаблица
	// ИЗ
	//    РегистрНакопления.ВзаиморасчетыУСН КАК ТекущаяТаблица
	//
	// Вариант 2
	// Т ИЗ Т
	// ЛЕВОЕ СОЕДИНЕНИЕ
	//
	// Вариант 3
	// ТекущаяТаблица
	// ГДЕ
	//
	// Вариант 4
	// ГДЕ ЛОЖЬ
	ВычислительРегВыражений.Pattern = "(\n|^)\s*(?:(" + мПлатформа.шИмя + ")\s+ИЗ\s+(?:" + мПлатформа.шИмя + "(?:\." + мПлатформа.шИмя + ")+\s+КАК\s+)?(" + мПлатформа.шИмя + ")\s|(" + мПлатформа.шИмя + ")(?=\s+ГДЕ\s))";
	РезультатПоиска = ВычислительРегВыражений.НайтиВхождения(Текст);
	Если РезультатПоиска.Количество() > 0 Тогда
		ТекстЗамены = "$1ВЫБРАТЬ 
		|	$3$4.*
		|ИЗ " + ТаблицаБД + " КАК $3$4
		|";
		Текст = ВычислительРегВыражений.Заменить(Текст, ТекстЗамены);
	Иначе
		Текст = "ВЫБРАТЬ 
		|	ТекущаяТаблица.*
		|ИЗ " + ТаблицаБД + " КАК ТекущаяТаблица
		|" + Текст;
	КонецЕсли; 
	Запрос = Новый Запрос; 
	Запрос.Текст = Текст;
	Для Каждого СтрокаПараметра Из ТаблицаПараметров.НайтиСтроки(Новый Структура("Тип", "ПараметрСеанса")) Цикл
		Запрос.УстановитьПараметр(СтрокаПараметра.Имя, СтрокаПараметра.Значение);
	КонецЦикла;
	ирОбщий.ОтладитьЛкс(Запрос);
	
КонецПроцедуры

Процедура ОбновитьТекстПослеЗаменыШаблонов()
	
	СохранитьШаблонВТаблицу();
	Текст = ЭлементыФормы.ТекстОграничения.ПолучитьТекст();
	ЕстьШаблонВТексте = Истина;
	Пока Истина Цикл
		ЗаменитьПоследнийВызовШаблонаНаШаблон(Текст, ЕстьШаблонВТексте);
		Если Не ЕстьШаблонВТексте Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Текст = СтрЗаменить(Текст, "#ИмяТекущейТаблицы", """" + ТаблицаБД + """");
	Текст = СтрЗаменить(Текст, "#ТекущаяТаблица", ТаблицаБД);
	Текст = СтрЗаменить(Текст, "#ИмяТекущегоПраваДоступа", """" + Право + """");
	ЗаполнитьПараметрыЗапроса(Текст);
	ЭлементыФормы.ТекстПослеЗаменыШаблонов.УстановитьТекст(Текст);

КонецПроцедуры

Функция ЗаполнитьПараметрыЗапроса(ТекстЗапроса)
		
	ВнутриИмениПараметра = Ложь;
	СимволВходитВСоставСтроки = Ложь;
	ИмяПараметра = "";
	ДлинаТекстаЗапроса = СтрДлина(ТекстЗапроса);
	ИменаПараметров = Новый Структура;
	ВычислительРегулярок = Неопределено;
	Если ирКэш.РежимОтладкиЛкс() Тогда
		// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
		Для ТекущийИндексСимвола = 1 По ДлинаТекстаЗапроса Цикл
			ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);
			Если ТекущийСимвол = """" Тогда
				СимволВходитВСоставСтроки = Не СимволВходитВСоставСтроки;
				Продолжить;
			КонецЕсли;
			Если ТекущийСимвол = "&" И Не СимволВходитВСоставСтроки тогда 
				ВнутриИмениПараметра = Истина;
				Продолжить;
			КонецЕсли;
			Если ВнутриИмениПараметра И ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда
				ИмяПараметра = ИмяПараметра + ТекущийСимвол;
				Продолжить;
			КонецЕсли;
			Если ВнутриИмениПараметра И Не ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда
				Если ЗначениеЗаполнено(ИмяПараметра) Тогда
					ИменаПараметров.Вставить(ИмяПараметра);
				КонецЕсли; 
				ВнутриИмениПараметра = Ложь;
				ИмяПараметра = "";
			КонецЕсли;
		КонецЦикла;
	Иначе
		// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
		Для ТекущийИндексСимвола = 1 По ДлинаТекстаЗапроса Цикл  		ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);  		Если ТекущийСимвол = """" Тогда  			СимволВходитВСоставСтроки = Не СимволВходитВСоставСтроки;  			Продолжить;  		КонецЕсли;  		Если ТекущийСимвол = "&" И Не СимволВходитВСоставСтроки тогда  			ВнутриИмениПараметра = Истина;  			Продолжить;  		КонецЕсли;  		Если ВнутриИмениПараметра И ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда  			ИмяПараметра = ИмяПараметра + ТекущийСимвол;  			Продолжить;  		КонецЕсли;  		Если ВнутриИмениПараметра И Не ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда  			Если ЗначениеЗаполнено(ИмяПараметра) Тогда  				ИменаПараметров.Вставить(ИмяПараметра);  			КонецЕсли;  			ВнутриИмениПараметра = Ложь;  			ИмяПараметра = "";  		КонецЕсли;  	КонецЦикла;  
	КонецЕсли; 
	СтараяТаблица = ТаблицаПараметров.Скопировать();
	ТаблицаПараметров.Очистить();
	Для Каждого КлючИЗначение Из ИменаПараметров Цикл
		СтрокаПараметра = ТаблицаПараметров.Добавить();
		СтрокаПараметра.Имя = КлючИЗначение.Ключ;
		ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаПараметра);
		Если Метаданные.ПараметрыСеанса.Найти(СтрокаПараметра.Имя) <> Неопределено Тогда
			СтрокаПараметра.Тип = "ПараметрСеанса";
			СтрокаПараметра.ВычисленноеЗначение = ПараметрыСеанса[СтрокаПараметра.Имя];
		ИначеЕсли Метаданные.ФункциональныеОпции.Найти(СтрокаПараметра.Имя) <> Неопределено Тогда
			СтрокаПараметра.Тип = "ФункциональнаяОпция";
			СтрокаПараметра.ВычисленноеЗначение = ПолучитьФункциональнуюОпцию(СтрокаПараметра.Имя);
		Иначе
			СтрокаПараметра.Тип = "НеНайден";
		КонецЕсли;
		СтараяСтрока = СтараяТаблица.Найти(СтрокаПараметра.Имя, "Имя");
		Если СтараяСтрока <> Неопределено Тогда
			СтрокаПараметра.Значение = СтараяСтрока.Значение;
		Иначе
			СтрокаПараметра.Значение = СтрокаПараметра.ВычисленноеЗначение;
		КонецЕсли; 
	КонецЦикла;
	ТаблицаПараметров.Сортировать("Имя");
	НастроитьЭлементыФормы();
	
КонецФункции

Процедура ВычислениеКонструкцийСтрСодержит(ТекстЗапроса, ТаблицаПараметров)
	
	Пока Истина Цикл
		ПозицияВхождения = Найти(ТекстЗапроса, "СтрСодержит");
		Если ПозицияВхождения = 0 Тогда
			Прервать;
		КонецЕсли;
		ДлинаТекстаЗапроса = СтрДлина(ТекстЗапроса);
		КоличествоОткрытыхСкобок = 0;
		СтрокаКонструкции = "";
		ВедемЗаписьСтрокиПараметров = Ложь;
		СтрокаПараметров = "";
		МассивПараметров = Новый Массив;
		СимволВходитВСоставСтроки = Ложь;
		Для ТекущийИндексСимвола = ПозицияВхождения По ДлинаТекстаЗапроса Цикл
			ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);
			СтрокаКонструкции = СтрокаКонструкции + ТекущийСимвол;
			Если ТекущийСимвол = """" Тогда
				СимволВходитВСоставСтроки = НЕ СимволВходитВСоставСтроки;
				Продолжить;
			КонецЕсли;
			Если ТекущийСимвол = "(" И НЕ СимволВходитВСоставСтроки тогда 
				КоличествоОткрытыхСкобок = КоличествоОткрытыхСкобок + 1;
				Если КоличествоОткрытыхСкобок = 1 Тогда
					ВедемЗаписьСтрокиПараметров = Истина;
				КонецЕсли;
				Продолжить;
			КонецЕсли;
			Если ТекущийСимвол = ")" И НЕ СимволВходитВСоставСтроки тогда 
				КоличествоОткрытыхСкобок = КоличествоОткрытыхСкобок - 1;
				Если КоличествоОткрытыхСкобок = 0 Тогда
					МассивПараметров.Добавить(СокрЛП(СтрокаПараметров));
					Прервать;
				КонецЕсли;
			КонецЕсли;
			Если ТекущийСимвол = "," И НЕ СимволВходитВСоставСтроки тогда
				МассивПараметров.Добавить(СокрЛП(СтрокаПараметров));
				СтрокаПараметров = "";
				Продолжить;
			КонецЕсли;
			Если ВедемЗаписьСтрокиПараметров Тогда
				СтрокаПараметров = СтрокаПараметров + ТекущийСимвол;
			КонецЕсли;
		КонецЦикла;
		Для Каждого СтрокаТаблицыПараметров Из ТаблицаПараметров Цикл
			Для Сч = 0 по 1 Цикл 
				МассивПараметров[Сч] = СтрЗаменить(МассивПараметров[Сч], "&" + СтрокаТаблицыПараметров.Имя, СтрокаТаблицыПараметров.Значение);
			КонецЦикла;
		КонецЦикла;
		Если Найти(МассивПараметров[0], МассивПараметров[1]) > 0 Тогда
			Результат = "ИСТИНА";
		Иначе
			Результат = "ЛОЖЬ";
		КонецЕсли;
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, СтрокаКонструкции, Результат);
	КонецЦикла;
	
КонецПроцедуры

Процедура ВычислитьВсеИнструкцииПрепроцессора(ТекстСИнструкциями, ТаблицаПараметров)
	
	ЕстьИнструкцияТексте = Истина;
	Пока Истина Цикл
		ВычислениеИнструкцииПрепроцессора(ТекстСИнструкциями, ЕстьИнструкцияТексте, ТаблицаПараметров);
		Если НЕ ЕстьИнструкцияТексте Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Процедура ВычислениеИнструкцииПрепроцессора(ТекстЗапроса, ЕстьИнструкцияТексте, ТаблицаПараметров)
		
	ТекстИнструкции = "";
	Если НЕ ПолучитьТекстИнструкции(ТекстЗапроса, ТекстИнструкции) Тогда
		ЕстьИнструкцияТексте = Ложь;
		Возврат;
	КонецЕсли;
	СоответствиеВложенныхИнструкцийИдентификаторам = Новый Соответствие;
	ЗаменитьВложенныеИнструкцииНаИдентификаторы(ТекстИнструкции, СоответствиеВложенныхИнструкцийИдентификаторам);
	МассивРазделителей = Новый Массив;
	МассивРазделителей.Добавить("#Если");
	МассивРазделителей.Добавить("#Тогда");
	МассивРазделителей.Добавить("#ИначеЕсли");
	МассивРазделителей.Добавить("#КонецЕсли");
	МассивРазделителей.Добавить("#Иначе");
	МассивВыражений = РазложитьСтрокуВМассивПодстрокПоМассивуРазделителей(СокрЛП(ТекстИнструкции), МассивРазделителей);
	КоличествоЭлементовЧетное = Цел(МассивВыражений.Количество() / 2) = МассивВыражений.Количество() / 2;
	СчетчикИстинногоВыражения = 0;
	ВычитаемыхСимволов = ?(КоличествоЭлементовЧетное, 2, 3);
	Для Счетчик = 1 по МассивВыражений.Количество() - ВычитаемыхСимволов Цикл 
		Если Цел(Счетчик / 2) = Счетчик / 2 Тогда
			Продолжить;
		КонецЕсли;
		ЗаменитьИдентификаторыНаТекст(МассивВыражений[Счетчик], СоответствиеВложенныхИнструкцийИдентификаторам);
		ВычислитьВсеИнструкцииПрепроцессора(МассивВыражений[Счетчик], ТаблицаПараметров);
		Для каждого СтрокаПараметра из ТаблицаПараметров Цикл 
			Если Найти(МассивВыражений[Счетчик], СтрокаПараметра.Имя) > 0 Тогда
				//СтрокаЗамены = ?(Параметр.Тип = "ПараметрСеанса", "ПараметрыСеанса[""" + Параметр.Имя + """]", "ПолучитьФункциональнуюОпцию(""" + Параметр.Имя + """)");
				СтрокаЗамены = "ТаблицаПараметров[" + ТаблицаПараметров.Индекс(СтрокаПараметра) + "].Значение";
				МассивВыражений[Счетчик] = СтрЗаменить(МассивВыражений[Счетчик], "&" + СтрокаПараметра.Имя, СтрокаЗамены);
			КонецЕсли;
		КонецЦикла;   
		НужноеУсловие = Ложь;
		Выполнить("НужноеУсловие = " + МассивВыражений[Счетчик]);
		Если НужноеУсловие Тогда
			СчетчикИстинногоВыражения = Счетчик;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	СтрокаЗамены = ?(СчетчикИстинногоВыражения > 0, МассивВыражений[СчетчикИстинногоВыражения + 1], ?(КоличествоЭлементовЧетное, "", МассивВыражений[МассивВыражений.Количество() - 2]));
	ЗаменитьИдентификаторыНаТекст(ТекстИнструкции, СоответствиеВложенныхИнструкцийИдентификаторам);
	ЗаменитьИдентификаторыНаТекст(СтрокаЗамены, СоответствиеВложенныхИнструкцийИдентификаторам);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ТекстИнструкции, СтрокаЗамены);
		
КонецПроцедуры

Процедура ЗаменитьИдентификаторыНаТекст(ТекстИнструкции, СоответствиеИнструкцийИдентификаторам)
	
	Для каждого ЭлементСоответствия из СоответствиеИнструкцийИдентификаторам Цикл 
		ТекстИнструкции = СтрЗаменить(ТекстИнструкции, ЭлементСоответствия.Ключ, ЭлементСоответствия.Значение);
	КонецЦикла;
	
КонецПроцедуры

Функция РазложитьСтрокуВМассивПодстрокПоМассивуРазделителей(Текст, МассивРазделителей)
	
	Результат = Новый Массив;
	Результат.Добавить(Текст);
	Для каждого Разделитель из МассивРазделителей Цикл 
		ПромежуточныйРезультат = Новый Массив;
		Для каждого СтрокаПромежуточногоРезультата из Результат Цикл 
			ПромежуточныйРезультатПоРазделителю = ирОбщий.СтрРазделитьЛкс(СтрокаПромежуточногоРезультата, Разделитель, Ложь, Истина);
			Для каждого Фрагмент из ПромежуточныйРезультатПоРазделителю Цикл 
				ПромежуточныйРезультат.Добавить(Фрагмент);
			КонецЦикла;
		КонецЦикла;
		Результат = ПромежуточныйРезультат;
	КонецЦикла;
	Возврат Результат;
	
КонецФункции

Процедура ЗаменитьВложенныеИнструкцииНаИдентификаторы(ТекстИнструкции, СоответствиеИнструкцийИдентификаторам)
	
	ВложеннаяИнструкция = "";
	Пока ПолучитьТекстИнструкции(ТекстИнструкции, ВложеннаяИнструкция, 2) Цикл
		ОбработкаПрерыванияПользователя();
		Идентификатор = Новый УникальныйИдентификатор;
		СоответствиеИнструкцийИдентификаторам.Вставить("" + Идентификатор, ВложеннаяИнструкция);
		ТекстИнструкции = СтрЗаменить(ТекстИнструкции, ВложеннаяИнструкция, "" + Идентификатор);  
	КонецЦикла;
	
КонецПроцедуры

Функция ПолучитьТекстИнструкции(Текст, ТекстИнструкции, НачальноеЗначениеПоиска = 1)
	
	МассивВхожденийЕсли = Новый Массив;
	Пока Истина Цикл 
		ОбработкаПрерыванияПользователя();
		ПозицияВхождения = ирОбщий.СтрНайтиЛкс(Текст, "#Если", , , НачальноеЗначениеПоиска);
		Если ПозицияВхождения = 0 Тогда
			Прервать;
		Иначе
			МассивВхожденийЕсли.Добавить(ПозицияВхождения);
		КонецЕсли;
		НачальноеЗначениеПоиска = НачальноеЗначениеПоиска + 1;
	КонецЦикла;
	Если МассивВхожденийЕсли.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	Счетчик = 1;
	МассивВхожденийКонецЕсли = Новый Массив;
	Пока Истина Цикл 
		ОбработкаПрерыванияПользователя();
		ПозицияВхождения = ирОбщий.СтрНайтиЛкс(Текст, "#КонецЕсли", , , Счетчик);
		Если ПозицияВхождения = 0 Тогда
			Прервать;
		Иначе
			МассивВхожденийКонецЕсли.Добавить(ПозицияВхождения);
		КонецЕсли;
		Счетчик = Счетчик + 1;
	КонецЦикла;
	Интервал = Новый Структура("Начало, Окончание");
	Интервал.Начало = МассивВхожденийЕсли[0];
	Для Счетчик = 0 по МассивВхожденийЕсли.Количество() - 1 Цикл 
		Интервал.Окончание = МассивВхожденийКонецЕсли[Счетчик];
		Подходит = КоличествоВхожденийВИнтервал(Интервал, МассивВхожденийЕсли) = КоличествоВхожденийВИнтервал(Интервал, МассивВхожденийКонецЕсли);
		Если Подходит Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	ТекстИнструкции = Сред(Текст, Интервал.Начало, Интервал.Окончание - Интервал.Начало + СтрДлина("#КонецЕсли"));
	Возврат Истина;
	
КонецФункции

Функция КоличествоВхожденийВИнтервал(Интервал, Массив)
	
	Количество = 0;
	Если ирКэш.РежимОтладкиЛкс() Тогда
		// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
		Для каждого Элемент из Массив Цикл
			Если Элемент > Интервал.Начало И Элемент < Интервал.Окончание Тогда
				Количество = Количество + 1;
			КонецЕсли;
		КонецЦикла;
	Иначе
		// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
		Для каждого Элемент из Массив Цикл  		Если Элемент > Интервал.Начало И Элемент < Интервал.Окончание Тогда  			Количество = Количество + 1;  		КонецЕсли;  	КонецЦикла;  
	КонецЕсли; 
	Возврат Количество;
	
КонецФункции

Процедура УдалитьИзТекстаПустыеСтроки(ТекстЗапроса)
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(ТекстЗапроса);
	КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
	Для Счетчик = 1 По КоличествоСтрок Цикл
		Индекс = КоличествоСтрок + 1 - Счетчик;
		ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Индекс);
		Если СокрЛП(ТекущаяСтрока) = "" Тогда
			ТекстовыйДокумент.УдалитьСтроку(Индекс);
		КонецЕсли;
	КонецЦикла;
	ТекстЗапроса = ТекстовыйДокумент.ПолучитьТекст();
	
КонецПроцедуры

Процедура ЗаменитьПоследнийВызовШаблонаНаШаблон(ТекстЗапроса, ЕстьШаблонВТексте)
	
	ТаблицаКодовыхСлов = Новый ТаблицаЗначений;
	ТаблицаКодовыхСлов.Колонки.Добавить("КодовоеСлово", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(200)));
	ТаблицаКодовыхСлов.Колонки.Добавить("НачалоВхождения", Новый ОписаниеТипов("Число"));
	ВедемЗаписьКодовогоСлова = Ложь;
	ТекущийСимволВходитВСоставСтроки = Ложь;
	КодовоеСлово = "";
	НачалоВхождения = 0;
	ДлинаТекстаЗапроса = СтрДлина(ТекстЗапроса);
	ВычислительРегулярок = Неопределено;
	
	Если ирКэш.РежимОтладкиЛкс() Тогда
		// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
		Для ТекущийИндексСимвола = 1 По ДлинаТекстаЗапроса Цикл
			ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);
			Если ТекущийСимвол = """" Тогда
				ТекущийСимволВходитВСоставСтроки = Не ТекущийСимволВходитВСоставСтроки;
				Продолжить;
			КонецЕсли;
			Если ТекущийСимвол = "#" И Не ТекущийСимволВходитВСоставСтроки тогда 
				ВедемЗаписьКодовогоСлова = Истина;
				НачалоВхождения = ТекущийИндексСимвола;
				Продолжить;
			КонецЕсли;
			Если ВедемЗаписьКодовогоСлова И ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда
				КодовоеСлово = КодовоеСлово + ТекущийСимвол;
				Продолжить;
			КонецЕсли;
			Если ВедемЗаписьКодовогоСлова И Не ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда
				НоваяСтрока = ТаблицаКодовыхСлов.Добавить();
				НоваяСтрока.КодовоеСлово = КодовоеСлово;
				НоваяСтрока.НачалоВхождения = НачалоВхождения;
				ВедемЗаписьКодовогоСлова = Ложь;
				НачалоВхождения = 0;
				КодовоеСлово = "";
			КонецЕсли;
		КонецЦикла;
	Иначе
		// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
		Для ТекущийИндексСимвола = 1 По ДлинаТекстаЗапроса Цикл  		ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);  		Если ТекущийСимвол = """" Тогда  			ТекущийСимволВходитВСоставСтроки = Не ТекущийСимволВходитВСоставСтроки;  			Продолжить;  		КонецЕсли;  		Если ТекущийСимвол = "#" И Не ТекущийСимволВходитВСоставСтроки тогда  			ВедемЗаписьКодовогоСлова = Истина;  			НачалоВхождения = ТекущийИндексСимвола;  			Продолжить;  		КонецЕсли;  		Если ВедемЗаписьКодовогоСлова И ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда  			КодовоеСлово = КодовоеСлово + ТекущийСимвол;  			Продолжить;  		КонецЕсли;  		Если ВедемЗаписьКодовогоСлова И Не ирОбщий.ЭтоКорректныйСимволИмениПеременнойЛкс(ТекущийСимвол, ВычислительРегулярок) Тогда  			НоваяСтрока = ТаблицаКодовыхСлов.Добавить();  			НоваяСтрока.КодовоеСлово = КодовоеСлово;  			НоваяСтрока.НачалоВхождения = НачалоВхождения;  			ВедемЗаписьКодовогоСлова = Ложь;  			НачалоВхождения = 0;  			КодовоеСлово = "";  		КонецЕсли;  	КонецЦикла;  
	КонецЕсли; 
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТаблицаКодовыхСлов", ТаблицаКодовыхСлов);
	Запрос.УстановитьПараметр("Шаблоны", Шаблоны.ВыгрузитьКолонку("Имя"));
	Запрос.Текст = "ВЫБРАТЬ
	|	ТаблицаКодовыхСлов.КодовоеСлово,
	|	ТаблицаКодовыхСлов.НачалоВхождения,
	|	0 КАК ОкончаниеВхождения
	|ПОМЕСТИТЬ ТаблицаКодовыхСлов
	|ИЗ
	|	&ТаблицаКодовыхСлов КАК ТаблицаКодовыхСлов
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	ТаблицаКодовыхСлов.КодовоеСлово,
	|	ТаблицаКодовыхСлов.НачалоВхождения КАК НачалоВхождения,
	|	ТаблицаКодовыхСлов.ОкончаниеВхождения,
	|	"""" КАК СтрокаПараметров
	|ИЗ
	|	ТаблицаКодовыхСлов КАК ТаблицаКодовыхСлов
	|ГДЕ ТаблицаКодовыхСлов.КодовоеСлово В(&Шаблоны)
	|
	|УПОРЯДОЧИТЬ ПО
	|	НачалоВхождения УБЫВ";
	ТаблицаКодовыхСлов = Запрос.Выполнить().Выгрузить();
	Если ТаблицаКодовыхСлов.Количество() = 0 Тогда
		ЕстьШаблонВТексте = Ложь;
		Возврат;
	КонецЕсли;
	
	СтрокаЗамены = "";
	ОткрытыхСкобок = 0;
	ТекущийСимволВходитВСоставСтроки = Ложь;
	Для ТекущийИндексСимвола = ТаблицаКодовыхСлов[0].НачалоВхождения По ДлинаТекстаЗапроса Цикл
		ТекущийСимвол = Сред(ТекстЗапроса, ТекущийИндексСимвола, 1);
		СтрокаЗамены = СтрокаЗамены + ТекущийСимвол;
		Если ТекущийСимвол = """" Тогда
			ТекущийСимволВходитВСоставСтроки = Не ТекущийСимволВходитВСоставСтроки;
			Продолжить;
		КонецЕсли;
		Если ТекущийСимвол = "(" И Не ТекущийСимволВходитВСоставСтроки Тогда
			ОткрытыхСкобок = ОткрытыхСкобок + 1;
		КонецЕсли;
		Если ТекущийСимвол = ")" И Не ТекущийСимволВходитВСоставСтроки Тогда
			ОткрытыхСкобок = ОткрытыхСкобок - 1;
			Если ОткрытыхСкобок = 0 Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ТекстШаблона = Шаблоны.Найти(НРег(ТаблицаКодовыхСлов[0].КодовоеСлово), "НИмя").Текст;
	МассивПараметров = ПолучитьМассивПараметров(СтрокаЗамены);
	Если МассивПараметров.Количество() = 0 Тогда
	Иначе
		Для Счетчик = 0 по МассивПараметров.Количество() - 1 Цикл 
			ТекстШаблона = СтрЗаменить(ТекстШаблона, "#Параметр(" + Формат(Счетчик + 1, "ЧГ=") + ")", СокрЛП(МассивПараметров[Счетчик]));
		КонецЦикла;
	КонецЕсли;
	ТекстШаблона = СтрЗаменить(ТекстШаблона, "##", "#");
	ТекстШаблона = СтрЗаменить(ТекстШаблона, "#ТекущаяТаблица", ТаблицаБД);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, СтрокаЗамены, ТекстШаблона);
	
КонецПроцедуры

Функция ПолучитьМассивПараметров(Знач СтрокаЗамены)
	
	МассивПараметров = Новый Массив;
	ТекущийСимволВходитВСоставСтроки = Ложь;
	СтрокаПараметров = "";
	ОткрытыхСкобок = 0;
	ВедемЗаписьСтрокиПараметров = Ложь;
	Для ТекущийИндексСимвола = 1 по СтрДлина(СтрокаЗамены) Цикл
		ТекущийСимвол = Сред(СтрокаЗамены, ТекущийИндексСимвола, 1);
		Если ТекущийСимвол = """" Тогда
			ТекущийСимволВходитВСоставСтроки = Не ТекущийСимволВходитВСоставСтроки;
			Продолжить;
		КонецЕсли;
		Если ТекущийСимвол = "(" И Не ТекущийСимволВходитВСоставСтроки тогда
			ОткрытыхСкобок = ОткрытыхСкобок + 1;
			ВедемЗаписьСтрокиПараметров = Истина;
			Продолжить;
		КонецЕсли;
		Если ТекущийСимвол = ")" И Не ТекущийСимволВходитВСоставСтроки Тогда
			ОткрытыхСкобок = ОткрытыхСкобок - 1;
			Если ОткрытыхСкобок = 0 Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
		Если ВедемЗаписьСтрокиПараметров Тогда
			СтрокаПараметров = СтрокаПараметров + ТекущийСимвол;
			Продолжить;
		КонецЕсли;
	КонецЦикла;	
	ТекущийПараметр = "";
	Для ТекущийИндексСимвола = 1 по СтрДлина(СтрокаПараметров) Цикл
		ТекущийСимвол = Сред(СтрокаПараметров, ТекущийИндексСимвола, 1);
		Если ТекущийСимвол = """" Тогда
			ТекущийСимволВходитВСоставСтроки = Не ТекущийСимволВходитВСоставСтроки;
			Продолжить;
		КонецЕсли;
		Если ТекущийСимвол = "," И Не ТекущийСимволВходитВСоставСтроки Тогда
			МассивПараметров.Добавить(СокрЛП(ТекущийПараметр));
			Если ТекущийИндексСимвола = СтрДлина(СтрокаПараметров) Тогда
				МассивПараметров.Добавить("");
			КонецЕсли;
			ТекущийПараметр = "";
			Продолжить;
		КонецЕсли;
		ТекущийПараметр = ТекущийПараметр + ТекущийСимвол;
		Если ТекущийИндексСимвола = СтрДлина(СтрокаПараметров) Тогда
			МассивПараметров.Добавить(СокрЛП(ТекущийПараметр));
		КонецЕсли;
	КонецЦикла;	
	Возврат МассивПараметров;
	
КонецФункции

Процедура ПанельЗапросаПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ЭлементыФормы.ПанельЗапроса.Страницы[ТекущаяСтраница] = ЭлементыФормы.ПанельЗапроса.Страницы.ТекстПослеЗаменыШаблонов Тогда
		ОбновитьТекстПослеЗаменыШаблонов();
	КонецЕсли; 

КонецПроцедуры

Процедура ПараметрыШаблонаВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	НайтиПоказатьПараметрШаблона(ВыбраннаяСтрока);
	
КонецПроцедуры

Процедура НайтиПоказатьПараметрШаблона(Знач ВыбраннаяСтрока)
	
	КомпонентаТекстШаблона = ПолеТекстаПрограммы.ТекстШаблона;
	#Если Сервер И Не Сервер Тогда
		КомпонентаТекстШаблона = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	Если Не КомпонентаТекстШаблона.НайтиПоказатьСловоВТексте("#Параметр(" + ВыбраннаяСтрока.Имя + ")", Истина) Тогда 
		КомпонентаТекстШаблона.НайтиПоказатьСловоВТексте("#" + ВыбраннаяСтрока.Имя, Истина);
	КонецЕсли; 

КонецПроцедуры

Процедура КП_ПараметрыШаблонаОбновить(Кнопка)
	
	Если мТекущийШаблон = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ЗаполнитьПараметрыШаблона();
	
КонецПроцедуры

Процедура ТаблицаПараметровВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	КоманднаяПанель1НайтиВТексте();
	
КонецПроцедуры

Процедура КоманднаяПанель1НайтиВТексте(Кнопка = Неопределено)
	
	ВыбраннаяСтрока = ЭлементыФормы.ТаблицаПараметров.ТекущаяСтрока;
	Если ВыбраннаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	КомпонентаТекстПослеЗаменыШаблонов = ПолеТекстаПрограммы.ТекстПослеЗаменыШаблонов;
	#Если Сервер И Не Сервер Тогда
		КомпонентаТекстПослеЗаменыШаблонов = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	КомпонентаТекстПослеЗаменыШаблонов.НайтиПоказатьСловоВТексте("&" + ВыбраннаяСтрока.Имя, Истина);
	
КонецПроцедуры

Процедура КП_ТекстПослеЗаменыШаблоновРедакторИсточникаЗначения(Кнопка)
	
	ВыбраннаяСтрока = ЭлементыФормы.ТаблицаПараметров.ТекущаяСтрока;
	Если ВыбраннаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Если ВыбраннаяСтрока.Тип = "ПараметрСеанса" Тогда
		ФормаРедактора = ирКлиент.ПолучитьФормуЛкс("Обработка.ирРедакторПараметровСеанса.Форма");
		ФормаРедактора.НачальноеЗначениеВыбора = ВыбраннаяСтрока.Имя;
		ФормаРедактора.Открыть();
	ИначеЕсли ВыбраннаяСтрока.Тип = "ФункциональнаяОпция" Тогда
		ОбъектМДХранения = Метаданные.ФункциональныеОпции[ВыбраннаяСтрока.Имя].Хранение;
		Если ирОбщий.ЛиКорневойТипКонстантыЛкс(ирОбщий.ПервыйФрагментЛкс(ОбъектМДХранения.ПолноеИмя())) Тогда
			ирКлиент.ОткрытьКонстантуВСпискеЛкс(ОбъектМДХранения.Имя);
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

Функция ПараметрыВыбораОбъектаМетаданных()
	Возврат ирКлиент.ПараметрыВыбораОбъектаМетаданныхЛкс(Истина, Истина, Истина, Истина,, Истина,,,,, Истина,,, Истина);
КонецФункции

Функция ТаблицаБДНачалоВыбора(Элемент, СтандартнаяОбработка, Текст = "")
	ирКлиент.ОбъектМетаданныхНачалоВыбораЛкс(Элемент, ПараметрыВыбораОбъектаМетаданных(), СтандартнаяОбработка);
КонецФункции

Процедура ТаблицаБДОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
	ирКлиент.ОбъектМетаданныхОкончаниеВводаТекстаЛкс(Элемент, ПараметрыВыбораОбъектаМетаданных(), Текст, Значение, СтандартнаяОбработка);
КонецПроцедуры

Процедура РольНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ирКлиент.ПолеВводаРоли_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ПравоПриИзменении(Элемент)
	
	ПрочитатьОграниченияИлиОчистить();
	
КонецПроцедуры

Процедура ДействияФормыРежимРедактирования(Кнопка)
	
	Если Не мПроверитьМодифицированность() Тогда
		Возврат;
	КонецЕсли; 
	Если Модифицированность Тогда
		ЭтаФорма.Модифицированность = Ложь;
		ПрочитатьОграниченияИлиОчистить();
	КонецЕсли; 
	ЭлементыФормы.ДействияФормы.Кнопки.РежимРедактирования.Пометка = Не ЭлементыФормы.ДействияФормы.Кнопки.РежимРедактирования.Пометка;
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура НастроитьЭлементыФормы()
	
	РежимРедактирования = ЭлементыФормы.ДействияФормы.Кнопки.РежимРедактирования.Пометка;
	Если Истина
		И РежимРедактирования 
		И НаборыПолей.Количество() = 0 
		И ЗначениеЗаполнено(ТаблицаБД) 
	Тогда
		СтрокаНабораПолей = НаборыПолей.Добавить();
		СтрокаНабораПолей.Изменено = Истина;
		ЭлементыФормы.НаборыПолей.ТекущаяСтрока = СтрокаНабораПолей;
	КонецЕсли; 
	ЭлементыФормы.ПанельЗапроса.Доступность = ЭлементыФормы.НаборыПолей.ТекущаяСтрока <> Неопределено;
	ЭлементыФормы.ДействияФормы.Кнопки.СобратьЗапрос.Доступность = ЭлементыФормы.НаборыПолей.ТекущаяСтрока <> Неопределено;
	ЭлементыФормы.ДействияФормы.Кнопки.РежимРедактирования.Доступность = ЗначениеЗаполнено(Роль);
	ЭлементыФормы.ДействияФормы.Кнопки.Перечитать.Доступность = ЗначениеЗаполнено(Роль);
	ЭлементыФормы.Роль.ТолькоПросмотр = РежимРедактирования;
	ЭлементыФормы.ТаблицаБД.ТолькоПросмотр = РежимРедактирования;
	ЭлементыФормы.Право.ТолькоПросмотр = РежимРедактирования;
	ЭлементыФормы.НаборыПолей.Колонки.Изменено.Видимость = РежимРедактирования;
	ЭлементыФормы.Шаблоны.Колонки.Изменено.Видимость = РежимРедактирования;
	ЭлементыФормы.ТекстОграничения.ТолькоПросмотр = Не РежимРедактирования;
	ЭлементыФормы.ТекстШаблона.ТолькоПросмотр = Не РежимРедактирования;
	ЭлементыФормы.Шаблоны.ТолькоПросмотр = Не РежимРедактирования;
	ЭлементыФормы.ДействияФормы.Кнопки.РежимРедактирования.Доступность = ЗначениеЗаполнено(Роль) И ЗначениеЗаполнено(ТаблицаБД) И ЗначениеЗаполнено(Право);
	ЭлементыФормы.НадписьТекстОграниченияЗависитОтСеанса.Видимость = ТаблицаПараметров.Найти("ПараметрСеанса", "Тип") <> Неопределено;
	ирОбщий.ОбновитьТекстПослеМаркераЛкс(ЭтаФорма.Заголовок,, Роль + ", " + ТаблицаБД, ": ");
	
КонецПроцедуры

Процедура ДействияФормыКэшРолей(Кнопка)
	
	ирКлиент.ОткрытьФормуЛкс("Обработка.ирРедакторОграниченияДоступа.Форма.КэшРолей");
	
КонецПроцедуры

Процедура РольПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ПрочитатьОграниченияИлиОчистить();
КонецПроцедуры

Процедура РольНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

Процедура ТаблицаБДНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

Процедура ТаблицаБДПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ПрочитатьОграниченияИлиОчистить(); 
КонецПроцедуры

Процедура ТаблицаПараметровПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	
КонецПроцедуры

Процедура ПараметрыШаблонаПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

КонецПроцедуры

Процедура ПараметрыШаблонаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	
КонецПроцедуры

Процедура ТаблицаПараметровПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	Если ДанныеСтроки.Тип = "НеНайден" Тогда
		ОформлениеСтроки.Ячейки.Тип.ЦветТекста = WebЦвета.Красный;
	КонецЕсли; 
	Если ДанныеСтроки.ВычисленноеЗначение <> ДанныеСтроки.Значение Тогда
		ОформлениеСтроки.Ячейки.Значение.ЦветТекста = ирОбщий.ЦветТекстаИзмененныхДанныхЛкс();
	КонецЕсли; 

КонецПроцедуры

Процедура ШаблоныПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);

КонецПроцедуры

Процедура ШаблоныПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

Процедура ШаблоныПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если НоваяСтрока Тогда
		мТекущийШаблон.Изменено = Истина;
		Если Копирование Тогда
			ЭлементыФормы.ТекстШаблона.УстановитьТекст(мТекущийШаблон.Текст);
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

Процедура ШаблоныПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ЭлементыФормы.Шаблоны.ТекущаяСтрока.Имя = ирОбщий.ПервыйФрагментЛкс(ЭлементыФормы.Шаблоны.ТекущаяСтрока.Определение, "(");
	ЭлементыФормы.Шаблоны.ТекущаяСтрока.Имя = ирОбщий.АвтоУникальноеИмяВКоллекцииЛкс(ЭлементыФормы.Шаблоны.Значение, ЭлементыФормы.Шаблоны.ТекущаяСтрока);
	
КонецПроцедуры

Процедура КП_ПараметрыШаблонаИТС(Кнопка)
	
	ирКлиент.ОткрытьСсылкуИТСЛкс("https://its.1c.ru/db/v?doc/bookmark/dev/TI000000205");
	
КонецПроцедуры

Процедура ДействияФормыИТС(Кнопка)
	
	ирКлиент.ОткрытьСсылкуИТСЛкс("https://its.1c.ru/db/v?doc#bookmark:dev:TI000000191");
	
КонецПроцедуры

Процедура КП_ПараметрыШаблонаНайтиВТексте(Кнопка)
	
	ВыбраннаяСтрока = ЭлементыФормы.ПараметрыШаблона.ТекущаяСтрока;
	Если ВыбраннаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	НайтиПоказатьПараметрШаблона(ВыбраннаяСтрока);
	
КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ТаблицаПараметровПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

Процедура ТаблицаПараметровЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ирКлиент.ПолеВводаКолонкиРасширенногоЗначения_НачалоВыбораЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаПараметров, СтандартнаяОбработка,, Истина);
	
КонецПроцедуры

Процедура КП_ТекстПослеЗаменыШаблоновВосстановитьЗначения(Кнопка)
	
	Для Каждого ВыделеннаяСтрока Из ЭлементыФормы.ТаблицаПараметров.ВыделенныеСтроки Цикл
		Если ВыделеннаяСтрока.Тип = "НеНайден" Тогда
			Продолжить;
		КонецЕсли; 
		ВыделеннаяСтрока.Значение = ВыделеннаяСтрока.ВычисленноеЗначение;
	КонецЦикла;
	
КонецПроцедуры

Процедура НаборыПолейПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

Процедура НаборыПолейВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	ирКлиент.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ЭтаФорма, Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ОбновлениеОтображения()
	
	ирКлиент.Форма_ОбновлениеОтображенияЛкс(ЭтаФорма);

КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

КонецПроцедуры

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);

КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 

КонецПроцедуры

Процедура РольОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ФайлРоли = ФайлРоли();
	#Если Сервер И Не Сервер Тогда
		ФайлРоли = Новый файл;
	#КонецЕсли
	Если Не ФайлРоли.Существует() Тогда
		Возврат
	КонецЕсли; 
	ЗапуститьПриложение(ФайлРоли.ПолноеИмя);
	
КонецПроцедуры

Процедура ШаблоныОпределениеПриИзменении(Элемент)
	
	ЭлементыФормы.Шаблоны.ТекущиеДанные.Имя = ирОбщий.ПервыйФрагментЛкс(ЭлементыФормы.Шаблоны.ТекущиеДанные.Определение, "(");
	ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(ЭлементыФормы.Шаблоны.ТекущиеДанные);
	
КонецПроцедуры

Процедура ШаблоныПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	
	Если ОтменаРедактирования Тогда
		мТекущийШаблон = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирРедакторОграниченияДоступа.Форма.Форма");

Право = "Чтение";
Шаблоны.Колонки.Добавить("НИмя");
ТаблицаПараметров.Колонки.Добавить("НИмя");
НаборыПолей.Колонки.Добавить("Имя");
