Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 02:38

Как ставить булево автоматически при заполнения строки

Автор burza, 13 июл 2016, 14:54

0 Пользователей и 1 гость просматривают эту тему.

burza

Здравствуйте! Есть вот такая форма для анкетирования где нужно сначала ставить булево чтобы выбрать и потом делать описание. Как сделать так чтобы сразу при заполнении строки галочка ставилась автоматом.

Нужен ли код? или и так можно подсказать)

VivaBrunko

Цитата: burza от 13 июл 2016, 14:54
Здравствуйте! Есть вот такая форма для анкетирования где нужно сначала ставить булево чтобы выбрать и потом делать описание. Как сделать так чтобы сразу при заполнении строки галочка ставилась автоматом.

Нужен ли код? или и так можно подсказать)
Нужен. Правда думаю такой ответ Вас не особо устроит

burza

Цитата: VivaBrunko от 13 июл 2016, 15:15
Цитата: burza от 13 июл 2016, 14:54
Здравствуйте! Есть вот такая форма для анкетирования где нужно сначала ставить булево чтобы выбрать и потом делать описание. Как сделать так чтобы сразу при заполнении строки галочка ставилась автоматом.

Нужен ли код? или и так можно подсказать)
Нужен. Правда думаю такой ответ Вас не особо устроит



////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

Если НЕ Объект.Опрос.Пустая() Тогда

РеквизитыОпрос = ПолучитьЗначенияРеквизитовНазначениеОпроса(Объект.Опрос);
УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос);

Если Не ШаблонАнкеты.Пустая() Тогда

Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда
АвтоЗаголовок = Ложь;
УстановитьЗаголовкиНадписей(РеквизитыОпрос);
КонецЕсли;

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

Если (НЕ Объект.Проведен) И ЗначениеЗаполнено(Объект.РедактируемыйРаздел) Тогда


Если ТипЗнч(Объект.РедактируемыйРаздел) = Тип("СправочникСсылка.ВопросыШаблонаАнкеты") Тогда

НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"Ссылка",Истина);

Иначе

НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"ТипСтроки",Истина);

КонецЕсли;

Если НомерТекущегоРаздела >= 0 Тогда

Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела;
ПостроениеФормыСогласноРаздела();

КонецЕсли;

КонецЕсли;

Иначе

Отказ = Истина;
Возврат;

КонецЕсли;

КонецЕсли;

Элементы.ПредыдущийРазделПодвал.Видимость = Ложь;
Элементы.СледующийРазделПодвал.Видимость  = Ложь;

ДействияВЗависимостиОтВидаФормы();

Элементы.ГруппаДеревоРазделов.Видимость         = Ложь;
Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = НСтр("ru = 'Показать разделы'");
Элементы.ДекорацияОжиданиеЭлементы.Ширина       = 45;

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела;
УправлениеДоступностьюКнопкиНавигацияРазделов();

Если (Не ЭтаФорма.ТолькоПросмотр) Тогда
УправлениеДоступностьюПодчиненныеВопросы(Ложь);
КонецЕсли;

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

Если Элементы.ГруппаТелоАнкеты.ТолькоПросмотр Тогда
Модифицированность = Ложь;
КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ

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

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

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

ОткрытьФорму(ИмяМетаданныхРеспонент + ".ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент);

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

//Обработчик события ПриИзменении для вопросов с условием
&НаКлиенте
Процедура Подключаемый_ПриИзмененииВопросовСУсловием(Элемент)

УправлениеДоступностьюПодчиненныеВопросы();

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

//Обработчик события при изменении для простых и табличных вопросов
&НаКлиенте
Процедура ПриИзмененииВопроса(Элемент)

Модифицированность = Истина;

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

//Обработчик начало выбора текстовых ячеек табличных вопросов
&НаКлиенте
Процедура Подключаемый_НачалоВыбораТекстовыхЯчеекТабличныхВопросов(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

Результат = "";
ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ТекстРедактирования,Результат,Модифицированность);
Если ТипЗнч(Элемент.Родитель) = Тип("ГруппаФормы") Тогда
ЭтаФорма[Элемент.Имя] = Результат;
Иначе

НайденнаяСтрока = ЭтаФорма[Элемент.Родитель.Имя].НайтиПоИдентификатору(Элемент.Родитель.ТекущаяСтрока);
ИндексСтроки = ЭтаФорма[Элемент.Родитель.Имя].Индекс(НайденнаяСтрока);
ЭтаФорма[Элемент.Родитель.Имя][ИндексСтроки][Элемент.Имя] = Результат;

КонецЕсли;

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

&НаКлиенте
Процедура ДеревоРазделовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

ТекущиеДанные = Элементы.ДеревоРазделов.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;

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

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

&НаКлиенте
Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность);

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

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД ФОРМЫ

&НаКлиенте
Процедура ФормаЗаполненияЗаписать(Команда)

Отказ = ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписиДокумента.Запись);

Если НЕ Отказ Тогда

ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"),
,
Строка(Объект.Ссылка),
БиблиотекаКартинок.Информация32);

Оповестить("Запись_Анкета",Новый Структура,Объект.Ссылка);

КонецЕсли;

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

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

Отказ = Ложь;

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

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

Если НЕ Отказ Тогда

ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"),
,
Строка(Объект.Ссылка),
БиблиотекаКартинок.Информация32);

Оповестить("Проведение_Анкета",Новый Структура,Объект.Ссылка);
Модифицированность = Ложь;
Закрыть();

КонецЕсли;

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

&НаКлиенте
Процедура СкрытьПоказатьДеревоРазделов(Команда)

ИзменитьВидимостьДеревоРазделов();

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

&НаКлиенте
Процедура СледующийРаздел(Команда)

ИзменитьРаздел("Вперед");

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

&НаКлиенте
Процедура ПредыдущийРаздел(Команда)

ИзменитьРаздел("Назад");

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

&НаКлиенте
Процедура ВыборРаздела(Команда)

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

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

////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// Установка значений реквизитов формы

// Устанавливает значения реквизитов формы заполнения, согласно данным ранее ответам
//
&НаСервере
Процедура УстановитьЗначенияРеквизитовФормыЗаполненияРаздела()

ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВнешнийИсточник.Вопрос КАК Вопрос,
| ВнешнийИсточник.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
| ВнешнийИсточник.НомерЯчейки КАК НомерЯчейки,
| ВнешнийИсточник.Ответ КАК Ответ,
| ВнешнийИсточник.ОткрытыйОтвет КАК ОткрытыйОтвет
|ПОМЕСТИТЬ ТаблицаОтветов
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|ГДЕ
| ВнешнийИсточник.Вопрос В(&ВопросыРаздела)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаОтветов.Вопрос КАК Вопрос,
| ТаблицаОтветов.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
| ТаблицаОтветов.НомерЯчейки КАК НомерЯчейки,
| ТаблицаОтветов.Ответ КАК Ответ,
| ТаблицаОтветов.ОткрытыйОтвет КАК ОткрытыйОтвет
|ИЗ
| ТаблицаОтветов КАК ТаблицаОтветов
|ИТОГИ ПО
| Вопрос";

Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить());
Запрос.УстановитьПараметр("ВопросыРаздела",ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона"));

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда

Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл

ВыборкаВопрос = Выборка.Выбрать();
УстановитьЗначениеРеквизита(Выборка.Вопрос,ВыборкаВопрос);

КонецЦикла;

КонецЕсли;

//+CRM
Для Каждого СтрокаВопросРаздела Из ТаблицаВопросовРаздела Цикл

Если СтрокаВопросРаздела.ТипСтроки = "Вопрос" Тогда

ТекущийВопросТипОтвета =  СтрокаВопросРаздела.ЭлементарныйВопрос.ТипОтвета;

Если (ТекущийВопросТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
И (ТекущийВопросТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз) Тогда

Если Не ПустаяСтрока(СтрокаВопросРаздела.ЭлементарныйВопрос.CRM_ИмяСправочника) Тогда

Если НЕ СтрокаВопросРаздела.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаВопросРаздела.КлючСтроки);

Если (НЕ ЗначениеЗаполнено(ЭтаФорма[ИмяВопроса]))
Или (ТипЗнч(ЭтаФорма[ИмяВопроса]) = Тип("Булево") И ЭтаФорма[ИмяВопроса] = Ложь) Тогда

ЗначениеИзСправочника = CRM_АнкетированиеПривелигированный.ПолучитьРеквизитИзСправочника(Объект.Респондент, СтрокаВопросРаздела.ЭлементарныйВопрос);

Если Не ЗначениеИзСправочника = Неопределено Тогда

ЭтаФорма[ИмяВопроса] = ЗначениеИзСправочника;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЦикла;
//-CRM

Анкетирование.УстановитьЗначенияРеквизитовВариантОтветаОдинИз(ЭтаФорма);

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

// Анализирует тип вопроса и вызывает соответствующие процедуры для установки значений реквизита
//
// Параметры
//  ВопросШаблона  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  ДеревоАнкетыСервер  - ДеревоЗначений - дерево значений, содержащее шаблон анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизита(ВопросШаблона,ВыборкаВопрос)

НайденныеСтроки = ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("ВопросШаблона",ВопросШаблона));

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

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

// Устанавливает значения реквизитов простого вопроса
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизитаПростойВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);

Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма);

Пока ВыборкаВопрос.Следующий() Цикл

ПараметрыОтвета = НайтиОтветВМассиве(ВыборкаВопрос.Ответ,ВариантыОтветовНаВопрос);

Если ПараметрыОтвета <> Неопределено Тогда
ЭтаФорма[ИмяВопроса + "_Реквизит_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = Истина;
Если ПараметрыОтвета.ТребуетОткрытогоОтвета Тогда

ЭтаФорма[ИмяВопроса + "_Комментарий_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = ВыборкаВопрос.ОткрытыйОтвет;

КонецЕсли;
КонецЕсли;

КонецЦикла;

Иначе

Если ВыборкаВопрос.Следующий() Тогда

Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда

ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.ОткрытыйОтвет;

Иначе

ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.Ответ;

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

// Анализирует тип табличного вопроса и вызывает соответствующие процедуры для установки значений реквизитов
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизитаТабличныйВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева)

Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда

УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

КонецЕсли;

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

// Устанавливает значения реквизитов составного табличного вопроса
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);
ИмяТаблицы = ИмяВопроса + "_Таблица";
Таблица    = РеквизитФормыВЗначение(ИмяТаблицы);

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");

Пока ВыборкаВопрос.Следующий() Цикл

Если ВыборкаВопрос.НомерЯчейки > Таблица.Количество() Тогда
ДобавитьСтрокиВТаблицу(Таблица,ВыборкаВопрос.НомерЯчейки - Таблица.Количество());
КонецЕсли;

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если НомерВопросаВМассиве <> Неопределено Тогда
Таблица[ВыборкаВопрос.НомерЯчейки - 1][НомерВопросаВМассиве] = ВыборкаВопрос.Ответ;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева);

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

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");

Пока ВыборкаВопрос.Следующий() Цикл

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если (НомерВопросаВМассиве <> Неопределено) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Количество()) Тогда
Таблица[ВыборкаВопрос.НомерЯчейки - 1][ИмяКолонкиБезНомера + Строка(НомерВопросаВМассиве+1)] = ВыборкаВопрос.Ответ;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в колонках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

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

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");
МассивВопросы.Удалить(0);

Пока ВыборкаВопрос.Следующий() Цикл

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если (НомерВопросаВМассиве <> Неопределено) Тогда
Если (НомерВопросаВМассиве <= Таблица.Количество()) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Колонки.Количество()) Тогда
Таблица[НомерВопросаВМассиве][ИмяКолонкиБезНомера + Строка(ВыборкаВопрос.НомерЯчейки + 1)] = ВыборкаВопрос.Ответ;
КонецЕсли;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках и колонках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//            для которого устанавливаются значения реквзитов
//  ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                  на вопрос шаблона анкеты
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева)

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

ВопросЯчейка = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос;

Пока ВыборкаВопрос.Следующий() Цикл
Если ВыборкаВопрос.ЭлементарныйВопрос = ВопросЯчейка Тогда
НомерКолонки = ?(ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1)=0,КоличествоКолонок - 1,ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1));
НомерСтроки  = ЦЕЛ((ВыборкаВопрос.НомерЯчейки + ЦЕЛ(ВыборкаВопрос.НомерЯчейки/КоличествоКолонок))/КоличествоКолонок);
Таблица[НомерСтроки ][ИмяКолонкиБезНомера + Строка(НомерКолонки+1)] = ВыборкаВопрос.Ответ;
КонецЕсли;
КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

////////////////////////////////////////////////////////////////////////////////
// Преобразование результатов заполнения анкеты в табличную часть документа

&НаСервере
Функция ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписи)

ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть();
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если ПроверитьЗаполнениеАнкеты()  Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;

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

//+CRM
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

CRM_АнкетированиеПривелигированный.ЗаписатьРеквизитыОбъектаАнкетирования(ДокументОбъект);

КонецЕсли;
//-CRM

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

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

// Преобразовает данные в форме заполнения ответы в данные табличной части
//
&НаСервере
Процедура ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть()

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

ПредыдущийРазделБезВопросов = (ТаблицаВопросовРаздела.Количество() = 0);

Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл

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

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

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

КонецЦикла;

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

// Анализирует тип табличного вопроса и вызывает соответствующую процедуру для
// получения ответов, данных респондентом на табличный вопрос
//
// Параметры
// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//
&НаСервере
Процедура ЗаполнитьТаблицуОтветовТабличныйВопрос(СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);
ИмяТаблицы = ИмяВопроса + "_Таблица";
Таблица = РеквизитФормыВЗначение(ИмяТаблицы);

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

Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда

ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица);

КонецЕсли;

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

//Получает ответы, данные респондентом на составной табличный вопрос и аккумулирует их в общей
//  таблице ответов.
//
//Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица)

Для ИндексКолонки = 0 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИндексКолонки];
Если ЗначениеЗаполнено(Ответ) Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;
КонецЦикла;
КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и
// аккумулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица)

ВопросПерваяКолонка = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ;

Для ИндексКолонки = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки+1)];
Если ЗначениеЗаполнено(Ответ) Тогда

ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина;

НоваяСтрока                    = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;

КонецЦикла;

Если ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + "1"];
Если ЗначениеЗаполнено(Ответ) Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросПерваяКолонка;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;

КонецЕсли;

КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и колонках и
// аккумулирует их в общейтаблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица)

ВопросДляСтрок   = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос;
ВопросДляЯчеек   = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос;

ОтветыСтроки  = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляСтрок));
ОтветыКолонки = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок));

ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл
Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки+1)];
Если ЗначениеЗаполнено(Ответ) Тогда

НомерЯчейки = ИндексКолонки + ИндексСтроки * (Таблица.Колонки.Количество() - 1);

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляСтрок;
НоваяСтрока.Ответ              = ОтветыСтроки[ИндексСтроки].Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок;
НоваяСтрока.Ответ              = ОтветыКолонки[ИндексКолонки - 1].Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляЯчеек;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

КонецЕсли;
КонецЦикла;
КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в колонках и
// аккамулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица)

ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл

ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ;

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки + 1)];
Если ЗначениеЗаполнено(Ответ) Тогда

ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексСтроки+1].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексКолонки;

КонецЕсли;

КонецЦикла;

Если  ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок;
НоваяСтрока.Ответ              = СтрокаДерева.ПредопределенныеОтветы[ИндексКолонки - 1].Ответ;
НоваяСтрока.НомерЯчейки        = ИндексКолонки;

КонецЕсли;

КонецЦикла;

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

//Получает ответы, данные респондентом на простой вопрос и
// аккамулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева   - СтрокаДереваЗначений - строка дерева шаблона анкеты
//
&НаСервере
Процедура ЗаполнитьОтветПростойВопрос(СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);

Если СтрокаДерева.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

Ответ = ЭтаФорма[ИмяВопроса];
Если ЗначениеЗаполнено(Ответ) Тогда

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

КонецЕсли;

Иначе

ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма);

Счётчик = 0;
Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

Счётчик = Счётчик + 1;
ИмяРеквизита =  ИмяВопроса + "_Реквизит_" + Счётчик;

Если ЭтаФорма[ИмяРеквизита] Тогда

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

КонецЕсли;

КонецЦикла;

КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// Прочее

// Отвечает за построение формы заполнения
&НаСервере
Процедура ПостроениеФормыСогласноРаздела()

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

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

Элементы.ПредыдущийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0);
Элементы.СледующийРазделПодвал.Видимость  = (ТаблицаВопросовРаздела.Количество() > 0);

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

// Добавляет пустые элементы в Коллекцию
//
// Параметры
//  Таблица    - Коллекция - коллеция в которую добавляются строки
//  ЧислоСтрок - Число - число добавляемых строк
//
&НаСервереБезКонтекста
Процедура ДобавитьСтрокиВТаблицу(Коллекция,ЧислоСтрок);

Для инд = 1 По ЧислоСтрок Цикл
Коллекция.Добавить();
КонецЦикла;

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

// Проверяет, даны ли ответы на обязательные вопросы
//
// Возвращаемое значение:
//   Булево   - Истина, в случае если проверка заполнения обязательных ответов закончилась неудачей,
//              Ложь, в обратном случае.
&НаСервере
Функция ПроверитьЗаполнениеАнкеты()

Отказ = Ложь;

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| СоставОтветов.Вопрос,
| СоставОтветов.ЭлементарныйВопрос,
| СоставОтветов.НомерЯчейки,
| СоставОтветов.Ответ,
| СоставОтветов.ОткрытыйОтвет
|ПОМЕСТИТЬ СоставОтветов
|ИЗ
| &ВнешнийИсточник КАК СоставОтветов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВопросыБезОтветов.Ссылка
|ПОМЕСТИТЬ ОбязательныеВопросыБезОтветов
|ИЗ
| (ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) КАК КоличествоОтветов
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
| ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО (СоставОтветов.Вопрос = ВопросыШаблонаАнкеты.Ссылка)
| ГДЕ
| ВопросыШаблонаАнкеты.Обязательный
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И ВопросыШаблонаАнкеты.РодительВопрос = ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка)
|
| СГРУППИРОВАТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка
|
| ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) = 0
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка,
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ)
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
| ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос
| ГДЕ
| ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.РодительВопрос <> ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка)
| И ВопросыШаблонаАнкеты.РодительВопрос В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Ссылка
| ИЗ
| (ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
| ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) КАК Ответ
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО
| ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос
| ГДЕ
| ВопросыШаблонаАнкеты.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.ВопросСУсловием)
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) = ИСТИНА
| ) КАК ВложенныйЗапрос)
| И ВопросыШаблонаАнкеты.Обязательный
|
| СГРУППИРОВАТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка
|
| ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) = 0) КАК ВопросыБезОтветов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка,
| ВопросыШаблонаАнкеты.Формулировка
|ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
|ГДЕ
| ВопросыШаблонаАнкеты.Ссылка В
| (ВЫБРАТЬ
| ОбязательныеВопросыБезОтветов.Ссылка
| ИЗ
| ОбязательныеВопросыБезОтветов КАК ОбязательныеВопросыБезОтветов)
|
|УПОРЯДОЧИТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка";

Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить());
Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Ложь;
КонецЕсли;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не указан ответ на вопрос - '") + СтрЗаменить(Выборка.Ссылка.ПолныйКод(),"/",".") + " " + Выборка.Формулировка);
КонецЦикла;

Возврат Истина;

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

// Находит ответ в массиве содержащем строки таблицы значений
//
// Параметры
//  Ответ         - Характеристика.ВопросыДляАнкетирования - ответ, который ищем.
//  МассивОтветов - Массив - масссив строк таблицы значений
//
// Возвращаемое значение:
//   Структура   - в структуре содержатся номер реквизита и признак необходимости открытого ответа.
//
&НаСервереБезКонтекста
Функция НайтиОтветВМассиве(Ответ,МассивОтветов)

СтруктураВозврата = Новый Структура;

Для инд = 1 По МассивОтветов.Количество() Цикл

Если МассивОтветов[инд - 1].Ответ = Ответ Тогда

СтруктураВозврата.Вставить("ПорядковыйНомерРеквзита",инд);
СтруктураВозврата.Вставить("ТребуетОткрытогоОтвета",МассивОтветов[инд - 1].ТребуетОткрытогоОтвета);
Возврат СтруктураВозврата;
КонецЕсли;

КонецЦикла;

Возврат Неопределено;

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

&НаСервере
Процедура УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос)

ВозможностьПредварительногоСохранения = РеквизитыОпрос.ВозможностьПредварительногоСохранения;
ШаблонАнкеты                          = РеквизитыОпрос.ШаблонАнкеты;
Вступление                            = РеквизитыОпрос.Вступление;
Заключение                            = РеквизитыОпрос.Заключение;

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

//Получает необходимые значения реквизита согласно выбранному опросу
&НаСервере
Функция ПолучитьЗначенияРеквизитовНазначениеОпроса(Опрос)

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

Запрос.УстановитьПараметр("Опрос",Опрос);

Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка;

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

//Устанавливает значения заголовков и надписей
&НаСервере
Процедура УстановитьЗаголовкиНадписей(РеквизитыОпрос)

Заголовок                            = РеквизитыОпрос.Заголовок;
Элементы.НадписьВступление.Заголовок = РеквизитыОпрос.Вступление;
Вступление                           = РеквизитыОпрос.Вступление;

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

//Управляет доступностью элементов формы
&НаКлиенте
Процедура УправлениеДоступностьюПодчиненныеВопросы(УстанавливатьМодифицированность = Истина)

Для каждого ЭлементКоллекции Из ПодчиненныеВопросы Цикл

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос);

Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл

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

//У флажка и переключателя нет свойства АвтоотметкаНезаполенного.
Попытка
Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоотметкаНезаполненного = (ЭтаФорма[ИмяВопроса] И ПодчиненныйВопрос.Обязательный);
Исключение
КонецПопытки;

КонецЕсли;
КонецЦикла;
КонецЦикла;

Если ВозможностьПредварительногоСохранения И УстанавливатьМодифицированность Тогда
Модифицированность = Истина;
КонецЕсли;

ОтключитьОтметкуНезаполненного();

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

//Устанавливает доступность и видимость реквзитов в зависимости от вида формы
&НаСервере
Процедура ДействияВЗависимостиОтВидаФормы()

Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда

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

Если Параметры.ТолькоПросмотр = Истина Тогда

Элементы.ГруппаТелоАнкеты.ТолькоПросмотр          = Истина;
Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь;
Элементы.ФормаЗаполненияЗаписать.Видимость        = Ложь;

Иначе

Элементы.ФормаЗаполненияЗаписать.Видимость = ВозможностьПредварительногоСохранения;

КонецЕсли;

Модифицированность = Ложь;

Иначе

Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь;
Элементы.ФормаЗаполненияЗаписать.Видимость        = Ложь;
Элементы.ГруппаТелоАнкеты.ТолькоПросмотр          = Истина;
Элементы.ГруппаОсновныеРеквизиты.ТолькоПросмотр   = Истина;

КонецЕсли;

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

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

Если Не ВозможностьПредварительногоСохранения Тогда
Возврат;
КонецЕсли;

Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл

Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда
Продолжить;
КонецЕсли;

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки);

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

КонецЦикла;

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

// Начинает процесс построения формы заполнения согласно разделам
&НаКлиенте
Процедура ВыполнитьПостроениеФормыЗаполнения()

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

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

// Заканчивает формирование формы заполнения анкеты
&НаКлиенте
Процедура ОкончаниеПостроенияФормыЗаполнения()

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

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

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

// Изменяет видимость дерева разделов
&НаКлиенте
Процедура ИзменитьВидимостьДеревоРазделов()

Элементы.ГруппаДеревоРазделов.Видимость         = НЕ Элементы.ГруппаДеревоРазделов.Видимость;
Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = ?(Элементы.ГруппаДеревоРазделов.Видимость,НСтр("ru = 'Скрыть разделы'"),НСтр("ru = 'Показать разделы'"));
Элементы.ДекорацияОжиданиеЭлементы.Ширина       = ?(Элементы.ГруппаДеревоРазделов.Видимость,20,45);

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

// Отвечает за доступность кнопок навигации по разделам
&НаКлиенте
Процедура УправлениеДоступностьюКнопкиНавигацияРазделов()

Элементы.ПредыдущийРаздел.Доступность       = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0);
Элементы.ПредыдущийРазделПодвал.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0);
Элементы.СледующийРаздел.Доступность        = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока +  1) <> Неопределено);
Элементы.СледующийРазделПодвал.Доступность  = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока +  1) <> Неопределено);

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

// Изменяет текущий раздел
&НаКлиенте
Процедура ИзменитьРаздел(Направление)

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

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

Добавлено: 13 июл 2016, 15:32


Цитата: burza от 13 июл 2016, 15:21
Цитата: VivaBrunko от 13 июл 2016, 15:15
Цитата: burza от 13 июл 2016, 14:54
Здравствуйте! Есть вот такая форма для анкетирования где нужно сначала ставить булево чтобы выбрать и потом делать описание. Как сделать так чтобы сразу при заполнении строки галочка ставилась автоматом.

Нужен ли код? или и так можно подсказать)
Нужен. Правда думаю такой ответ Вас не особо устроит


Вполне устроит

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

Если НЕ Объект.Опрос.Пустая() Тогда

РеквизитыОпрос = ПолучитьЗначенияРеквизитовНазначениеОпроса(Объект.Опрос);
УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос);

Если Не ШаблонАнкеты.Пустая() Тогда

Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда
АвтоЗаголовок = Ложь;
УстановитьЗаголовкиНадписей(РеквизитыОпрос);
КонецЕсли;

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

Если (НЕ Объект.Проведен) И ЗначениеЗаполнено(Объект.РедактируемыйРаздел) Тогда


Если ТипЗнч(Объект.РедактируемыйРаздел) = Тип("СправочникСсылка.ВопросыШаблонаАнкеты") Тогда

НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"Ссылка",Истина);

Иначе

НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"ТипСтроки",Истина);

КонецЕсли;

Если НомерТекущегоРаздела >= 0 Тогда

Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела;
ПостроениеФормыСогласноРаздела();

КонецЕсли;

КонецЕсли;

Иначе

Отказ = Истина;
Возврат;

КонецЕсли;

КонецЕсли;

Элементы.ПредыдущийРазделПодвал.Видимость = Ложь;
Элементы.СледующийРазделПодвал.Видимость  = Ложь;

ДействияВЗависимостиОтВидаФормы();

Элементы.ГруппаДеревоРазделов.Видимость         = Ложь;
Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = НСтр("ru = 'Показать разделы'");
Элементы.ДекорацияОжиданиеЭлементы.Ширина       = 45;

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела;
УправлениеДоступностьюКнопкиНавигацияРазделов();

Если (Не ЭтаФорма.ТолькоПросмотр) Тогда
УправлениеДоступностьюПодчиненныеВопросы(Ложь);
КонецЕсли;

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

Если Элементы.ГруппаТелоАнкеты.ТолькоПросмотр Тогда
Модифицированность = Ложь;
КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ

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

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

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

ОткрытьФорму(ИмяМетаданныхРеспонент + ".ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент);

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

//Обработчик события ПриИзменении для вопросов с условием
&НаКлиенте
Процедура Подключаемый_ПриИзмененииВопросовСУсловием(Элемент)

УправлениеДоступностьюПодчиненныеВопросы();

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

//Обработчик события при изменении для простых и табличных вопросов
&НаКлиенте
Процедура ПриИзмененииВопроса(Элемент)

Модифицированность = Истина;

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

//Обработчик начало выбора текстовых ячеек табличных вопросов
&НаКлиенте
Процедура Подключаемый_НачалоВыбораТекстовыхЯчеекТабличныхВопросов(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

Результат = "";
ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ТекстРедактирования,Результат,Модифицированность);
Если ТипЗнч(Элемент.Родитель) = Тип("ГруппаФормы") Тогда
ЭтаФорма[Элемент.Имя] = Результат;
Иначе

НайденнаяСтрока = ЭтаФорма[Элемент.Родитель.Имя].НайтиПоИдентификатору(Элемент.Родитель.ТекущаяСтрока);
ИндексСтроки = ЭтаФорма[Элемент.Родитель.Имя].Индекс(НайденнаяСтрока);
ЭтаФорма[Элемент.Родитель.Имя][ИндексСтроки][Элемент.Имя] = Результат;

КонецЕсли;

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

&НаКлиенте
Процедура ДеревоРазделовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

ТекущиеДанные = Элементы.ДеревоРазделов.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;

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

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

&НаКлиенте
Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность);

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

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД ФОРМЫ

&НаКлиенте
Процедура ФормаЗаполненияЗаписать(Команда)

Отказ = ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписиДокумента.Запись);

Если НЕ Отказ Тогда

ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"),
,
Строка(Объект.Ссылка),
БиблиотекаКартинок.Информация32);

Оповестить("Запись_Анкета",Новый Структура,Объект.Ссылка);

КонецЕсли;

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

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

Отказ = Ложь;

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

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

Если НЕ Отказ Тогда

ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"),
,
Строка(Объект.Ссылка),
БиблиотекаКартинок.Информация32);

Оповестить("Проведение_Анкета",Новый Структура,Объект.Ссылка);
Модифицированность = Ложь;
Закрыть();

КонецЕсли;

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

&НаКлиенте
Процедура СкрытьПоказатьДеревоРазделов(Команда)

ИзменитьВидимостьДеревоРазделов();

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

&НаКлиенте
Процедура СледующийРаздел(Команда)

ИзменитьРаздел("Вперед");

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

&НаКлиенте
Процедура ПредыдущийРаздел(Команда)

ИзменитьРаздел("Назад");

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

&НаКлиенте
Процедура ВыборРаздела(Команда)

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

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

////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// Установка значений реквизитов формы

// Устанавливает значения реквизитов формы заполнения, согласно данным ранее ответам
//
&НаСервере
Процедура УстановитьЗначенияРеквизитовФормыЗаполненияРаздела()

ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВнешнийИсточник.Вопрос КАК Вопрос,
| ВнешнийИсточник.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
| ВнешнийИсточник.НомерЯчейки КАК НомерЯчейки,
| ВнешнийИсточник.Ответ КАК Ответ,
| ВнешнийИсточник.ОткрытыйОтвет КАК ОткрытыйОтвет
|ПОМЕСТИТЬ ТаблицаОтветов
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|ГДЕ
| ВнешнийИсточник.Вопрос В(&ВопросыРаздела)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаОтветов.Вопрос КАК Вопрос,
| ТаблицаОтветов.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
| ТаблицаОтветов.НомерЯчейки КАК НомерЯчейки,
| ТаблицаОтветов.Ответ КАК Ответ,
| ТаблицаОтветов.ОткрытыйОтвет КАК ОткрытыйОтвет
|ИЗ
| ТаблицаОтветов КАК ТаблицаОтветов
|ИТОГИ ПО
| Вопрос";

Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить());
Запрос.УстановитьПараметр("ВопросыРаздела",ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона"));

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда

Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл

ВыборкаВопрос = Выборка.Выбрать();
УстановитьЗначениеРеквизита(Выборка.Вопрос,ВыборкаВопрос);

КонецЦикла;

КонецЕсли;

//+CRM
Для Каждого СтрокаВопросРаздела Из ТаблицаВопросовРаздела Цикл

Если СтрокаВопросРаздела.ТипСтроки = "Вопрос" Тогда

ТекущийВопросТипОтвета =  СтрокаВопросРаздела.ЭлементарныйВопрос.ТипОтвета;

Если (ТекущийВопросТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
И (ТекущийВопросТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз) Тогда

Если Не ПустаяСтрока(СтрокаВопросРаздела.ЭлементарныйВопрос.CRM_ИмяСправочника) Тогда

Если НЕ СтрокаВопросРаздела.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаВопросРаздела.КлючСтроки);

Если (НЕ ЗначениеЗаполнено(ЭтаФорма[ИмяВопроса]))
Или (ТипЗнч(ЭтаФорма[ИмяВопроса]) = Тип("Булево") И ЭтаФорма[ИмяВопроса] = Ложь) Тогда

ЗначениеИзСправочника = CRM_АнкетированиеПривелигированный.ПолучитьРеквизитИзСправочника(Объект.Респондент, СтрокаВопросРаздела.ЭлементарныйВопрос);

Если Не ЗначениеИзСправочника = Неопределено Тогда

ЭтаФорма[ИмяВопроса] = ЗначениеИзСправочника;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЦикла;
//-CRM

Анкетирование.УстановитьЗначенияРеквизитовВариантОтветаОдинИз(ЭтаФорма);

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

// Анализирует тип вопроса и вызывает соответствующие процедуры для установки значений реквизита
//
// Параметры
//  ВопросШаблона  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  ДеревоАнкетыСервер  - ДеревоЗначений - дерево значений, содержащее шаблон анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизита(ВопросШаблона,ВыборкаВопрос)

НайденныеСтроки = ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("ВопросШаблона",ВопросШаблона));

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

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

// Устанавливает значения реквизитов простого вопроса
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизитаПростойВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);

Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма);

Пока ВыборкаВопрос.Следующий() Цикл

ПараметрыОтвета = НайтиОтветВМассиве(ВыборкаВопрос.Ответ,ВариантыОтветовНаВопрос);

Если ПараметрыОтвета <> Неопределено Тогда
ЭтаФорма[ИмяВопроса + "_Реквизит_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = Истина;
Если ПараметрыОтвета.ТребуетОткрытогоОтвета Тогда

ЭтаФорма[ИмяВопроса + "_Комментарий_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = ВыборкаВопрос.ОткрытыйОтвет;

КонецЕсли;
КонецЕсли;

КонецЦикла;

Иначе

Если ВыборкаВопрос.Следующий() Тогда

Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда

ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.ОткрытыйОтвет;

Иначе

ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.Ответ;

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

// Анализирует тип табличного вопроса и вызывает соответствующие процедуры для установки значений реквизитов
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначениеРеквизитаТабличныйВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева)

Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда

УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

КонецЕсли;

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

// Устанавливает значения реквизитов составного табличного вопроса
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева);

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);
ИмяТаблицы = ИмяВопроса + "_Таблица";
Таблица    = РеквизитФормыВЗначение(ИмяТаблицы);

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");

Пока ВыборкаВопрос.Следующий() Цикл

Если ВыборкаВопрос.НомерЯчейки > Таблица.Количество() Тогда
ДобавитьСтрокиВТаблицу(Таблица,ВыборкаВопрос.НомерЯчейки - Таблица.Количество());
КонецЕсли;

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если НомерВопросаВМассиве <> Неопределено Тогда
Таблица[ВыборкаВопрос.НомерЯчейки - 1][НомерВопросаВМассиве] = ВыборкаВопрос.Ответ;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева);

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

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");

Пока ВыборкаВопрос.Следующий() Цикл

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если (НомерВопросаВМассиве <> Неопределено) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Количество()) Тогда
Таблица[ВыборкаВопрос.НомерЯчейки - 1][ИмяКолонкиБезНомера + Строка(НомерВопросаВМассиве+1)] = ВыборкаВопрос.Ответ;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в колонках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//                 для которого устанавливаются значения реквзитов
//  ВыборкаВопрос  - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                 на вопрос шаблона анкеты
//  СтрокаДерева  - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева);

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

МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос");
МассивВопросы.Удалить(0);

Пока ВыборкаВопрос.Следующий() Цикл

НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос);
Если (НомерВопросаВМассиве <> Неопределено) Тогда
Если (НомерВопросаВМассиве <= Таблица.Количество()) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Колонки.Количество()) Тогда
Таблица[НомерВопросаВМассиве][ИмяКолонкиБезНомера + Строка(ВыборкаВопрос.НомерЯчейки + 1)] = ВыборкаВопрос.Ответ;
КонецЕсли;
КонецЕсли;

КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках и колонках
//
// Параметры
//  Вопрос  - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты,
//            для которого устанавливаются значения реквзитов
//  ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов
//                  на вопрос шаблона анкеты
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты
&НаСервере
Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева)

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

ВопросЯчейка = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос;

Пока ВыборкаВопрос.Следующий() Цикл
Если ВыборкаВопрос.ЭлементарныйВопрос = ВопросЯчейка Тогда
НомерКолонки = ?(ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1)=0,КоличествоКолонок - 1,ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1));
НомерСтроки  = ЦЕЛ((ВыборкаВопрос.НомерЯчейки + ЦЕЛ(ВыборкаВопрос.НомерЯчейки/КоличествоКолонок))/КоличествоКолонок);
Таблица[НомерСтроки ][ИмяКолонкиБезНомера + Строка(НомерКолонки+1)] = ВыборкаВопрос.Ответ;
КонецЕсли;
КонецЦикла;

ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы);

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

////////////////////////////////////////////////////////////////////////////////
// Преобразование результатов заполнения анкеты в табличную часть документа

&НаСервере
Функция ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписи)

ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть();
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если ПроверитьЗаполнениеАнкеты()  Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;

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

//+CRM
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

CRM_АнкетированиеПривелигированный.ЗаписатьРеквизитыОбъектаАнкетирования(ДокументОбъект);

КонецЕсли;
//-CRM

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

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

// Преобразовает данные в форме заполнения ответы в данные табличной части
//
&НаСервере
Процедура ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть()

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

ПредыдущийРазделБезВопросов = (ТаблицаВопросовРаздела.Количество() = 0);

Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл

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

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

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

КонецЦикла;

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

// Анализирует тип табличного вопроса и вызывает соответствующую процедуру для
// получения ответов, данных респондентом на табличный вопрос
//
// Параметры
// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//
&НаСервере
Процедура ЗаполнитьТаблицуОтветовТабличныйВопрос(СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);
ИмяТаблицы = ИмяВопроса + "_Таблица";
Таблица = РеквизитФормыВЗначение(ИмяТаблицы);

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

Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда

ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица);

ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица);

КонецЕсли;

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

//Получает ответы, данные респондентом на составной табличный вопрос и аккумулирует их в общей
//  таблице ответов.
//
//Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица)

Для ИндексКолонки = 0 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИндексКолонки];
Если ЗначениеЗаполнено(Ответ) Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;
КонецЦикла;
КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и
// аккумулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица)

ВопросПерваяКолонка = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ;

Для ИндексКолонки = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки+1)];
Если ЗначениеЗаполнено(Ответ) Тогда

ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина;

НоваяСтрока                    = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;

КонецЦикла;

Если ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + "1"];
Если ЗначениеЗаполнено(Ответ) Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросПерваяКолонка;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексСтроки + 1;

КонецЕсли;

КонецЕсли;

КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и колонках и
// аккумулирует их в общейтаблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица)

ВопросДляСтрок   = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос;
ВопросДляЯчеек   = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос;

ОтветыСтроки  = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляСтрок));
ОтветыКолонки = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок));

ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл
Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки+1)];
Если ЗначениеЗаполнено(Ответ) Тогда

НомерЯчейки = ИндексКолонки + ИндексСтроки * (Таблица.Колонки.Количество() - 1);

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляСтрок;
НоваяСтрока.Ответ              = ОтветыСтроки[ИндексСтроки].Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок;
НоваяСтрока.Ответ              = ОтветыКолонки[ИндексКолонки - 1].Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляЯчеек;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = НомерЯчейки;

КонецЕсли;
КонецЦикла;
КонецЦикла;

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

//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в колонках и
// аккамулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты
//  Таблица      - ТаблицаЗначений - таблица табличного вопроса
//
&НаСервере
Процедура ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица)

ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
ИмяКолонкиБезНомера = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки) + "_Таблица_Колонка_";

Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл

ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ;

Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл

Ответ = Таблица[ИндексСтроки][ИмяКолонкиБезНомера + Строка(ИндексКолонки + 1)];
Если ЗначениеЗаполнено(Ответ) Тогда

ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина;

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексСтроки+1].ЭлементарныйВопрос;
НоваяСтрока.Ответ              = Ответ;
НоваяСтрока.НомерЯчейки        = ИндексКолонки;

КонецЕсли;

КонецЦикла;

Если  ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда

НоваяСтрока = Объект.Состав.Добавить();
НоваяСтрока.Вопрос             = СтрокаДерева.ВопросШаблона;
НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок;
НоваяСтрока.Ответ              = СтрокаДерева.ПредопределенныеОтветы[ИндексКолонки - 1].Ответ;
НоваяСтрока.НомерЯчейки        = ИндексКолонки;

КонецЕсли;

КонецЦикла;

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

//Получает ответы, данные респондентом на простой вопрос и
// аккамулирует их в общей таблице ответов.
//
// Параметры
//  СтрокаДерева   - СтрокаДереваЗначений - строка дерева шаблона анкеты
//
&НаСервере
Процедура ЗаполнитьОтветПростойВопрос(СтрокаДерева)

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки);

Если СтрокаДерева.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

Ответ = ЭтаФорма[ИмяВопроса];
Если ЗначениеЗаполнено(Ответ) Тогда

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

КонецЕсли;

Иначе

ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма);

Счётчик = 0;
Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

Счётчик = Счётчик + 1;
ИмяРеквизита =  ИмяВопроса + "_Реквизит_" + Счётчик;

Если ЭтаФорма[ИмяРеквизита] Тогда

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

КонецЕсли;

КонецЦикла;

КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// Прочее

// Отвечает за построение формы заполнения
&НаСервере
Процедура ПостроениеФормыСогласноРаздела()

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

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

Элементы.ПредыдущийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0);
Элементы.СледующийРазделПодвал.Видимость  = (ТаблицаВопросовРаздела.Количество() > 0);

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

// Добавляет пустые элементы в Коллекцию
//
// Параметры
//  Таблица    - Коллекция - коллеция в которую добавляются строки
//  ЧислоСтрок - Число - число добавляемых строк
//
&НаСервереБезКонтекста
Процедура ДобавитьСтрокиВТаблицу(Коллекция,ЧислоСтрок);

Для инд = 1 По ЧислоСтрок Цикл
Коллекция.Добавить();
КонецЦикла;

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

// Проверяет, даны ли ответы на обязательные вопросы
//
// Возвращаемое значение:
//   Булево   - Истина, в случае если проверка заполнения обязательных ответов закончилась неудачей,
//              Ложь, в обратном случае.
&НаСервере
Функция ПроверитьЗаполнениеАнкеты()

Отказ = Ложь;

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| СоставОтветов.Вопрос,
| СоставОтветов.ЭлементарныйВопрос,
| СоставОтветов.НомерЯчейки,
| СоставОтветов.Ответ,
| СоставОтветов.ОткрытыйОтвет
|ПОМЕСТИТЬ СоставОтветов
|ИЗ
| &ВнешнийИсточник КАК СоставОтветов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВопросыБезОтветов.Ссылка
|ПОМЕСТИТЬ ОбязательныеВопросыБезОтветов
|ИЗ
| (ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) КАК КоличествоОтветов
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
| ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО (СоставОтветов.Вопрос = ВопросыШаблонаАнкеты.Ссылка)
| ГДЕ
| ВопросыШаблонаАнкеты.Обязательный
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И ВопросыШаблонаАнкеты.РодительВопрос = ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка)
|
| СГРУППИРОВАТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка
|
| ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) = 0
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка,
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ)
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
| ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос
| ГДЕ
| ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.РодительВопрос <> ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка)
| И ВопросыШаблонаАнкеты.РодительВопрос В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Ссылка
| ИЗ
| (ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
| ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) КАК Ответ
| ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов
| ПО
| ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос
| ГДЕ
| ВопросыШаблонаАнкеты.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.ВопросСУсловием)
| И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления)
| И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)
| И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
| И ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) = ИСТИНА
| ) КАК ВложенныйЗапрос)
| И ВопросыШаблонаАнкеты.Обязательный
|
| СГРУППИРОВАТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка
|
| ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА СоставОтветов.Ответ ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) = 0) КАК ВопросыБезОтветов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВопросыШаблонаАнкеты.Ссылка,
| ВопросыШаблонаАнкеты.Формулировка
|ИЗ
| Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
|ГДЕ
| ВопросыШаблонаАнкеты.Ссылка В
| (ВЫБРАТЬ
| ОбязательныеВопросыБезОтветов.Ссылка
| ИЗ
| ОбязательныеВопросыБезОтветов КАК ОбязательныеВопросыБезОтветов)
|
|УПОРЯДОЧИТЬ ПО
| ВопросыШаблонаАнкеты.Ссылка";

Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить());
Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Ложь;
КонецЕсли;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не указан ответ на вопрос - '") + СтрЗаменить(Выборка.Ссылка.ПолныйКод(),"/",".") + " " + Выборка.Формулировка);
КонецЦикла;

Возврат Истина;

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

// Находит ответ в массиве содержащем строки таблицы значений
//
// Параметры
//  Ответ         - Характеристика.ВопросыДляАнкетирования - ответ, который ищем.
//  МассивОтветов - Массив - масссив строк таблицы значений
//
// Возвращаемое значение:
//   Структура   - в структуре содержатся номер реквизита и признак необходимости открытого ответа.
//
&НаСервереБезКонтекста
Функция НайтиОтветВМассиве(Ответ,МассивОтветов)

СтруктураВозврата = Новый Структура;

Для инд = 1 По МассивОтветов.Количество() Цикл

Если МассивОтветов[инд - 1].Ответ = Ответ Тогда

СтруктураВозврата.Вставить("ПорядковыйНомерРеквзита",инд);
СтруктураВозврата.Вставить("ТребуетОткрытогоОтвета",МассивОтветов[инд - 1].ТребуетОткрытогоОтвета);
Возврат СтруктураВозврата;
КонецЕсли;

КонецЦикла;

Возврат Неопределено;

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

&НаСервере
Процедура УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос)

ВозможностьПредварительногоСохранения = РеквизитыОпрос.ВозможностьПредварительногоСохранения;
ШаблонАнкеты                          = РеквизитыОпрос.ШаблонАнкеты;
Вступление                            = РеквизитыОпрос.Вступление;
Заключение                            = РеквизитыОпрос.Заключение;

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

//Получает необходимые значения реквизита согласно выбранному опросу
&НаСервере
Функция ПолучитьЗначенияРеквизитовНазначениеОпроса(Опрос)

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

Запрос.УстановитьПараметр("Опрос",Опрос);

Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка;

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

//Устанавливает значения заголовков и надписей
&НаСервере
Процедура УстановитьЗаголовкиНадписей(РеквизитыОпрос)

Заголовок                            = РеквизитыОпрос.Заголовок;
Элементы.НадписьВступление.Заголовок = РеквизитыОпрос.Вступление;
Вступление                           = РеквизитыОпрос.Вступление;

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

//Управляет доступностью элементов формы
&НаКлиенте
Процедура УправлениеДоступностьюПодчиненныеВопросы(УстанавливатьМодифицированность = Истина)

Для каждого ЭлементКоллекции Из ПодчиненныеВопросы Цикл

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос);

Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл

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

//У флажка и переключателя нет свойства АвтоотметкаНезаполенного.
Попытка
Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоотметкаНезаполненного = (ЭтаФорма[ИмяВопроса] И ПодчиненныйВопрос.Обязательный);
Исключение
КонецПопытки;

КонецЕсли;
КонецЦикла;
КонецЦикла;

Если ВозможностьПредварительногоСохранения И УстанавливатьМодифицированность Тогда
Модифицированность = Истина;
КонецЕсли;

ОтключитьОтметкуНезаполненного();

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

//Устанавливает доступность и видимость реквзитов в зависимости от вида формы
&НаСервере
Процедура ДействияВЗависимостиОтВидаФормы()

Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда

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

Если Параметры.ТолькоПросмотр = Истина Тогда

Элементы.ГруппаТелоАнкеты.ТолькоПросмотр          = Истина;
Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь;
Элементы.ФормаЗаполненияЗаписать.Видимость        = Ложь;

Иначе

Элементы.ФормаЗаполненияЗаписать.Видимость = ВозможностьПредварительногоСохранения;

КонецЕсли;

Модифицированность = Ложь;

Иначе

Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь;
Элементы.ФормаЗаполненияЗаписать.Видимость        = Ложь;
Элементы.ГруппаТелоАнкеты.ТолькоПросмотр          = Истина;
Элементы.ГруппаОсновныеРеквизиты.ТолькоПросмотр   = Истина;

КонецЕсли;

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

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

Если Не ВозможностьПредварительногоСохранения Тогда
Возврат;
КонецЕсли;

Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл

Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда
Продолжить;
КонецЕсли;

ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки);

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

КонецЦикла;

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

// Начинает процесс построения формы заполнения согласно разделам
&НаКлиенте
Процедура ВыполнитьПостроениеФормыЗаполнения()

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

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

// Заканчивает формирование формы заполнения анкеты
&НаКлиенте
Процедура ОкончаниеПостроенияФормыЗаполнения()

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

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

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

// Изменяет видимость дерева разделов
&НаКлиенте
Процедура ИзменитьВидимостьДеревоРазделов()

Элементы.ГруппаДеревоРазделов.Видимость         = НЕ Элементы.ГруппаДеревоРазделов.Видимость;
Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = ?(Элементы.ГруппаДеревоРазделов.Видимость,НСтр("ru = 'Скрыть разделы'"),НСтр("ru = 'Показать разделы'"));
Элементы.ДекорацияОжиданиеЭлементы.Ширина       = ?(Элементы.ГруппаДеревоРазделов.Видимость,20,45);

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

// Отвечает за доступность кнопок навигации по разделам
&НаКлиенте
Процедура УправлениеДоступностьюКнопкиНавигацияРазделов()

Элементы.ПредыдущийРаздел.Доступность       = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0);
Элементы.ПредыдущийРазделПодвал.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0);
Элементы.СледующийРаздел.Доступность        = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока +  1) <> Неопределено);
Элементы.СледующийРазделПодвал.Доступность  = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока +  1) <> Неопределено);

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

// Изменяет текущий раздел
&НаКлиенте
Процедура ИзменитьРаздел(Направление)

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

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


cska-fanat-kz

всю "простыню" обязательно было выкладывать? :^454^:

обрабатываете ПриИзменении() у соответствующего поля описания,
если на выходе оно не пустое - ставьте соответствующий флаг.

проблема в чем?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

burza

Цитата: cska-fanat-kz от 14 июл 2016, 07:09
всю "простыню" обязательно было выкладывать? :^454^:

обрабатываете ПриИзменении() у соответствующего поля описания,
если на выходе оно не пустое - ставьте соответствующий флаг.

проблема в чем?

Проблема в том что я не очень понимаю куда его надо прописать. напишите код строки как надо и куда вписать, пожалуйста)

cska-fanat-kz

Обработчик события ПриИзменении() мышью добавляется, там пишете
    Объект.ВашФлагСкайп = НЕ ПустаяСтрока(Объект.ОписаниеСкайп);
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

burza

Цитата: cska-fanat-kz от 14 июл 2016, 09:44
Обработчик события ПриИзменении() мышью добавляется, там пишете
    Объект.ВашФлагСкайп = НЕ ПустаяСтрока(Объект.ОписаниеСкайп);

Спасибо. Буду пробывать)
Добавлено: 14 июл 2016, 15:10


Цитата: burza от 14 июл 2016, 10:19
Цитата: cska-fanat-kz от 14 июл 2016, 09:44
Обработчик события ПриИзменении() мышью добавляется, там пишете
    Объект.ВашФлагСкайп = НЕ ПустаяСтрока(Объект.ОписаниеСкайп);

Спасибо. Буду пробывать)

Не помогло. ничего не происходит(

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск