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

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

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

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

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

	ПроверятьПрава = Не Пользователи.ЭтоПолноправныйПользователь() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом");

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

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

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

				// Проверка на запись свойства.
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗаполнитьТаблицуЗначенийСвойств(ИзОбработчикаПриСоздании)

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

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

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

	ПроверятьПрава = Не Пользователи.ЭтоПолноправныйПользователь() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом");

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

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

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

				// Проверка на запись свойства.
				НачатьТранзакцию();
				Попытка
					Набор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
					Набор.Отбор.Объект.Установить(Параметры.Ссылка);
					Набор.Отбор.Свойство.Установить(Строка.Свойство);

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

					ОтменитьТранзакцию();
				Исключение
					ИнформацияОбОшибке = ИнформацияОбОшибке();
					ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
					ОтменитьТранзакцию();
				КонецПопытки;
			КонецЕсли;
		КонецЕсли;

		НоваяСтрока = ТаблицаЗначенийСвойств.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);

		Если ЗначениеЗаполнено(НоваяСтрока.Подсказка) Тогда
			НоваяСтрока.КолонкаВопрос = "?";
		КонецЕсли;

		НоваяСтрока.НомерКартинки = ?(Строка.Удалено, 0, -1);
		НоваяСтрока.ДоступноДляИзменения = ДоступноДляИзменения;

		Если Строка.Значение = Неопределено
			И ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(Строка.ТипЗначения, Тип("Булево")) Тогда
			НоваяСтрока.Значение = Ложь;
		КонецЕсли;
	КонецЦикла;

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

&НаКлиенте

Процедура ЗаписатьЗначенияСвойств()

	// Запись значений свойств в регистр сведений.
	ЗначенияСвойств = Новый Массив;

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

	Если ЗначенияСвойств.Количество() > 0 Тогда
		ЗаписатьНаборСвойствВРегистр(СсылкаНаОбъект, ЗначенияСвойств);
	КонецЕсли;

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

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

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

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

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

	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения");
		ЭлементБлокировки.УстановитьЗначение("Объект", Ссылка);
		Блокировка.Заблокировать();

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

			Если Не ЗначениеЗаполнено(Запись.Значение)
				Или Запись.Значение = Ложь Тогда
				ТекущиеЗначения.Удалить(Запись);
			КонецЕсли;
		КонецЦикла;
		Набор.Загрузить(ТекущиеЗначения);
		Набор.Записать();

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

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

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

Функция ПрочитатьЗначенияСвойствИзРегистраСведений(Ссылка)

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

	Возврат Запрос.Выполнить().Выгрузить();

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

&НаСервере

Функция ПолучитьТекущиеЗначенияСвойств()

	ЗначенияСвойств = Новый ТаблицаЗначений;
	ЗначенияСвойств.Колонки.Добавить("Свойство");
	ЗначенияСвойств.Колонки.Добавить("Значение");

	Для каждого Строка Из ТаблицаЗначенийСвойств Цикл

		Если ЗначениеЗаполнено(Строка.Значение) И (Строка.Значение <> Ложь) Тогда
			НоваяСтрока = ЗначенияСвойств.Добавить();
			НоваяСтрока.Свойство = Строка.Свойство;
			НоваяСтрока.Значение = Строка.Значение;
		КонецЕсли;
	КонецЦикла;

	Возврат ЗначенияСвойств;

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

&НаСервере


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

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

Функция УстановитьПарольНаСервере()
ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("Пользователь",              Пользователь);
	ПараметрыВыполнения.Вставить("ИмяДляВхода",               ИмяДляВхода);
	ПараметрыВыполнения.Вставить("НовыйПароль",               НовыйПароль);
	ПараметрыВыполнения.Вставить("СтарыйПароль",              СтарыйПароль);
	ПараметрыВыполнения.Вставить("ПриВходеВПрограмму",        ПриВходеВПрограмму);
	ПараметрыВыполнения.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса);
	ПараметрыВыполнения.Вставить("ТолькоПроверить",           ВернутьПарольБезУстановки);

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

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

[Assistant]
Функция УстановитьПарольНаСервере()

	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("Пользователь",              Пользователь);
	ПараметрыВыполнения.Вставить("ИмяДляВхода",               ИмяДляВхода);
	ПараметрыВыполнения.Вставить("НовыйПароль",               НовыйПароль);
	ПараметрыВыполнения.Вставить("СтарыйПароль",              СтарыйПароль);
	ПараметрыВыполнения.Вставить("ПриВходеВПрограмму",        ПриВходеВПрограмму);
	ПараметрыВыполнения.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса);
	ПараметрыВыполнения.Вставить("ТолькоПроверить",           ВернутьПарольБезУстановки);

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

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

	Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
		Возврат "";
	КонецЕсли;

	Если Не ПараметрыВыполнения.СтарыйПарольСовпадает Тогда
		ТекущийЭлемент = Элементы.СтарыйПароль;
		СтарыйПароль = "";
	КонецЕсли;

	ПарольПользователяСервиса = ПараметрыВыполнения.ПарольПользователяСервиса;

	Возврат ТекстОшибки;

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

&НаКлиенте

Процедура ВернутьРезультатИЗакрытьФорму()

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

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

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


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

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

Процедура ИмяФункции(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ПутьКСписку = СтрЗаменить(Элемент.Имя, "Значение", "");

	ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь, Ложь);
	ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку;
	ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку];
	ПараметрыЗаполнения.Владелец = Элемент;

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

		СписокТипов = Новый СписокЗначений;
		СписокТипов.Добавить(ТипЗнч(ТекущееЗначение));
		ПродолжитьЗаполнениеСписка(СписокТипов[0], ПараметрыЗаполнения);
		Возврат;
	КонецЕсли;

	НачатьЗаполнениеСписка(Элемент, ПараметрыЗаполнения);
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСортировка

&НаКлиенте

Процедура СортировкаВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

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

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

&НаКлиенте

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

	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;

	ВыбратьПоле("Сортировка", Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте

Процедура СортировкаПередУдалением(Элемент, Отказ)
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте

Процедура СортировкаИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("Сортировка");
КонецПроцедуры

&НаКлиенте

Процедура Сортировка_ПоУбыванию(Команда)
	ИзменитьТипУпорядочиванияСтрок(НаправлениеСортировкиКомпоновкиДанных.Убыв);
КонецПроцедуры

&НаКлиенте

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

&НаКлиенте

Процедура Сортировка_ПереместитьВверх(Команда)
	СдвинутьСортировку();
КонецПроцедуры

&НаКлиенте

Процедура Сортировка_ПереместитьВниз(Команда)
	СдвинутьСортировку(Ложь);
КонецПроцедуры

&НаКлиенте

Процедура Сортировка_УстановитьФлажки(Команда)
	ИзменитьИспользование("Сортировка");
КонецПроцедуры

&НаКлиенте

Процедура Сортировка_СнятьФлажки(Команда)
	ИзменитьИспользование("Сортировка", Ложь);
КонецПроцедуры

&НаКлиенте

Процедура СортировкаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание)
	ИсточникПеретаскиванияНаКлиенте = Элемент.Имя;
КонецПроцедуры

&НаКлиенте

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

	Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура СортировкаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле)
	СтандартнаяОбработка = Ложь;
	Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда
		ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока);
	ИначеЕсли ИсточникПеретаскиванияНаКлиенте = Элементы.ВыбранныеПоля.Имя Тогда
		ПеретащитьВыбранныеПоляВСортировку(ПараметрыПеретаскивания.Значение);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура СортировкаОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте

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

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

	ПеретащитьВыбранныеПоляВСортировку(Строки);
КонецПроцедуры

&НаКлиенте

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

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

	ПеретащитьПоляСортировкиВВыбранныеПоля(Строки);
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_Сортировка_ВлевоВсе(Команда)
	ПеретащитьПоляСортировкиВВыбранныеПоля(Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы());
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_ГруппаИ(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_ГруппаИли(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_ГруппаНе(Команда)
	ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока;
	Если ИдентификаторСтроки <> Неопределено Тогда
		ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе, ИдентификаторСтроки);
	КонецЕсли;
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля

&НаКлиенте

Процедура ВыбранныеПоляВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
#Если МобильныйКлиент Тогда
	Возврат;
#КонецЕсли

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

	Если Поле = Элементы.ВыбранныеПоляПоле Тогда // Изменение порядка.
		Если Строка.ЭтоГруппа Тогда
			ВыбранныеПоляВыбратьГруппу(ИдентификаторСтроки, Строка);
		ИначеЕсли ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда
			ВыбранныеПоляВыбратьПоле(ИдентификаторСтроки, Строка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоляПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ПослеАктивизацииВыбранныхПолей", 0.1, Истина);
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоляПередУдалением(Элемент, Отказ)
	Если РасширенныйРежим = 0 Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	УдалитьСтроки(Элемент, Отказ);
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоляИспользованиеПриИзменении(Элемент)
	ИзменитьИспользованиеЭлементаНастройки("ВыбранныеПоля");
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_ПереместитьВверх(Команда)
	СдвинутьВыбранныеПоля();
КонецПроцедуры

&НаКлиенте

Процедура ВыбранныеПоля_ПереместитьВниз(Команда)
	СдвинутьВыбранныеПоля(Ложь);
КонецПроцедуры

&НаКлиенте

[Assistant] Процедура Подключаемый_ЭлементСписка_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)


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

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

Процедура ИмяФункции(Команда)
	ПараметрыГруппировки = ПараметрыГруппировкиОтборов();
	Если ПараметрыГруппировки = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);

	// Обработка элементов настроек.
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор);
	КонецЕсли;

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

	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);

	// Обработка строк.
	СтрокаИсточник = ПараметрыГруппировки.Родитель;
	ЭлементыИсточника = СтрокаИсточник.ПолучитьЭлементы();
	СтрокаПриемник = ЭлементКоллекцииФормыНастроек(СтрокаИсточник);
	СтрокаПриемник = ЭлементыИсточника.Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек
	УстановитьДанныеСтрокиОтборов(СтрокаПриемник, СвойствоЭлементаСтруктуры, ЭлементНастройкиПриемник);
	СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);

	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);

	ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	УдалитьБазовыеЭлементыГруппировкиОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки);

	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.Отборы.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор();

	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

Процедура Отборы_Разгруппировать(Команда)
	ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки;
	Если ИдентификаторыСтрок.Количество() <> 1 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите одну группу.'"));
		Возврат;
	КонецЕсли;

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

	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек);

	РодительЭлементаНастройкиИсточника = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(РодительСтрокиИсточника.Идентификатор);
	Если ТипЗнч(РодительЭлементаНастройкиИсточника) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'"));
		Возврат;
	КонецЕсли;

	РодительЭлементаНастройкиПриемника = РодительЭлементаНастройкиИсточника.Родитель;
	Если РодительЭлементаНастройкиИсточника.Родитель = Неопределено Тогда
		РодительЭлементаНастройкиПриемника = СвойствоЭлементаСтруктуры;
	КонецЕсли;

	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(РодительЭлементаНастройкиИсточника, РодительЭлементаНастройкиПриемника);

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

	ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, РодительСтрокиИсточника.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);

	// Удаление базовых элементов группировки.
	РодительСтрокиПриемника.ПолучитьЭлементы().Удалить(РодительСтрокиИсточника);
	РодительЭлементаНастройкиПриемника.Элементы.Удалить(РодительЭлементаНастройкиИсточника);

	Раздел = КорневаяСтрокаПоУмолчанию("Отборы");
	Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.Отборы.ТекущаяСтрока = РодительСтрокиПриемника.ПолучитьИдентификатор();

	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПереместитьВверх(Команда)
	СдвинутьОтборы();
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПереместитьВниз(Команда)
	СдвинутьОтборы(Ложь);
КонецПроцедуры

&НаКлиенте

Процедура Отборы_УстановитьФлажки(Команда)
	ИзменитьИспользование("Параметры");
	ИзменитьИспользование("Отборы");
КонецПроцедуры

&НаКлиенте

Процедура Отборы_СнятьФлажки(Команда)
	ИзменитьИспользование("Параметры", Ложь);
	ИзменитьИспользование("Отборы", Ложь);
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПоказыватьВШапкеОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьВШапкеОтчета");
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПоказыватьВНастройкахОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьВНастройкахОтчета");
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПоказыватьТолькоФлажокВШапкеОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВШапкеОтчета");
КонецПроцедуры

&НаКлиенте

Процедура Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета(Команда)
	ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВНастройкахОтчета");
КонецПроцедуры

&НаКлиенте

Процедура Отборы_НеПоказывать(Команда)
	ОтборыУстановитьРежимОтображения("НеПоказывать");
КонецПроцедуры

&НаКлиенте

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

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

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

&НаКлиенте

Процедура ОтборыПриАктивизацииСтроки(Элемент)
	УстановитьПараметрыРедактированияЭлементаОтбора();
	ПодключитьОбработчикОжидания("ОтборыПриИзмененииТекущейСтроки", 0.1, Истина);
КонецПроцедуры

&НаКлиенте

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

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

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

	ПривестиЗначениеКВидуСравнения(Строка);
	УстановитьПредставлениеЗначения(Строка);
КонецПроцедуры

&НаКлиенте

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

	Если Копирование Тогда
		СкопироватьНастройки(Элемент);
		Возврат;
	КонецЕсли;

	ОтборыПередВыборомПоля();
КонецПроцедуры

&НаКлиенте

[Assistant] Процедура Отборы_Сгруппировать(Команда)


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

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

Процедура ИмяФункции()
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);

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

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

		Если ТипЗнч(ЭлементНастройки) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда
			Строка.Заголовок  = НСтр("ru = 'Авто (по всем полям)'");
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "Предопределенный");
			Продолжить;
		КонецЕсли;

		ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляПолейГруппировок.НайтиПоле(ЭлементНастройки.Поле);
		Если ОписаниеНастройки = Неопределено Тогда
			УстановитьПометкуУдаления("СоставГруппировки", Строка);
			Продолжить;
		КонецЕсли;

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

		Если ОписаниеНастройки.Ресурс Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ресурс");
		ИначеЕсли ОписаниеНастройки.Таблица Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Таблица");
		ИначеЕсли ОписаниеНастройки.Папка Тогда
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
		Иначе
			Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент");
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Добавление, изменение элементов.

&НаКлиенте

Процедура СоставГруппировкиВыбратьПоле(ИдентификаторСтроки, Строка)
	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек);
	ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);

	Обработчик = Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки);
	ВыбратьПоле("СоставГруппировки", Обработчик, ЭлементНастройки.Поле);
КонецПроцедуры

&НаКлиенте

Процедура СоставГруппировкиПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки) Экспорт
	Если ОписаниеНастройки = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Настройки = Отчет.КомпоновщикНастроек.Настройки;
	ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки);

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

	Если ИдентификаторСтроки = Неопределено Тогда
		Строка = СоставГруппировки.ПолучитьЭлементы().Добавить();
		ЭлементНастройки = СвойствоЭлементаСтруктуры.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	Иначе
		Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
	КонецЕсли;

	ЭлементНастройки.Использование = Истина;
	ЭлементНастройки.Поле = ОписаниеНастройки.Поле;

	ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки);
	Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки);

	ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);

	Строка.ПоказыватьТипДополнения = ОписаниеНастройки.ТипЗначения.СодержитТип(Тип("Дата"));

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

	ИзменитьИспользованиеСвязанныхЭлементовНастроек("СоставГруппировки", Строка, ЭлементНастройки);

	Элементы.СоставГруппировки.ТекущаяСтрока = Строка.ПолучитьИдентификатор();

	УстановитьМодифицированность();
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте

Процедура СдвинутьПолеГруппировки(ВНачало = Истина)
	ИдентификаторыСтрок = Элементы.СоставГруппировки.ВыделенныеСтроки;
	Если ИдентификаторыСтрок.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

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

	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл
		Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);

		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;
		Строки = СоставГруппировки.ПолучитьЭлементы();

		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;

		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	УстановитьМодифицированность();
КонецПроцедуры

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

#Область ПараметрыДанныхИОтборы

// Чтение настроек.

&НаСервере

[Assistant] Процедура ОбновитьПоляГруппировки()


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

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

Процедура ИмяФункции(СвойстваГруппы, ПараметрыГруппировки) Экспорт
	Если ТипЗнч(СвойстваГруппы) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;

	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	// Обработка элементов настроек.
	ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры;
	Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда
		ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор);
	КонецЕсли;

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

	НаследникиЭлементовНастроек = Новый Соответствие;
	НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);

	// Обработка строк.
	СтрокаИсточник = ПараметрыГруппировки.Родитель;
	СтрокаПриемник = СтрокаИсточник.ПолучитьЭлементы().Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек
	ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
	СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
	СтрокаПриемник.ЭтоГруппа = Истина;
	СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа");
	СтрокаПриемник.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройкиПриемник);

	НаследникиСтрок = Новый Соответствие;
	НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);

	ИзменитьГруппировкуВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок);
	УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки);

	Раздел = ВыбранныеПоля.ПолучитьЭлементы()[0];
	Элементы.ВыбранныеПоля.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	Элементы.ВыбранныеПоля.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор();

	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

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

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

		РодительСтрокиИсточника = СтрокаИсточник.ПолучитьРодителя();
		РодительСтрокиПриемника = НаследникиСтрок.Получить(РодительСтрокиИсточника);

		Индекс = РодительЭлементаНастройкиПриемника.Элементы.Индекс(РодительЭлементаНастройкиИсточника);
		Если Индекс < 0 Тогда
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Добавить();
		Иначе // Это удаление группировки.
			ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник));
			СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Вставить(Индекс);
		КонецЕсли;

		ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
		СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
		СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));

		НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник);
		НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник);

		ИзменитьГруппировкуВыбранныхПолей(ВыбранныеПоляУзлаНастроек, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте

Процедура УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(ВыбранныеПоляУзлаНастроек, ПараметрыГруппировки)
	Строки = ПараметрыГруппировки.Родитель.ПолучитьЭлементы();

	ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.Элементы;
	Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек

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

	Индекс = ПараметрыГруппировки.Строки.ВГраница();
	Пока Индекс >= 0 Цикл
		Строка = ПараметрыГруппировки.Строки[Индекс]; // см. ЭлементКоллекцииФормыНастроек
		ЭлементНастройки = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);

		Строки.Удалить(Строка);
		ЭлементыНастроек.Удалить(ЭлементНастройки);

		Индекс = Индекс - 1;
	КонецЦикла;
КонецПроцедуры

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

Функция ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки, СвойствоЭлементаСтруктуры = Неопределено)
	ЗаголовокГруппы = ЭлементНастройки.Заголовок;

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

	Если Не ЗначениеЗаполнено(ЗаголовокГруппы) Тогда
		ЗаголовокГруппы = "(" + ЭлементНастройки.Расположение + ")";
	ИначеЕсли ЭлементНастройки.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда
		ЗаголовокГруппы = ЗаголовокГруппы + " (" + ЭлементНастройки.Расположение + ")";
	КонецЕсли;

	Возврат ЗаголовокГруппы;
КонецФункции

// Перетаскивание элементов.

&НаКлиенте

Процедура ПроверитьПеретаскиваемыеСтрокиИзВыбранныхПолей(ИдентификаторыСтрок)
	Родители = Новый Массив;

	Индекс = ИдентификаторыСтрок.ВГраница();
	Пока Индекс >= 0 Цикл
		ИдентификаторСтроки = ИдентификаторыСтрок[Индекс];

		Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки);
		Родитель = Строка.ПолучитьРодителя();

		Если Родитель = Неопределено
			Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0
			Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
			ИдентификаторыСтрок.Удалить(Индекс);
		Иначе
			Родители.Добавить(Родитель);
		КонецЕсли;

		Индекс = Индекс - 1;
	КонецЦикла;

	Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители);
	Если Родители.Количество() > 1 Тогда
		ИдентификаторыСтрок.Очистить();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

[Assistant] Процедура ВыбранныеПоляПередГруппировкойПолей(СвойстваГруппы, ПараметрыГруппировки)


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

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

Процедура ИмяФункции(Строки)
	ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	Раздел = Сортировка.ПолучитьЭлементы()[0];

	Для Каждого СтрокаИсточник Из Строки Цикл
		ЭлементНастройкиИсточник = ВыбранныеПоляЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);
		Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда
			ПеретащитьВыбранныеПоляВСортировку(СтрокаИсточник.ПолучитьЭлементы());
		ИначеЕсли ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда
			Найден = Ложь;
			Для Каждого ЭлементНастройкиПриемник Из СортировкаЭлементаСтруктуры.Элементы Цикл
				Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда
					Найден = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если Не Найден Тогда
				ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
				ЭлементНастройкиПриемник.Использование = Истина;
				СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить();
				ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник);
				СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник);
				СтрокаПриемник.Картинка = 18;
				СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'");
				СтрокаПриемник.ЭтоАвтоПоле = Истина;
			КонецЕсли;
		Иначе
			Если НайтиПолеПорядка(СортировкаЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;

			ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник);
			ЭлементНастройкиПриемник.Использование = Истина;

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

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

	Элементы.Сортировка.Развернуть(Раздел.ПолучитьИдентификатор());
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

Процедура ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока)

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

&НаКлиенте

Функция НайтиПолеПорядка(СортировкаУзлаНастроек, Поле)
	Для Каждого ЭлементНастройки Из СортировкаУзлаНастроек.Элементы Цикл
		Если ТипЗнч(ЭлементНастройки) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных")
			И ЭлементНастройки.Поле = Поле Тогда

			Возврат Поле;
		КонецЕсли;
	КонецЦикла;

	Возврат Неопределено;
КонецФункции

&НаКлиенте

Процедура ПеретащитьПоляСортировкиВВыбранныеПоля(Строки)
	ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим);

	РазделВыбранныхПолей = ВыбранныеПоля.ПолучитьЭлементы()[0];
	РазделПолейСортировки = Сортировка.ПолучитьЭлементы()[0];

	Индекс = Строки.Количество() - 1;
	Пока Индекс >= 0 Цикл
		СтрокаИсточник = Строки[Индекс];
		ЭлементНастройкиИсточник = СортировкаЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор);

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

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

			ОписаниеНастройки = ВыбранныеПоляЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройкиИсточник.Поле);

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

		СортировкаЭлементаСтруктуры.Элементы.Удалить(ЭлементНастройкиИсточник);
		РазделПолейСортировки.ПолучитьЭлементы().Удалить(СтрокаИсточник);

		Индекс = Индекс - 1;
	КонецЦикла;

	Элементы.ВыбранныеПоля.Развернуть(РазделВыбранныхПолей.ПолучитьИдентификатор(), Истина);
	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

Функция НайтиВыбранноеПоле(ВыбранныеПоляУзлаНастроек, Поле)
	НайденноеПоле = Неопределено;

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

	Возврат НайденноеПоле;
КонецФункции

// Сдвиг элементов.

&НаКлиенте

[Assistant] Процедура ПеретащитьВыбранныеПоляВСортировку(Строки)


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

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

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

	Настройки = Отчет.КомпоновщикНастроек.Настройки;

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

	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);

	Раздел = КорневаяСтрокаПоУмолчанию("Оформление");

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

	ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(СвойствоЭлементаСтруктуры, ЭлементНастройки, Результат.ЭлементКД);
	ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;

	Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда
		ЭлементНастройки.Представление = Результат.Наименование;
	КонецЕсли;

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

	Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда
		Строка.Представление = Результат.Наименование;
	КонецЕсли;

	Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.Представление);

	Если Строка.ЭтоПредопределенныйЗаголовок Тогда
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = "";
	Иначе
		ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
	КонецЕсли;

	Строка.Картинка = -1;
	Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки);

	Элементы.Оформление.ТекущаяСтрока = Строка.ПолучитьИдентификатор();

	УстановитьМодифицированность();
КонецПроцедуры

&НаКлиенте

Процедура СинхронизироватьПредопределенныеПараметрыВывода(Использование, ЭлементНастройки)
	ПараметрыВывода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы;

	Значение = ?(Использование, ТипВыводаТекстаКомпоновкиДанных.Авто, ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

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

&НаКлиенте

Процедура ОформлениеВводЗаголовкаЗавершение(Значение, Идентификатор) Экспорт
	Если Значение = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Строка = Оформление.НайтиПоИдентификатору(Идентификатор);
	Строка.Использование = Истина;
	Строка.Значение = Значение;
	Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выводить заголовок для печати: %1'"),
		?(ЗначениеЗаполнено(Значение), Значение, "<Отсутствует>"));

	Настройки = Отчет.КомпоновщикНастроек.Настройки;

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

	Настройки.ДополнительныеСвойства.Вставить("ЗаголовокУстановленИнтерактивно", ЗначениеЗаполнено(Значение));

	УстановитьМодифицированность();
КонецПроцедуры

// Сдвиг элементов.

&НаКлиенте

Процедура СдвинутьОформление(ВНачало = Истина)
	ИдентификаторыСтрок = Элементы.Оформление.ВыделенныеСтроки;
	Строки = Оформление.ПолучитьЭлементы();

	ГраницаНачалаЭлементовОформления = 2;
	ГраницаИдентификаторовСтрок = ИдентификаторыСтрок.ВГраница();

	Пока ГраницаИдентификаторовСтрок >= 0 Цикл
		Строка = Оформление.НайтиПоИдентификатору(ИдентификаторыСтрок[ГраницаИдентификаторовСтрок]);

		Если Строки.Индекс(Строка) < ГраницаНачалаЭлементовОформления Тогда
			ИдентификаторыСтрок.Удалить(ГраницаИдентификаторовСтрок);
		КонецЕсли;

		ГраницаИдентификаторовСтрок = ГраницаИдентификаторовСтрок - 1;
	КонецЦикла;

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

	СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(
		Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек);

	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл
		Строка = Оформление.НайтиПоИдентификатору(ИдентификаторСтроки);
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);

		Если ТипЗнч(ЭлементНастройки) <> Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда
			Продолжить;
		КонецЕсли;

		ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы;

		Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки);
		Граница = ЭлементыНастроек.Количество() - 1;

		Если ВНачало Тогда // Сдвиг в начало коллекции.
			Если Индекс = 0 Тогда
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -1);
			КонецЕсли;
		Иначе // Сдвиг в конец коллекции.
			Если Индекс = Граница Тогда
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -Граница);
			Иначе
				ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1);
				Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, 1);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	УстановитьМодифицированность();
КонецПроцедуры

// Использование элементов.

&НаКлиенте

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

	Строки = Оформление.ПолучитьЭлементы();
	СвойствоЭлементаСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода;

	Для Каждого Строка Из Строки Цикл
		Если ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
			Продолжить;
		КонецЕсли;

		Строка.Использование = Использование;
		ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка);
		ЭлементНастройки.Использование = Использование;
	КонецЦикла;
КонецПроцедуры

// Обработчик закрытия общей формы НастройкаКолонтитулов.
//  См. Синтакс-помощник: ОткрытьФорму - ОписаниеОповещенияОЗакрытии.
//
&НаКлиенте

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

	Если Настройки <> ПредыдущиеНастройки Тогда
		УстановитьМодифицированность();
	КонецЕсли;

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

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

#Область Структура

// Чтение настроек.

&НаСервере

[Assistant] Процедура ОформлениеИзменитьЭлементЗавершение(Результат, ИдентификаторСтроки)


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

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

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

	Раздел = СтруктураВарианта.ПолучитьЭлементы().Добавить();
	Раздел.Представление = НСтр("ru = 'Отчет'");
	Раздел.ЭтоРаздел = Истина;
	Раздел.Картинка = -1;
	Раздел.Тип = СвойствоЭлементаСтруктуры;
	Строки = Раздел.ПолучитьЭлементы();

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

&НаСервере

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

	Коллекция = Узел[ИмяКоллекции];
	ТипКоллекции = ТипЗнч(Коллекция);
	ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Коллекция);

	Если ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда

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

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

		Строка = Строки.Добавить();
		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Коллекция);

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

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

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

		ЭлементПользовательскойНастройки = ПользовательскиеНастройки.Найти(Элемент.ИдентификаторПользовательскойНастройки);

		Строка = Строки.Добавить();

		Если ЭлементПользовательскойНастройки = Неопределено Тогда
			Строка.Использование = Элемент.Использование;
		Иначе
			Строка.Использование = ЭлементПользовательскойНастройки.Использование;
		КонецЕсли;

		Если ТипЗнч(Элемент) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
			Узел = Элемент.Настройки;
			СодержитВложенныеОтчеты = Истина;
		Иначе
			Узел = Элемент;
			ЗаполнитьЗначенияСвойств(Строка, Элемент);

			Если РасширенныйРежим = 0 И ЭлементПользовательскойНастройки <> Неопределено Тогда
				Строка.Использование = ЭлементПользовательскойНастройки.Использование;
			КонецЕсли;
		КонецЕсли;

		Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Узел);
		Строка.ФлажокДоступен = (РасширенныйРежим = 1 Или ЭлементПользовательскойНастройки <> Неопределено);

		СвойстваЭлемента = СвойстваЭлементаКоллекцииСтруктуры(Элемент);
		ЗаполнитьЗначенияСвойств(Строка, СвойстваЭлемента);

		Строка.Подтип = Строка.ПолучитьРодителя().Подтип;

		Если СвойстваЭлемента.ПометкаУдаления Тогда
			УстановитьПометкуУдаления("СтруктураВарианта", Строка);
		КонецЕсли;

		Для Каждого ИмяКоллекции Из СвойстваЭлемента.ИменаКоллекций Цикл
			ОбновитьКоллекциюСтруктуры(Узел, ИмяКоллекции, Строка.ПолучитьЭлементы());
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

// Параметры:
//  Элемент - НастройкиВложенногоОбъектаКомпоновкиДанных
//
// Возвращаемое значение:
//  Структура:
//    * СодержитУсловноеОформление - Булево
//    * СодержитПоляИлиСортировки - Булево
//    * СодержитОтборы - Булево
//    * Тип - Строка
//    * Картинка - Число
//    * ПометкаУдаления - Булево
//    * ИменаКоллекций - Массив
//    * Заголовок - Строка
//    * Представление - Строка
//
&НаСервере

Функция СвойстваЭлементаКоллекцииСтруктуры(Элемент)
	СвойстваЭлемента = ПалитраСвойствЭлементаКоллекцииСтруктуры();

	ТипЭлемента = ТипЗнч(Элемент);
	Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных")
		Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда

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

	ИначеЕсли ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		Объекты = ДоступныеОбъектыНастройки(Элемент);
		ОписаниеОбъекта = Объекты.Найти(Элемент.ИдентификаторОбъекта);

		СвойстваЭлемента.Представление = ОписаниеОбъекта.Заголовок;
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;

		Если Не ЗначениеЗаполнено(СвойстваЭлемента.Представление) Тогда
			СвойстваЭлемента.Представление = НСтр("ru = 'Вложенная группировка'");
		КонецЕсли;

	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда

		СвойстваЭлемента.Представление = НСтр("ru = 'Таблица'");
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;

	ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда

		СвойстваЭлемента.Представление = НСтр("ru = 'Диаграмма'");
		Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда
			СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки;
		КонецЕсли;

	Иначе
		СвойстваЭлемента.Представление = Строка(ТипЭлемента);
	КонецЕсли;

	Если ТипЭлемента <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		ПараметрыВывода = Элемент.ПараметрыВывода; // ЗначенияПараметровВыводаКомпоновкиДанных
		ЗаголовокЭлемента = ПараметрыВывода.Элементы.Найти("Заголовок");

		Если ЗаголовокЭлемента <> Неопределено Тогда
			СвойстваЭлемента.Заголовок = ЗаголовокЭлемента.Значение;
		КонецЕсли;

	КонецЕсли;

	СвойстваЭлемента.ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Элемент);

	ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЭлемента);
	СостояниеЭлемента = ?(СвойстваЭлемента.ПометкаУдаления, "ПометкаУдаления", Неопределено);
	СвойстваЭлемента.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента, СостояниеЭлемента);

	СвойстваЭлемента.Тип = Элемент;

	УстановитьПризнакиВложенныхЭлементовНастроек(Элемент, СвойстваЭлемента);

	Возврат СвойстваЭлемента;
КонецФункции

&НаСервере

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

	Возврат СвойстваЭлемента;
КонецФункции

&НаСервере

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

&НаСервере

[Assistant] Процедура ОбновитьСтруктуру()


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

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

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

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

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

	ШаблонЗаголовка = НСтр("ru = 'Настройка %1 отчета ""%2""'");
	Если Строка.Тип = "ДиаграммаКомпоновкиДанных" Тогда
		ПредставлениеЭлемента = НСтр("ru = 'диаграммы'");
	Иначе
		ПредставлениеЭлемента = НСтр("ru = 'группировки'");
	КонецЕсли;

	Если ЗначениеЗаполнено(Строка.Заголовок) Тогда
		ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Заголовок + """";
	ИначеЕсли ЗначениеЗаполнено(Строка.Представление) Тогда
		ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Представление + """";
	КонецЕсли;

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

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

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

	ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров);
	Если ВыполнятьЗамеры Тогда
		МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент");
		МодульОценкаПроизводительностиКлиент.ЗамерВремени(
			НастройкиОтчета.КлючЗамеров + ".Настройки", Ложь, Ложь);
	КонецЕсли;

	ИмяОткрываемойФормы = НастройкиОтчета.ПолноеИмя + ?(ИспользоватьФормуВарианта, ".ФормаВарианта", ".ФормаНастроек");
	ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект,,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте

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

	Если Результат.ВариантМодифицирован Тогда
		ОбновитьФорму(Результат);

		Раздел = КорневаяСтрокаПоУмолчанию("СтруктураВарианта");
		Элементы.СтруктураВарианта.Развернуть(Раздел.ПолучитьИдентификатор(), Истина);
	КонецЕсли;
КонецПроцедуры

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

#Область Общее

#Область ОбработчикиОповещений

&НаКлиенте

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

	Возврат ПараметрыЗаполнения;
КонецФункции

&НаКлиенте

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


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

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

Процедура ИмяФункции(ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения = Неопределено)
	Если КартинкаРежимаОтображения = Неопределено Тогда
		КартинкаРежимаОтображения = Строка.КартинкаРежимаОтображения;
	Иначе
		Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображения;
	КонецЕсли;

	Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 2 Тогда
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
	ИначеЕсли КартинкаРежимаОтображения = 3 Или КартинкаРежимаОтображения = 4 Тогда
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
	Иначе
		ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	КонецЕсли;

	Если ИмяКоллекции = "Отборы" И Не Строка.ЭтоПараметр Тогда
		Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда
			// Когда ПредставлениеПользовательскойНастройки заполнено,
			// то Представление работает как переключатель,
			// но также может использоваться для вывода в табличный документ.
			ЭлементНастройки.Представление = Строка.Заголовок;
		Иначе
			ЭлементНастройки.Представление = "";
		КонецЕсли;

		Если Не Строка.ЭтоПредопределенныйЗаголовок Тогда
			ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок;
		КонецЕсли;
	ИначеЕсли ИмяКоллекции = "Оформление" Тогда
		// Особенность УО - ПредставлениеПользовательскойНастройки может очищаться после ПолучитьНастройки().
		Если Строка.ЭтоПредопределенныйЗаголовок Тогда
			Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда
				// Когда ПредставлениеПользовательскойНастройки заполнено,
				// то Представление работает как переключатель,
				// но также может использоваться для вывода в табличный документ.
				ЭлементНастройки.Представление = Строка.Заголовок;
			Иначе
				ЭлементНастройки.Представление = "";
			КонецЕсли;
		Иначе
			// Когда ПредставлениеПользовательскойНастройки заполнено,
			// то Представление работает как переключатель,
			// но также может использоваться для вывода в табличный документ.
			ЭлементНастройки.Представление = Строка.Заголовок;
		КонецЕсли;
	КонецЕсли;

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

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

Функция КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки)
	КартинкаРежимаОтображения = 5;

	Если ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда
		Если ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда
			Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
				Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда
				КартинкаРежимаОтображения = 2;
			Иначе
				КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 1, 2);
			КонецЕсли;
		ИначеЕсли ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
			Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
				Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда
				КартинкаРежимаОтображения = 4;
			Иначе
				КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 3, 4);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	Возврат КартинкаРежимаОтображения;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Клиент - Таблицы полей (функциональная часть).

// Параметры:
//  УзелНастроек - НастройкиКомпоновкиДанных
//               - НастройкиВложенногоОбъектаКомпоновкиДанных
//               - СтруктураНастроекКомпоновкиДанных
//               - ДиаграммаКомпоновкиДанных
//               - ПорядокКомпоновкиДанных
//               - ГруппировкаКомпоновкиДанных
//               - ГруппировкаТаблицыКомпоновкиДанных
//               - ГруппировкаДиаграммыКомпоновкиДанных
//               - УсловноеОформлениеКомпоновкиДанных
//               - ГруппаВыбранныхПолейКомпоновкиДанных
//               - ГруппаЭлементовОтбораКомпоновкиДанных
//               - ЭлементОтбораКомпоновкиДанных
//               - ЭлементУсловногоОформленияКомпоновкиДанных
//               - ЗначенияПараметровВыводаКомпоновкиДанных
//               - ЗначениеПараметраНастроекКомпоновкиДанных
//               - ОтборКомпоновкиДанных
//               - ВыбранныеПоляКомпоновкиДанных
//               - ТаблицаКомпоновкиДанных
//               - Неопределено
//  Строка - см. ЭлементКоллекцииФормыНастроек
//
// Возвращаемое значение:
//   - НастройкиКомпоновкиДанных
//   - НастройкиВложенногоОбъектаКомпоновкиДанных
//   - СтруктураНастроекКомпоновкиДанных
//   - ГруппировкаКомпоновкиДанных
//   - ТаблицаКомпоновкиДанных
//   - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных
//   - ГруппировкаТаблицыКомпоновкиДанных
//   - ДиаграммаКомпоновкиДанных
//   - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных
//   - ГруппировкаДиаграммыКомпоновкиДанных
//   - ОтборКомпоновкиДанных
//   - ЭлементОтбораКомпоновкиДанных
//   - ГруппаЭлементовОтбораКомпоновкиДанных
//   - ЭлементУсловногоОформленияКомпоновкиДанных
//   - ЗначенияПараметровВыводаКомпоновкиДанных
//   - ЗначениеПараметраНастроекКомпоновкиДанных
//   - ВыбранныеПоляКомпоновкиДанных
//   - ГруппаВыбранныхПолейКомпоновкиДанных
//   - ПорядокКомпоновкиДанных
//   - УсловноеОформлениеКомпоновкиДанных
//   - КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных
//   - Неопределено
//
&НаКлиентеНаСервереБезКонтекста

Функция ЭлементНастройки(Знач УзелНастроек, Знач Строка)
	ЭлементНастройки = Неопределено;

	Если Строка <> Неопределено
		И ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда

		ЭлементНастройки = УзелНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор);
	КонецЕсли;

	Если ТипЗнч(ЭлементНастройки) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
		ЭлементНастройки = ЭлементНастройки.Настройки;
	КонецЕсли;

	Возврат ЭлементНастройки;
КонецФункции

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

Функция ЭлементыНастроек(Знач СвойствоЭлементаСтруктуры, Знач ЭлементНастройки = Неопределено, Знач ИмяКоллекции = Неопределено)
	Если ЭлементНастройки = Неопределено Тогда
		ЭлементНастройки = СвойствоЭлементаСтруктуры;
	КонецЕсли;

	ТипОбъекта = ТипЗнч(ЭлементНастройки);

	Если ИмяКоллекции <> Неопределено Тогда
		ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Таблица", "");
		ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Диаграмма", "");

		Если ТипОбъекта = Тип("ТаблицаКомпоновкиДанных")
			И (ИмяКоллекции = "Строки" Или ИмяКоллекции = "Колонки")
			Или ТипОбъекта = Тип("ДиаграммаКомпоновкиДанных")
			И (ИмяКоллекции = "Серии" Или ИмяКоллекции = "Точки") Тогда

			Возврат ЭлементНастройки[ИмяКоллекции];
		КонецЕсли;
	КонецЕсли;

	Если ТипОбъекта = Тип("НастройкиКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаТаблицыКомпоновкиДанных")
		Или ТипОбъекта = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда

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

		Возврат ЭлементНастройки;
	ИначеЕсли ТипОбъекта = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		Возврат ЭлементНастройки.Настройки.Структура;
	КонецЕсли;

	Возврат ЭлементНастройки.Элементы;
КонецФункции

&НаКлиенте

[Assistant] Процедура УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения = Неопределено)


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

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

Процедура ПоказательРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки,
	СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

	Если Элементы.ВсеНастройки.Видимость Тогда
		ПерейтиКНастройкам(НастройкиОтчета.РазрешеноИзменятьВарианты);
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПоказательРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки,
	СтандартнаяОбработка)

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

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

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

&НаКлиенте

Процедура ПоказательПриИзменении(Элемент)

	ПереходКНастройкамВыполнен();

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

&НаКлиенте

Процедура ПоказательОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Массив") Тогда
		СброситьУниверсальныйПоиск();
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка = Ложь;
	ПрименитьЗначениеУниверсальногоПоиска(ВыбранноеЗначение);

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

&НаКлиенте

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

	Если Не ЗначениеЗаполнено(Текст) Тогда
		Возврат;
	КонецЕсли;

	Запрос = СокрЛП(Текст);

	Если ПереходКНастройкамВыполнен(Запрос) Тогда
		Возврат;
	КонецЕсли;

	ПодходящиеЗначения = ПодходящиеЗначенияУниверсальногоПоиска(Запрос);

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

	ДанныеВыбора = ПодходящиеЗначения;
	СтандартнаяОбработка = Ложь;

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

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

#Область ОбработчикиСобытийДокументаОтчетТабличныйДокумент

&НаКлиенте

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

	ОбработкаРасшифровки = Ложь;

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

	Если Не ОбработкаРасшифровки И СтандартнаяОбработка И ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда

		Если ПерейтиПоСсылке(Область.Текст) Тогда
			СтандартнаяОбработка = Ложь;
			Возврат;
		КонецЕсли;

		Попытка
			ЗначениеРасшифровки = Область.Расшифровка;
		Исключение
			ЗначениеРасшифровки = Неопределено;
			// Для некоторых типов областей табличного документа (свойство ТипОбласти)
			// чтение расшифровки недоступно, поэтому делается попытка-исключение.
		КонецПопытки;

		Если ЗначениеРасшифровки <> Неопределено И ПерейтиПоСсылке(ЗначениеРасшифровки) Тогда
			СтандартнаяОбработка = Ложь;
			Возврат;
		КонецЕсли;

		Если ПерейтиПоСсылке(Область.Маска) Тогда
			СтандартнаяОбработка = Ложь;
			Возврат;
		КонецЕсли;
	КонецЕсли;

	Если Не ОбработкаРасшифровки И СтандартнаяОбработка Тогда
		ВариантыОтчетовСлужебныйКлиент.ПоказатьКонтекстнуюНастройкуОтчета(ЭтотОбъект, Элемент, Область,
			СтандартнаяОбработка);
	КонецЕсли;

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

&НаКлиенте

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

	ИнтеграцияПодсистемБСПКлиент.ПриОбработкеРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка);
	ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка);

	Если СтандартнаяОбработка Тогда
		ВариантыОтчетовСлужебныйКлиент.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка);
	КонецЕсли;

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

&НаКлиенте

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

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

	ИнтеграцияПодсистемБСПКлиент.ПриОбработкеДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка,
		СтандартнаяОбработка);
	ОтчетыКлиентПереопределяемый.ОбработкаДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка,
		СтандартнаяОбработка);

	Если СтандартнаяОбработка Тогда
		Данные = ДанныеЭлементаРасшифровки(Расшифровка);
		ВариантыОтчетовСлужебныйКлиент.ОбработкаДополнительнойРасшифровки(ЭтотОбъект, Данные, Элемент, Расшифровка,
			СтандартнаяОбработка);
	КонецЕсли;

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

&НаКлиенте

Процедура ОтчетТабличныйДокументПриАктивизации(Элемент)

	ВариантыОтчетовСлужебныйКлиент.ПриАктивизацииРезультатаОтчета(ЭтотОбъект, Элементы.ОтчетТабличныйДокумент);
	ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина);

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

&НаКлиенте

Процедура ОтчетТабличныйДокументПередЗаписью(Элемент, Копирование, Отказ)

	Отказ = Истина;
	СохранитьОтчет(Команды.Найти(Элементы.СохранитьОтчет.ИмяКоманды));

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

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

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

#Область ОбработчикиКомандФормы

&НаКлиенте

Процедура ВсеНастройки(Команда)

	ПерейтиКНастройкам();

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

&НаКлиенте

Процедура ПрименитьНастройкиИПереформироватьОтчет(Результат, ПараметрыВыполнения) Экспорт
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;

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

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

	КонецЕсли;

	РезультатНастройки = Результат;
	ОтчетСформирован = Результат.Переформировать;

	ПодключитьОбработчикОжидания("ОбновитьЭлементыФормыНастроекОтложенно", 0.1, Истина);
КонецПроцедуры

&НаКлиенте

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

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

	ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина);
	ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина);

	ОтчетСформирован = Ложь;

	СброситьВыбранныйУровеньГруппировок();
	ВариантыОтчетовСлужебныйКлиент.СброситьПометкиСтекаНастроек(СтекНастроек);
	ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения);
КонецПроцедуры

&НаКлиенте

Процедура СохранитьВариант(Команда)

	Если Не ВариантМодифицирован
	   И НастройкиОтчета.ПолноеИмя <> "Отчет.УниверсальныйОтчет" Тогда
		Возврат;
	КонецЕсли;

	СохранитьВариантОтчета();

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

&НаКлиенте

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

&НаКлиенте

Процедура ОтчетСкомпоноватьРезультат(Команда)
	ОчиститьСообщения();
	Сформировать();
	ПараметрыИзменены = Ложь;
КонецПроцедуры

&НаКлиенте


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

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

&НаСервере
Процедура ИмяФункции(Отказ, СтандартнаяОбработка)
	узИспользоватьУчетВремени = Константы.узИспользоватьУчетВремени.Получить();
	узИспользоватьВопросыИОтветы = Константы.узИспользоватьВопросыИОтветы.Получить();
	узИспользоватьСвоиЦветаДляЗадач = Константы.узИспользоватьСвоиЦветаДляЗадач.Получить();
	узРегистрироватьАктивностьПользователей = Константы.узРегистрироватьАктивностьПользователей.Получить();
	узПоказыватьАктивностьПользователяНаРабочемСтоле = Константы.узПоказыватьАктивностьПользователяНаРабочемСтоле.Получить();
	//+ #104 Дзеса Ігор (capitoshko) 09.10.2	018
	узЗапретитьВводФактаДляОсновныхЗадач = Константы.узЗапретитьВводФактаДляОсновныхЗадач.Получить();
	//- #104 Дзеса Ігор (capitoshko) 09.10.2018
	ВыполнитьЛокализацию();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЛокализацию()
	МассивКодовСообщений = Новый Массив();
	МассивКодовСообщений.Добавить(66);//Настройки основные

	РегистрыСведений.узСловарь.ВыполнитьЛокализацию(Элементы,МассивКодовСообщений);
КонецПроцедуры //ВыполнитьЛокализацию()

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

&НаСервере
Процедура узИспользоватьУчетВремениПриИзмененииНаСервере()
	Константы.узИспользоватьУчетВремени.Установить(узИспользоватьУчетВремени);
КонецПроцедуры

&НаСервере
Процедура узИспользоватьВопросыИОтветыПриИзмененииНаСервере()
	Константы.узИспользоватьВопросыИОтветы.Установить(узИспользоватьВопросыИОтветы);
КонецПроцедуры

&НаКлиенте
Процедура узИспользоватьВопросыИОтветыПриИзменении(Элемент)
	узИспользоватьВопросыИОтветыПриИзмененииНаСервере();
	ОбновитьИнтерфейс();
КонецПроцедуры

&НаКлиенте
Процедура узИспользоватьСвоиЦветаДляЗадачПриИзменении(Элемент)
	узИспользоватьСвоиЦветаДляЗадачПриИзмененииНаСервере();
	ОбновитьИнтерфейс();
	Оповестить("Константа.ИспользоватьСвоиЦветаДляЗадач.Записана");
КонецПроцедуры

&НаСервере
Процедура узИспользоватьСвоиЦветаДляЗадачПриИзмененииНаСервере()
	Константы.узИспользоватьСвоиЦветаДляЗадач.Установить(узИспользоватьСвоиЦветаДляЗадач);
КонецПроцедуры

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

&НаСервере
Процедура узПоказыватьАктивностьПользователяНаРабочемСтолеПриИзмененииНаСервере()
	Константы.узПоказыватьАктивностьПользователяНаРабочемСтоле.Установить(узПоказыватьАктивностьПользователяНаРабочемСтоле);
КонецПроцедуры

&НаКлиенте
Процедура узПоказыватьАктивностьПользователяНаРабочемСтолеПриИзменении(Элемент)
	узПоказыватьАктивностьПользователяНаРабочемСтолеПриИзмененииНаСервере();
	ОбновитьИнтерфейс();
КонецПроцедуры

&НаСервере
Процедура узРегистрироватьАктивностьПользователейПриИзмененииНаСервере()
	Константы.узПоказыватьАктивностьПользователяНаРабочемСтоле.Установить(узПоказыватьАктивностьПользователяНаРабочемСтоле);
	Константы.узРегистрироватьАктивностьПользователей.Установить(узРегистрироватьАктивностьПользователей);
КонецПроцедуры

&НаКлиенте
Процедура узРегистрироватьАктивностьПользователейПриИзменении(Элемент)
	Если узРегистрироватьАктивностьПользователей = Ложь Тогда
		узПоказыватьАктивностьПользователяНаРабочемСтоле = Ложь;
	Конецесли;
	узРегистрироватьАктивностьПользователейПриИзмененииНаСервере();
	ОбновитьИнтерфейс();
КонецПроцедуры

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

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

//+ #104 Дзеса Ігор (capitoshko) 09.10.2018
&НаСервере
Процедура узЗапретитьВводФактаДляОсновныхЗадачПриИзмененииНаСервере()
	Константы.узЗапретитьВводФактаДляОсновныхЗадач.Установить(узЗапретитьВводФактаДляОсновныхЗадач);
КонецПроцедуры

&НаКлиенте
Процедура узЗапретитьВводФактаДляОсновныхЗадачПриИзменении(Элемент)
	узЗапретитьВводФактаДляОсновныхЗадачПриИзмененииНаСервере();
КонецПроцедуры
//- #104 Дзеса Ігор (capitoshko) 09.10.2018

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


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

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

Процедура ОбъектПриЧтенииНаСервере(ТекущийОбъект, ТолькоПросмотр)
Экспорт

	Если Не ТолькоПросмотр Тогда
    // TODO: допиши оставшуюся часть

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

#Область ПрограммныйИнтерфейс

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

	Если Не ТолькоПросмотр Тогда

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

	КонецЕсли;

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

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

	АвтономнаяРаботаСлужебный.ОтключитьАвтоматическуюСинхронизациюДанныхСПриложениемВИнтернете(Источник);

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

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

	Возврат АвтономнаяРаботаСлужебный.ФлагНастройкиВопросаОДолгойСинхронизации(ЗначениеФлага, ОписаниеНастройки);

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

// Возвращает адрес для восстановления пароля учетной записи приложения в интернете.
//
// Возвращаемое значение:
//   Строка - адрес восстановления пароля учетной записи.
//
Функция АдресДляВосстановленияПароляУчетнойЗаписи() Экспорт

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

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

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

	Если Не АвтономнаяРаботаСлужебный.НеобходимоВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске() Тогда
		Возврат Ложь;
	КонецЕсли;

	Попытка
		АвтономнаяРаботаСлужебный.ВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске();
		Параметры.Вставить("ПерезапуститьПослеНастройкиАвтономногоРабочегоМеста");
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();

		ЗаписьЖурналаРегистрации(АвтономнаяРаботаСлужебный.СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));

		Параметры.Вставить("ОшибкаПриНастройкеАвтономногоРабочегоМеста",
			ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
	КонецПопытки;

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

Функция ИмяКонстантыАРМБазовойФункциональности() Экспорт

	Возврат "СтандартныеПодсистемыВАвтономномРежиме";

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

Процедура ВыключитьСвойствоИБ() Экспорт

	ЭтоАвтономноеРабочееМесто = Константы.ЭтоАвтономноеРабочееМесто.СоздатьМенеджерЗначения();
	ЭтоАвтономноеРабочееМесто.Прочитать();
	Если ЭтоАвтономноеРабочееМесто.Значение Тогда

		ЭтоАвтономноеРабочееМесто.Значение = Ложь;
		МодульОбновлениеИнформационнойБазы = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазы");
		МодульОбновлениеИнформационнойБазы.ЗаписатьДанные(ЭтоАвтономноеРабочееМесто);

	КонецЕсли;

	ИмяКонстанты = ИмяКонстантыАРМБазовойФункциональности();
	Если Метаданные.Константы.Найти(ИмяКонстанты) <> Неопределено Тогда

		Если Константы[ИмяКонстанты].Получить() = Истина Тогда

			Константы[ИмяКонстанты].Установить(Ложь);

		КонецЕсли;

	КонецЕсли;

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

// Для вызова из формы восстановления связи с главным узлом
// см. ОбщаяФорма.ВосстановлениеСвязиСГлавнымУзлом.
//
Процедура ПриПодтвержденииОтключенияСвязиСГлавнымУзлом() Экспорт

	ИмяКонстанты = ИмяКонстантыАРМБазовойФункциональности();
	ЕстьКонстантаБазовойФункциональности = (Метаданные.Константы.Найти(ИмяКонстанты) <> Неопределено);

	Если Константы.ЭтоАвтономноеРабочееМесто.Получить() = Ложь
		И
		(ЕстьКонстантаБазовойФункциональности
			И Константы[ИмяКонстанты].Получить() = ЛОЖЬ) Тогда

		Возврат;

	КонецЕсли;

	ВыключитьСвойствоИБ();

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

		НеИспользоватьРазделениеПоОбластямДанных.Значение = Истина;

		МодульОбновлениеИнформационнойБазы = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазы");
		МодульОбновлениеИнформационнойБазы.ЗаписатьДанные(НеИспользоватьРазделениеПоОбластямДанных);

	КонецЕсли;

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

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