Обновить превью табличный вопрос. Обновляет превью табличного вопроса.
// Обновляет превью табличного вопроса.
Процедура ОбновитьПревьюТабличныйВопрос(Вопросы,Ответы,ТипТабличногоВопроса,Форма,ИмяТаблицыПревью,Ключ) Экспорт
ИмяКолонкиБезНомера = "ПревьюТаблицаКолонка_" + СтрЗаменить(Строка(Ключ),"-","_") + "_";
ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(70));
РезультирующаяТаблицаСервер = Форма.РеквизитФормыВЗначение(ИмяТаблицыПревью);
РезультирующаяТаблицаСервер.Колонки.Очистить();
УдаляемыеРеквизиты = Новый Массив;
УдаляемыеЭлементыФормы = Новый Массив;
МассивТекущихКолонокРезультирующейТаблицы = Форма.ПолучитьРеквизиты(ИмяТаблицыПревью);
Для каждого ЭлементМассива Из МассивТекущихКолонокРезультирующейТаблицы Цикл
УдаляемыеРеквизиты.Добавить(ЭлементМассива.Путь + "." + ЭлементМассива.Имя);
УдаляемыеЭлементыФормы.Добавить(ЭлементМассива.Имя);
КонецЦикла;
Для каждого ЭлементМассива Из УдаляемыеЭлементыФормы Цикл
НайденныйЭлементФормы = Форма.Элементы.Найти(ЭлементМассива);
Если НайденныйЭлементФормы <> Неопределено Тогда
Форма.Элементы.Удалить(НайденныйЭлементФормы);
КонецЕсли;
КонецЦикла;
ДобавляемыеРеквизиты = Новый Массив;
СчетчикКолонок = 0;
МассивВопросы = Вопросы.ВыгрузитьКолонку("ЭлементарныйВопрос");
Если Вопросы.Колонки.Найти("НомерСтроки") = Неопределено Тогда
Вопросы.Колонки.Добавить("НомерСтроки",Новый ОписаниеТипов("Число"));
КонецЕсли;
Для инд = 0 По Вопросы.Количество()- 1 Цикл
Вопросы[инд].НомерСтроки = инд;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Вопросы.ЭлементарныйВопрос КАК Вопрос,
| Вопросы.НомерСтроки
|ПОМЕСТИТЬ Вопросы
|ИЗ
| &Вопросы КАК Вопросы
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВопросыДляАнкетирования.Формулировка,
| ВопросыДляАнкетирования.ТипЗначения
|ИЗ
| Вопросы КАК Вопросы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
| ПО Вопросы.Вопрос = ВопросыДляАнкетирования.Ссылка
|ГДЕ
| ВопросыДляАнкетирования.Ссылка В(&Вопросы)
|
|УПОРЯДОЧИТЬ ПО
| Вопросы.НомерСтроки";
Запрос.УстановитьПараметр("Вопросы",Вопросы);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда
ВыборкаВопросы = Результат.Выбрать();
Пока ВыборкаВопросы.Следующий() Цикл
СчетчикКолонок = СчетчикКолонок + 1;
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ВыборкаВопросы.Формулировка);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ИмяТаблицыПревью));
КонецЦикла;
ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда
ВыборкаВопросы = Результат.Выбрать();
Пока ВыборкаВопросы.Следующий() Цикл
СчетчикКолонок = СчетчикКолонок + 1;
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ВыборкаВопросы.Формулировка);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ИмяТаблицыПревью));
КонецЦикла;
Для инд = 1 По Ответы.Количество() Цикл
НоваяСтрока = РезультирующаяТаблицаСервер.Добавить();
НоваяСтрока[0] = Ответы[инд - 1].Ответ;
КонецЦикла;
ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда
ВыборкаВопросы = Результат.Выбрать();
Если ВыборкаВопросы.Следующий() Тогда
СчетчикКолонок = СчетчикКолонок + 1;
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1",ОписаниеТиповСтрока,ВыборкаВопросы.Формулировка);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ОписаниеТиповСтрока,ИмяТаблицыПревью));
КонецЕсли;
Для инд = 1 По Ответы.Количество() Цикл
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(инд + 1),ОписаниеТиповСтрока,Ответы[инд-1].Ответ);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд + 1),ОписаниеТиповСтрока,ИмяТаблицыПревью));
КонецЦикла;
Пока ВыборкаВопросы.Следующий() Цикл
НоваяСтрока = РезультирующаяТаблицаСервер.Добавить();
НоваяСтрока[0] = ВыборкаВопросы.Формулировка;
КонецЦикла;
ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда
ТаблицаВопросы = Результат.Выгрузить();
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1",ТаблицаВопросы[0].ТипЗначения,ТаблицаВопросы[0].Формулировка);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ТаблицаВопросы[0].ТипЗначения,ИмяТаблицыПревью));
ОтветыВКолонках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",МассивВопросы[1]));
Для инд = 1 По ОтветыВКолонках.Количество() Цикл
РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(инд + 1),ТаблицаВопросы[2].ТипЗначения,ОтветыВКолонках[инд-1].Ответ);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд + 1),ТаблицаВопросы[2].ТипЗначения,ИмяТаблицыПревью));
КонецЦикла;
ОтветыВСтроках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",МассивВопросы[0]));
Для инд = 1 По ОтветыВСтроках.Количество() Цикл
НоваяСтрока = РезультирующаяТаблицаСервер.Добавить();
НоваяСтрока[0] = ОтветыВСтроках[инд - 1].Ответ;
КонецЦикла;
КонецЕсли;
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
Форма.ЗначениеВРеквизитФормы(РезультирующаяТаблицаСервер,ИмяТаблицыПревью);
Для инд = 1 По ДобавляемыеРеквизиты.Количество() Цикл
Элемент = Форма.Элементы.Добавить(ИмяКолонкиБезНомера + Строка(инд),Тип("ПолеФормы"), Форма.Элементы[ИмяТаблицыПревью]);
Если ДобавляемыеРеквизиты[инд-1].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда
Элемент.Вид = ВидПоляФормы.ПолеФлажка;
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Элемент.ПутьКДанным = ИмяТаблицыПревью + "." + ИмяКолонкиБезНомера + Строка(инд);
Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной
ИЛИ ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках) ИЛИ (инд > 1) Тогда
Элемент.Заголовок = РезультирующаяТаблицаСервер.Колонки[инд -1].Заголовок;
Иначе
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса (БСП)
ПолучитьПревьюРасширенийВФоне (БСП)
ОбновитьКонтактнуюИнформациюДляСписков (БСП)
СформироватьТаблицуПодчиненияВопросов (БСП)