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

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

Процедура ОсновныеДействияФормыИсследовать(Кнопка)
	ирОбщий.ИсследоватьЛкс(1);
КонецПроцедуры

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

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

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

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

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

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

Функция ПоследниеВыбранныеНажатие(Кнопка) Экспорт
	ирКлиент.ПоследниеВыбранныеНажатиеЛкс(ЭтаФорма, ЭлементыФормы.КартинкиКонфигурации, "Имя", Кнопка);
КонецФункции

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

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

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

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

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

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

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

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

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

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

Процедура ПрименитьФильтрПоПодстрокеБезСохранения()
	ЭлементОтбора = ЭлементыФормы.КартинкиКонфигурации.ОтборСтрок.Имя;
	ЭлементОтбора.ВидСравнения = ВидСравнения.Содержит;
	ЭлементОтбора.Использование = ЗначениеЗаполнено(ЭлементОтбора.Значение);
	Если ЭлементыФормы.ДействияФормы.Кнопки.Матрица.Пометка Тогда
		ТекстМатрицы = Новый Массив;
		Если ПустаяСтрока(ЭлементыФормы.КартинкиКонфигурации.ОтборСтрок) Тогда
			ОтобранныеСтроки = КартинкиКонфигурации
		Иначе
			ОтобранныеСтроки = ирКлиент.ПостроительТабличногоПоляСОтборомКлиентаЛкс(ЭлементыФормы.КартинкиКонфигурации).Результат.Выгрузить(); // см. КартинкиКонфигурации.Выгрузить
		КонецЕсли;
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ОтобранныеСтроки.Количество(), "Подготовка файлов");
		Для Каждого СтрокаКартинки Из ОтобранныеСтроки Цикл
			ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
			Картинка = ЗаполнитьВсеДанныеВСтроке(СтрокаКартинки);
			Файл = Новый Файл(КаталогВременныхФайлов() + СтрокаКартинки.Имя + "." + СтрокаКартинки.Формат);
			Если Ложь
				Или Не Файл.Существует() 
				Или ПустаяСтрока(СтрокаКартинки.ИмяФайла) 
			Тогда
				СтрокаКартинки.ИмяФайла = Файл.Имя;
				Если ТипЗнч(СтрокаКартинки) = Тип("СтрокаТаблицыЗначений") Тогда
					ЗаполнитьЗначенияСвойств(КартинкиКонфигурации.Найти(СтрокаКартинки.Имя, "Имя"), СтрокаКартинки);
				КонецЕсли;
				Картинка.Записать(Файл.ПолноеИмя);
			КонецЕсли;
			// Пробовал избавиться от розового фона у некоторых BMP 24b
			//ТекстМатрицы.Добавить(ирОбщий.СтрШаблонЛкс("<img src=""%2"" id=""%1"" height=16 width=16 background=rgba(255,255,255,1)>", СтрокаКартинки.Имя, Файл.ПолноеИмя)); 
			ТекстМатрицы.Добавить(ирОбщий.СтрШаблонЛкс("<img src=""%2"" id=""%1"" height=16 width=16>", СтрокаКартинки.Имя, Файл.ПолноеИмя));
		КонецЦикла;
		ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
		ТекстМатрицы = "<html><body>" + ирОбщий.СтрСоединитьЛкс(ТекстМатрицы, "") + "</body></html>";
		ЭлементыФормы.МатрицаКартинок.УстановитьТекст(ТекстМатрицы);
	КонецЕсли;
КонецПроцедуры

Процедура ФильтрПоПодстрокеОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Элемент.Значение = ""; // Меняем Неопределено на пустую строку
	ПрименитьФильтрПоПодстрокеБезСохранения();
КонецПроцедуры

Процедура МатрицаКартинокonclick(Элемент, pEvtObj)
	ИД = pEvtObj.srcElement.id;
	Если ПустаяСтрока(ИД) Тогда
		Возврат;;
	КонецЕсли;
	ЭлементыФормы.КартинкиКонфигурации.ТекущаяСтрока = КартинкиКонфигурации.Найти(ИД, "Имя");
КонецПроцедуры

Процедура МатрицаКартинокondblclick(Элемент, pEvtObj)
	ИД = pEvtObj.srcElement.id;
	Если ПустаяСтрока(ИД) Тогда
		Возврат;;
	КонецЕсли;
	ОткрытьКартинку();
КонецПроцедуры

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

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

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

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

