///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

Функция ОпределитьТипФормы(ИмяФормы) Экспорт
	
	Возврат МультиязычностьСервер.ОпределитьТипФормы(ИмяФормы);
	
КонецФункции

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

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

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

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

Функция СуффиксЯзыкаПоКодуЯзыка(Язык) Экспорт
	
	Для ПорядковыйНомерЯзыка = 1 По КоличествоДополнительныхЯзыков() Цикл
		
		ИмяКонстанты    =  МультиязычностьСервер.ИмяКонстантыЯзыка(ПорядковыйНомерЯзыка);
		Если СтрСравнить(Язык, Константы[ИмяКонстанты].Получить()) = 0
		   И ИспользуетсяДополнительныйЯзык(ПорядковыйНомерЯзыка) Тогда
				Возврат МультиязычностьКлиентСервер.СуффиксЯзыка(ПорядковыйНомерЯзыка);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат "";
	
КонецФункции

Функция КоличествоДополнительныхЯзыков() Экспорт
	
	ПорядковыйНомерЯзыка = 1;
	КоличествоЯзыков     = Неопределено;
	
	Пока КоличествоЯзыков = Неопределено Цикл
		
		Если Метаданные.Константы.Найти(МультиязычностьСервер.ИмяКонстантыЯзыка(ПорядковыйНомерЯзыка)) = Неопределено
		 Или ПорядковыйНомерЯзыка = 1000 Тогда
			КоличествоЯзыков = ПорядковыйНомерЯзыка - 1;
			Прервать;
		КонецЕсли;
		
		ПорядковыйНомерЯзыка = ПорядковыйНомерЯзыка + 1;
		
	КонецЦикла;
		
	Возврат КоличествоЯзыков;
	
КонецФункции

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

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

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

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

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