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

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

// Создает структуру отбора, для дальнейшей передачи на сервер,
// и использования в качестве параметров отбора динамических списков вызываемых форм.
//
Функция СоздатьСтруктуруПараметраОтбора(ТипОтбора, ЛевоеЗначение, ВидСравнения, ПравоеЗначение) Экспорт

	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставить("ТипОтбора", ТипОтбора);
	СтруктураВозврата.Вставить("ЛевоеЗначение", ЛевоеЗначение);
	СтруктураВозврата.Вставить("ВидСравнения", ВидСравнения);
	СтруктураВозврата.Вставить("ПравоеЗначение", ПравоеЗначение);

	Возврат СтруктураВозврата;

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

// Параметры:
//  Респондент   - ОпределяемыйТип.Респондент - респондент, с которым проводится интервью.
//  ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон, по которому проводится интервью.
//               - Неопределено - пользователь выбирает шаблон из справочника.
//
Процедура НачатьИнтервью(Респондент, ШаблонАнкеты = Неопределено) Экспорт

	Если ШаблонАнкеты = Неопределено Тогда

		ОписаниеОповещения = Новый ОписаниеОповещения("НачатьИнтервьюСВыборомШаблонаЗавершение", ЭтотОбъект, Респондент);

		ПоказатьВводЗначения(ОписаниеОповещения, Неопределено, , Тип("СправочникСсылка.ШаблоныАнкет"));

	Иначе

		ОткрытьФормуИнтервью(Респондент, ШаблонАнкеты);

	КонецЕсли;

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

Процедура ОткрытьФормуИнтервью(Респондент, ШаблонАнкеты)

	ЗначенияЗаполнения = Новый Структура;
	ЗначенияЗаполнения.Вставить("Респондент", Респондент);
	ЗначенияЗаполнения.Вставить("ШаблонАнкеты", ШаблонАнкеты);
	ЗначенияЗаполнения.Вставить("РежимАнкетирования", ПредопределенноеЗначение(
		"Перечисление.РежимыАнкетирования.Интервью"));

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
	ПараметрыФормы.Вставить("ТолькоФормаЗаполнения", Истина);

	ФормаАнкеты = ОткрытьФорму("Документ.Анкета.ФормаОбъекта", ПараметрыФормы);

	Если ФормаАнкеты <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(ФормаАнкеты, ЗначенияЗаполнения);
	КонецЕсли;

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

// Обработчик результата работы процедуры НачатьИнтервьюСВыборомШаблона.
//
Процедура НачатьИнтервьюСВыборомШаблонаЗавершение(ВыбранныйШаблон, Респондент) Экспорт

	Если ВыбранныйШаблон = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОткрытьФормуИнтервью(Респондент, ВыбранныйШаблон);

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

Процедура ПриИзмененииВопроса(Форма, Элемент) Экспорт

	ИмяВопроса = Элемент.Имя;

	Если СтрНайти(ИмяВопроса, "_Комментарий") <> 0 Тогда
		Возврат;
	КонецЕсли;

	Если СтрНайти(ИмяВопроса, "_Таблица") <> 0 Тогда
		Возврат;
	КонецЕсли;

	Если СтрНайти(ИмяВопроса, "_Ответ_") <> 0 Тогда
		Возврат;
	КонецЕсли;

	Если СтрНайти(ИмяВопроса, "_Реквизит_") <> 0 Тогда
		ПриИзмененииВопросаСВариантамиОтветов(Форма, ИмяВопроса);
		Возврат;
	КонецЕсли;

	НайденныеСтроки = Форма.ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("КлючСтроки",
		Новый УникальныйИдентификатор(СтрЗаменить(Прав(ИмяВопроса, 36), "_", "-"))));

	Если НайденныеСтроки.Количество() > 0 Тогда
		УстановитьПодсказкуУЧисловогоВопроса(Форма, НайденныеСтроки[0], ИмяВопроса);
		Если НайденныеСтроки[0].Обязательный Тогда
			НаименованиеГруппы = ИмяВопроса + "_Группа";
			ИзменитьЦветФонаГруппыОбязательногоВопроса(Форма.Элементы[НаименованиеГруппы].ЦветФона, ЗначениеЗаполнено(
				Форма[ИмяВопроса]));
		КонецЕсли;
	КонецЕсли;

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

Процедура ПриИзмененииПолосыРегулирования(Форма, Элемент) Экспорт

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

	Если НайденныеСтроки.Количество() > 0 Тогда
		ШагПриращения = НайденныеСтроки[0].ШагПолосыРегулирования;
		Форма[ИмяРеквизитаЧисло] = НайденныеСтроки[0].МинимальноеЗначение + ШагПриращения * Форма[Элемент.Имя
			+ "Реквизит"];

		УстановитьПодсказкуУЧисловогоВопроса(Форма, НайденныеСтроки[0], ИмяРеквизитаЧисло);

		Если НайденныеСтроки[0].Обязательный Тогда
			НаименованиеГруппы = ИмяРеквизитаЧисло + "_Группа";
			ИзменитьЦветФонаГруппыОбязательногоВопроса(Форма.Элементы[НаименованиеГруппы].ЦветФона, ЗначениеЗаполнено(
				Форма[ИмяРеквизитаЧисло]));
		КонецЕсли;
	КонецЕсли;

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

Процедура РегулированиеПоляЧисло(Форма, Элемент, Направление, СтандартнаяОбработка) Экспорт

	СтандартнаяОбработка = Ложь;

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

	Если НайденныеСтроки.Количество() > 0 Тогда
		ШагПриращения = НайденныеСтроки[0].ШагПолосыРегулирования;
		НовоеЗначение = Форма[Элемент.Имя] + Направление * ШагПриращения;
		Если Направление = 1 И НовоеЗначение > Элемент.МаксимальноеЗначение Тогда
			Форма[Элемент.Имя] = Элемент.МаксимальноеЗначение;
		ИначеЕсли Направление = -1 И НовоеЗначение < Элемент.МинимальноеЗначение Тогда
			Форма[Элемент.Имя] = Элемент.МинимальноеЗначение;
		Иначе
			Форма[Элемент.Имя] = НовоеЗначение;
		КонецЕсли;
		Форма[Элемент.Имя + "_ПолосаРегулированияРеквизит"] = (Форма[Элемент.Имя]
			- НайденныеСтроки[0].МинимальноеЗначение) / ШагПриращения;

		УстановитьПодсказкуУЧисловогоВопроса(Форма, НайденныеСтроки[0], Элемент.Имя);

		Если НайденныеСтроки[0].Обязательный Тогда
			НаименованиеГруппы = Элемент.Имя + "_Группа";
			ИзменитьЦветФонаГруппыОбязательногоВопроса(Форма.Элементы[НаименованиеГруппы].ЦветФона, ЗначениеЗаполнено(
				Форма[Элемент.Имя]));
		КонецЕсли;
	КонецЕсли;

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

Процедура ПриИзмененииПоляЧисло(Форма, Элемент) Экспорт

	Если Форма.Элементы.Найти(Элемент.Имя + "_ПолосаРегулирования") = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

	Если НайденныеСтроки.Количество() > 0 Тогда
		ШагПриращения = НайденныеСтроки[0].ШагПолосыРегулирования;
		Форма[Элемент.Имя + "_ПолосаРегулированияРеквизит"] = (Форма[Элемент.Имя]
			- НайденныеСтроки[0].МинимальноеЗначение) / ШагПриращения;

		УстановитьПодсказкуУЧисловогоВопроса(Форма, НайденныеСтроки[0], Элемент.Имя);

		Если НайденныеСтроки[0].Обязательный Тогда
			НаименованиеГруппы = Элемент.Имя + "_Группа";
			ИзменитьЦветФонаГруппыОбязательногоВопроса(Форма.Элементы[НаименованиеГруппы].ЦветФона, ЗначениеЗаполнено(
				Форма[Элемент.Имя]));
		КонецЕсли;
	КонецЕсли;

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

Процедура ПриИзмененииФлагаНеОтвечатьНаВопрос(Форма, Элемент) Экспорт

	ИмяВопроса = Лев(Элемент.Имя, СтрНайти(Элемент.Имя, "_ИспользоватьОтказОтОтвета") - 1);

	НайденныеСтроки = Форма.ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("КлючСтроки",
		Новый УникальныйИдентификатор(СтрЗаменить(Прав(ИмяВопроса, 36), "_", "-"))));

	Если НайденныеСтроки.Количество() > 0 Тогда
		ВыделитьВопросСОтветом(Форма, НайденныеСтроки[0], ИмяВопроса);
	КонецЕсли;

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

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

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

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

Процедура ПриИзмененииВопросаСВыборомОдногоВариантаОтвета(Форма, Вопрос, ИмяВопроса)

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

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

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

Процедура ПриИзмененииВопросаСВыборомНесколькихВариантовОтвета(Форма, Вопрос, ИмяВопроса)

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

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

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

Процедура ВыделитьВопросыНаКоторыеДаныОтветы(Форма) Экспорт

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

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

Процедура ВыделитьВопросСОтветом(Форма, Вопрос, ИмяВопроса)

	БезОтвета = Ложь;
	Если Вопрос.ИспользоватьОтказОтОтвета Тогда
		БезОтвета = Форма[ИмяВопроса + "_ИспользоватьОтказОтОтвета"];
	КонецЕсли;

	Если Вопрос.ТипОтвета <> ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз")
		И Вопрос.ТипОтвета <> ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз")
		И Вопрос.ТипОтвета <> ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.Булево") Тогда
		Форма.Элементы[ИмяВопроса].АвтоОтметкаНезаполненного = Не БезОтвета;
	КонецЕсли;

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

	Если Вопрос.ТребуетсяКомментарий Тогда
		Форма.Элементы[ИмяВопроса + "_Комментарий"].Доступность = Не БезОтвета;
	КонецЕсли;

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

	Если ЕстьОтвет Тогда
		УстановитьПодсказкуУЧисловогоВопроса(Форма, Вопрос, ИмяВопроса);
	КонецЕсли;

	ВыделитьФон = ЕстьОтвет Или БезОтвета;

	НаименованиеГруппы = ИмяВопроса + "_Группа";
	ИзменитьЦветФонаГруппыОбязательногоВопроса(Форма.Элементы[НаименованиеГруппы].ЦветФона, ВыделитьФон);

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

Функция ЕстьОтветНаВопросСВыборомОтветов(Форма, Вопрос, ИмяВопроса)

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

	Возврат Ложь;

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

Процедура УстановитьПодсказкуУЧисловогоВопроса(Форма, Вопрос, ИмяВопроса)

	Если Вопрос.ТипОтвета <> ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.Число") Тогда
		Возврат;
	КонецЕсли;

	Если Вопрос.ДиапазонПодсказокЧисловогоВопроса.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	ТекстПодсказки = "";
	Для Каждого Диапазон Из Вопрос.ДиапазонПодсказокЧисловогоВопроса Цикл
		Если Форма[ИмяВопроса] <= Диапазон.ЗначениеДо Тогда
			ТекстПодсказки = Диапазон.Подсказка;
		КонецЕсли;
	КонецЦикла;

	Форма.Элементы[ИмяВопроса].Подсказка = ТекстПодсказки;
	Форма.Элементы[ИмяВопроса + "_РасшифровкаПодсказки"].Заголовок = ТекстПодсказки;

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

Процедура ИзменитьЦветФонаГруппыОбязательногоВопроса(ЦветФонаГруппыВопроса, ВыделитьФон)

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

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

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