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

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

Процедура ОбновитьЗаголовок()
Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда
		ТипФайла = НСтр("ru = 'Файл'");
	Иначе
		ТипФайла = НСтр("ru = 'Присоединенный файл'");
	КонецЕсли;

	Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    // TODO: допиши оставшуюся часть

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

	Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда
		ТипФайла = НСтр("ru = 'Файл'");
	Иначе
		ТипФайла = НСтр("ru = 'Присоединенный файл'");
	КонецЕсли;

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

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

&НаКлиенте

Процедура ОтображатьВкладкиДополнительныхДанных()

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

	ИспользоватьВкладки = ВидимостьДополнительныхРеквизитов Или Элементы.ГруппаЭлектронныеПодписи.Видимость Или Элементы.ГруппаСертификатыШифрования.Видимость;
	Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц =
		?(ИспользоватьВкладки , ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет);

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

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

Функция ДанныеФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено, Знач Режим = "")

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

&НаКлиенте

Процедура ОткрытьФайлДляПросмотра()

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

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

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

&НаКлиенте

Процедура ОткрытьКаталогФайла()

	Если ЭтоНовый()
		ИЛИ Объект.Зашифрован Тогда
		Возврат;
	КонецЕсли;

	ДанныеФайла = ДанныеФайла(Объект.Ссылка, УникальныйИдентификатор, "ДляОткрытия");
	РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла);

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

&НаКлиенте

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

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

	ДанныеФайла = ДанныеФайла(Объект.Ссылка, УникальныйИдентификатор, "ДляСохранения");
	РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено);

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

&НаКлиенте

Процедура ПослеУдаленияДанных(Результат, ДополнительныеПараметры) Экспорт

	Закрыть();

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

&НаСервере

Процедура УдалитьИзСпискаПодписейИЗаписатьФайл()

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

	МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись");

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

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

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

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

Процедура УстановитьДоступностьКнопок(Форма, Элементы)

	ИменаВсехКоманд = ИменаВсехКомандФормы();
	ИменаДоступныхКоманд = ДоступныеКомандыФормы(Форма);

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

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

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

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

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

Функция ИменаВсехКомандФормы()

	ИменаКоманд = ИменаКомандИзмененияФайла();
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИменаКоманд, ИменаПрочихКоманд());
	Возврат ИменаКоманд;

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

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

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

	ИменаКоманд = Новый Массив;

	// Простые команды, которые доступны любому пользователю читающему файлы.
	ИменаКоманд.Добавить("СохранитьВместеСЭП");

	ИменаКоманд.Добавить("ОткрытьСертификат");
	ИменаКоманд.Добавить("ОткрытьПодпись");
	ИменаКоманд.Добавить("ПроверитьЭП");
	ИменаКоманд.Добавить("ПроверитьВсе");
	ИменаКоманд.Добавить("СохранитьПодпись");

	ИменаКоманд.Добавить("ОткрытьКаталогФайла");
	ИменаКоманд.Добавить("ОткрытьФайлДляПросмотра");
	ИменаКоманд.Добавить("СохранитьКак");

	Возврат ИменаКоманд;

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

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

Функция ИменаКомандИзмененияФайла()

	ИменаКоманд = Новый Массив;

	ИменаКоманд.Добавить("Подписать");
	ИменаКоманд.Добавить("ДобавитьЭПИзФайла");

	ИменаКоманд.Добавить("УдалитьЭП");

	ИменаКоманд.Добавить("Редактировать");
	ИменаКоманд.Добавить("Занять");
	ИменаКоманд.Добавить("ЗакончитьРедактирование");
	ИменаКоманд.Добавить("Освободить");
	ИменаКоманд.Добавить("СохранитьИзменения");

	ИменаКоманд.Добавить("Зашифровать");
	ИменаКоманд.Добавить("Расшифровать");

	ИменаКоманд.Добавить("СтандартныеСкопировать");
	ИменаКоманд.Добавить("ОбновитьИзФайлаНаДиске");

	ИменаКоманд.Добавить("СтандартнаяЗаписать");
	ИменаКоманд.Добавить("СтандартнаяЗаписатьИЗакрыть");
	ИменаКоманд.Добавить("СтандартныеУстановитьПометкуУдаления");

	ИменаКоманд.Добавить("Скопировать");

	Возврат ИменаКоманд;

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

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


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

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

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

	//+ УрянскийД 2020-06-22 (начало)
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
	//- УрянскийД 2020-06-22 (окончание)

	Если Отказ Тогда
		Возврат;
	Конецесли;

	Если ДополнительныеСвойства.Свойство("узЭтоОбработка") Тогда
		Возврат;
	Конецесли;

	Если НЕ ЗначениеЗаполнено(ДатаСоздания) Тогда
		ДатаСоздания = ТекущаяДатаСеанса();
	Конецесли;
	Если НЕ ЗначениеЗаполнено(ДатаНачалаРаботПоЗадаче) Тогда
		ДатаНачалаРаботПоЗадаче = ДатаСоздания;
	Конецесли;

	Если ЭтоНовый()
		И НЕ ЗначениеЗаполнено(Родитель) Тогда
		ЭтоОсновнаяЗадача = Истина;
	Конецесли;

	ОсновнаяЗадача = ПолучитьОсновнуюЗадачу(Родитель);

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

	ЗаполнитьСтатусЗадачиЕслиОнНеЗаполнен(Отказ);

	// [+] #285 Павлюков С.Ю. 2024-04-20
	ПроверитьДоступностьСменыСтатуса(Статус, Отказ);
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	// [-] #285 Павлюков С.Ю. 2024-04-20

	РезультатПроверкиWIPЛимит = ПроверитьWIPЛимит();
	Если РезультатПроверкиWIPЛимит.ПревышенWIPЛимит Тогда
		Отказ = Истина;
		Сообщить(РезультатПроверкиWIPЛимит.ТекстОшибки);
		Возврат;
	Конецесли;

	пЕстьПодчиненныеЗадачи = ЕстьПодчиненныеЗадачи(Ссылка);

	УказаноСвойство_узЭтоЗаписьРодителя = ДополнительныеСвойства.Свойство("узЭтоЗаписьРодителя");

	Если НЕ УказаноСвойство_узЭтоЗаписьРодителя Тогда
		ЕстьПодчиненныеЗадачи = пЕстьПодчиненныеЗадачи;
	Конецесли;

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

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

	ТекПользователь = Пользователи.ТекущийПользователь();
	ДатаПоследнегоИзменения = ТекущаяДатаСеанса();
	АвторПоследнегоИзменения = ТекПользователь;

	СтарыйСтатус = Ссылка.Статус;

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

	ИзмененЦветПоУмолчанию = ПолучитьИзмененЦветПоУмолчанию();

	Если Удалить_ФактическиеЧасы.Количество() > 0 Тогда
		Удалить_ЧасыФакт = Удалить_ФактическиеЧасы.Итог("ЧасыФакт");
	Конецесли;

	СобытияВИстории = ОбновитьИсторию();

	ДополнительныеСвойства.Вставить("СобытияВИстории",СобытияВИстории);

	//+ УрянскийД 2020-06-22 (начало)
	КоличествоЗадачЧекЛиста = ЭтотОбъект.Комментарии.Количество();
	КоличествоВыполненныхЗадачЧекЛиста = ЭтотОбъект.Комментарии.Итог("Выполнено");
	//- УрянскийД 2020-06-22 (окончание)

	ПоследнийКомментарий = "";
	Если КоличествоЗадачЧекЛиста > 0 Тогда
		СтрокаПоследнийКомментарий = ЭтотОбъект.Комментарии[КоличествоЗадачЧекЛиста - 1];
		ПоследнийКомментарий = СтрокаПоследнийКомментарий.Комментарий;
	КонецЕсли;

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

Процедура ЗаполнитьСтатусЗадачиЕслиОнНеЗаполнен(Отказ)
	Перем пНовыйСтатус;

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

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

	СтатусЗадачиПоУмолчанию = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
		"СтатусЗадачиПоУмолчанию",
		Тип("СправочникСсылка.узСтатусыЗадачи"),
		Ложь,Ложь);

	Если ЗначениеЗаполнено(СтатусЗадачиПоУмолчанию) Тогда
		пНовыйСтатус = СтатусЗадачиПоУмолчанию;
	Конецесли;

	Статус = пНовыйСтатус;
КонецПроцедуры //ЗаполнитьСтатусЗадачи(Отказ)

Функция ПолучитьИзмененЦветПоУмолчанию() Экспорт

	пИзмененЦветПоУмолчанию = Ложь;

	ЦветУЗадачи = ЦветЗадачи.Получить();
	//ЦветПоУмолчанию = ЦветаСтиля.узЦветЧерный;
	ЦветПоУмолчанию = узОбщийМодульСервер.ЦветаСтиляБезЦвета();

	Если ЦветУЗадачи <> ЦветПоУмолчанию Тогда
		пИзмененЦветПоУмолчанию = Истина;
	Конецесли;

	Возврат пИзмененЦветПоУмолчанию;
КонецФункции

[Assistant] Процедура ПередЗаписью(Отказ)


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

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

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

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

	//+ #190 SZ 16.03.2020
	// признак будем проверять при отправлке почты
	//Если СтарыйИсполнитель.узНеОтправлятьУведомленияНаПочту Тогда
	//	Возврат;
	//Конецесли;
	//- #190 SZ 16.03.2020

	ТекПользователь = Пользователи.ТекущийПользователь();

	//+ #190 SZ 16.03.2020
	// проверяем признак узОтправлятьУведомленияОДействияхПользователяЕмуНаПочту
	//Если ТекПользователь = СтарыйИсполнитель Тогда
	//	Возврат;
	//Конецесли;

	Если ТекПользователь = СтарыйИсполнитель
		И НЕ ТекПользователь.узОтправлятьУведомленияОДействияхПользователяЕмуНаПочту Тогда
		Возврат;
	Конецесли;
	//- #190 SZ 16.03.2020

	Если Исполнитель = СтарыйИсполнитель Тогда
		Возврат;
	КонецЕсли;

	ТЗСобытияВИсторииДляУведомлений = СобытияВИстории.ТЗСобытияВИсторииДляУведомлений;
	ВсегоСобытий = ТЗСобытияВИсторииДляУведомлений.Количество();
	Если ВсегоСобытий = 0 Тогда
		Возврат;
	Конецесли;

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

	Если НЕ РезультатФункции.НеобходимоОтправитьУведомление Тогда
		Возврат;
	КонецЕсли;

	//+ГЕНА
	ДопПараметры = Новый Структура();
	ДопПараметры.Вставить("ВажностьЗадачи",Важность);
	ДопПараметры.Вставить("ПользовательКому",СтарыйИсполнитель);
	ПолучитьПараметрыПисьма(РезультатФункции, ДопПараметры);
	//-ГЕНА

	//+ #190 SZ 16.03.2020
	// Отправлем почту если это разрешено реквизитом узНеОтправлятьУведомленияНаПочту
	//
	//узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры);
	Если НЕ Исполнитель.узНеОтправлятьУведомленияНаПочту Тогда
		узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры);
	КонецЕсли;
	//- #190 SZ 16.03.2020

	//+ #240 Пиганов Г.В. 2020-09-08
	// +++ 79Vlad  20.12.2018
	//узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
	// --- 79Vlad  20.12.2018
	узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, СтарыйИсполнитель);
	//- #240 Пиганов Г.В. 2020-09-08

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

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

	МассивНаблюдателей = ПолучитьМассивНаблюдателей();
	Если МассивНаблюдателей.Количество() = 0 Тогда
		Возврат;
	Конецесли;

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

	Если НЕ РезультатФункции.НеобходимоОтправитьУведомление Тогда
		Возврат;
	КонецЕсли;

	//+ГЕНА
	ДопПараметры = Новый Структура();
	ДопПараметры.Вставить("ВажностьЗадачи",Важность);
	ДопПараметры.Вставить("Статус",Статус);
	ДопПараметры.Вставить("МассивПользователейКому",МассивНаблюдателей);
	ПолучитьПараметрыПисьма(РезультатФункции, ДопПараметры);
	//-ГЕНА

	узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры);

	//+ #240 Пиганов Г.В. 2020-09-08
	//Павлюков
	//узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
	узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, МассивНаблюдателей);
	//- #240 Пиганов Г.В. 2020-09-08

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

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

	Если Контрагент.узНеОтправлятьУведомленияНаПочту Тогда
		Возврат;
	Конецесли;

	ЭтоОтправкаКонтрагентам = Истина;

	ТЗСобытияВИсторииДляУведомлений = СобытияВИстории.ТЗСобытияВИсторииДляУведомлений;
	ВсегоСобытий = ТЗСобытияВИсторииДляУведомлений.Количество();
	Если ВсегоСобытий = 0 Тогда
		Возврат;
	Конецесли;

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

	Если НЕ РезультатФункции.НеобходимоОтправитьУведомление Тогда
		Возврат;
	КонецЕсли;
	РезультатФункции.Вставить("ЭтоОтправкаКонтрагентам",ЭтоОтправкаКонтрагентам);

	//+ГЕНА
	// Получение индивидуального шаблона
	ШаблонСообщения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "узШаблонСообщения");
	Если ЗначениеЗаполнено(ШаблонСообщения) Тогда
		РезультатФункции.Вставить("ШаблонСообщения", ШаблонСообщения);
	КонецЕсли;
	//-ГЕНА

	МассивКонтрагентов = Новый Массив();
	МассивКонтрагентов.Добавить(Контрагент);

	ТЗАдресаЭлектроннойПочты = узОбщийМодульСервер.ПолучитьТЗАдресаЭлектроннойПочтыПоМассивуКонтрагентов(
		МассивКонтрагентов);

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

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

	узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры);

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

Функция ПолучитьУчетнуюЗаписьДляОтправкиУведомленийДляКонтрагентов()
	Возврат узОбщийМодульСервер.ПолучитьУчетнуюЗаписьДляОтправкиУведомленийДляКонтрагентов();
КонецФункции

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


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

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

Процедура ИмяФункции(ДопПараметры, РезультатФункции)
	//МассивКодовСообщений = Новый Массив();
	//МассивКодовСообщений.Добавить(22); //Добрый день
	//МассивКодовСообщений.Добавить(23); //Номер задачи
	//МассивКодовСообщений.Добавить(24); //Описание задачи
	//МассивКодовСообщений.Добавить(25); //Комментарии
	//МассивКодовСообщений.Добавить(26); //Реквизиты задачи
	//МассивКодовСообщений.Добавить(27); //Исполнитель
	//МассивКодовСообщений.Добавить(28); //Статус
	//МассивКодовСообщений.Добавить(29); //Важность
	//МассивКодовСообщений.Добавить(30); //ОсновнаяЗадача
	//
	//СтруктураСообщений = узОбщийМодульСервер.ПолучитьСтруктуруСообщений(МассивКодовСообщений);
	//
	//ТекстВПисьмеДобрыйДень = СтруктураСообщений.Текст22;
	//ТекстВПисьмеНомерЗадачи = СтруктураСообщений.Текст23;
	//ТекстВПисьмеОписаниеЗадачи = СтруктураСообщений.Текст24;
	//ТекстВПисьмеКомментарий = СтруктураСообщений.Текст25;
	//ТекстВПисьмеРеквизитыЗадачи = СтруктураСообщений.Текст26;
	//ТекстВПисьмеИсполнитель = СтруктураСообщений.Текст27;
	//ТекстВПисьмеСтатус = СтруктураСообщений.Текст28;
	//ТекстВПисьмеВажность = СтруктураСообщений.Текст29;
	//ТекстВПисьмеОсновнаяЗадача = СтруктураСообщений.Текст30;
	//
	//
	//ЭтоОтправкаКонтрагентам = Ложь;
	//Если ДопПараметры.Свойство("ЭтоОтправкаКонтрагентам")
	//	И ДопПараметры.ЭтоОтправкаКонтрагентам Тогда
	//	ЭтоОтправкаКонтрагентам = Истина;
	//Конецесли;
	//
	//ТемаПисьмаСобытие = ДопПараметры.ТемаПисьмаСобытие;
	//МассивИзмененнийПоКомментариям = ДопПараметры.МассивИзмененнийПоКомментариям;
	//
	//РезультатФункции = Новый Структура();
	//
	//НаименованиеЗадачи = СокрЛП(Наименование);
	//НомерЗадачи = ""+Формат(Код,"ЧГ=0");
	//ТемаПисьма = "[#"+НомерЗадачи+"] "+ТемаПисьмаСобытие + НаименованиеЗадачи;
	//ТекстПисьма = "
	//|"+ТекстВПисьмеДобрыйДень+".
	//|
	//|"+ТемаПисьмаСобытие+" "+НаименованиеЗадачи+"
	//|"+ТекстВПисьмеНомерЗадачи+": #"+НомерЗадачи+"
	//|";
	//
	//Если МассивИзмененнийПоКомментариям.Количество() = 0 Тогда
	//	Если ЗначениеЗаполнено(ТекстСодержания) Тогда
	//		ТекстПисьма = ТекстПисьма + "
	//		|
	//		|"+ТекстВПисьмеОписаниеЗадачи+":
	//		|"+ТекстСодержания+"
	//		|";
	//	Конецесли;
	//Иначе
	//	ТекстПисьма = ТекстПисьма + "
	//	|
	//	|"+ТекстВПисьмеКомментарий+":";
	//	Для каждого ЭлМассивИзмененнийПоКомментариям из МассивИзмененнийПоКомментариям цикл
	//		ТекстПисьма = ТекстПисьма + Символы.ПС
	//			+ " - "+ЭлМассивИзмененнийПоКомментариям;
	//	Конеццикла;
	//Конецесли;
	//
	//Если НЕ ЭтоОтправкаКонтрагентам Тогда
	//	ТекстПисьма = ТекстПисьма + "
	//	|
	//	|"+ТекстВПисьмеРеквизитыЗадачи+":
	//	|- "+ТекстВПисьмеИсполнитель+" ["+Исполнитель+"]
	//	|- "+ТекстВПисьмеСтатус+" ["+Статус+"]
	//	|- "+ТекстВПисьмеВажность+" ["+Важность+"]
	//	|- "+ТекстВПисьмеОсновнаяЗадача+" ["+ОсновнаяЗадача+"]
	//	|";
	//Конецесли;

	НаименованиеЗадачи = СокрЛП(Наименование);
	ТемаПисьмаСобытие = ДопПараметры.ТемаПисьмаСобытие;

	НомерЗадачи = ""+Формат(Код,"ЧГ=0");
	ТемаПисьма = "[#"+НомерЗадачи+"] "+ТемаПисьмаСобытие + НаименованиеЗадачи;
	ДопПараметры.Вставить("ТемаПисьма",ТемаПисьма);
	ДопПараметры.Вставить("НомерЗадачи",НомерЗадачи);

	//ГЕНА
	РезультатФункции.Вставить("ТемаПисьма",ТемаПисьма);
	РезультатФункции.Вставить("ТипТекста", ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.ПростойТекст"));
	ПолучитьТекстПисьма(ДопПараметры, РезультатФункции);
	//-ГЕНА

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

Процедура ПолучитьТекстПисьма(ДопПараметры, РезультатФункции) // ГЕНА

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

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

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

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

Функция ПолучитьТекстПисьма_Контрагентам(ДопПараметры)
	Перем ТекстПисьма;

	ТемаПисьмаСобытие = ДопПараметры.ТемаПисьмаСобытие;

	ТекстПисьма = "
	|	Добрый день.
	|
	|	"+ТемаПисьмаСобытие+"
	|	Номер заявки: " + ДопПараметры.НомерЗадачи + "
	|	Тема заявки: "+ ДопПараметры.ТемаПисьма + "
	|
	|	Описание задачи:
	|	"+ТекстСодержания+"
	|";

	Возврат ТекстПисьма;
КонецФункции

Функция ПолучитьТекстПисьма_Общее(ДопПараметры)

	МассивКодовСообщений = Новый Массив();
	МассивКодовСообщений.Добавить(22); //Добрый день
	МассивКодовСообщений.Добавить(23); //Номер задачи
	МассивКодовСообщений.Добавить(24); //Описание задачи
	МассивКодовСообщений.Добавить(25); //Комментарии
	МассивКодовСообщений.Добавить(26); //Реквизиты задачи
	МассивКодовСообщений.Добавить(27); //Исполнитель
	МассивКодовСообщений.Добавить(28); //Статус
	МассивКодовСообщений.Добавить(29); //Важность
	МассивКодовСообщений.Добавить(30); //ОсновнаяЗадача

	СтруктураСообщений = узОбщийМодульСервер.ПолучитьСтруктуруСообщений(МассивКодовСообщений);

	ТекстВПисьмеДобрыйДень = СтруктураСообщений.Текст22;
	ТекстВПисьмеНомерЗадачи = СтруктураСообщений.Текст23;
	ТекстВПисьмеОписаниеЗадачи = СтруктураСообщений.Текст24;
	ТекстВПисьмеКомментарий = СтруктураСообщений.Текст25;
	ТекстВПисьмеРеквизитыЗадачи = СтруктураСообщений.Текст26;
	ТекстВПисьмеИсполнитель = СтруктураСообщений.Текст27;
	ТекстВПисьмеСтатус = СтруктураСообщений.Текст28;
	ТекстВПисьмеВажность = СтруктураСообщений.Текст29;
	ТекстВПисьмеОсновнаяЗадача = СтруктураСообщений.Текст30;

	ТемаПисьмаСобытие = ДопПараметры.ТемаПисьмаСобытие;
	МассивИзмененнийПоКомментариям = ДопПараметры.МассивИзмененнийПоКомментариям;

	РезультатФункции = Новый Структура();

	НаименованиеЗадачи = СокрЛП(Наименование);
	НомерЗадачи = ""+Формат(Код,"ЧГ=0");
	//ТемаПисьма = "[#"+НомерЗадачи+"] "+ТемаПисьмаСобытие + НаименованиеЗадачи;
	ТекстПисьма = "
	|"+ТекстВПисьмеДобрыйДень+".
	|
	|"+ТемаПисьмаСобытие+" "+НаименованиеЗадачи+"
	|"+ТекстВПисьмеНомерЗадачи+": #"+НомерЗадачи+"
	|";

	Если МассивИзмененнийПоКомментариям.Количество() = 0 Тогда
		//Если ЗначениеЗаполнено(ТекстСодержания) Тогда
		//	ТекстПисьма = ТекстПисьма + "
		//	|
		//	|"+ТекстВПисьмеОписаниеЗадачи+":
		//	|"+ТекстСодержания+"
		//	|";
		//Конецесли;
	Иначе
		ТекстПисьма = ТекстПисьма + "
		|
		|"+ТекстВПисьмеКомментарий+":";
		Для каждого ЭлМассивИзмененнийПоКомментариям из МассивИзмененнийПоКомментариям цикл
			ТекстПисьма = ТекстПисьма + Символы.ПС
				+ " - "+ЭлМассивИзмененнийПоКомментариям;
		Конеццикла;
	Конецесли;

	ТекстПисьма = ТекстПисьма + "
	|
	|"+ТекстВПисьмеРеквизитыЗадачи+":
	|- "+ТекстВПисьмеИсполнитель+" ["+Исполнитель+"]
	|- "+ТекстВПисьмеСтатус+" ["+Статус+"]
	|- "+ТекстВПисьмеВажность+" ["+Важность+"]
	|- "+ТекстВПисьмеОсновнаяЗадача+" ["+ОсновнаяЗадача+"]
	|";

	Возврат ТекстПисьма;
КонецФункции

[Assistant] Процедура ПолучитьПараметрыПисьма(ДопПараметры, РезультатФункции)


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

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

Функция ПолучитьВсеМеткиЗадач()
Экспорт

	ВсеМеткиЗадач = Новый Массив();

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	узМеткиЗадач.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.узМеткиЗадач КАК узМеткиЗадач
	|ГДЕ
	|	НЕ узМеткиЗадач.ПометкаУдаления
	|	И НЕ узМеткиЗадач.ЭтоГруппа
	|
	|УПОРЯДОЧИТЬ ПО
	|	узМеткиЗадач.РеквизитДопУпорядочивания";
    // TODO: допиши оставшуюся часть

[Assistant]
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

&НаСервере
Функция ПолучитьВсеМеткиЗадач() Экспорт

	ВсеМеткиЗадач = Новый Массив();

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	узМеткиЗадач.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.узМеткиЗадач КАК узМеткиЗадач
	|ГДЕ
	|	НЕ узМеткиЗадач.ПометкаУдаления
	|	И НЕ узМеткиЗадач.ЭтоГруппа
	|
	|УПОРЯДОЧИТЬ ПО
	|	узМеткиЗадач.РеквизитДопУпорядочивания";

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

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

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

		ВсеМеткиЗадач.Добавить(Выборка.Ссылка);

	КонецЦикла;

	Возврат ВсеМеткиЗадач;

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

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

#КонецЕсли


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

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

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

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

&НаКлиенте
Процедура ИмяФункции(ПараметрКоманды, ПараметрыВыполненияКоманды)

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

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

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

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

[Assistant] Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)


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

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

Процедура ИмяФункции(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();

	Взаимодействия.ОбработатьНеобходимостьОтображенияГруппПользователей(ЭтотОбъект);

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

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

	// Заполним контакты по предмету.
	Предмет = Параметры.Предмет;
	Взаимодействия.ЗаполнитьКонтактыПоПредмету(Элементы, Предмет, КонтактыПоПредмету, Истина);

	ВариантыПоиска = "Везде";

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

	ОбновитьМенюВариантовПоиска();
	УправлениеСтраницами();

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

&НаКлиенте

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

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

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

&НаСервере

Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

	ПриИзмененииТолькоКонтактыСАдресами(ЭтотОбъект);

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

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

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

&НаКлиенте

Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)

	УправлениеСтраницами();

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

&НаКлиенте

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

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

	ТекущиеДанные = Элементы.ПолучателиПисьма.ТекущиеДанные;
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ТолькоEmail",                       Истина);
	ПараметрыОткрытия.Вставить("ТолькоТелефон",                     Ложь);
	ПараметрыОткрытия.Вставить("ЗаменятьПустыеАдресИПредставление", Истина);
	ПараметрыОткрытия.Вставить("ДляФормыУточненияКонтактов",        Ложь);
	ПараметрыОткрытия.Вставить("ИдентификаторФормы",                УникальныйИдентификатор);

	ВзаимодействияКлиент.ВыбратьКонтакт(Предмет, ТекущиеДанные.Адрес, ТекущиеДанные.Представление,
	                                    ТекущиеДанные.Контакт,ПараметрыОткрытия)

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура ПолучателиПисьмаПриАктивизацииЯчейки(Элемент)

	Если Элемент.ТекущийЭлемент.Имя = "Адрес" Тогда
		Элементы.Адрес.СписокВыбора.Очистить();

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

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

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

&НаКлиенте

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

	ДобавитьПолучателяИзСпискаПоПредмету();

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

&НаКлиенте

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

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

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

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

	Адрес = Результат.Адреса[0];
	СписокАдресов = СтрСоединить(Результат.Адреса.ВыгрузитьЗначения(), ";");

	ДобавитьПолучателя(Адрес, Результат.Наименование, ВыбраннаяСтрока, СписокАдресов);

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

// Универсальный обработчик активизации строки динамического списка, у которого есть подчиненные списки.
&НаКлиенте

Процедура Подключаемый_СписокВладелецПриАктивизацииСтроки(Элемент)

	ВзаимодействияКлиент.КонтактВладелецПриАктивизацииСтроки(Элемент, ЭтотОбъект);

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

&НаКлиенте

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

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

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

	ДобавитьПолучателя(ТекущиеДанные.Представление, ТекущиеДанные.НаименованиеКонтакта, ТекущиеДанные.Ссылка, СписокАдресов);

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

&НаКлиенте

Процедура ГруппыПользователейПриАктивизацииСтроки(Элемент)

	СписокПользователей.Параметры.УстановитьЗначениеПараметра("ГруппаПользователей", Элементы.ГруппыПользователей.ТекущаяСтрока);

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

&НаКлиенте

Процедура ПоказыватьТолькоКонтактыСАдресамиПриИзменении(Элемент)

	ПриИзмененииТолькоКонтактыСАдресами(ЭтотОбъект);

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

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

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

// Передает владельцу в качестве результата работы формы массив структур содержащих
// адреса выбранных получателей и закрывает форму.
//
&НаКлиенте

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

	Результат = Новый Массив;

	Для Каждого СтрокаТаблицы Из ПолучателиПисьма Цикл

		Если ПустаяСтрока(СтрокаТаблицы.Адрес) Тогда
			Продолжить;
		КонецЕсли;
		Группа = ?(ПустаяСтрока(СтрокаТаблицы.Группа), "Кому", СтрокаТаблицы.Группа);

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

	КонецЦикла;

	ОповеститьОВыборе(Результат);

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

// Переносит текущий контакт из списка "Контакты по предмету" в список "Получатели письма".
//
&НаКлиенте

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

	ДобавитьПолучателяИзСпискаПоПредмету();

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

// Изменяет текущую группу получателей письма на группу "Кому".
//
&НаКлиенте

Процедура ИзменитьГруппуКомуВыполнить()

	ИзменитьГруппу("Кому");

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

// Изменяет текущую группу получателей письма на группу "Копии".
//
&НаКлиенте

Процедура ИзменитьГруппуКопииВыполнить()

	ИзменитьГруппу("Копии");

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

// Изменяет текущую группу получателей письма на группу "Скрытые".
//
&НаКлиенте

Процедура ИзменитьГруппуСкрытыеВыполнить()

	ИзменитьГруппу("Скрытые");

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

// Инициирует процесс поиска контактов.
//
&НаКлиенте

Процедура НайтиКонтактыВыполнить()

	Если ПустаяСтрока(СтрокаПоиска) Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Не задано, что нужно найти.'"),, "СтрокаПоиска");
		Возврат;
	КонецЕсли;

	Результат = "";
	НайденныеКонтакты.Очистить();

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

	Если Не ПустаяСтрока(Результат) Тогда
		ПоказатьПредупреждение(, Результат);
	КонецЕсли;

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

// Выполняет позиционирование в соответствующем динамическом списке на текущем контакте из
// списка "Найденные контакты".
//
&НаКлиенте

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


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

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

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

	Родитель = ВладелецКоманд.ПолучитьРодителя();
	Если Родитель <> Неопределено Тогда
		ВладелецКоманд = Родитель;
	КонецЕсли;

	НавигационнаяСсылка = ВладелецКоманд.НавигационнаяСсылка;

	Для Каждого ОкноКлиентскогоПриложения Из ПолучитьОкна() Цикл
		Если ОкноКлиентскогоПриложения.ПолучитьНавигационнуюСсылку() = НавигационнаяСсылка Тогда
			Форма = ОкноКлиентскогоПриложения.Содержимое[0];
			ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКСпискуЗавершение", ЭтотОбъект,
				Новый Структура("Форма, НавигационнаяСсылка", Форма, НавигационнаяСсылка));
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПерейтиКСписку()

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

	Родитель = ВладелецКоманд.ПолучитьРодителя();
	Если Родитель <> Неопределено Тогда
		ВладелецКоманд = Родитель;
	КонецЕсли;

	НавигационнаяСсылка = ВладелецКоманд.НавигационнаяСсылка;

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

	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка);
КонецПроцедуры

&НаКлиенте

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

	ДополнительныеПараметры.Форма.Закрыть();
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ДополнительныеПараметры.НавигационнаяСсылка);
КонецПроцедуры

&НаКлиенте

Процедура ПередЗакрытиемПодтверждениеПолучено(РезультатВопроса, ДополнительныеПараметры) Экспорт
	ЗаписатьИЗакрыть();
КонецПроцедуры

&НаСервере

Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КомандыПечати.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);

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

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


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

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

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

[Assistant]
Процедура Перечитать(Команда)

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

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

&НаКлиенте

Процедура СнятьУстановкуПрава(Команда)

	УстановитьЗначениеТекущегоПрава(Неопределено);

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

&НаКлиенте

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

	УстановитьЗначениеТекущегоПрава(Ложь);

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

&НаКлиенте

Процедура УстановитьРазрешениеПрава(Команда)

	УстановитьЗначениеТекущегоПрава(Истина);

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

&НаКлиенте

Процедура УстановитьЗначениеТекущегоПрава(НовоеЗначение)

	Отказ = Ложь;
	ПроверкаВозможностиИзмененияПрав(Отказ);

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

		Если ВозможныеПрава.Свойство(ТекущееПраво)
		   И ТекущиеДанные <> Неопределено Тогда

			СтароеЗначение = ТекущиеДанные[ТекущееПраво];
			ТекущиеДанные[ТекущееПраво] = НовоеЗначение;

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

			ОбновитьЗависимыеПрава(ТекущиеДанные, ТекущееПраво, СтароеЗначение);
		КонецЕсли;
	КонецЕсли;

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

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

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

&НаСервере

Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Серый);

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

	ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Элементы.ГруппыПрав.Имя);

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

&НаКлиенте

Процедура ЗаписатьИЗакрытьОповещение(Результат, Контекст) Экспорт

	ЗаписатьНачало(Истина);

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

&НаКлиенте

Процедура ЗаписатьНачало(Закрыть = Ложь)

	Отказ = Ложь;
	ОбработкаПроверкиЗаполнения(Отказ);

	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	ПодтвердитьОтказОтУправленияПравами = Неопределено;
	Попытка
		ЗаписатьПрава();
	Исключение
		Если ПодтвердитьОтказОтУправленияПравами <> Истина Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;

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

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

&НаКлиенте

Процедура ЗаписатьПослеПодтверждения(Ответ, Контекст) Экспорт

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

	ЗаписатьЗавершение();

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

&НаКлиенте

Процедура ЗаписатьЗавершение()

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

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

&НаКлиенте

Процедура ПеречитатьЗавершение(Ответ, Контекст) Экспорт

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

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

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

&НаКлиенте

Процедура ОбновитьЗависимыеПрава(Знач Данные, Знач Право, Знач СтароеЗначение, Знач ГлубинаРекурсии = 0)

	Если Данные[Право] = СтароеЗначение Тогда
		Возврат;
	КонецЕсли;

	Если ГлубинаРекурсии > 100 Тогда
		Возврат;
	Иначе
		ГлубинаРекурсии = ГлубинаРекурсии + 1;
	КонецЕсли;

	ЗависимыеПрава = Неопределено;

	Если Данные[Право] = Истина Тогда

		// Увеличены разрешения (с Неопределено или Ложь на Истина).
		// Требуется повысить разрешения на ведущие права.
		ПрямыеЗависимостиПрав.Свойство(Право, ЗависимыеПрава);
		ЗначениеЗависимогоПрава = Истина;

	ИначеЕсли Данные[Право] = Ложь Тогда

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

	Если ЗависимыеПрава <> Неопределено Тогда
		Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл
			Если ТипЗнч(ЗависимоеПраво) = Тип("Массив") Тогда
				УстановитьЗависимоеПраво = Истина;
				Для каждого ОдноИзЗависимыхПрав Из ЗависимоеПраво Цикл
					Если Данные[ОдноИзЗависимыхПрав] = ЗначениеЗависимогоПрава Тогда
						УстановитьЗависимоеПраво = Ложь;
						Прервать;
					КонецЕсли;
				КонецЦикла;
				Если УстановитьЗависимоеПраво Тогда
					Если НЕ (ЗначениеЗависимогоПрава = Неопределено И Данные[ЗависимоеПраво[0]] <> СтароеЗначение) Тогда
						ТекущееСтароеЗначение = Данные[ЗависимоеПраво[0]];
						Данные[ЗависимоеПраво[0]] = ЗначениеЗависимогоПрава;
						ОбновитьЗависимыеПрава(Данные, ЗависимоеПраво[0], ТекущееСтароеЗначение);
					КонецЕсли;
				КонецЕсли;
			Иначе
				Если НЕ (ЗначениеЗависимогоПрава = Неопределено И Данные[ЗависимоеПраво] <> СтароеЗначение) Тогда
					ТекущееСтароеЗначение = Данные[ЗависимоеПраво];
					Данные[ЗависимоеПраво] = ЗначениеЗависимогоПрава;
					ОбновитьЗависимыеПрава(Данные, ЗависимоеПраво, ТекущееСтароеЗначение);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

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

&НаСервере

Процедура ДобавитьРеквизит(НовыеРеквизиты, Реквизит, НачальноеЗначение)

	НовыеРеквизиты.Добавить(Реквизит);
	ДобавленныеРеквизиты.Вставить(Реквизит.Имя, НачальноеЗначение);

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

&НаСервере

Функция ДобавитьЭлемент(Имя, Тип, Родитель)

	Элемент = Элементы.Добавить(Имя, Тип, Родитель);
	Элемент.ФиксацияВТаблице = ФиксацияВТаблице.Нет;

	Возврат Элемент;

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

&НаСервере


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

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

Процедура ИмяФункции(Отказ, СтандартнаяОбработка)

	ПредставлениеИстина = НСтр("ru='Все варианты отчетов'");
	ПредставлениеЛожь = НСтр("ru='Для компьютеров и планшетов'");
	Элементы.ОтображатьВсеВариантыОтчетов.ФорматРедактирования = "БЛ='" + ПредставлениеЛожь + "'; БИ='"
		+ ПредставлениеИстина + "'";
	ОпределитьПоведениеВМобильномКлиенте();

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

	ПараметрыКлиента = ВариантыОтчетов.ПараметрыКлиента();
	ПараметрыКлиента.Вставить("ПутьКПодсистеме", Параметры.ПутьКПодсистеме);

	КартинкаБыстрыйДоступ = БиблиотекаКартинок.БыстрыйДоступ;

	ЭлементыСтиля = Метаданные.ЭлементыСтиля;

	ЦветСкрытыхВариантов = ЭлементыСтиля.СкрытыйВариантОтчетаЦвет.Значение;
	ЦветСкрытыхПоНазначениюВариантов = ЭлементыСтиля.ЗаблокированныйРеквизитЦвет.Значение;
	ЦветВидимыхВариантов = ЭлементыСтиля.ГиперссылкаЦвет.Значение;
	ЦветПодсветкиНайденныхСлов = ЭлементыСтиля.ФонРезультатовПоиска.Значение;
	ЦветПодсказки = ЭлементыСтиля.ПоясняющийТекст.Значение;
	ЦветГруппыВариантовОтчетов = ЭлементыСтиля.ГруппаВариантовОтчетовЦвет.Значение;

	ШрифтВажнойГруппы = ЭлементыСтиля.ГруппаВариантовОтчетовВажнаяШрифт.Значение;
	ШрифтОбычнойГруппы = ЭлементыСтиля.ГруппаВариантовОтчетовОбычнаяШрифт.Значение;
	ШрифтРаздела = ЭлементыСтиля.РазделВариантовОтчетовШрифт.Значение;
	ШрифтВажнойНадписи = ЭлементыСтиля.ВажнаяНадписьШрифт.Значение;

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

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

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

	ЦветРаздела = ЦветГруппыВариантовОтчетов;

	Элементы.БыстрыйДоступШапкаНадпись.Шрифт = ШрифтВажнойГруппы;
	Элементы.БыстрыйДоступШапкаНадпись.ЦветТекста = ЦветГруппыВариантовОтчетов;

	НаборРеквизитов = ПолучитьРеквизиты();
	Для Каждого Реквизит Из НаборРеквизитов Цикл
		ПостоянныеРеквизиты.Добавить(Реквизит.Имя);
	КонецЦикла;

	Для Каждого Команда Из Команды Цикл
		ПостоянныеКоманды.Добавить(Команда.Имя);
	КонецЦикла;

	// Чтение пользовательской настройки, общей для всех панелей отчетов.
	ЗагрузитьВсеНастройки();

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

	ОпределитьПодсистемыИЗаголовок(Параметры);
	ДлительнаяОперация = ОбновитьПанельОтчетовНаСервере();

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

&НаКлиенте

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

&НаКлиенте

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

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

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

&НаКлиенте

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

&НаКлиенте

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

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

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

// Параметры:
//  Элемент - ДекорацияФормы
//
&НаКлиенте

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

// Параметры:
//  Элемент - ПолеФормы
//
&НаКлиенте

Процедура Подключаемый_ВидимостьВариантаПриИзменении(Элемент)
	Флажок = Элемент;
	Показать = ЭтотОбъект[Флажок.Имя];

	НадписьИмя = Сред(Флажок.Имя, СтрДлина("Флажок_")+1);
	Вариант = НайтиВариантПоИмениЭлемента(НадписьИмя);
	Элемент = Элементы.Найти(НадписьИмя);
	Если Вариант = Неопределено Или Элемент = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

&НаКлиенте

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

&НаКлиенте

Функция ВведенаСлишкомКороткаяСтрокаПоиска(Текст)
	Текст = СокрЛП(Текст);
	Если СтрДлина(Текст) < 2 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Введена слишком короткая строка поиска.'"));
		Возврат Истина;
	КонецЕсли;

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

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

&НаКлиенте

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

	ОбновитьПанельОтчетовНаКлиенте("СтрокаПоискаПриИзменении");

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

// Параметры:
//  Элемент - ДекорацияФормы
//
&НаКлиенте

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


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

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

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

	ПутьКПодсистеме = СтрЗаменить(Раздел.ПолноеИмя, "Подсистема.", "");

	ПутьКПодсистеме = ?(ПустаяСтрока(ПутьКПодсистеме), "НеВключенныеВРазделы", ПутьКПодсистеме);

	ФормаПараметры = Новый Структура;
	ФормаПараметры.Вставить("ПутьКПодсистеме",      ПутьКПодсистеме);
	ФормаПараметры.Вставить("СтрокаПоиска",         СтрокаПоиска);

	ФормаВладелец     = ЭтотОбъект;
	ФормаУникальность = Истина;

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

	ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, ФормаВладелец, ФормаУникальность);

	Если ПараметрыКлиента.ВыполнятьЗамеры Тогда
		ЗакончитьЗамер(Замер);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

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

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

&НаКлиенте

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

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

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

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

&НаКлиенте

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

&НаКлиенте

Процедура ПереместитьВБыстрыйДоступ(Команда)

#Если ВебКлиент Тогда
	Элемент = Элементы.Найти(Сред(Команда.Имя, СтрНайти(Команда.Имя, "_")+1));
#Иначе
	Элемент = ТекущийЭлемент;
#КонецЕсли

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

	Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя);
	Если Вариант = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДобавитьУбратьВариантИзБыстрогоДоступа(Вариант, Элемент, Истина);
КонецПроцедуры

&НаКлиенте

Процедура УбратьИзБыстрогоДоступа(Команда)

#Если ВебКлиент Тогда
	Элемент = Элементы.Найти(Сред(Команда.Имя, СтрНайти(Команда.Имя, "_")+1));
#Иначе
	Элемент = ТекущийЭлемент;
#КонецЕсли

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

	Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя);
	Если Вариант = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДобавитьУбратьВариантИзБыстрогоДоступа(Вариант, Элемент, Ложь);
КонецПроцедуры

&НаКлиенте

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

#Если ВебКлиент Тогда
	Элемент = Элементы.Найти(Сред(Команда.Имя, СтрНайти(Команда.Имя, "_")+1));
#Иначе
	Элемент = ТекущийЭлемент;
#КонецЕсли

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

	Вариант = НайтиВариантПоИмениЭлемента(Элемент.Имя);
	Если Вариант = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

&НаКлиенте

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

&НаКлиенте

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

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

	ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаСписка", ФормаПараметры, , "ВариантыОтчетов.ВсеОтчеты");

	Если ПараметрыКлиента.ВыполнятьЗамеры Тогда
		ЗакончитьЗамер(Замер);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура Обновить(Команда)
	ОбновитьПанельОтчетовНаКлиенте("Обновить");
КонецПроцедуры

&НаКлиенте

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

&НаКлиенте

Процедура СнимкиОтчетов(Команда)

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Клиент

&НаКлиенте

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

&НаКлиенте

Процедура ДобавитьУбратьВариантИзБыстрогоДоступа(Вариант, Элемент, БыстрыйДоступ)
	Если Вариант.БыстрыйДоступ = БыстрыйДоступ Тогда
		Возврат;
	КонецЕсли;

	// Регистрация результата для записи.
	Вариант.БыстрыйДоступ = БыстрыйДоступ;

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

	// Визуальный результат
	ПереместитьВариантБыстрогоДоступа(Вариант.ПолучитьИдентификатор(), БыстрыйДоступ);
КонецПроцедуры

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

[Assistant] Процедура Подключаемый_ЗаголовокРазделаНажатие(Элемент)


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

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

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

	ЗаданЗаголовок = Не ПустаяСтрока(Параметры.Заголовок);
	ЗаголовокПанели = ?(ЗаданЗаголовок, Параметры.Заголовок, НСтр("ru = 'Отчеты'"));

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

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

		ПодсистемыПоСсылке[СтрокаТаблицы.Ссылка] = СтрокаТаблицы.ПолучитьИдентификатор();

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

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

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

	СтрокаТаблицы = ПодсистемыПрограммы.Добавить();
	СтрокаТаблицы.ИмяЭлемента    = "НеВключенныеВРазделы";
	СтрокаТаблицы.Имя            = "НеВключенныеВРазделы";
	СтрокаТаблицы.Представление  = НСтр("ru = 'Не включенные в разделы'");
	СтрокаТаблицы.НомерЭлемента  = 0;
	СтрокаТаблицы.РазделСсылка   = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	СтрокаТаблицы.РодительСсылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	СтрокаТаблицы.Ссылка   = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	СтрокаТаблицы.Приоритет = "999";
	ПодсистемыПоСсылке.Вставить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(), СтрокаТаблицы.ПолучитьИдентификатор());

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

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

	КлючНазначенияИспользования = "Раздел_" + Строка(ТекущийРазделСсылка.УникальныйИдентификатор());
	Заголовок = ЗаголовокПанели;
	ПодсистемаПоСсылке = Новый ФиксированноеСоответствие(ПодсистемыПоСсылке);

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

&НаСервере

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

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

&НаСервере

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

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

////////////////////////////////////////////////////////////////////////////////
// Сервер / Заполнение панели отчетов.

&НаСервере

Функция ЗаполнитьПанельОтчетовВФоне()
	// Очистка сведений об изменениях в пользовательских настройках.
	ДобавленныеВарианты.Очистить();

	ПараметрыПоиска = Новый Структура;
	ПараметрыПоиска.Вставить("РежимНастройки", РежимНастройки);
	ПараметрыПоиска.Вставить("СтрокаПоиска", СтрокаПоиска);
	ПараметрыПоиска.Вставить("ИскатьВоВсехРазделах", ИскатьВоВсехРазделах);
	ПараметрыПоиска.Вставить("ТекущийРазделСсылка", ТекущийРазделСсылка);

	НазначенияВариантовОтчетов = Новый Массив;
	НазначенияВариантовОтчетов.Добавить(Перечисления.НазначенияВариантовОтчетов.ДляЛюбыхУстройств);
	НазначенияВариантовОтчетов.Добавить(?(ОбщегоНазначения.ЭтоМобильныйКлиент(),
									Перечисления.НазначенияВариантовОтчетов.ДляСмартфонов,
									Перечисления.НазначенияВариантовОтчетов.ДляКомпьютеровИПланшетов));
	ПараметрыПоиска.Вставить("НазначенияВариантовОтчетов", НазначенияВариантовОтчетов);
	ПараметрыПоиска.Вставить("ОтображатьВсеВариантыОтчетов", ОтображатьВсеВариантыОтчетов);

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

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

	ЗаполнитьПанельОтчетов(Результат.АдресРезультата);
	Возврат Результат;

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

&НаСервере

[Assistant] Процедура ОпределитьПодсистемыИЗаголовок(Параметры)


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

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

Процедура ИмяФункции(ПараметрыЗаполненияВременноеХранилище)

	ПараметрыЗаполнения = ПолучитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище); // см. ВариантыОтчетов.ВариантыОтчетовДляВывода
	УдалитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище);

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

	ВывестиВариантыРаздела(ПараметрыЗаполнения, ТекущийРазделСсылка);

	Если ПараметрыЗаполнения.ТолькоТекущийРаздел Тогда
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Ложь;
	Иначе
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Истина;
		Если ПараметрыЗаполнения.ДругиеРазделы.Количество() = 0 Тогда
			Надпись = Элементы.Вставить("ВДругихРазделах", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = НСтр("ru = 'Отчеты в других разделах не найдены.'") + Символы.ПС;
			Надпись.Высота = 2;
		КонецЕсли;
		Для Каждого РазделСсылка Из ПараметрыЗаполнения.ДругиеРазделы Цикл
			ВывестиВариантыРаздела(ПараметрыЗаполнения, РазделСсылка);
		КонецЦикла;
		Если ПараметрыЗаполнения.НеВыведено > 0 Тогда // Вывод информационной надписи.
			ЗаголовокНадписи = НСтр("ru = 'Выведены первые %1 отчетов из других разделов, уточните поисковый запрос.'");
			ЗаголовокНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокНадписи, ПараметрыЗаполнения.ПределВывода);
			Надпись = Элементы.Вставить("ПределВыводаПревышен", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = ЗаголовокНадписи;
			Надпись.Шрифт = ШрифтВажнойНадписи;
			Надпись.Высота = 2;
		КонецЕсли;
	КонецЕсли;

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

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

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

&НаСервере

Процедура ИнициализироватьПараметрыЗаполнения(ПараметрыЗаполнения)
	ПараметрыЗаполнения.Вставить("ИмяГруппы", "");
	ПараметрыЗаполнения.Вставить("ДобавляемыеРеквизиты", Новый Массив);
	ПараметрыЗаполнения.Вставить("ДобавленоПустыхДекораций", 0);
	ПараметрыЗаполнения.Вставить("ПределВывода", 20);
	ПараметрыЗаполнения.Вставить("ОсталосьВывести", ПараметрыЗаполнения.ПределВывода);
	ПараметрыЗаполнения.Вставить("НеВыведено", 0);
	ПараметрыЗаполнения.Вставить("ВыведеноЭлементовВариантов", 0);
	ПараметрыЗаполнения.Вставить("ПоискВариантов", Новый Соответствие);

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

	ШаблонКартинкиБыстрогоДоступа = Новый Структура(
		"Вид, Ширина, Высота, Картинка,
		|РастягиватьПоГоризонтали, РастягиватьПоВертикали");
	ШаблонКартинкиБыстрогоДоступа.Вид = ВидДекорацииФормы.Картинка;
	ШаблонКартинкиБыстрогоДоступа.Ширина = 2;
	ШаблонКартинкиБыстрогоДоступа.Высота = 1;
	ШаблонКартинкиБыстрогоДоступа.Картинка = КартинкаБыстрыйДоступ;
	ШаблонКартинкиБыстрогоДоступа.РастягиватьПоГоризонтали = Ложь;
	ШаблонКартинкиБыстрогоДоступа.РастягиватьПоВертикали = Ложь;

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

	// Шаблоны заполнения создаваемых элементов управления.
	ШаблонНадписиВарианта = Новый Структура(
		"Вид, Гиперссылка, ЦветТекста,
		|РастягиватьПоВертикали, Высота,
		|РастягиватьПоГоризонтали, АвтоМаксимальнаяШирина, МаксимальнаяШирина");
	ШаблонНадписиВарианта.Вид = ВидДекорацииФормы.Надпись;
	ШаблонНадписиВарианта.Гиперссылка = Истина;
	ШаблонНадписиВарианта.ЦветТекста = ЦветВидимыхВариантов;
	ШаблонНадписиВарианта.РастягиватьПоВертикали = Ложь;
	ШаблонНадписиВарианта.Высота = 1;
	ШаблонНадписиВарианта.РастягиватьПоГоризонтали = Истина;
	ШаблонНадписиВарианта.АвтоМаксимальнаяШирина = Ложь;
	ШаблонНадписиВарианта.МаксимальнаяШирина = 0;

	ПараметрыЗаполнения.Вставить("Шаблоны", Новый Структура);
	ПараметрыЗаполнения.Шаблоны.Вставить("ГруппаВарианта", ШаблонГруппыВарианта);
	ПараметрыЗаполнения.Шаблоны.Вставить("КартинкаБыстрогоДоступа", ШаблонКартинкиБыстрогоДоступа);
	ПараметрыЗаполнения.Шаблоны.Вставить("КартинкаОтступа", ШаблонКартинкиОтступа);
	ПараметрыЗаполнения.Шаблоны.Вставить("НадписьВарианта", ШаблонНадписиВарианта);

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

	ПараметрыЗаполнения.Вставить("ГруппыВажности", Новый Массив);
	ПараметрыЗаполнения.ГруппыВажности.Добавить("БыстрыйДоступ");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("БезГруппы");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("СГруппой");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("СмТакже");

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

	ПараметрыЗаполнения.БыстрыйДоступ.Отбор = Новый Структура("БыстрыйДоступ", Истина);
	ПараметрыЗаполнения.БезГруппы.Отбор     = Новый Структура("БыстрыйДоступ, БезГруппы", Ложь, Истина);
	ПараметрыЗаполнения.СГруппой.Отбор      = Новый Структура("БыстрыйДоступ, БезГруппы, СмТакже", Ложь, Ложь, Ложь);
	ПараметрыЗаполнения.СмТакже.Отбор       = Новый Структура("БыстрыйДоступ, БезГруппы, СмТакже", Ложь, Ложь, Истина);

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

// Параметры:
//  ПараметрыЗаполнения -  см. ВариантыОтчетов.ВариантыОтчетовДляВывода
//  РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - СправочникСсылка.ИдентификаторыОбъектовРасширений
//
&НаСервере

[Assistant] Процедура ЗаполнитьПанельОтчетов(ПараметрыЗаполненияВременноеХранилище)


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

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

Процедура ЗаполнитьПанельОтчетов(ПараметрыЗаполненияВременноеХранилище)
ПараметрыЗаполнения = ПолучитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище); // см. ВариантыОтчетов.ВариантыОтчетовДляВывода
	УдалитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище);

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

	ВывестиВариантыРаздела(ПараметрыЗаполнения, ТекущийРазделСсылка);

	Если ПараметрыЗаполнения.ТолькоТекущийРаздел Тогда
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Ложь;
	Иначе
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Истина;
		Если ПараметрыЗаполнения.ДругиеРазделы.Количество() = 0 Тогда
			Надпись = Элементы.Вставить("ВДругихРазделах", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = НСтр("ru = 'Отчеты в других разделах не найдены.'") + Символы.ПС;
			Надпись.Высота = 2;
		КонецЕсли;
		Для Каждого РазделСсылка Из ПараметрыЗаполнения.ДругиеРазделы Цикл
			ВывестиВариантыРаздела(ПараметрыЗаполнения, РазделСсылка);
		КонецЦикла;
		Если ПараметрыЗаполнения.НеВыведено > 0 Тогда // Вывод информационной надписи.
			ЗаголовокНадписи = НСтр("ru = 'Выведены первые %1 отчетов из других разделов, уточните поисковый запрос.'");
			ЗаголовокНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокНадписи, ПараметрыЗаполнения.ПределВывода);
			Надпись = Элементы.Вставить("ПределВыводаПревышен", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = ЗаголовокНадписи;
			Надпись.Шрифт = ШрифтВажнойНадписи;
			Надпись.Высота = 2;
		КонецЕсли;
	КонецЕсли;

	Если ПараметрыЗаполнения.ДобавляемыеРеквизиты.Количество() > 0 Тогда
		// Регистрация старых реквизитов для удаления.
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗаполнитьПанельОтчетов(ПараметрыЗаполненияВременноеХранилище)

	ПараметрыЗаполнения = ПолучитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище); // см. ВариантыОтчетов.ВариантыОтчетовДляВывода
	УдалитьИзВременногоХранилища(ПараметрыЗаполненияВременноеХранилище);

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

	ВывестиВариантыРаздела(ПараметрыЗаполнения, ТекущийРазделСсылка);

	Если ПараметрыЗаполнения.ТолькоТекущийРаздел Тогда
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Ложь;
	Иначе
		Элементы.РезультатыПоискаИзДругихРазделовГруппа.Видимость = Истина;
		Если ПараметрыЗаполнения.ДругиеРазделы.Количество() = 0 Тогда
			Надпись = Элементы.Вставить("ВДругихРазделах", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = НСтр("ru = 'Отчеты в других разделах не найдены.'") + Символы.ПС;
			Надпись.Высота = 2;
		КонецЕсли;
		Для Каждого РазделСсылка Из ПараметрыЗаполнения.ДругиеРазделы Цикл
			ВывестиВариантыРаздела(ПараметрыЗаполнения, РазделСсылка);
		КонецЦикла;
		Если ПараметрыЗаполнения.НеВыведено > 0 Тогда // Вывод информационной надписи.
			ЗаголовокНадписи = НСтр("ru = 'Выведены первые %1 отчетов из других разделов, уточните поисковый запрос.'");
			ЗаголовокНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокНадписи, ПараметрыЗаполнения.ПределВывода);
			Надпись = Элементы.Вставить("ПределВыводаПревышен", Тип("ДекорацияФормы"), Элементы.РезультатыПоискаИзДругихРазделов);
			Надпись.Заголовок = ЗаголовокНадписи;
			Надпись.Шрифт = ШрифтВажнойНадписи;
			Надпись.Высота = 2;
		КонецЕсли;
	КонецЕсли;

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

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

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

&НаСервере

Процедура ИнициализироватьПараметрыЗаполнения(ПараметрыЗаполнения)
	ПараметрыЗаполнения.Вставить("ИмяГруппы", "");
	ПараметрыЗаполнения.Вставить("ДобавляемыеРеквизиты", Новый Массив);
	ПараметрыЗаполнения.Вставить("ДобавленоПустыхДекораций", 0);
	ПараметрыЗаполнения.Вставить("ПределВывода", 20);
	ПараметрыЗаполнения.Вставить("ОсталосьВывести", ПараметрыЗаполнения.ПределВывода);
	ПараметрыЗаполнения.Вставить("НеВыведено", 0);
	ПараметрыЗаполнения.Вставить("ВыведеноЭлементовВариантов", 0);
	ПараметрыЗаполнения.Вставить("ПоискВариантов", Новый Соответствие);

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

	ШаблонКартинкиБыстрогоДоступа = Новый Структура(
		"Вид, Ширина, Высота, Картинка,
		|РастягиватьПоГоризонтали, РастягиватьПоВертикали");
	ШаблонКартинкиБыстрогоДоступа.Вид = ВидДекорацииФормы.Картинка;
	ШаблонКартинкиБыстрогоДоступа.Ширина = 2;
	ШаблонКартинкиБыстрогоДоступа.Высота = 1;
	ШаблонКартинкиБыстрогоДоступа.Картинка = КартинкаБыстрыйДоступ;
	ШаблонКартинкиБыстрогоДоступа.РастягиватьПоГоризонтали = Ложь;
	ШаблонКартинкиБыстрогоДоступа.РастягиватьПоВертикали = Ложь;

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

	// Шаблоны заполнения создаваемых элементов управления.
	ШаблонНадписиВарианта = Новый Структура(
		"Вид, Гиперссылка, ЦветТекста,
		|РастягиватьПоВертикали, Высота,
		|РастягиватьПоГоризонтали, АвтоМаксимальнаяШирина, МаксимальнаяШирина");
	ШаблонНадписиВарианта.Вид = ВидДекорацииФормы.Надпись;
	ШаблонНадписиВарианта.Гиперссылка = Истина;
	ШаблонНадписиВарианта.ЦветТекста = ЦветВидимыхВариантов;
	ШаблонНадписиВарианта.РастягиватьПоВертикали = Ложь;
	ШаблонНадписиВарианта.Высота = 1;
	ШаблонНадписиВарианта.РастягиватьПоГоризонтали = Истина;
	ШаблонНадписиВарианта.АвтоМаксимальнаяШирина = Ложь;
	ШаблонНадписиВарианта.МаксимальнаяШирина = 0;

	ПараметрыЗаполнения.Вставить("Шаблоны", Новый Структура);
	ПараметрыЗаполнения.Шаблоны.Вставить("ГруппаВарианта", ШаблонГруппыВарианта);
	ПараметрыЗаполнения.Шаблоны.Вставить("КартинкаБыстрогоДоступа", ШаблонКартинкиБыстрогоДоступа);
	ПараметрыЗаполнения.Шаблоны.Вставить("КартинкаОтступа", ШаблонКартинкиОтступа);
	ПараметрыЗаполнения.Шаблоны.Вставить("НадписьВарианта", ШаблонНадписиВарианта);

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

	ПараметрыЗаполнения.Вставить("ГруппыВажности", Новый Массив);
	ПараметрыЗаполнения.ГруппыВажности.Добавить("БыстрыйДоступ");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("БезГруппы");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("СГруппой");
	ПараметрыЗаполнения.ГруппыВажности.Добавить("СмТакже");

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

	ПараметрыЗаполнения.БыстрыйДоступ.Отбор = Новый Структура("БыстрыйДоступ", Истина);
	ПараметрыЗаполнения.БезГруппы.Отбор     = Новый Структура("БыстрыйДоступ, БезГруппы", Ложь, Истина);
	ПараметрыЗаполнения.СГруппой.Отбор      = Новый Структура("БыстрыйДоступ, БезГруппы, СмТакже", Ложь, Ложь, Ложь);
	ПараметрыЗаполнения.СмТакже.Отбор       = Новый Структура("БыстрыйДоступ, БезГруппы, СмТакже", Ложь, Ложь, Истина);

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

// Параметры:
//  ПараметрыЗаполнения -  см. ВариантыОтчетов.ВариантыОтчетовДляВывода
//  РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - СправочникСсылка.ИдентификаторыОбъектовРасширений
//
&НаСервере


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

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

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

	Если Не Рекурсия.ЭтоПоследняяКолонка И Рекурсия.СвободноСтрок <= 0 Тогда // текущая колонка исчерпана
		// Переход к новой колонке.
		Рекурсия.ВсегоОсталосьВывести = Рекурсия.ВсегоОсталосьВывести - 1; // Пустая группа, которую не надо выводить.
		Рекурсия.НомерТекущейКолонки = Рекурсия.НомерТекущейКолонки + 1;
		Рекурсия.ЭтоПоследняяКолонка = (Рекурсия.НомерТекущейКолонки = Рекурсия.КоличествоКолонок);
		СвободноКолонок = Рекурсия.КоличествоКолонок - Рекурсия.НомерТекущейКолонки + 1;
		// Количество вариантов для вывода в одной колонке.
		Рекурсия.ГруппаУровня3Отсечка = Макс(Цел(Рекурсия.ВсегоОсталосьВывести / СвободноКолонок), 2);
		Рекурсия.СвободноСтрок = Рекурсия.ГруппаУровня3Отсечка; // Количество вариантов для вывода в одной колонке.

		// Вывод иерархии / Повтор иерархии с добавкой "(продолжение)" если вывод строк текущего родителя уже был начат в
		// предыдущей колонке.
		ТекущийРодитель = СтрокаРодителя;
		Пока ТекущийРодитель <> Неопределено И ТекущийРодитель.ПодсистемаСсылка <> ПараметрыЗаполнения.РазделСсылка Цикл

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

			ТекущийРодитель = ТекущийРодитель.Родитель;
		КонецЦикла;

		Рекурсия.НачатВыводВТекущейКолонке = Ложь;

	КонецЕсли;

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

		// Учет строк, занятых пустой строкой.
		Рекурсия.СвободноСтрок = Рекурсия.СвободноСтрок - 1;
	КонецЕсли;

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

	Если СтрокаДерева.КоличествоВариантов > 0 Тогда

		// Учет строки, занятой группой.
		Рекурсия.ВсегоОсталосьВывести = Рекурсия.ВсегоОсталосьВывести - 1;
		Рекурсия.СвободноСтрок = Рекурсия.СвободноСтрок - 1;

		СтрокаДерева.НачатВывод = Истина;
		Рекурсия.НачатВыводВТекущейКолонке = Истина;

		Если Рекурсия.ЭтоПоследняяКолонка
			Или СтрокаРодителя <> Неопределено
			И (СтрокаДерева.КоличествоВариантов <= 5
			Или СтрокаДерева.КоличествоВариантов - 2 <= Рекурсия.СвободноСтрок + 2) Тогда

			// Вывод всех в текущую колонку.
			ВозможноПродолжение = Ложь;
			КоличествоВТекущуюКолонку = СтрокаДерева.КоличествоВариантов;

		Иначе

			// Частичный вывод в текущую колонку с продолжением в следующей.
			ВозможноПродолжение = Истина;
			КоличествоВТекущуюКолонку = Макс(Рекурсия.СвободноСтрок + 2, 3);

		КонецЕсли;

		// Регистрация вариантов в текущей колонке / Довывод вариантов в новой колонке.
		ВариантовВыведено = 0;
		ВидимыхВариантов = 0;
		Для Каждого Вариант Из СтрокаДерева.Варианты Цикл
			// СтрокаДерева.Варианты - это результат поиска по таблице значений.
			// Код рассчитан на то, что сортировка результата поиска не отличается от сортировки строк.
			// Если это не так, то исходную таблицу необходимо скопировать
			// с фильтром по подсистеме и отсортировать по наименованию.

			Если ВозможноПродолжение
				И Не Рекурсия.ЭтоПоследняяКолонка
				И Не Вариант.ВыводитсяВместеСОсновным
				И ВариантовВыведено >= КоличествоВТекущуюКолонку Тогда
				// Переход к новой колонке.
				Рекурсия.НомерТекущейКолонки = Рекурсия.НомерТекущейКолонки + 1;
				Рекурсия.ЭтоПоследняяКолонка = (Рекурсия.НомерТекущейКолонки = Рекурсия.КоличествоКолонок);
				СвободноКолонок = Рекурсия.КоличествоКолонок - Рекурсия.НомерТекущейКолонки + 1;
				// Количество вариантов для вывода в одной колонке.
				Рекурсия.ГруппаУровня3Отсечка = Макс(Цел(Рекурсия.ВсегоОсталосьВывести / СвободноКолонок), 2);
				Рекурсия.СвободноСтрок = Рекурсия.ГруппаУровня3Отсечка; // Количество вариантов для вывода в одной колонке.

				Если Рекурсия.ЭтоПоследняяКолонка Тогда
					КоличествоВТекущуюКолонку = -1;
				Иначе
					КоличествоВТекущуюКолонку = Макс(Мин(Рекурсия.СвободноСтрок, СтрокаДерева.КоличествоВариантов - ВариантовВыведено), 3);
				КонецЕсли;
				ВариантовВыведено = 0;

				// Повтор иерархии с добавкой "(продолжение)".
				ТекущийРодитель = СтрокаРодителя;
				Пока ТекущийРодитель <> Неопределено И ТекущийРодитель.ПодсистемаСсылка <> ПараметрыЗаполнения.РазделСсылка Цикл

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

					ТекущийРодитель = ТекущийРодитель.Родитель;
				КонецЦикла;

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

				// Учет строки, занятой группой.
				Рекурсия.СвободноСтрок = Рекурсия.СвободноСтрок - 1;
			КонецЕсли;

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

			ВариантовВыведено = ВариантовВыведено + 1;
			Если Вариант.Видимость Тогда
				ВидимыхВариантов = ВидимыхВариантов + 1;
			КонецЕсли;

			// Учет строк, занятых вариантами.
			Рекурсия.СвободноСтрок = Рекурсия.СвободноСтрок - 1;
		КонецЦикла;

		Если ВидимыхВариантов > 0 Тогда
			ПодсистемаФормы = НайтиПодсистемуПоСсылке(ЭтотОбъект, СтрокаДерева.ПодсистемаСсылка);
			Если ПодсистемаФормы <> Неопределено Тогда
			ПодсистемаФормы.ВидимыхВариантов = ПодсистемаФормы.ВидимыхВариантов + ВидимыхВариантов;
			Пока ПодсистемаФормы.Ссылка <> ПодсистемаФормы.РазделСсылка Цикл
				ПодсистемаФормы = НайтиПодсистемуПоСсылке(ЭтотОбъект, ПодсистемаФормы.РазделСсылка);
				ПодсистемаФормы.ВидимыхВариантов = ПодсистемаФормы.ВидимыхВариантов + ВидимыхВариантов;
			КонецЦикла;
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

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

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

// Параметры:
//  ПараметрыЗаполнения - см. ВариантыОтчетов.ВариантыОтчетовДляВывода
//  СтрокаПорядкаВывода - см. ПорядокВывода
//  ВГруппу - ГруппаФормы
//
// Возвращаемое значение:
//  ГруппаФормы, КнопкаФормы, ТаблицаФормы, ПолеФормы, Произвольный, ДекорацияФормы
//
&НаСервере

[Assistant] Процедура ЗаполнитьПорядокВывода(ПорядокВывода, СтрокаРодителя, СтрокаДерева, Рекурсия, ПараметрыЗаполнения)