Перем РежимРедактора Экспорт;
Перем ПараметрОтбор Экспорт;
Перем ПараметрТабличныйДокумент Экспорт;
Перем ЗапрешеноСохранениеПолнойНастройки;
Перем мСтарыйСнимокНастройкиКомпоновки;
Перем мКнопкаРежимаОтображенияТЗ;

// В этом инструменте настройка формы сохраняется в разрезе ПолноеИмяТаблицы
Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	Если ЗапрешеноСохранениеПолнойНастройки = Истина Тогда
		Возврат Неопределено;
	КонецЕсли; 
	Результат = ПолучитьНастройкуФормы();
	Возврат Результат;
КонецФункции

// Процедура - Загрузить настройку в форме
//
// Параметры:
//  НастройкаФормы	 - см. мПолучитьНастройку() - 
//  ДопПараметры	 - 	 - 
//  ИзФайла			 - 	 - 
//
Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры = Неопределено, ИзФайла = Ложь) Экспорт 
	
	Если Истина
		И ИзФайла
		И НастройкаФормы.Свойство("ПолноеИмяТаблицы") 
		И ЗначениеЗаполнено(НастройкаФормы.ПолноеИмяТаблицы) 
		И Не ирОбщий.СтрокиРавныЛкс(НастройкаФормы.ПолноеИмяТаблицы, ПолноеИмяТаблицы)
	Тогда 
		Ответ = Вопрос("Установить таблицу БД приемник из загружаемой настройки?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
		Если Ответ = КодВозвратаДиалога.Да Тогда
			ЭтотОбъект.ПолноеИмяТаблицы = НастройкаФормы.ПолноеИмяТаблицы;
			УстановитьИсточникВФорме(Ложь, Ложь);
		КонецЕсли;
	КонецЕсли;
	ЗаменитьДанныеТДиТЗ = Ложь;
	ЗаменитьМетаданныеТДиТЗ = Ложь
		Или ДопПараметры = Неопределено 
		Или Не ДопПараметры.Свойство("РазрешитьЗаменуМетаданныхТДиТЗ")
		Или ДопПараметры.РазрешитьЗаменуМетаданныхТДиТЗ;
	ЗаменитьДанныеТДиТЗ = Ложь
		Или ДопПараметры = Неопределено 
		Или Не ДопПараметры.Свойство("РазрешитьЗаменуДанныхТДиТЗ")
		Или ДопПараметры.РазрешитьЗаменуДанныхТДиТЗ;
	Если ЗаменитьДанныеТДиТЗ Тогда
		СтруктураПозицийТД = СтруктураПозицийТД();
		Если Ложь
			Или ТаблицаЗначений.Колонки.Количество() > 1 
			Или ЗначениеЗаполнено(ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиЗаголовков, 1).Текст) 
		Тогда
			Если Истина
				И ИзФайла 
				И Не ЗначениеЗаполнено(ПолноеИмяТаблицы) 
				И НастройкаФормы.Свойство("ПолноеИмяТаблицы")
				И Не ЗначениеЗаполнено(НастройкаФормы.ПолноеИмяТаблицы) 
			Тогда
				Ответ = КодВозвратаДиалога.Да;
			Иначе
				Ответ = Вопрос("Хотите заменить табличный документ и таблицу значений на сохраненные ранее для выбранной таблицы БД?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);
			КонецЕсли; 
			ЗаменитьДанныеТДиТЗ = Ответ = КодВозвратаДиалога.Да;
			ЗаменитьМетаданныеТДиТЗ = ЗаменитьДанныеТДиТЗ;
		КонецЕсли; 
	КонецЕсли; 
	мЗагрузитьНастройку(НастройкаФормы, ЗаменитьДанныеТДиТЗ, ЗаменитьМетаданныеТДиТЗ);
	СинхронизироватьРеквизитыОбъекта(Ложь);
	ОбновитьФлагиСохраненияТДиТЗ(ЗаменитьДанныеТДиТЗ, ИзФайла);
	
КонецПроцедуры

Процедура УстановитьИсточникВФорме(РазрешитьЗаменуДанныхТДиТЗ = Истина, РазрешитьЗаменуМетаданныхТДиТЗ = Истина) 
	
	ОчиститьСопоставлениеКолонокБД();
	ТаблицаБД.Очистить();
	УстановитьИсточник();
	Если ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
		СтруктураКлючаБД = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ПолноеИмяТаблицы);
		ЭлементыФормы.ЗаменятьНаборСтрокОбъекта.Доступность = СтруктураКлючаБД.Свойство(ирОбщий.ПеревестиСтроку("НомерСтроки"));
		Если Не ЭлементыФормы.ЗаменятьНаборСтрокОбъекта.Доступность Тогда 
			ЭтотОбъект.ЗаменятьНаборСтрокОбъекта = Ложь;
		КонецЕсли;
	КонецЕсли;
	ОбновитьФлагиСохраненияТДиТЗ(Ложь);
	ПараметрыЗагрузкиНастройкиФормы = Новый Структура;
	ПараметрыЗагрузкиНастройкиФормы.Вставить("РазрешитьЗаменуДанныхТДиТЗ", РазрешитьЗаменуДанныхТДиТЗ);
	ПараметрыЗагрузкиНастройкиФормы.Вставить("РазрешитьЗаменуМетаданныхТДиТЗ", РазрешитьЗаменуМетаданныхТДиТЗ);
	//СоставНастройкиФормы = Новый СписокЗначений;
	//СоставНастройкиФормы.Добавить("ВсеТаблицы", "Настройки всех таблиц", Истина);
	//СоставНастройкиФормы.Добавить("ТекущаяТаблица", "Настройки текущей таблицы", Истина);
	//СоставНастройкиФормы.Добавить("Прочее", "Прочее", Истина);
	ЗапрешеноСохранениеПолнойНастройки = Истина;
	ирКлиент.СоздатьМенеджерСохраненияНастроекФормыЛкс(ЭтаФорма, ПолноеИмяТаблицы, Не РежимРедактора, ПараметрыЗагрузкиНастройкиФормы, "sxl");
	ЗапрешеноСохранениеПолнойНастройки = Ложь;
	ОбновитьКолонкиТабличногоПоляТаблицыЗначений();
	ВыявитьНеуникальныеКлючи();
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	СинхронизироватьРеквизитыОбъекта();
	Если Ложь
		Или ПараметрТабличныйДокумент <> Неопределено 
		Или ТаблицаЗначений.Колонки.Количество() <= 1
	Тогда
		ЭлементыФормы.ТабличныйДокумент.Очистить();
	КонецЕсли; 
	ПолученТабличныйДокумент = Ложь;
	Если ПараметрТабличныйДокумент <> Неопределено Тогда
		ЭлементыФормы.ТабличныйДокумент.ВставитьОбласть(ПараметрТабличныйДокумент.Область(),,, Ложь);
		ПолученТабличныйДокумент = Истина;
	КонецЕсли;
	ПолученаТаблицаЗначений = ТаблицаЗначений.Колонки.Количество() > 1 Или ТаблицаЗначений.Количество() > 0;
	Если Истина
		И ТаблицаЗначений.Количество() > 0
		И ТабличныйДокумент.ВысотаТаблицы = 0
	Тогда
		ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаЗначений;
	КонецЕсли;
	РазрешитьЗаменуДанныхТДиТЗ = Не ПолученТабличныйДокумент И Не ПолученаТаблицаЗначений;
	УстановитьИсточникВФорме(РазрешитьЗаменуДанныхТДиТЗ, РазрешитьЗаменуДанныхТДиТЗ);
	Если ПолученаТаблицаЗначений Тогда
		ЭтотОбъект.АвтоДобавлениеКолонокТЗИзБД = Ложь;
	ИначеЕсли ПолученТабличныйДокумент И Не ПолученаТаблицаЗначений Тогда
		ЭтотОбъект.АвтоДобавлениеКолонокТЗИзБД = Истина;
	КонецЕсли; 
	Если ПараметрОтбор <> Неопределено Тогда
		#Если Сервер И Не Сервер Тогда
			ПараметрОтбор = Новый Структура;
		#КонецЕсли
		Для Каждого КлючИЗначение Из ПараметрОтбор Цикл
			СтрокаПоля = СопоставлениеКолонокБД.Найти(КлючИЗначение.Ключ, "ИмяКолонкиПриемника");
			СтрокаПоля.Значение = КлючИЗначение.Значение;
		КонецЦикла;
	КонецЕсли;
	Если Не РежимРедактора Тогда
		ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Удалить(ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Применить);
	КонецЕсли;
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаЗначений).НеинтерактивноеИзменение = Истина;
	НастроитьЭлементыФормы();
	ирКлиент.УстановитьДоступностьВыполненияНаСервереЛкс(ЭтаФорма, ЭлементыФормы.ВыполнятьКонвертациюНаСервере.Имя);
	ирКлиент.УстановитьДоступностьВыполненияНаСервереЛкс(ЭтаФорма, ЭлементыФормы.ВыполнятьЗагрузкуНаСервере.Имя);
	ирКлиент.НастроитьПоляВводаПараметровПотоковЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма, Не РежимРедактора);
	Если мКонсольЗапросов <> Неопределено Тогда
		мКонсольЗапросов.УничтожитьКомпоненты();
		мКонсольЗапросов = Неопределено; // Надо делать после автосохранения настройки
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура КоманднаяПанельТабличногоДокументаКонтрольЗаполнения(Кнопка)
	
	//СформироватьСтруктуруКолонок();
	КонтрольЗаполнения();
	
КонецПроцедуры

Процедура КоманднаяПанельТабличногоДокументаОбновить(Кнопка)
	
	ОбновитьДанныеТабличногоДокумента();
	
КонецПроцедуры

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

Процедура КоманднаяПанельТабличногоДокументаСледующееПримечание(Кнопка)

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

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

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

Процедура КоманднаяПанельВыбратьЗначениеВыбратьЗначение(Кнопка)
	
	ВыбратьЗначениеВЯчейке();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ТаблицаЗагружаемыхРеквизитовОписаниеТиповПриИзменении(Элемент)
	
	ТекущиеДанные = ЭлементыФормы.СопоставлениеКолонокТЗ.ТекущиеДанные;
	ТекущиеДанные.Значение = ТекущиеДанные.ОписаниеТипов.ПривестиЗначение(ТекущиеДанные.Значение);
	СписокВыбора = ПолучитьСписокИменПредставлений(ТекущиеДанные);
	ТекущиеДанные.ИскатьПо = ?(СписокВыбора.Количество() = 0, Неопределено, СписокВыбора[0].Значение);
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.ИскатьПо.ЭлементУправления.СписокВыбора = СписокВыбора;
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.ИскатьПо.ЭлементУправления.ТолькоПросмотр = СписокВыбора.Количество() = 0;
	СписокВыбора = СписокСвязейКолонкиПоВладельцу(ТекущиеДанные);
	ТекущиеДанные.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, Неопределено, СписокВыбора[0].Значение);
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.СвязьПоВладельцу.ЭлементУправления.СписокВыбора = СписокВыбора;
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.СвязьПоВладельцу.ЭлементУправления.ТолькоПросмотр = СписокВыбора.Количество() = 0;
	СписокВыбора = СписокСвязейКолонкиПоТипу(ТекущиеДанные);
	ТекущиеДанные.СвязьПоТипу = ?(СписокВыбора.Количество() = 0, Неопределено, СписокВыбора[0].Значение);
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.СвязьПоТипу.ЭлементУправления.СписокВыбора = СписокВыбора;
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.СвязьПоТипу.ЭлементУправления.ТолькоПросмотр = СписокВыбора.Количество() = 0;
	ЭлементыФормы.СопоставлениеКолонокТЗ.Колонки.Значение.ЭлементУправления.КнопкаВыбора = Не ТипЗНЧ(ТекущиеДанные.Значение) = Тип("Строка");
	
КонецПроцедуры

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

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

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

	//ОбновитьСопоставлениеКолонокТЗВФорме();
	ОбновитьНесопоставлениеКолонкиТД();
	
КонецПроцедуры

Процедура СопоставлениеКолонокТЗСинонимКолонкиИсточникаПриИзменении(Элемент)
	
	СопоставлениеКолонокТЗИмяКолонкиИсточникаПриИзменении(Элемент);
	
КонецПроцедуры

Процедура ТаблицаЗагружаемыхРеквизитовРежимЗагрузкиОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельЗагружаемыеРеквизитыВТаблицуЗначений(Кнопка)
	
	
КонецПроцедуры

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

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

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

Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
	
	ЗапуститьЗагрузкуВБД(Кнопка, Истина);
	
КонецПроцедуры

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

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

Процедура КоманднаяПанельТаблицаБДЗагрузитьБезЗаписи(Кнопка)
	
	ЗапуститьЗагрузкуВБД(Кнопка, Ложь);
	
КонецПроцедуры

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

Процедура НастроитьЭлементыФормы()
	
	ЭлементыФормы.СопоставлениеКолонокБД.Колонки.ДопРеквизит.Видимость = Истина
		И ирКэш.ЛиДоступноДопРеквизитыБСПЛкс()
		И ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(МетаданныеТаблицыБД());
	ЭлементыФормы.ПанельОсновная.Страницы.СопоставлениеКолонокБД.Доступность = ЗначениеЗаполнено(ПолноеИмяТаблицы);
	ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаБД.Доступность = ЗначениеЗаполнено(ПолноеИмяТаблицы);
	ЭлементыФормы.СопоставлениеКолонокБД.Колонки.Принадлежность.Видимость = Истина
		И СопоставлениеКолонокБД.Количество() > 0
		И ЗначениеЗаполнено(СопоставлениеКолонокБД[0].Принадлежность);
	ЭлементыФормы.НадписьНеуникальные.Гиперссылка = КоличествоНеуникально > 0;
	Если КоличествоНеуникально > 0 Тогда
		ЭлементыФормы.НадписьНеуникальные.ЦветТекста = WebЦвета.Красный;
	Иначе
		ЭлементыФормы.НадписьНеуникальные.ЦветТекста = Новый Цвет;
	КонецЕсли;
	ЭлементыФормы.ДополнениеЗапросом.Доступность = ДополнятьЗапросом;
	ДоступностьМногопоточности = ВыполнятьЗагрузкуНаСервере И ЭлементыФормы.ВыполнятьЗагрузкуНаСервере.Доступность И Не ирКэш.ЛиФайловаяБазаЛкс();
	ЭлементыФормы.КоличествоПотоков.Доступность = ДоступностьМногопоточности;
	ЭлементыФормы.КоличествоОбъектовВПорции.Доступность = КоличествоПотоков > 1 И ДоступностьМногопоточности;
	ЭлементыФормы.ОбновлятьСтрокиБД.Доступность = Не ЗаменятьНаборСтрокОбъекта;

	// Кнопка по умолчанию
	Если Не РежимРедактора Тогда
		Если ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.СопоставлениеКолонокТЗ Тогда
			ЭлементыФормы.КоманднаяПанельСопоставлениеКолонокТЗ.Кнопки.Конвертировать.КнопкаПоУмолчанию = Истина;
		ИначеЕсли ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаБД Тогда
			Если ТаблицаБД.Количество() > 0 Тогда
				ЭлементыФормы.КоманднаяПанельТаблицаБД.Кнопки.Загрузить.КнопкаПоУмолчанию = Истина;
			Иначе
				ЭлементыФормы.КоманднаяПанельТаблицаБД.Кнопки.ЗагрузитьБезЗаписи.КнопкаПоУмолчанию = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли; 

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

Функция ОписаниеТиповКлючейРезультатов()

	МассивТипов = Новый Массив();
	ТипКлюча = ирОбщий.ТипКлючаЗаписиТаблицыЛкс(ПолноеИмяТаблицы);
	МассивТипов.Добавить(ТипКлюча);
	ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
	Возврат ОписаниеТипов;

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

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

Процедура КоманднаяПанельТаблицаЗначенийОткрытьТаблицу(Кнопка)
	
	РедактироватьТаблицуЗначений();
	
КонецПроцедуры

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

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

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

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

Процедура КоманднаяПанельТаблицаБДРедакторОбъектаБДСтроки(Кнопка)

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

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

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

Процедура ОбновитьФиксациюШапкиТабличногоДокумента()
	
	СтруктураПозицийТД = СтруктураПозицийТД();
	ЭлементыФормы.ТабличныйДокумент.ФиксацияСверху = СтруктураПозицийТД.НомерСтрокиДанных - 1;

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

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

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

Процедура ПерваяСтрокаДанныхТДПриИзменении(Элемент = Неопределено)
	
	Если ПерваяСтрокаДанныхТД > 0 Тогда 
		Если СтрокаЗаголовковТД >= ПерваяСтрокаДанныхТД Тогда
			СтрокаЗаголовковТД = ПерваяСтрокаДанныхТД - 1;
		КонецЕсли;
		Если ПоследняяСтрокаДанныхТД < ПерваяСтрокаДанныхТД Тогда
			ПоследняяСтрокаДанныхТД = 0;
		КонецЕсли;
	КонецЕсли; 
	
КонецПроцедуры 

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

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

Процедура ПоследняяСтрокаДанныхТДПриИзменении(Элемент)
	
	Если ПоследняяСтрокаДанныхТД > 0 Тогда 
		Если ПоследняяСтрокаДанныхТД < ПерваяСтрокаДанныхТД Тогда
			ПерваяСтрокаДанныхТД = 0;
		КонецЕсли;
		Если ПоследняяСтрокаДанныхТД < СтрокаЗаголовковТД Тогда
			СтрокаЗаголовковТД = 0;
		КонецЕсли;
	КонецЕсли; 

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

Процедура ПоследняяСтрокаДанныхТДОткрытие(Элемент, СтандартнаяОбработка)
	СтруктураПозицийТД = СтруктураПозицийТД();
	ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть = ЭлементыФормы.ТабличныйДокумент.Область(СтруктураПозицийТД.НомерПоследнейСтрокиДанных, 1,
		СтруктураПозицийТД.НомерПоследнейСтрокиДанных, ЭлементыФормы.ТабличныйДокумент.ШиринаТаблицы);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

Процедура СтрокаЗаголовковТДПриИзменении(Элемент = Неопределено)
	
	Если СтрокаЗаголовковТД > 0 Тогда 
		Если СтрокаЗаголовковТД >= ПерваяСтрокаДанныхТД Тогда
			ПерваяСтрокаДанныхТД = СтрокаЗаголовковТД + 1;
		КонецЕсли;
		Если СтрокаЗаголовковТД >= ПоследняяСтрокаДанныхТД Тогда
			ПоследняяСтрокаДанныхТД = 0;
		КонецЕсли;
	КонецЕсли; 
	
КонецПроцедуры

Процедура КП_СопоставлениеКолонокТаблицыБДЗаполнитьПоИменам(Кнопка)

	Если АвтоДобавлениеКолонокТЗИзБД Тогда
		ОбновитьКолонкиТаблицыЗначений(Ложь, Истина);
	КонецЕсли;
	СопоставлениеКолонокБДЗаполнитьПоИменамСинонимам(, Истина);
	
КонецПроцедуры

Процедура КП_СопоставлениеКолонокТаблицыБДОчистить(Кнопка)
	
	Ответ = Вопрос("Очистить все настройки (Да) или только сопоставление колонок (Нет)?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
	Если Ответ = КодВозвратаДиалога.Да Тогда
		СопоставлениеКолонокБД.Очистить();
		ЗаполнитьСопоставлениеКолонокБД();
	КонецЕсли;
	ОчиститьСопоставлениеКолонокБД();
	
КонецПроцедуры

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

Процедура СопоставлениеКолонокТаблицыБДСинонимКолонкиИсточникаПриИзменении(Элемент)
	
	СопоставлениеКолонокТаблицыБДИмяКолонкиИсточникаПриИзменении(Элемент);

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

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

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

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

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

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

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

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

Процедура СопоставлениеКолонокБДПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ОформлениеСтроки.Ячейки.Пометка.ОтображатьФлажок = Не ДанныеСтроки.ПолеПоиска И Не ДанныеСтроки.Ключевое И ДанныеСтроки.ДоступноИзменение;
	ОформлениеСтроки.Ячейки.Пометка.ТолькоПросмотр = Не ОформлениеСтроки.Ячейки.Пометка.ОтображатьФлажок;
	ОформлениеСтроки.Ячейки.КолонкаИсточника.Видимость = Ложь;
	ОформлениеСтроки.Ячейки.КолонкаПриемника.Видимость = Ложь;
	ОписаниеТиповПриемника = ДанныеСтроки.ОписаниеТиповПриемника;
	#Если Сервер И Не Сервер Тогда
		ОписаниеТиповПриемника = Новый ОписаниеТипов;
	#КонецЕсли
	ОформлениеСтроки.Ячейки.ПолеПоиска.ОтображатьФлажок = Истина
		//И Не ДанныеСтроки.Ключевое // так по ссылке в ссылочной таблице нельзя было включить поиск
		И Не ОписаниеТиповПриемника.СодержитТип(Тип("ХранилищеЗначения"))
		//И Не (Истина
		//	И ОписаниеТиповПриемника.СодержитТип(Тип("Строка"))
		//	И ОписаниеТиповПриемника.КвалификаторыСтроки.Длина = 0)
		;
	ОформлениеСтроки.Ячейки.ПолеПоиска.ТолькоПросмотр = Не ОформлениеСтроки.Ячейки.ПолеПоиска.ОтображатьФлажок Или ЗаменятьНаборСтрокОбъекта;
	Если ЗначениеЗаполнено(ДанныеСтроки.ДопРеквизит) Тогда
		ирКлиент.ОформитьСтрокуДопРеквизитаБСПЛкс(ОформлениеСтроки);
	КонецЕсли;
	ЦветТекстаНеактивности = ирОбщий.ЦветТекстаНеактивностиЛкс();
	ЦветФонаОшибки = ирОбщий.ЦветФонаОшибкиЛкс();
	ЦветФонаАктивности = ирОбщий.ЦветФонаАкцентаЛкс();
	Если ДанныеСтроки.Пометка Или ДанныеСтроки.ПолеПоиска Тогда
		Если ДанныеСтроки.ИзИсточника Тогда
			ОформлениеСтроки.Ячейки.Значение.ЦветТекста = ЦветТекстаНеактивности;
			//ОформлениеСтроки.Ячейки.Значение.ТолькоПросмотр = Истина;
			ОформлениеСтроки.Ячейки.Значение.ОтображатьФлажок = Ложь;
			//ОформлениеСтроки.Ячейки.ИмяКолонкиИсточника.ЦветФона = ЦветФонаАктивности;
			//ОформлениеСтроки.Ячейки.СинонимКолонкиИсточника.ЦветФона = ЦветФонаАктивности;
		Иначе
			ОформлениеСтроки.Ячейки.ИмяКолонкиИсточника.ЦветТекста = ЦветТекстаНеактивности;
			ОформлениеСтроки.Ячейки.СинонимКолонкиИсточника.ЦветТекста = ЦветТекстаНеактивности;
			ОформлениеСтроки.Ячейки.ОписаниеТиповИсточника.ЦветТекста = ЦветТекстаНеактивности;
			ОформлениеСтроки.Ячейки.Значение.ЦветФона = ЦветФонаАктивности;
		КонецЕсли;
	Иначе
		ОформлениеСтроки.ЦветТекста = ирОбщий.ЦветТекстаНеактивностиЛкс();
		ОформлениеСтроки.Ячейки.Значение.ОтображатьФлажок = Ложь;
	КонецЕсли;
	ирКлиент.ТабличноеПолеКолонокПриВыводеСтрокиЛкс(ОформлениеСтроки, ДанныеСтроки, "ОписаниеТиповИсточника");
	ирКлиент.ТабличноеПолеКолонокПриВыводеСтрокиЛкс(ОформлениеСтроки, ДанныеСтроки, "ОписаниеТиповПриемника");
	Если Истина
		И ЗначениеЗаполнено(ДанныеСтроки.ИмяКолонкиИсточника) 
		И Не ирОбщий.ЛиОписаниеТипов1ВходитВОписаниеТипов2Лкс(ДанныеСтроки.ОписаниеТиповИсточника, ДанныеСтроки.ОписаниеТиповПриемника) 
	Тогда
		ОформлениеСтроки.Ячейки.ОписаниеТиповИсточника.ЦветФона = ЦветФонаОшибки;
	КонецЕсли; 
	Если Не ЗначениеЗаполнено(ДанныеСтроки.ИмяКолонкиИсточника) Тогда 
		ОформлениеСтроки.Ячейки.ИзИсточника.ТолькоПросмотр = Истина;
		ОформлениеСтроки.Ячейки.ИзИсточника.ОтображатьФлажок = Ложь;
		//Если ДанныеСтроки.ИзИсточника Тогда 
		//	ОформлениеСтроки.Ячейки.ИмяКолонкиИсточника.ЦветФона = ЦветФонаОшибки;
		//	ОформлениеСтроки.Ячейки.СинонимКолонкиИсточника.ЦветФона = ЦветФонаОшибки;
		//КонецЕсли; 
	КонецЕсли; 
	ОформлениеСтроки.Ячейки.НеОчищать.ТолькоПросмотр = Ложь
		Или Не ЗначениеЗаполнено(ДанныеСтроки.ИмяКолонкиИсточника)
		Или ДанныеСтроки.ПолеПоиска 
		Или ирОбщий.ЛиОписаниеТиповБулевоЛкс(ДанныеСтроки.ОписаниеТиповПриемника);
	ОформлениеСтроки.Ячейки.ТолькоДляНовых.ТолькоПросмотр = ДанныеСтроки.ПолеПоиска Или Не ДанныеСтроки.Пометка;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки, , "Значение");

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

Процедура КоманднаяПанельТаблицаЗначенийЗаполнитьИзТаблицыБД(Кнопка)
	
	Если Не ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
		Возврат;
	КонецЕсли;
	Если ТаблицаЗначений.Колонки.Количество() > 1 Тогда
		Ответ = Вопрос("Очистить существующие колонки и строки?", РежимДиалогаВопрос.ДаНетОтмена);
		Если Ответ = КодВозвратаДиалога.Отмена Тогда
			Возврат;
		Иначе
			ОчиститьСуществующие = Ответ = КодВозвратаДиалога.Да;
		КонецЕсли;
	Иначе
		ОчиститьСуществующие = Истина;
	КонецЕсли; 
	ОбновитьКолонкиТаблицыЗначений(ОчиститьСуществующие, Истина);
	ОбновитьКолонкиТабличногоПоляТаблицыЗначений(ОчиститьСуществующие);
	Если ОчиститьСуществующие Тогда
		СопоставлениеКолонокБДЗаполнитьПоИменамСинонимам(); // Пометки тут не могут меняться
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура КоманднаяПанельСопоставлениеКолонокТЗОчистить(Кнопка)
	
	ОчиститьСопоставлениеКолонокТЗ();

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

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

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

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

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

Процедура КоманднаяПанельСопоставлениеКолонокТЗЗаполнитьПоСинонимам(Кнопка)
	
	Если ТаблицаЗначений.Колонки.Количество() > 1 Тогда
		Ответ = Вопрос("Хотите пересоздать колонки таблицы-приемника по колонкам источника?", РежимДиалогаВопрос.ДаНет);
	Иначе
		Ответ = КодВозвратаДиалога.Да;
	КонецЕсли;
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ТаблицаЗначений.Колонки.Очистить();
		КоманднаяПанельТаблицаЗначенийЗаполнитьИзТабличногоДокумента();
	Иначе
		СопоставлениеКолонокТЗЗаполнить();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Процедура СопоставлениеКолонокТЗИмяКолонкиИсточникаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьКолонкуТабличногоДокументаИзСтрокиКонвертации();
	СтандартнаяОбработка = Ложь;

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

Процедура СопоставлениеКолонокТЗСинонимКолонкиИсточникаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьКолонкуТабличногоДокументаИзСтрокиКонвертации();
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

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

Процедура НесопоставленныеКолонкиТДВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	НомерКолонки = Число(ЭлементыФормы.НесопоставленныеКолонкиТД.ТекущиеДанные.ИмяКолонки);
	СтруктураПозицийТД = СтруктураПозицийТД();
	ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть = ЭлементыФормы.ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиДанных, НомерКолонки, СтруктураПозицийТД.НомерСтрокиДанных, НомерКолонки);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
	ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТабличныйДокумент; // Антибаг платформы 8.3.13

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

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

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

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

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

Процедура КоманднаяПанельТаблицаЗначенийПерейтиКБД(Кнопка)
	
	Если ЭлементыФормы.ТаблицаЗначений.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Если Ложь
		Или ТаблицаЗначений.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено 
		Или ТаблицаБД.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено
	Тогда
		Возврат;
	КонецЕсли; 
	СтрокаТаблицыБД = ТаблицаБД.Найти(ЭлементыФормы.ТаблицаЗначений.ТекущаяСтрока[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
	Если СтрокаТаблицыБД <> Неопределено Тогда
		ЭлементыФормы.ТаблицаБД.ТекущаяСтрока = СтрокаТаблицыБД;
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТаблицаБД;
		// Антибаг платформы 8.3.12-8.3.14 https://partners.v8.1c.ru/forum/message/1767153
		ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаБД;
	КонецЕсли; 
	
КонецПроцедуры

Процедура КоманднаяПанельТаблицаЗначенийПерейтиКТД(Кнопка = Неопределено)
	
	Если ТаблицаЗначений.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ВыбраннаяСтрока = ЭлементыФормы.ТаблицаЗначений.ТекущаяСтрока;
	Если ВыбраннаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	НомерКолонкиТД = 1;
	ТекущаяКолонка = ЭлементыФормы.ТаблицаЗначений.ТекущаяКолонка;
	Если ТекущаяКолонка <> Неопределено Тогда
		ИмяКолонки = ТекущаяКолонка.Данные;
		Если ирОбщий.СтрКончаетсяНаЛкс(ИмяКолонки, мСуффиксСырыхДанных) Тогда
			ИмяКолонки = ирОбщий.СтрокаБезКонцаЛкс(ИмяКолонки, СтрДлина(мСуффиксСырыхДанных));
		КонецЕсли;
		СтрокаКолонки = СопоставлениеКолонокТЗ.Найти(ИмяКолонки, "ИмяКолонкиПриемника");
		Если СтрокаКолонки <> Неопределено Тогда
			ИмяКолонкиИсточника = СтрокаКолонки.ИмяКолонкиИсточника;
			Если ЗначениеЗаполнено(ИмяКолонкиИсточника) Тогда
				НомерКолонкиТД = Число(ИмяКолонкиИсточника);
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли; 
	ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть = ЭлементыФормы.ТабличныйДокумент.Область(ВыбраннаяСтрока[мИмяКолонкиНомерСтроки], НомерКолонкиТД, ВыбраннаяСтрока[мИмяКолонкиНомерСтроки], НомерКолонкиТД);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
	// Антибаг платформы 8.3.12-8.3.14 https://partners.v8.1c.ru/forum/message/1767153
	ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТабличныйДокумент;
	
КонецПроцедуры

Процедура КоманднаяПанельТабличногоДокументаПерейтиКТЗ(Кнопка)
	
	ТекущаяОбласть = ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть;
	Если ТекущаяОбласть = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	СтрокаТаблицыЗначений = ТаблицаЗначенийОтобранное.Найти(ТекущаяОбласть.Верх, мИмяКолонкиНомерСтроки);
	Если СтрокаТаблицыЗначений <> Неопределено Тогда
		СтрокаСопоставленияТЗ = СтрокаСопоставленияКолонкиТЗДляОбластиТД(ТекущаяОбласть);
		Если СтрокаСопоставленияТЗ <> Неопределено Тогда
			ЭлементыФормы.ТаблицаЗначений.ТекущаяКолонка = ЭлементыФормы.ТаблицаЗначений.Колонки[СтрокаСопоставленияТЗ.ИмяКолонкиПриемника];
		КонецЕсли;
		ЭлементыФормы.ТаблицаЗначений.ТекущаяСтрока = СтрокаТаблицыЗначений;
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТаблицаЗначений;
		// Антибаг платформы 8.3.12-8.3.14 https://partners.v8.1c.ru/forum/message/1767153
		ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаЗначений;
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура КоманднаяПанельТаблицаБДПерейти(Кнопка)
	
	ПерейтиКСтрокеТаблицыЗначенийИзСтрокиТаблицыБД();
	
КонецПроцедуры

Процедура ПерейтиКСтрокеТаблицыЗначенийИзСтрокиТаблицыБД()
	
	Если ЭлементыФормы.ТаблицаБД.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Если Ложь
		Или ТаблицаЗначенийОтобранное.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено 
		Или ТаблицаБД.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено
	Тогда
		Возврат;
	КонецЕсли; 
	СтрокаТаблицыЗначений = ТаблицаЗначенийОтобранное.Найти(ЭлементыФормы.ТаблицаБД.ТекущаяСтрока[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
	Если СтрокаТаблицыЗначений <> Неопределено Тогда
		ЭлементыФормы.ТаблицаЗначений.ТекущаяСтрока = СтрокаТаблицыЗначений;
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТаблицаЗначений;
		// Антибаг платформы 8.3.12-8.3.14 https://partners.v8.1c.ru/forum/message/1767153
		ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.ТаблицаЗначений;
	КонецЕсли;

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

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

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

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

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

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

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

Процедура СопоставлениеКолонокБДВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

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

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

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

Процедура СобытияОбработкиОбъектовПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ОформитьЯчейкуАлгоритмаВТабличномПолеЛкс(ОформлениеСтроки);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыПрименить(Кнопка)
	
	Если ТаблицаЗначений.Количество() = 0 Тогда
		ОсновныеДействияФормыКонвертировать();
	КонецЕсли; 
	Закрыть(Истина);
	
КонецПроцедуры

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

Процедура ТаблицаБДПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ЦветФонаОшибки = ирОбщий.ЦветФонаОшибкиЛкс(); 
	//СравнениеТаблиц = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирСравнениеТаблиц");
	//ЦветФонаРазличия = СравнениеТаблиц.ОтличаютсяЦветФона;
	ЦветФонаРазличия = Новый Цвет(250, 245, 245); 
	Ячейка = ОформлениеСтроки.Ячейки.Найти(мИмяКолонкиРезультатПоиска);
	Если Истина
		И Ячейка <> Неопределено
		И ДанныеСтроки[мИмяКолонкиРезультатПоиска] = "Найдено > 1"
	Тогда
		ОформлениеСтроки.Ячейки[мИмяКолонкиРезультатПоиска].ЦветФона = ЦветФонаОшибки;
	КонецЕсли;
	Ячейка = ОформлениеСтроки.Ячейки.Найти(мИмяКолонкиРезультатЗаписи);
	Если Истина
		И Ячейка <> Неопределено
		И ДанныеСтроки[мИмяКолонкиРезультатЗаписи] <> "Успех" 
	Тогда
		Ячейка.ЦветФона = ЦветФонаОшибки;
	КонецЕсли;
	Если ДанныеСтроки[мИмяКолонкиРезультатПоиска] <> РезультатПоискаНеНайдено() И СнимокБД <> Неопределено Тогда
		СтрокаКолонокКлючаБД = СтрокаКолонокКлючаБД();
		КлючБД = Новый Структура(СтрокаКолонокКлючаБД);
		ЗаполнитьЗначенияСвойств(КлючБД, ДанныеСтроки);
		СтрокаСнимкаБД = СнимокБД.НайтиСтроки(КлючБД)[0];
		ИменаАктивныхКолонокБД = ИменаАктивныхКолонокБД();
		Для Каждого ИмяКолонки Из ИменаАктивныхКолонокБД Цикл
			Если КлючБД.Свойство(ИмяКолонки) Тогда
				Продолжить;
			КонецЕсли;
			//СтрокаСопоставления = СопоставлениеКолонокБД.Найти(ИмяКолонки, "ИмяКолонкиПриемника");
			//Если СтрокаСопоставления.ТолькоДляНовых Тогда
			//	Продолжить;
			//КонецЕсли;
			Ячейка = ОформлениеСтроки.Ячейки.Найти(ИмяКолонки);
			Если Истина
				И Ячейка <> Неопределено
				И СтрокаСнимкаБД[ИмяКолонки] <> ДанныеСтроки[ИмяКолонки] 
				//И (Ложь
				//	Или Не СтрокаСопоставления.НеОчищать
				//	Или ЗначениеЗаполнено(ДанныеСтроки[ИмяКолонки]))
			Тогда
				ОформлениеСтроки.Ячейки[ИмяКолонки].ЦветФона = ЦветФонаРазличия;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки, ЭлементыФормы.КоманднаяПанельТаблицаБД.Кнопки.Идентификаторы);

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

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

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

Процедура КоманднаяПанельТаблицаБДУдалитьУспешныеИзИсточника(Кнопка)
	
	Если ТаблицаБД.Колонки.Найти(мИмяКолонкиРезультатЗаписи) = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	УспешныеСтрокиБД = ТаблицаБД.НайтиСтроки(Новый Структура(мИмяКолонкиРезультатЗаписи, "Успех"));
	ирОбщий.ДобавитьИндексВТаблицуЛкс(ТаблицаЗначений, мИмяКолонкиНомерСтроки);
	Для Каждого СтрокаТаблицыБД Из УспешныеСтрокиБД Цикл
		СтрокаТаблицы = ТаблицаЗначений.Найти(СтрокаТаблицыБД[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
		Если СтрокаТаблицы <> Неопределено Тогда
			ТаблицаЗначений.Удалить(СтрокаТаблицы);
		КонецЕсли;
		ТаблицаБД.Удалить(СтрокаТаблицыБД);
	КонецЦикла;
	
КонецПроцедуры

Процедура ТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ирКлиент.ОткрытьЗначениеЛкс(Расшифровка, , СтандартнаяОбработка);
	
КонецПроцедуры

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

Процедура НадписьОбщиеПараметрыЗаписиНажатие(Элемент)
	
	ирКлиент.ОткрытьОбщиеПараметрыЗаписиЛкс();
	
КонецПроцедуры

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

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

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

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

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

Процедура СопоставлениеКолонокБДПолеПоискаПриИзменении(Элемент)
	
	ВыявитьНеуникальныеКлючи();
	НастроитьЭлементыФормы();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельТаблицаЗначенийСортироватьПоУбыванию(Кнопка)
	
	ирКлиент.ТабличноеПолеСортироватьЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаЗначений, Ложь);

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

Процедура КоманднаяПанельТаблицаЗначенийДополнениеЗапросом(Кнопка)
	
	ВыполнитьЗапросДополнения(Истина);

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

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

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

Процедура ТаблицаЗначенийОтобрать(РежимОтладки = Ложь) 

	Попытка
		ирКлиент.ТабличноеПолеСОтборомПросмотраОтобратьЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаЗначений,, РежимОтладки);
	Исключение
		ирОбщий.СообщитьЛкс(ОписаниеОшибки());
		ЭтотОбъект.ТаблицаЗначенийИспользоватьОтбор = Ложь;
		ирКлиент.ТабличноеПолеСОтборомПросмотраОтобратьЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаЗначений,, РежимОтладки);
	КонецПопытки;

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

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

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

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

Процедура ДополнятьЗапросомПриИзменении(Элемент)
	
	ВыполнитьЗапросДополнения(Истина);
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

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

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

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

Процедура ИспользоватьОтборПриИзменении(Элемент)
	
	ТаблицаЗначенийОтобрать();
	
КонецПроцедуры

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

Процедура ПриПолученииДанныхДоступныхПолей(Элемент, ОформленияСтрок)

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

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

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

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

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

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

Процедура КоманднаяПанельТаблицаЗначенийИсполняемаяКомпоновка(Кнопка)
	
	ТаблицаЗначенийОтобрать(Истина);
	
КонецПроцедуры

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

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

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

Процедура КоличествоПотоковОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Элемент.Значение = 1;
	
КонецПроцедуры

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

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

Процедура ВыполнятьКонвертациюНаСервереПриИзменении(Элемент)
	НастроитьЭлементыФормы();
КонецПроцедуры

Процедура ВыполнятьЗагрузкуНаСервереПриИзменении(Элемент)
	НастроитьЭлементыФормы();
КонецПроцедуры

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

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

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

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

Процедура ТолькоВыделенныеСтрокиТДПриИзменении(Элемент)
	
	ОбновитьСопоставлениеКолонокТЗВФорме();
	
КонецПроцедуры

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

Процедура СопоставлениеКолонокБДИзИсточникаПриИзменении(Элемент)
	
	ЭлементыФормы.СопоставлениеКолонокБД.ТекущаяСтрока.Пометка = Истина;
	
КонецПроцедуры

Процедура СобытияОбработкиОбъектовВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	СобытияОбработкиОбъектовАлгоритмНачалоВыбора();
КонецПроцедуры

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

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

Процедура ТабличныйДокументПриАктивизацииОбласти(Элемент)
	ТекущаяОбласть = ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть;
	Если Истина
		И ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента")
		И ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник 
		// Антибаг платформы - увеличиваются размеры документа при обращении к ТекущаяОбласть.Примечание.* https://www.hostedredmine.com/issues/954529
		И ТекущаяОбласть.Низ <= ЭлементыФормы.ТабличныйДокумент.ВысотаТаблицы
		И ТекущаяОбласть.Право <= ЭлементыФормы.ТабличныйДокумент.ШиринаТаблицы
	Тогда
		ЭтаФорма.ПримечаниеЯчейки = ТекущаяОбласть.Примечание.Текст;
	Иначе
		ЭтаФорма.ПримечаниеЯчейки = "";
	КонецЕсли;
	ирКлиент.ПолеТабличногоДокументаПриАктивизацииОбластиЛкс(ЭтаФорма, Элемент);
КонецПроцедуры

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

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

Процедура СопоставлениеКолонокБДПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры

Процедура СопоставлениеКолонокБДПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

Процедура СопоставлениеКолонокТЗПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры

Процедура СопоставлениеКолонокТЗПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

Процедура СопоставлениеКолонокБДПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
	СтандартнаяОбработка = ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Копирование;
КонецПроцедуры

Процедура КоманднаяПанельТабличногоДокументаСоздатьОбъект(Кнопка)
	
	ВыбратьЗначениеВЯчейке(Истина);
	
КонецПроцедуры

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

Процедура КоманднаяПанельТаблицаБДСравнитьСтрокуБД(Кнопка)
	
	ТекущаяСтрока = ЭлементыФормы.ТаблицаБД.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ИменаАктивныхКолонокБД = ИменаАктивныхКолонокБД();
	ИменаАктивныхКолонокБД = ирОбщий.СтрСоединитьЛкс(ИменаАктивныхКолонокБД);
	СтрокаКолонокКлючаБД = СтрокаКолонокКлючаБД();
	КлючСтрокиБД = Новый Структура(СтрокаКолонокКлючаБД);
	ЗаполнитьЗначенияСвойств(КлючСтрокиБД, ТекущаяСтрока);
	Построитель = Новый ПостроительЗапроса("ВЫБРАТЬ Т.* ИЗ " + ПолноеИмяТаблицы + " КАК Т");
	Построитель.ЗаполнитьНастройки();
	ирОбщий.УстановитьОтборПоСтруктуреЛкс(Построитель.Отбор, КлючСтрокиБД);
	ДанныеСтроки = Построитель.Результат.Выгрузить();
	Если ДанныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	ДанныеСтроки = ДанныеСтроки[0];
	СтруктураСтарая = Новый Структура(ИменаАктивныхКолонокБД);
	ЗаполнитьЗначенияСвойств(СтруктураСтарая, ДанныеСтроки);
	СтруктураНовая = Новый Структура(ИменаАктивныхКолонокБД);
	ЗаполнитьЗначенияСвойств(СтруктураНовая, ТекущаяСтрока);
	Если ЭлементыФормы.ТаблицаБД.ТекущаяКолонка <> Неопределено Тогда
		ТекущаяКолонка = ЭлементыФормы.ТаблицаБД.ТекущаяКолонка.Имя;
	КонецЕсли;
	ирКлиент.Сравнить2ЗначенияВФормеЛкс(СтруктураСтарая, СтруктураНовая,, "Старое", "Новое",, ТекущаяКолонка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура ОсновныеДействияФормыОбучающееВидео(Кнопка)
	
	ЗапуститьПриложение("https://www.youtube.com/watch?v=S1ovPH-OR5g");

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

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

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

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

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

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

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

