[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ТабличныйДокумент_АктивностиОбработкаРасшифровки`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ТабличныйДокумент_АктивностиОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если СтрНачинаетсяС( Расшифровка, "ДеньАктивности" ) Тогда

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

		структОтбор = Новый Структура( "День", Дата( СтрЗаменить( Расшифровка, "ДеньАктивности", "") ));
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ТабличныйДокумент_АктивностиОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

	Если СтрНачинаетсяС( Расшифровка, "ДеньАктивности" ) Тогда

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

		структОтбор = Новый Структура( "День", Дата( СтрЗаменить( Расшифровка, "ДеньАктивности", "") ));

		Элементы.ТаблицаАктивностей.ОтборСтрок = Новый ФиксированнаяСтруктура( структОтбор );

	КонецЕсли;

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

&НаКлиенте

Процедура ЗаполнитьТестовымиДанными(Команда)

	//ЗаполнитьТестовымиДаннымиСервер();

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

Процедура Удалить_ЗаполнитьТестовымиДаннымиСервер()

	Объект.ТаблицаАктивностей.Очистить();

	ГСЧ = Новый ГенераторСлучайныхЧисел();

	структНастройки = ПолучитьНастройки( 100 );

	текДень = структНастройки.ПервыйДень;

	Пока текДень <= структНастройки.ПоследнийДень Цикл

		Если ДеньНедели( текДень ) = 6
			ИЛИ ДеньНедели( текДень ) = 7 Тогда
			максАктивностей = 20;
		Иначе
			максАктивностей = 100;
		КонецЕсли;

		Для ц = 0 По ГСЧ.СлучайноеЧисло( 0, максАктивностей ) Цикл

			новСтрока = Объект.ТаблицаАктивностей.Добавить();

			новСтрока.Период = текДень;
			новСтрока.Описание = ц;

		КонецЦикла;

		текДень = текДень + Сутки();

	КонецЦикла;

	ЗаполнитьНаСервере();

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

&НаКлиенте

Процедура Заполнить(Команда)
	ЗаполнитьНаСервере();

	пДеньАктивности = "ДеньАктивности" + Формат(ТекущаяДатаНаСервере(), "ДФ=yyyyMMddhhmmss" );
	структОтбор = Новый Структура( "День", Дата( СтрЗаменить( пДеньАктивности, "ДеньАктивности", "") ));

	Элементы.ТаблицаАктивностей.ОтборСтрок = Новый ФиксированнаяСтруктура( структОтбор );
КонецПроцедуры

&НаСервере

Процедура ЗаполнитьНаСервере()
	ЗаполнитьТаблицуАктивностей();
	Для каждого цСтрока Из Объект.ТаблицаАктивностей Цикл
		цСтрока.День = НачалоДня( цСтрока.Период );
	КонецЦикла;

	тзАктивности = Объект.ТаблицаАктивностей.Выгрузить(, "День");
	тзАктивности.Колонки.Добавить( "Количество" );
	тзАктивности.ЗаполнитьЗначения( 1, "Количество" );
	тзАктивности.Свернуть( "День", "Количество" );

	максКоличество = 0;

	Для каждого цСтрока Из тзАктивности Цикл

		максКоличество = Макс( максКоличество, цСтрока.Количество );

	КонецЦикла;

	структНастройки = ПолучитьНастройки(максКоличество);

	ТабличныйДокумент_Активности = СоздатьТабличныйДокументАктивности( тзАктивности, структНастройки );

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

&НаСервере

Процедура ЗаполнитьТаблицуАктивностей()
	Объект.ТаблицаАктивностей.Очистить();

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

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

	РезультатЗапроса = Запрос.Выполнить();

	Выборка = РезультатЗапроса.Выбрать();

	Пока Выборка.Следующий() Цикл
		СтрокаТаблицаАктивностей = Объект.ТаблицаАктивностей.Добавить();
		СтрокаТаблицаАктивностей.Период = Выборка.ДатаАктивности;
		СтрокаТаблицаАктивностей.Описание = Выборка.Описание;
		СтрокаТаблицаАктивностей.День = Выборка.ДеньАктивности;
		СтрокаТаблицаАктивностей.СсылкаНаОбъект = Выборка.СсылкаНаОбъект;
		СтрокаТаблицаАктивностей.Пользователь = Выборка.Пользователь;
		СтрокаТаблицаАктивностей.ВидСобытия = Выборка.ВидСобытия;
	КонецЦикла;

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

&НаСервереБезКонтекста

Функция ПолучитьНастройки(Знач максКоличество)

	структНастройки = Новый Структура();
	структНастройки.Вставить( "ПервыйДень",  НачалоДня( ДобавитьМесяц( ТекущаяДатаСеанса(), -12) + Сутки()));
	структНастройки.Вставить( "ПоследнийДень", НачалоДня( ТекущаяДатаСеанса() ));

	массивПалитра = Новый Массив;
	//массивПалитра.Добавить( Новый Цвет(225,225,225) );
	//массивПалитра.Добавить( Новый Цвет(173,213,247) );
	//массивПалитра.Добавить( Новый Цвет(127,178,240) );
	//массивПалитра.Добавить( Новый Цвет(78,122,199) );
	//массивПалитра.Добавить( Новый Цвет(53,71,140) );
	//массивПалитра.Добавить( Новый Цвет(22,25,59) );

	//массивПалитра.Добавить( Новый Цвет(235,237,240) );
	массивПалитра.Добавить(ЦветаСтиля.узАктивностьЦветСветлоСерый);
	//массивПалитра.Добавить( Новый Цвет(198,228,139) );
	массивПалитра.Добавить(ЦветаСтиля.узАктивностьЦветСветлоЗеленый);
	//массивПалитра.Добавить( Новый Цвет(123,201,111) );
	массивПалитра.Добавить(ЦветаСтиля.узАктивностьЦветЗеленый);
	//массивПалитра.Добавить( Новый Цвет(35,154,59) );
	массивПалитра.Добавить(ЦветаСтиля.узАктивностьЦветТемноЗеленый);
	//массивПалитра.Добавить( Новый Цвет(25, 97, 39) );
	массивПалитра.Добавить(ЦветаСтиля.узАктивностьЦветСильноТемноЗеленый);

	//массивПалитра.Добавить( Новый Цвет(23,78,52) );

	структНастройки.Вставить( "Палитра", массивПалитра );

	массивГраницы = Новый Массив;
	массивГраницы.Добавить(0);
	массивГраницы.Добавить(1);
	//массивГраницы.Добавить(Макс( 1, максКоличество * 0.2));
	//массивГраницы.Добавить(Макс( 1, максКоличество * 0.4));
	//массивГраницы.Добавить(Макс( 1, максКоличество * 0.6));
	//массивГраницы.Добавить(Макс( 1, максКоличество * 0.8));
	массивГраницы.Добавить(Макс( 1, максКоличество * 0.25));
	массивГраницы.Добавить(Макс( 1, максКоличество * 0.5));
	массивГраницы.Добавить(Макс( 1, максКоличество * 0.75));

	структНастройки.Вставить( "Границы", массивГраницы );

	Возврат структНастройки;

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

&НаСервереБезКонтекста


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало функция `ПолучитьИменаЭлементовДляКолонки`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

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

	ИмяГруппыКолонки = ПрефиксДляИмениЭлементовКолонок + ИмяКолонки + "_Группа";
	ИмяТЧЗадачи = ИмяКолонки + "_ТЧЗадачи";
	ИмяКомандыДобавитьВСпринт = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьВСпринт";
	ИмяКомандыУбратьИзСпринта = ИмяКолонки + "_ТЧЗадачи_КомандаУбратьИзСпринта";
	ИмяКомандыСледитьЗаЗадачей = ИмяКолонки + "_ТЧЗадачи_КомандаСледитьЗаЗадачей";
	ИмяКомандыНеСледитьЗаЗадачей = ИмяКолонки + "_ТЧЗадачи_КомандаНеСледитьЗаЗадачей";
	ИмяКомандыДобавитьВТекущиеДела = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьВТекущиеДела";
	// [+] #327 Павлюков С.Ю. 2024-04-11
	ИмяКомандыДобавитьФактРабот = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьФактРабот";
	// [-] #327 Павлюков С.Ю. 2024-04-11
	ИмяКомандыСкопироватьКомментарийВКоде = ИмяКолонки + "_ТЧЗадачи_КомандаСкопироватьКомментарийВКоде";
	ИмяКомандыСоздатьФайлДляЗадачиНаДиске = ИмяКолонки + "_ТЧЗадачи_СоздатьФайлДляЗадачиНаДиске";
	ИмяКомандыОткрытьПапкуЗадачиНаДиске = ИмяКолонки + "_ТЧЗадачи_ОткрытьПапкуЗадачиНаДиске";

	ИмяКарточкаЗадачи = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи";
	ИмяКарточкаЗадачи_НижняяЧасть = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть";
	ИмяПоляЗадачиВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть_Задача";
	ИмяКарточкаЗадачи_ВерхняяЧасть = ИмяКолонки +"_ТЧЗадачи_ВерхняяЧасть";

	ИмяПоляКороткоеИмяВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_ВерхняяЧасть_КороткоеИмя";
	ИмяПоляОсновнаяЗадачаПредставлениеВКарточкеЗадачи = ИмяКолонки +"_ТЧЗадачи_ВерхняяЧасть_ОсновнаяЗадачаПредставление";
	ИмяПоляНомерЗадачиПредставлениеВКарточкеЗадачи = ИмяКолонки+"_ТЧЗадачи_ВерхняяЧасть_НомерЗадачиПредставление";

	ИмяКарточкаЗадачи_НижняяЧасть3Строка = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть3Строка";
	ИмяПоляЕстьФайлыВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_ЕстьФайлы";
	ИмяПоляЕстьПисьмаВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_ЕстьПисьма";
	ИмяПоляЗаказчикВКарточкеЗадачи = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_Заказчик";

	//+ #58 Дзеса Ігор (capitoshko)
	ИмяПоляЧекЛистВыполнение = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_ЧекЛистВыполнение";
	//- #58 Дзеса Ігор (capitoshko)
	//+ #106 Дзеса Ігор (capitoshko) 05.10.2018
	ИмяПоляЧекЛистВыполнениеПроцент = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_ЧекЛистВыполнениеПроцент";
	//- #106 Дзеса Ігор (capitoshko) 05.10.2018

	// + #225 Урянский Д. 2020-07-06
	ИмяПоляКоличествоФайловВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_КоличествоФайлов";
	ИмяПоляКоличествоПисемВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_КоличествоПисем";
	// - #225 Урянский Д. 2020-07-06

	//ЬЬ+ pva 29-03-2023 добавляем вывод на форму последнего комментария
	ИмяКарточкаЗадачи_НижняяЧасть4Строка = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть4Строка";
	ИмяПоляКомментарийВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть4Строка_Комментарий";
	//ЬЬ- pva 29-03-2023

	РезультатФункции = Новый Структура();
	РезультатФункции.Вставить("ИмяГруппыКолонки",ИмяГруппыКолонки);
	РезультатФункции.Вставить("ИмяТЧЗадачи",ИмяТЧЗадачи);
	РезультатФункции.Вставить("ИмяКомандыДобавитьВСпринт",ИмяКомандыДобавитьВСпринт);
	РезультатФункции.Вставить("ИмяКомандыУбратьИзСпринта",ИмяКомандыУбратьИзСпринта);
	РезультатФункции.Вставить("ИмяКомандыСледитьЗаЗадачей",ИмяКомандыСледитьЗаЗадачей);
	РезультатФункции.Вставить("ИмяКомандыНеСледитьЗаЗадачей",ИмяКомандыНеСледитьЗаЗадачей);
	РезультатФункции.Вставить("ИмяКомандыДобавитьВТекущиеДела",ИмяКомандыДобавитьВТекущиеДела);
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПолучитьИменаЭлементовДляКолонки(пСтатус)

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

	ИмяГруппыКолонки = ПрефиксДляИмениЭлементовКолонок + ИмяКолонки + "_Группа";
	ИмяТЧЗадачи = ИмяКолонки + "_ТЧЗадачи";
	ИмяКомандыДобавитьВСпринт = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьВСпринт";
	ИмяКомандыУбратьИзСпринта = ИмяКолонки + "_ТЧЗадачи_КомандаУбратьИзСпринта";
	ИмяКомандыСледитьЗаЗадачей = ИмяКолонки + "_ТЧЗадачи_КомандаСледитьЗаЗадачей";
	ИмяКомандыНеСледитьЗаЗадачей = ИмяКолонки + "_ТЧЗадачи_КомандаНеСледитьЗаЗадачей";
	ИмяКомандыДобавитьВТекущиеДела = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьВТекущиеДела";
	// [+] #327 Павлюков С.Ю. 2024-04-11
	ИмяКомандыДобавитьФактРабот = ИмяКолонки + "_ТЧЗадачи_КомандаДобавитьФактРабот";
	// [-] #327 Павлюков С.Ю. 2024-04-11
	ИмяКомандыСкопироватьКомментарийВКоде = ИмяКолонки + "_ТЧЗадачи_КомандаСкопироватьКомментарийВКоде";
	ИмяКомандыСоздатьФайлДляЗадачиНаДиске = ИмяКолонки + "_ТЧЗадачи_СоздатьФайлДляЗадачиНаДиске";
	ИмяКомандыОткрытьПапкуЗадачиНаДиске = ИмяКолонки + "_ТЧЗадачи_ОткрытьПапкуЗадачиНаДиске";

	ИмяКарточкаЗадачи = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи";
	ИмяКарточкаЗадачи_НижняяЧасть = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть";
	ИмяПоляЗадачиВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть_Задача";
	ИмяКарточкаЗадачи_ВерхняяЧасть = ИмяКолонки +"_ТЧЗадачи_ВерхняяЧасть";

	ИмяПоляКороткоеИмяВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_ВерхняяЧасть_КороткоеИмя";
	ИмяПоляОсновнаяЗадачаПредставлениеВКарточкеЗадачи = ИмяКолонки +"_ТЧЗадачи_ВерхняяЧасть_ОсновнаяЗадачаПредставление";
	ИмяПоляНомерЗадачиПредставлениеВКарточкеЗадачи = ИмяКолонки+"_ТЧЗадачи_ВерхняяЧасть_НомерЗадачиПредставление";

	ИмяКарточкаЗадачи_НижняяЧасть3Строка = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть3Строка";
	ИмяПоляЕстьФайлыВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_ЕстьФайлы";
	ИмяПоляЕстьПисьмаВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_ЕстьПисьма";
	ИмяПоляЗаказчикВКарточкеЗадачи = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_Заказчик";

	//+ #58 Дзеса Ігор (capitoshko)
	ИмяПоляЧекЛистВыполнение = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_ЧекЛистВыполнение";
	//- #58 Дзеса Ігор (capitoshko)
	//+ #106 Дзеса Ігор (capitoshko) 05.10.2018
	ИмяПоляЧекЛистВыполнениеПроцент = ИмяКолонки +"_ТЧЗадачи_НижняяЧасть3Строка_ЧекЛистВыполнениеПроцент";
	//- #106 Дзеса Ігор (capitoshko) 05.10.2018

	// + #225 Урянский Д. 2020-07-06
	ИмяПоляКоличествоФайловВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_КоличествоФайлов";
	ИмяПоляКоличествоПисемВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть3Строка_КоличествоПисем";
	// - #225 Урянский Д. 2020-07-06

	//ЬЬ+ pva 29-03-2023 добавляем вывод на форму последнего комментария
	ИмяКарточкаЗадачи_НижняяЧасть4Строка = ИмяКолонки + "_ТЧЗадачиКарточкаЗадачи_НижняяЧасть4Строка";
	ИмяПоляКомментарийВКарточкеЗадачи = ИмяКолонки + "_ТЧЗадачи_НижняяЧасть4Строка_Комментарий";
	//ЬЬ- pva 29-03-2023

	РезультатФункции = Новый Структура();
	РезультатФункции.Вставить("ИмяГруппыКолонки",ИмяГруппыКолонки);
	РезультатФункции.Вставить("ИмяТЧЗадачи",ИмяТЧЗадачи);
	РезультатФункции.Вставить("ИмяКомандыДобавитьВСпринт",ИмяКомандыДобавитьВСпринт);
	РезультатФункции.Вставить("ИмяКомандыУбратьИзСпринта",ИмяКомандыУбратьИзСпринта);
	РезультатФункции.Вставить("ИмяКомандыСледитьЗаЗадачей",ИмяКомандыСледитьЗаЗадачей);
	РезультатФункции.Вставить("ИмяКомандыНеСледитьЗаЗадачей",ИмяКомандыНеСледитьЗаЗадачей);
	РезультатФункции.Вставить("ИмяКомандыДобавитьВТекущиеДела",ИмяКомандыДобавитьВТекущиеДела);
	// [+] #327 Павлюков С.Ю. 2024-04-11
	РезультатФункции.Вставить("ИмяКомандыДобавитьФактРабот", ИмяКомандыДобавитьФактРабот);
	// [-] #327 Павлюков С.Ю. 2024-04-11
	РезультатФункции.Вставить("ИмяКомандыСкопироватьКомментарийВКоде",ИмяКомандыСкопироватьКомментарийВКоде);
	РезультатФункции.Вставить("ИмяКомандыСоздатьФайлДляЗадачиНаДиске",ИмяКомандыСоздатьФайлДляЗадачиНаДиске);
	РезультатФункции.Вставить("ИмяКомандыОткрытьПапкуЗадачиНаДиске",ИмяКомандыОткрытьПапкуЗадачиНаДиске);

	РезультатФункции.Вставить("ИмяКарточкаЗадачи",ИмяКарточкаЗадачи);
	РезультатФункции.Вставить("ИмяКарточкаЗадачи_НижняяЧасть",ИмяКарточкаЗадачи_НижняяЧасть);
	РезультатФункции.Вставить("ИмяКарточкаЗадачи_НижняяЧасть3Строка",ИмяКарточкаЗадачи_НижняяЧасть3Строка);
	РезультатФункции.Вставить("ИмяПоляЗадачиВКарточкеЗадачи",ИмяПоляЗадачиВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляЕстьФайлыВКарточкеЗадачи",ИмяПоляЕстьФайлыВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляЕстьПисьмаВКарточкеЗадачи",ИмяПоляЕстьПисьмаВКарточкеЗадачи);

	РезультатФункции.Вставить("ИмяКарточкаЗадачи_ВерхняяЧасть",ИмяКарточкаЗадачи_ВерхняяЧасть);
	РезультатФункции.Вставить("ИмяПоляКороткоеИмяВКарточкеЗадачи",ИмяПоляКороткоеИмяВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляОсновнаяЗадачаПредставлениеВКарточкеЗадачи",ИмяПоляОсновнаяЗадачаПредставлениеВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляЗаказчикВКарточкеЗадачи",ИмяПоляЗаказчикВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляНомерЗадачиПредставлениеВКарточкеЗадачи",ИмяПоляНомерЗадачиПредставлениеВКарточкеЗадачи);

	//+ #58 Дзеса Ігор (capitoshko)
	РезультатФункции.Вставить("ИмяПоляЧекЛистВыполнение",ИмяПоляЧекЛистВыполнение);
	//- #58 Дзеса Ігор (capitoshko)
	//+ #106 Дзеса Ігор (capitoshko) 05.10.2018
	РезультатФункции.Вставить("ИмяПоляЧекЛистВыполнениеПроцент",ИмяПоляЧекЛистВыполнениеПроцент);
	//- #106 Дзеса Ігор (capitoshko) 05.10.2018

	// + #225 Урянский Д. 2020-07-06
	РезультатФункции.Вставить("ИмяПоляКоличествоФайловВКарточкеЗадачи",ИмяПоляКоличествоФайловВКарточкеЗадачи);
	РезультатФункции.Вставить("ИмяПоляКоличествоПисемВКарточкеЗадачи",ИмяПоляКоличествоПисемВКарточкеЗадачи);
	// - #225 Урянский Д. 2020-07-06

	//ЬЬ+ pva 29-03-2023 добавляем вывод на форму последнего комментария
	РезультатФункции.Вставить("ИмяКарточкаЗадачи_НижняяЧасть4Строка", ИмяКарточкаЗадачи_НижняяЧасть4Строка);
	РезультатФункции.Вставить("ИмяПоляКомментарийВКарточкеЗадачи", ИмяПоляКомментарийВКарточкеЗадачи);
	//ЬЬ- pva 29-03-2023

	Возврат РезультатФункции;
КонецФункции

&НаСервере

Функция ПолучитьИмяКолонки(пСтатус)
	пИмяКолонки = "";

	НаименованиеСтатуса = пСтатус.Наименование;
	НомерСимвола = 1;
	ДлинаСтроки = СтрДлина(НаименованиеСтатуса);
	Пока НомерСимвола <= ДлинаСтроки Цикл
		пСимвол = Сред(НаименованиеСтатуса,НомерСимвола,1);
		пКодСимвола = КодСимвола(пСимвол);

		//Сообщить("пСимвол " + пСимвол + " пКодСимвола - " + пКодСимвола);
		Если (65 <= пКодСимвола И пКодСимвола <= 90)
			ИЛИ (97 <= пКодСимвола И пКодСимвола <= 122)
			ИЛИ (1072 <= пКодСимвола И пКодСимвола <= 1103)
			ИЛИ (1040 <= пКодСимвола И пКодСимвола <= 1071)
			Тогда
			пИмяКолонки = пИмяКолонки + пСимвол;
		Конецесли;
		Если пКодСимвола = 32 Тогда
			пИмяКолонки = пИмяКолонки + "_";
		Конецесли;
		НомерСимвола = НомерСимвола + 1;
	Конеццикла;
	Возврат пИмяКолонки;
КонецФункции

&НаСервере


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

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

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

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

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

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

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

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

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

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

		КонецЦикла;

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

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

		Пока ВыборкаВопрос.Следующий() Цикл
			ПараметрыОтвета = НайтиОтветВМассиве(ВыборкаВопрос.Ответ, ВариантыОтветовНаВопрос);
			Если ПараметрыОтвета <> Неопределено Тогда
				ЭтотОбъект[ИмяВопроса + "_Реквизит_" + ПараметрыОтвета.ПорядковыйНомерРеквизита] = ВыборкаВопрос.Ответ;
			КонецЕсли;
			Если (СтрокаДерева.ТребуетсяКомментарий) Тогда
				ЭтотОбъект[ИмяВопроса + "_Комментарий"] = ВыборкаВопрос.ОткрытыйОтвет;
			КонецЕсли;
			Если СтрокаДерева.ИспользоватьОтказОтОтвета Тогда
				ЭтотОбъект[ИмяВопроса + "_ИспользоватьОтказОтОтвета"] = ВыборкаВопрос.БезОтвета;
			КонецЕсли;
		КонецЦикла;

	Иначе

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

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

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

			Иначе

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

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

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

			КонецЕсли;

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

		КонецЕсли;

	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

	КонецЕсли;

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

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

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

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

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

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

		Если ВопросыАнкеты.Найти(ВыборкаВопрос.ЭлементарныйВопрос) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Если ВыборкаВопрос.НомерЯчейки > Таблица.Количество() Тогда
			Для Индекс = 1 По ВыборкаВопрос.НомерЯчейки - Таблица.Количество() Цикл
				Таблица.Добавить();
			КонецЦикла;
		КонецЕсли;

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

	КонецЦикла;

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

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

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

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

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

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

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

	КонецЦикла;

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

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

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

[Assistant] Процедура УстановитьЗначениеРеквизитаПростойВопрос(Вопрос, ВыборкаВопрос, СтрокаДерева)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

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

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

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

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

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

	КонецЦикла;

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

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

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

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

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

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

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

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

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

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

Процедура УстановитьЗначенияРеквизитаКомплексныйВопрос(Вопрос, ВыборкаВопрос, СтрокаДерева)

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

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

		Если ВопросыАнкеты.Найти(ВыборкаВопрос.ЭлементарныйВопрос) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

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

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

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

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

		ИначеЕсли ВыборкаВопрос.ЭлементарныйВопрос.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда
			ЭтотОбъект[ИмяРеквизита] = ВыборкаВопрос.ОткрытыйОтвет;
		Иначе
			ЭтотОбъект[ИмяРеквизита] = ВыборкаВопрос.Ответ;

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

	КонецЦикла;

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

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

&НаСервере

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

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

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

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

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

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

&НаСервере

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

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

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

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

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

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

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

	КонецЦикла;

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

// Параметры:
//   СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//
&НаСервере

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


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(СтрокаДерева)

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

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

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

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

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

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

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

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

			КонецЕсли;

		КонецЦикла;

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

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

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

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

			Если ЗначениеЗаполнено(ЭтотОбъект[ИмяРеквизита]) Тогда

				ОтветПолучен = Истина;

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

			КонецЕсли;

		КонецЦикла;

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

	Иначе

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

		Если ЗначениеЗаполнено(Ответ) Или Анкетирование.РазрешенВводНулевогоЗначенияВЧисловоеПоле(СтрокаДерева)
			Или ОтказОтОтвета Тогда

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

		КонецЕсли;

	КонецЕсли;

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

&НаСервере

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

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

	Для Каждого СтрокаКомплексногоВопроса Из СтрокаДерева.СоставКомплексногоВопроса Цикл

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

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

		Иначе

			ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(
				СтрокаКомплексногоВопроса.ЭлементарныйВопрос, ЭтотОбъект);

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

				Счетчик = Счетчик + 1;
				ИмяТекРеквизита =  ИмяРеквизита + "_Реквизит_" + Счетчик;

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

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

				КонецЕсли;

			КонецЦикла;

		КонецЕсли;

	КонецЦикла;

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

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

&НаСервере

Процедура ПостроениеФормыСогласноРаздела()

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

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

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

	АнкетированиеКлиентСервер.ПереключитьВидимостьГруппТелаАнкеты(ЭтотОбъект, Истина);

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

// Возвращаемое значение:
//   Булево
//
&НаСервере

[Assistant] Процедура ЗаполнитьОтветПростойВопрос(СтрокаДерева)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции()

	Если Параметры.ТолькоФормаЗаполнения Тогда

		ЭтоИнтервью = Объект.РежимАнкетирования = ПредопределенноеЗначение("Перечисление.РежимыАнкетирования.Интервью");

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

		Элементы.РежимАнкетирования.ТолькоПросмотр = ЭтоИнтервью;
		Элементы.Опрос.ТолькоПросмотр              = ЭтоИнтервью;
		Элементы.ШаблонАнкеты.ТолькоПросмотр       = ЭтоИнтервью;

		Если Объект.Ссылка.Пустая() Тогда
			Объект.Дата = ТекущаяДатаСеанса();
		КонецЕсли;

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

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

		Иначе

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

		КонецЕсли;

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

	Иначе

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

	КонецЕсли;

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

&НаСервере

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

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

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

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

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

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

	КонецЦикла;

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

&НаСервере

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

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

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

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

	КонецЦикла;

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура ОкончаниеПостроенияФормыЗаполнения()

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

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

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

&НаКлиенте

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

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

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

&НаКлиенте

[Assistant] Процедура УстановитьВидимостьДоступностьЭлементовФормы()


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции()

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

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

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

&НаКлиенте

Процедура ИзменитьРаздел(Направление)

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

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

&НаКлиенте

Процедура ВопросОПринятииАнкетыПослеЗавершения(РезультатВопроса, ДополнительныеПараметры) Экспорт

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

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

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

// Параметры:
//   ИзмененныйТекст         - Строка
//   ДополнительныеПараметры - Структура
//
&НаКлиенте

Процедура РедактированиеМногострочногоТекстаПриОкончании(ИзмененныйТекст, ДополнительныеПараметры) Экспорт

	Элемент = ДополнительныеПараметры.Элемент;

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

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

		Если ЭтотОбъект[Элемент.Родитель.Имя][ИндексСтроки][Элемент.Имя] <> ИзмененныйТекст Тогда
			ЭтотОбъект[Элемент.Родитель.Имя][ИндексСтроки][Элемент.Имя] = ИзмененныйТекст;
			Модифицированность = Истина;
		КонецЕсли;

	КонецЕсли;

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

&НаКлиенте

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

	АнкетированиеКлиент.ВыделитьВопросыНаКоторыеДаныОтветы(ЭтотОбъект);

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

&НаКлиентеНаСервереБезКонтекста

Процедура ИзменитьВидимостьЭлементовФормы(Форма)

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте

Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте

Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере

Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры

&НаКлиенте

Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

[Assistant] Процедура УстановитьДоступностьНавигацииРазделов()


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

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

#Область ОписаниеПеременных

// СтандартныеПодсистемы

// Хранилище глобальных переменных.
//
// ПараметрыПриложения - Соответствие из КлючИЗначение:
//   * Ключ - Строка - имя переменной в формате "ИмяБиблиотеки.ИмяПеременной";
//   * Значение - Произвольный - значение переменной.
//
// Пример инициализации:
//   ИмяПараметра = "СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации";
//   Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
//     ПараметрыПриложения.Вставить(ИмяПараметра, Новый СписокЗначений);
//   КонецЕсли;
//
// Пример использования:
//   ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"].Добавить(...);
//   ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"] = ...;
Перем ПараметрыПриложения Экспорт;

// Конец СтандартныеПодсистемы

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

#Область ОбработчикиСобытий

Процедура ИмяФункции()

#Если МобильныйКлиент Тогда
	Если ОсновнойСерверДоступен() = Ложь Тогда
		Возврат;
	КонецЕсли;
#КонецЕсли

	// СтандартныеПодсистемы
#Если МобильныйКлиент Тогда
	Выполнить("СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы()");
#Иначе
	СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы();
#КонецЕсли
	// Конец СтандартныеПодсистемы

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

Процедура ПриНачалеРаботыСистемы()

	// СтандартныеПодсистемы
#Если МобильныйКлиент Тогда
	Выполнить("СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы()");
#Иначе
	СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
#КонецЕсли
	// Конец СтандартныеПодсистемы

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

Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)

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

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

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

	// СтандартныеПодсистемы
#Если МобильныйКлиент Тогда
	Выполнить("СтандартныеПодсистемыКлиент.ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора,
		|Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)");
#Иначе
	СтандартныеПодсистемыКлиент.ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора,
		Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка);
#КонецЕсли
	// Конец СтандартныеПодсистемы

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

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

[Assistant] Процедура ПередНачаломРаботыСистемы()


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ЗаписатьОперациюБизнесСтатистики`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ЗаписатьОперациюБизнесСтатистики(ИмяОперации, Значение, Комментарий = Неопределено, Разделитель = ".")
Экспорт

	УстановитьОтключениеБезопасногоРежима(Истина);
    УстановитьПривилегированныйРежим(Истина);

	ПериодИдентификатораУдаления = ЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторинга("ПериодАгрегацииМалый");

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

	ТекДата = ТекущаяУниверсальнаяДатаВМиллисекундах();

	Если Разделитель <> "." Тогда
		ИмяОперации = СтрЗаменить(ИмяОперации, ".", "☼");
		ИмяОперации = СтрЗаменить(ИмяОперации, Разделитель, ".");
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗаписатьОперациюБизнесСтатистики(ИмяОперации, Значение, Комментарий = Неопределено, Разделитель = ".") Экспорт

	УстановитьОтключениеБезопасногоРежима(Истина);
    УстановитьПривилегированныйРежим(Истина);

	ПериодИдентификатораУдаления = ЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторинга("ПериодАгрегацииМалый");

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

	ТекДата = ТекущаяУниверсальнаяДатаВМиллисекундах();

	Если Разделитель <> "." Тогда
		ИмяОперации = СтрЗаменить(ИмяОперации, ".", "☼");
		ИмяОперации = СтрЗаменить(ИмяОперации, Разделитель, ".");
	КонецЕсли;

	ОперацияСсылка = ЦентрМониторингаПовтИсп.ПолучитьСсылкуОперацииСтатистики(ИмяОперации);
	КомментарийСсылка = РегистрыСведений.КомментарииСтатистики.ПолучитьСсылку(Комментарий, ОперацияСсылка);
	ОбластьДанныхСсылка = РегистрыСведений.ОбластиСтатистики.ПолучитьСсылку(ОбластьДанных);

	МенеджерЗаписи = СоздатьМенеджерЗаписи();
	МенеджерЗаписи.ДатаЗаписи = ТекДата;
	МенеджерЗаписи.ИдентификаторУдаления = Цел(Цел(ТекДата/1000)/ПериодИдентификатораУдаления)*ПериодИдентификатораУдаления;
	МенеджерЗаписи.ИдентификаторЗаписи = Новый УникальныйИдентификатор();
	МенеджерЗаписи.ОперацияСтатистики = ОперацияСсылка;
	МенеджерЗаписи.КомментарийСтатистики = КомментарийСсылка;
	МенеджерЗаписи.ОбластьСтатистики = ОбластьДанныхСсылка;
	МенеджерЗаписи.Значение = Значение;

	МенеджерЗаписи.Записать(Ложь);

	УстановитьПривилегированныйРежим(Ложь);
	УстановитьОтключениеБезопасногоРежима(Ложь);

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

Процедура ЗаписатьОперацииБизнесСтатистики(Операции) Экспорт

	УстановитьОтключениеБезопасногоРежима(Истина);
    УстановитьПривилегированныйРежим(Истина);

    ПериодИдентификатораУдаления = ЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторинга("ПериодАгрегацииМалый");

    ТекДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ИдентификаторУдаления = Цел(Цел(ТекДата/1000)/ПериодИдентификатораУдаления)*ПериодИдентификатораУдаления;
    КомментарийСсылка = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор();
	ОбластьДанныхСсылка = РегистрыСведений.ОбластиСтатистики.ПолучитьСсылку("0");

    НаборЗаписей = СоздатьНаборЗаписей();
    МаксимальноеКоличествоЗаписей = 1000;

    Для Каждого Операция Из Операции Цикл

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

        Если НаборЗаписей.Количество() >= МаксимальноеКоличествоЗаписей Тогда
            НаборЗаписей.Записать(Ложь);
            НаборЗаписей.Очистить();
        КонецЕсли;

    КонецЦикла;

    Если НаборЗаписей.Количество() > 0 Тогда
        НаборЗаписей.Записать(Ложь);
        НаборЗаписей.Очистить();
	КонецЕсли;

	УстановитьПривилегированныйРежим(Ложь);
	УстановитьОтключениеБезопасногоРежима(Ложь);

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

Функция ПолучитьАгрегированныеЗаписиОпераций(ДатаЗаписи, ПериодАгрегации, ПериодУдаления) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодАгрегации - 0.5 КАК ЧИСЛО(15,0)) * &ПериодАгрегации)/1000  - 63555667200
	|	) КАК Период,
	|	БуферОперацийСтатистики.ОперацияСтатистики КАК ОперацияСтатистики,
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодУдаления - 0.5 КАК ЧИСЛО(15,0)) * &ПериодУдаления)/1000  - 63555667200
	|	) КАК ИдентификаторУдаления,
	|   КОЛИЧЕСТВО(1) КАК КоличествоЗначений,
	|	СУММА(БуферОперацийСтатистики.Значение) КАК СуммаЗначений,
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодАгрегации - 0.5 КАК ЧИСЛО(15,0)) * &ПериодАгрегации)/1000  - 63555667200 + &ПериодАгрегации/1000 - 1
	|	) КАК ПериодОкончание
	|ИЗ
	|	РегистрСведений.БуферОперацийСтатистики КАК БуферОперацийСтатистики
	|ГДЕ
	|	БуферОперацийСтатистики.ДатаЗаписи < &ДатаЗаписи
	|СГРУППИРОВАТЬ ПО
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодАгрегации - 0.5 КАК ЧИСЛО(15,0)) * &ПериодАгрегации)/1000  - 63555667200
	|	),
	|	БуферОперацийСтатистики.ОперацияСтатистики,
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодУдаления - 0.5 КАК ЧИСЛО(15,0)) * &ПериодУдаления)/1000  - 63555667200
	|	),
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодАгрегации - 0.5 КАК ЧИСЛО(15,0)) * &ПериодАгрегации)/1000  - 63555667200 + &ПериодАгрегации/1000 - 1
	|	)
	|УПОРЯДОЧИТЬ ПО
	|	ДОБАВИТЬКДАТЕ(
	|		ДАТАВРЕМЯ(2015,1,1),
	|		СЕКУНДА,
	|		(ВЫРАЗИТЬ(БуферОперацийСтатистики.ДатаЗаписи/&ПериодАгрегации - 0.5 КАК ЧИСЛО(15,0)) * &ПериодАгрегации)/1000  - 63555667200
	|	)
	|";

	Запрос.УстановитьПараметр("ДатаЗаписи", (ДатаЗаписи - Дата(1, 1, 1)) * 1000);
	Запрос.УстановитьПараметр("ПериодАгрегации", ПериодАгрегации * 1000);
	Запрос.УстановитьПараметр("ПериодУдаления", ПериодУдаления * 1000);

	РезультатЗапроса = Запрос.Выполнить();

	Возврат РезультатЗапроса;
КонецФункции


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

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

	ВидОбновления = "";

	Если Параметры = Неопределено Тогда
		ВидОбновления = "Все";

	ИначеЕсли Параметры.Количество() = 2
	        И Параметры.Свойство("Пользователи")
	        И Параметры.Свойство("ГруппыПользователей") Тогда

		ВидОбновления = "ПользователиИГруппыПользователей";

	ИначеЕсли Параметры.Количество() = 1
	        И Параметры.Свойство("Пользователи") Тогда

		ВидОбновления = "ПользователиИГруппыПользователей";

	ИначеЕсли Параметры.Количество() = 1
	        И Параметры.Свойство("ГруппыПользователей") Тогда

		ВидОбновления = "ПользователиИГруппыПользователей";

	ИначеЕсли Параметры.Количество() = 1
	        И Параметры.Свойство("ГруппыИсполнителей") Тогда

		ВидОбновления = "ГруппыИсполнителей";

	ИначеЕсли Параметры.Количество() = 1
	        И Параметры.Свойство("ОбъектыАвторизации") Тогда

		ВидОбновления = "ОбъектыАвторизации";
	Иначе
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Ошибка в процедуре %1
			           |модуля менеджера регистра сведений %2.
			           |
			           |Указаны неверные параметры.'"),
			"ОбновитьГруппировкиПользователей",
			"ГруппыЗначенийДоступа");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	НачатьТранзакцию();
	Попытка
		Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
		 Или ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда

			УдалитьЛишниеЗаписи(ЕстьИзменения);
		КонецЕсли;

		Если ВидОбновления = "ПользователиИГруппыПользователей" Тогда

			Если Параметры.Свойство("Пользователи") Тогда
				ОбновитьПользователей(        Параметры.Пользователи, ЕстьИзменения);
				ОбновитьГруппыИсполнителей( , Параметры.Пользователи, ЕстьИзменения);
			КонецЕсли;

			Если Параметры.Свойство("ГруппыПользователей") Тогда
				ОбновитьГруппыПользователей(Параметры.ГруппыПользователей, ЕстьИзменения);
			КонецЕсли;

		ИначеЕсли ВидОбновления = "ГруппыИсполнителей" Тогда
			ОбновитьГруппыИсполнителей(Параметры.ГруппыИсполнителей, , ЕстьИзменения);

		ИначеЕсли ВидОбновления = "ОбъектыАвторизации" Тогда
			ОбновитьОбъектыАвторизации(Параметры.ОбъектыАвторизации, ЕстьИзменения);
		Иначе
			ОбновитьПользователей(       ,   ЕстьИзменения);
			ОбновитьГруппыПользователей( ,   ЕстьИзменения);
			ОбновитьГруппыИсполнителей(  , , ЕстьИзменения);
			ОбновитьОбъектыАвторизации(  ,   ЕстьИзменения);
		КонецЕсли;

		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;

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

// Процедура удаляет лишние данные по результату изменения состава
// типов значений и групп значений доступа.
//

Процедура ОбновитьВспомогательныеДанныеРегистраПоИзменениямКонфигурации() Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Если Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() Тогда
		УправлениеДоступомСлужебный.УстановитьЗаполнениеДанныхДляОграниченияДоступа(Истина);
	КонецЕсли;

	ОбновитьГруппыПустыхЗначенийДоступа();
	УдалитьЛишниеЗаписи();

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

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

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

// Процедура обновляет данные регистра при изменении значений доступа.
//
// Параметры:
//  ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись,
//                  устанавливается Истина, иначе не изменяется.
//

Процедура ОбновитьДанныеРегистра(ЕстьИзменения = Неопределено) Экспорт

	УдалитьЛишниеЗаписи(ЕстьИзменения);

	ОбновитьГруппировкиПользователей( , ЕстьИзменения);

	ОбновитьГруппыЗначенийДоступа( , ЕстьИзменения);

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

// Обновляет группы значений доступа в РегистрСведений.ГруппыЗначенийДоступа.
//
// Параметры:
//  ЗначенияДоступа - СправочникОбъект
//                  - СправочникСсылка
//                  - Массив - массив значений указанных выше типов.
//                  - Неопределено - без отбора.
//                    Тип значений должен быть в составе типов измерения ЗначениеДоступа
//                    регистра сведений ГруппыЗначенийДоступа.
//                    Если передан Объект, то обновление будет только при его изменении.
//
//  ЕстьИзменения   - Булево - (возвращаемое значение) - если производилась запись,
//                    устанавливается Истина, иначе не изменяется.
//

Процедура ОбновитьГруппыЗначенийДоступа(ЗначенияДоступа = Неопределено,
                                        ЕстьИзменения   = Неопределено) Экспорт

	ЗначенияСИзменениямиПоТипам = Новый Соответствие;

	Если ЗначенияДоступа = Неопределено Тогда

		СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
		ЗначенияДоступаСГруппами = СвойстваВидовДоступа.ЗначенияДоступаСГруппами;

		Запрос = Новый Запрос;
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТекущаяТаблица.Ссылка
		|ИЗ
		|	&ТекущаяТаблица КАК ТекущаяТаблица";

		Для Каждого ИмяТаблицы Из ЗначенияДоступаСГруппами.ИменаТаблицДляОбновления Цикл

			Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", ИмяТаблицы);
			// @skip-check query-in-loop - Малый цикл из одной или двух итераций
			Выборка = Запрос.Выполнить().Выбрать();

			МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяТаблицы);
			ОбновитьГруппыЗначенияДоступа(МенеджерОбъекта.ПустаяСсылка(), ЕстьИзменения, ЗначенияСИзменениямиПоТипам);

			Пока Выборка.Следующий() Цикл
				ОбновитьГруппыЗначенияДоступа(Выборка.Ссылка, ЕстьИзменения, ЗначенияСИзменениямиПоТипам);
			КонецЦикла;
		КонецЦикла;

	ИначеЕсли ТипЗнч(ЗначенияДоступа) = Тип("Массив") Тогда

		Для каждого ЗначениеДоступа Из ЗначенияДоступа Цикл
			ОбновитьГруппыЗначенияДоступа(ЗначениеДоступа, ЕстьИзменения, ЗначенияСИзменениямиПоТипам);
		КонецЦикла;
	Иначе
		ОбновитьГруппыЗначенияДоступа(ЗначенияДоступа, ЕстьИзменения, ЗначенияСИзменениямиПоТипам);
	КонецЕсли;

	УправлениеДоступомСлужебный.ЗапланироватьОбновлениеЗависимыхСписковПоЗначениямСГруппами(
		ЗначенияСИзменениямиПоТипам);

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

// Заполняет группы для пустых ссылок используемых типов значений доступа.

Процедура ОбновитьГруппыПустыхЗначенийДоступа()

	СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
	ЗначенияДоступаСГруппами = СвойстваВидовДоступа.ЗначенияДоступаСГруппами;

	ЗначенияСИзменениямиПоТипам = Новый Соответствие;

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

	УправлениеДоступомСлужебный.ЗапланироватьОбновлениеЗависимыхСписковПоЗначениямСГруппами(
		ЗначенияСИзменениямиПоТипам);

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

////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.

Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт

	// Регистрация данных не требуется.
	Возврат;

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

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

	ОбновитьДанныеРегистра();

	Параметры.ОбработкаЗавершена = Истина;

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

////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.

// Удаляет строки, которых не должно быть, если они добавлены каким-либо способом.

[Assistant] Процедура ОбновитьГруппировкиПользователей(Параметры = Неопределено, ЕстьИзменения = Неопределено)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(ЕстьИзменения = Неопределено)

	СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
	ТипыГруппЗначений = СвойстваВидовДоступа.ЗначенияДоступаСГруппами.ТипыГруппЗначенийДляОбновления;

	ТаблицаТиповГруппИЗначений = Новый ТаблицаЗначений;
	ТаблицаТиповГруппИЗначений.Колонки.Добавить("ТипЗначений",      Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип);
	ТаблицаТиповГруппИЗначений.Колонки.Добавить("ТипГруппЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип);

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

	// Группы данных в регистре.
	// 0 - Стандартные значения доступа.
	// 1 - Обычные/внешние пользователи.
	// 2 - Обычные/внешние группы пользователей.
	// 3 - Группы исполнителей.
	// 4 - Объекты авторизации.

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

	РезультатЗапроса = Запрос.Выполнить();

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

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

// Обновляет группы значения доступа в РегистрСведений.ГруппыЗначенийДоступа.
//
// Параметры:
//  ЗначениеДоступа - СправочникСсылка.
//                    СправочникОбъект.
//                    Если передан Объект, то обновление будет только при его изменении.
//
//  ЕстьИзменения   - Булево - (возвращаемое значение) - если производилась запись,
//                    устанавливается Истина, иначе не изменяется.
//

[Assistant] Процедура УдалитьЛишниеЗаписи(ЕстьИзменения = Неопределено)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(Пользователи1 = Неопределено,
                                ЕстьИзменения = Неопределено)

	УстановитьПривилегированныйРежим(Истина);

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

	// Подготовка выбираемых полей с необязательным отбором.
	Поля = Новый Массив;
	Поля.Добавить(Новый Структура("ЗначениеДоступа",       "&УсловиеОтбораПользователей2"));
	Поля.Добавить(Новый Структура("ГруппаЗначенийДоступа"));
	Поля.Добавить(Новый Структура("ГруппаДанных",          "&УсловиеОтбораГруппОбновляемыхДанных"));

	Запрос = Новый Запрос;
	Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений(
		ТекстЗапроса, Поля, "РегистрСведений.ГруппыЗначенийДоступа");

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, Пользователи1, "Пользователи",
		"&УсловиеОтбораПользователей1:СоставыГруппПользователей.Пользователь
		|&УсловиеОтбораПользователей2:СтарыеДанные.ЗначениеДоступа");

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, 1, "ГруппаДанных",
		"&УсловиеОтбораГруппОбновляемыхДанных:СтарыеДанные.ГруппаДанных");

	Данные = Новый Структура;
	Данные.Вставить("МенеджерРегистра",      РегистрыСведений.ГруппыЗначенийДоступа);
	Данные.Вставить("ИзмененияСоставаСтрок", Запрос.Выполнить().Выгрузить());
	Данные.Вставить("ФиксированныйОтбор",    Новый Структура("ГруппаДанных", 1));

	УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьИзменения);

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

// Обновляет группировки пользователей для проверки разрешенных значений
// по видам доступа Пользователи и ВнешниеПользователи.
//
// <Состав поля ЗначениеДоступа>    <Состав поля ГруппаЗначенийДоступа>.
//                               <Состав поля ГруппаДанных>.
//
// А) для вида доступа Пользователи:
// {сравнение с Т.<поле>}           {Сравнение с ЗначенияГруппДоступа.ЗначениеДоступа}.
//                                  {Сравнение с &ТекущийПользователь}.
//
// Группа пользователей          2 - Та же Группа пользователей.
//
//                               2 - Пользователь
//                                   той же группы пользователей.
//
// Б) для вида доступа Внешние пользователи:
// {сравнение с Т.<поле>}           {Сравнение с ЗначенияГруппДоступа.ЗначениеДоступа}.
//                                  {Сравнение с &ТекущийВнешнийПользователь}.
//
// Группа внешних пользователей  2 - Та же Группа внешних пользователей.
//
//                               2 - Внешний пользователь
//                                   той же группы внешних пользователей.
//
//

Процедура ОбновитьГруппыПользователей(ГруппыПользователей = Неопределено,
                                      ЕстьИзменения       = Неопределено)

	УстановитьПривилегированныйРежим(Истина);

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

	// Подготовка выбираемых полей с необязательным отбором.
	Поля = Новый Массив;
	Поля.Добавить(Новый Структура("ЗначениеДоступа",         "&УсловиеОтбораГруппПользователей2"));
	Поля.Добавить(Новый Структура("ГруппаЗначенийДоступа"));
	Поля.Добавить(Новый Структура("ГруппаДанных",            "&УсловиеОтбораГруппОбновляемыхДанных"));

	Запрос = Новый Запрос;
	Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений(
		ТекстЗапроса, Поля, "РегистрСведений.ГруппыЗначенийДоступа");

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, ГруппыПользователей, "ГруппыПользователей",
		"&УсловиеОтбораГруппПользователей1:СоставыГруппПользователей.ГруппаПользователей
		|&УсловиеОтбораГруппПользователей2:СтарыеДанные.ЗначениеДоступа");

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, 2, "ГруппаДанных",
		"&УсловиеОтбораГруппОбновляемыхДанных:СтарыеДанные.ГруппаДанных");

	Данные = Новый Структура;
	Данные.Вставить("МенеджерРегистра",      РегистрыСведений.ГруппыЗначенийДоступа);
	Данные.Вставить("ИзмененияСоставаСтрок", Запрос.Выполнить().Выгрузить());
	Данные.Вставить("ФиксированныйОтбор",    Новый Структура("ГруппаДанных", 2));

	УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьИзменения);

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

// Обновляет группировки пользователей для проверки разрешенных значений
// по видам доступа Пользователи и ВнешниеПользователи.
//
// <Состав поля ЗначениеДоступа>    <Состав поля ГруппаЗначенийДоступа>.
//                               <Состав поля ГруппаДанных>.
//
// А) для вида доступа Пользователи:
// {сравнение с Т.<поле>}           {Сравнение с ЗначенияГруппДоступа.ЗначениеДоступа}.
//                                  {Сравнение с &ТекущийПользователь}.
//
// Группа исполнителей           3 - Пользователь
//                                   той же группы исполнителей.
//
//                               3 - Группа пользователей пользователя
//                                   той же группы исполнителей.
//
// Б) для вида доступа Внешние пользователи:
// {сравнение с Т.<поле>}           {Сравнение с ЗначенияГруппДоступа.ЗначениеДоступа}.
//                                  {Сравнение с &ТекущийВнешнийПользователь}.
//
// Группа исполнителей           3 - Внешний пользователь
//                                   той же группы исполнителей.
//
//                               3 - Группа внешних пользователей
//                                   внешнего пользователя
//                                   той же группы исполнителей.
//

[Assistant]
Процедура ОбновитьПользователей(Пользователи1 = Неопределено,
                                ЕстьИзменения = Неопределено)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(ГруппыИсполнителей = Неопределено,
                                     Исполнители        = Неопределено,
                                     ЕстьИзменения      = Неопределено)

	УстановитьПривилегированныйРежим(Истина);

	// Подготовка таблицы дополнительных групп пользователей -
	// групп исполнителей (например, задач).

	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

	Если ГруппыИсполнителей = Неопределено
	   И Исполнители        = Неопределено Тогда

		СодержаниеПараметра = Неопределено;
		ЗначениеПараметра   = Неопределено;

	ИначеЕсли ГруппыИсполнителей <> Неопределено Тогда
		СодержаниеПараметра = "ГруппыИсполнителей";
		ЗначениеПараметра   = ГруппыИсполнителей;

	ИначеЕсли Исполнители <> Неопределено Тогда
		СодержаниеПараметра = "Исполнители";
		ЗначениеПараметра   = Исполнители;
	Иначе
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Ошибка в процедуре %1
			           |модуля менеджера регистра сведений %2.
			           |
			           |Указаны неверные параметры.'"),
			"ОбновитьГруппыИсполнителей",
			"ГруппыЗначенийДоступа");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	НетГруппИсполнителей = Истина;
	ИнтеграцияПодсистемБСП.ПриОпределенииГруппИсполнителей(Запрос.МенеджерВременныхТаблиц,
		СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей);

	Если НетГруппИсполнителей Тогда
		НаборЗаписей = СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.ГруппаДанных.Установить(3);
		НаборЗаписей.Прочитать();
		Если НаборЗаписей.Количество() > 0 Тогда
			НаборЗаписей.Очистить();
			НаборЗаписей.Записать();
			ЕстьИзменения = Истина;
		КонецЕсли;
		Возврат;
	КонецЕсли;

	// Подготовка отобранных связей исполнителей и групп исполнителей.
	Запрос.УстановитьПараметр("ПустыеСсылкиГруппЗначений",
		УправлениеДоступомСлужебныйПовтИсп.ТаблицаПустыхСсылокУказанныхТипов(
			"РегистрСведений.ГруппыЗначенийДоступа.Измерение.ГруппаЗначенийДоступа").Получить());

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

	Если ГруппыИсполнителей = Неопределено
	   И Исполнители <> Неопределено Тогда

		// АПК:96-выкл - №434 Использование ОБЪЕДИНИТЬ допустимо, так как
		// строки не должны повторятся и объем данных небольшой (от единиц до сотен).
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ПользователиГруппИсполнителей.ГруппаИсполнителей
		|ИЗ
		|	ПользователиГруппИсполнителей КАК ПользователиГруппИсполнителей
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	ВнешниеПользователиГруппИсполнителей.ГруппаИсполнителей
		|ИЗ
		|	ВнешниеПользователиГруппИсполнителей КАК ВнешниеПользователиГруппИсполнителей";
		// АПК:96-вкл.

		Запрос.Текст = ТекстЗапросовВременныхТаблиц + "
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|" + ТекстЗапроса;

		РезультатыЗапросов = Запрос.ВыполнитьПакет();
		Количество = РезультатыЗапросов.Количество();

		ГруппыИсполнителей = РезультатыЗапросов[Количество-1].Выгрузить().ВыгрузитьКолонку("ГруппаИсполнителей");
		ТекстЗапросовВременныхТаблиц = Неопределено;
	КонецЕсли;

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

	// Подготовка выбираемых полей с необязательным отбором.
	Поля = Новый Массив;
	Поля.Добавить(Новый Структура("ЗначениеДоступа",         "&УсловиеОтбораГруппИсполнителей"));
	Поля.Добавить(Новый Структура("ГруппаЗначенийДоступа"));
	Поля.Добавить(Новый Структура("ГруппаДанных",            "&УсловиеОтбораГруппОбновляемыхДанных"));

	Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений(
		ТекстЗапроса, Поля, "РегистрСведений.ГруппыЗначенийДоступа", ТекстЗапросовВременныхТаблиц);

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, ГруппыИсполнителей, "ГруппыИсполнителей",
		"&УсловиеОтбораГруппИсполнителей:СтарыеДанные.ЗначениеДоступа");

	УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, 3, "ГруппаДанных",
		"&УсловиеОтбораГруппОбновляемыхДанных:СтарыеДанные.ГруппаДанных");

	Данные = Новый Структура;
	Данные.Вставить("МенеджерРегистра",      РегистрыСведений.ГруппыЗначенийДоступа);
	Данные.Вставить("ИзмененияСоставаСтрок", Запрос.Выполнить().Выгрузить());
	Данные.Вставить("ФиксированныйОтбор",    Новый Структура("ГруппаДанных", 3));

	УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьИзменения);

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

// Обновляет группировки пользователей для проверки разрешенных значений
// по видам доступа Пользователи и ВнешниеПользователи.
//
// <Состав поля ЗначениеДоступа>    <Состав поля ГруппаЗначенийДоступа>.
//                               <Состав поля ГруппаДанных>.
//
// Для вида доступа Внешние пользователи:
// {сравнение с Т.<поле>}           {Сравнение с ЗначенияГруппДоступа.ЗначениеДоступа}.
//                                  {Сравнение с &ТекущийВнешнийПользователь}.
//
// Объект авторизации            4 - Внешний пользователь
//                                   того же объекта авторизации.
//
//                               4 - Группа внешних пользователей
//                                   внешнего пользователя
//                                   того же объекта авторизации.
//

[Assistant]
Процедура ОбновитьГруппыИсполнителей(ГруппыИсполнителей = Неопределено,
                                     Исполнители        = Неопределено,
                                     ЕстьИзменения      = Неопределено)