Экземпляр бюджета / Сопоставление загружаемых данных из Excel / Модуль формы

файл

#Область ОбработчикиСобытийФормы

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ПериодНеСоответствуетПериодуБюджета Тогда
		ПодключитьОбработчикОжидания("ПоказатьВопросНесоответствияПериода", 0.2, Истина);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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

#КонецОбласти

#Область ОбработчикиСобытийТаблицыФормы

&НаКлиенте
Процедура СписокРедактированияБюджетаПриАктивизацииСтроки(Элемент)
	
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СтруктураПолей = ПолучитьИзВременногоХранилища(АдресСоответствияЗагрузки)[ТекущиеДанные.ИндексСтроки];
	
	Для Каждого КлючИЗначение Из СтруктураПолей Цикл
		ЭтаФорма["ЗначениеЗагрузки_" + КлючИЗначение.Ключ] = КлючИЗначение.Значение;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРедактированияБюджетаПослеУдаления(Элемент)
	
	НастроитьВариантыОтображенияСтрок();
	
КонецПроцедуры

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗакрытьФормы(Команда)
	
	Закрыть();
	
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СписокРедактированияБюджетаОсновнаяКолонкаПриИзменении(Команда)
	
	СписокРедактированияПриИзмененииНаСервере();
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

&НаКлиенте
Процедура ПриОткрытииФрагмент(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Нет Тогда
		Закрыть();
	КонецЕсли;

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

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

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

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

&НаКлиенте
Процедура ОтметитьВсе(Команда)
	
	Для Каждого СтрокаЗагрузки Из СписокРедактированияБюджета Цикл
		СтрокаЗагрузки.Загружать = Истина;
	КонецЦикла;
	
	НастроитьВариантыОтображенияСтрок();
	
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция МассивЗначенийЗагружаемогоФайла(АдресФайлаДанных, РасширениеФайла, КоличествоКолонокПоСтруктуреБюджета)
	
	МассивЗначений = Новый Массив; // Массив из Массив -
	Для НомерКолонки = 1 По КоличествоКолонокПоСтруктуреБюджета Цикл
		МассивЗначений.Добавить(Новый Массив);
	КонецЦикла;
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаДанных); // ДвоичныеДанные -
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	ДвоичныеДанные = Неопределено;
	УдалитьИзВременногоХранилища(АдресФайлаДанных);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	Попытка
		ТабличныйДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	Исключение
		ТекстОшибки = НСтр("ru = 'Не удалось прочитать выбранный файл по причине %1'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ТекстОшибки,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки);
		Возврат МассивЗначений;
	КонецПопытки;
	
	НомерПервойКолонки = 0;
	НомерПервойСтроки = 0;
	
	МаксимальноеКоличествоПустыхКолонок = 10;
	МаксимальноеКоличествоПустыхСтрок   = 10;
	
	// Поиск первой заполненной ячейки с левого верхнего угла.
	ТекущийНомерСтроки = 0;
	ПустыхСтрок = 0;
	Пока НомерПервойСтроки = 0 Цикл
		Если ПустыхСтрок >= МаксимальноеКоличествоПустыхСтрок Тогда
			Прервать;
		КонецЕсли;
		
		ПустыхКолонок = 0;
		ТекущийНомерСтроки = ТекущийНомерСтроки + 1;
		ТекущийНомерКолонки = 0;
		
		Пока НомерПервойСтроки = 0 Цикл
			Если ПустыхКолонок >= МаксимальноеКоличествоПустыхКолонок Тогда
				Прервать;
			КонецЕсли;
			
			ТекущийНомерКолонки = ТекущийНомерКолонки + 1;
			
			ИмяОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				"R%1C%2",
				Формат(ТекущийНомерСтроки, "ЧН=0; ЧГ=0"),
				Формат(ТекущийНомерКолонки, "ЧН=0; ЧГ=0"));
			Значение = ТабличныйДокумент.Область(ИмяОбласти).Текст;
			Если НЕ ЗначениеЗаполнено(Значение) Тогда
				ПустыхКолонок = ПустыхКолонок + 1;
				Продолжить;
			Иначе
				Если НомерПервойКолонки = 0 Тогда
					НомерПервойКолонки = ТекущийНомерКолонки;
					НомерПервойСтроки  = ТекущийНомерСтроки;
					Прервать;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Если НЕ НомерПервойСтроки = 0 Тогда
		// Поиск последней строки.
		// Количество читаемых колонок известно.
		ТекущийНомерСтроки    = НомерПервойСтроки;
		
		ПустыхСтрок = 0;
		
		Пока Истина Цикл
			
			ЕстьЗначениеПоСтроке = Ложь;
			ЗначенияПоСтроке = Новый Соответствие;
			Для ИндексТекущийКолонки = 0 По КоличествоКолонокПоСтруктуреБюджета-1 Цикл
				ТекущийНомерКолонки = НомерПервойКолонки + ИндексТекущийКолонки;
				ИмяОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					"R%1C%2",
					Формат(ТекущийНомерСтроки, "ЧН=0; ЧГ=0"),
					Формат(ТекущийНомерКолонки, "ЧН=0; ЧГ=0"));
				Область = ТабличныйДокумент.Область(ИмяОбласти);
				Значение = ?(Область.СодержитЗначение, Область.Значение, Область.Текст);
				Если ЗначениеЗаполнено(Значение) Тогда
					ЕстьЗначениеПоСтроке = Истина;
				КонецЕсли;
				
				// Добавление в соответствующий массив колонок.
				ЗначенияПоСтроке.Вставить(ИндексТекущийКолонки, Значение);
			КонецЦикла;
			
			Если НЕ ЕстьЗначениеПоСтроке Тогда
				ПустыхСтрок = ПустыхСтрок + 1;
			Иначе
				ПустыхСтрок = 0;
				Для каждого ИндексКолонкиИЗначение Из ЗначенияПоСтроке Цикл
					МассивЗначений[ИндексКолонкиИЗначение.Ключ].Добавить(ИндексКолонкиИЗначение.Значение);
				КонецЦикла;
			КонецЕсли;
			
			Если ПустыхСтрок >= МаксимальноеКоличествоПустыхСтрок Тогда
				Прервать;
			КонецЕсли;
			
			ТекущийНомерСтроки = ТекущийНомерСтроки + 1;
			
		КонецЦикла;
	КонецЕсли;
	
	Попытка
		УдалитьФайлы(ИмяВременногоФайла);
	Исключение
		
		КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
		СобытиеЖР = НСтр("ru = 'Бюджетирование'", КодЯзыка) + "." + НСтр("ru = 'Удаление временного файла загрузки данных'", КодЯзыка);
		ТекстОшибки = НСтр("ru = 'Не удалось удалить временный файл загрузки данных по причине %1'", КодЯзыка);
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ТекстОшибки,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ЗаписьЖурналаРегистрации(СобытиеЖР, УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
	КонецПопытки;
	
	Возврат МассивЗначений;
	
КонецФункции

#КонецОбласти

Связанные материалы