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