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

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

Функция ИмяФункции(МенеджерВсехВидов, ПротоДанные, ПротоОбъект)
	ЭтоДокумент = МенеджерВсехВидов = Документы;
	ЭтоБизнесПроцесс = МенеджерВсехВидов = БизнесПроцессы;
	ЭтоЗадача = МенеджерВсехВидов = Задачи;

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

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

	Если ПротоОбъект.Режимы.ТолькоСоздание И Объект<>Неопределено Тогда
		Возврат ПротоОбъект.Объект;
	КонецЕсли;

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

	Если Объект = Неопределено Тогда
		Объект = НовыйПустойОбъект;
	КонецЕсли;

	//Установка ссылки
	Если Объект <> Неопределено И Объект.ЭтоНовый() Тогда
		Если Не ЗначениеЗаполнено(ПротоОбъект.Объект) Тогда
			ПротоОбъект.Объект = МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор);
		КонецЕсли;
		Объект.УстановитьСсылкуНового(ПротоОбъект.Объект);
	КонецЕсли;

	Если Объект <> НовыйПустойОбъект Тогда
		ПропускаемыеРеквизиты = ПолучитьПропускаемыеРеквизиты(ПротоОбъект.Объект.Метаданные());
		ОчиститьОбъект(Объект, НовыйПустойОбъект, ПропускаемыеРеквизиты);
	КонецЕсли;

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

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

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

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

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

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

[Assistant] Функция СоздатьОбъект_Документ_или_БизнесПроцесс_или_Задача(МенеджерВсехВидов, ПротоДанные, ПротоОбъект)


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

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

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

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

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

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

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

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

	ПредставлениеМетаданного = "пользователя ИБ ";
	ЗаписатьОбъектПриНеобходимости(Объект, ПротоОбъект, ПредставлениеМетаданного, Ложь);

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

Функция СоздатьОбъект_ПВХ(ПротоДанные, ПротоОбъект)

	СпрМенеджер = ПланыВидовХарактеристик[ПротоОбъект.Вид];

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

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

	Если ПротоОбъект.Режимы.ТолькоСоздание И Объект<>Неопределено Тогда
		Возврат ПротоОбъект.Объект;
	КонецЕсли;

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

	//Создание объекта ПВХ
	Если Объект = Неопределено Тогда
		СтарыйПредопреденный = Неопределено;
		Если ПротоОбъект.Режимы.Предопределенный Тогда
			Попытка
				Объект = СпрМенеджер[ПротоОбъект.ИмяПредопределенного].ПолучитьОбъект();
			Исключение
				Ошибка = ОписаниеОшибки();
				ВызватьИсключение "ПланВидовХарактеристик."+ПротоОбъект.Вид+" не удалось найти предопределенный элемент/группу ["+ПротоОбъект.ИмяПредопределенного+"]."+Символы.ПС+Ошибка;
			КонецПопытки;

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

		ИначеЕсли ПротоОбъект.Режимы.СоздатьПоГуид Тогда
			ВызватьИсключение "Устарело и больше не поддерживается: https://github.com/xDrivenDevelopment/xUnitFor1C/issues/332";
		КонецЕсли;

		Если Объект = Неопределено Тогда
			Если ПротоОбъект.Режимы.СоздатьПоГуид Тогда
				ВызватьИсключение "Устарело и больше не поддерживается: https://github.com/xDrivenDevelopment/xUnitFor1C/issues/332";
			Иначе
				Объект = НовыйПустойОбъект;
			КонецЕсли;
		КонецЕсли;

		Если Объект <> Неопределено И Объект.ЭтоНовый() Тогда
			Если Не ЗначениеЗаполнено(ПротоОбъект.Объект) Тогда
				ПротоОбъект.Объект = СпрМенеджер.ПолучитьСсылку(Новый УникальныйИдентификатор);
			КонецЕсли;
			Объект.УстановитьСсылкуНового(ПротоОбъект.Объект);

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

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

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

				Объект[мдТабЧасть.Имя].Очистить();
		КонецЕсли;

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

	//Служебные поля и значения
	Если Не ЗначениеЗаполнено(Объект.Код) тогда
		Объект.УстановитьНовыйКод();
	КонецЕсли;

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

	ПредставлениеМетаданного = "плана видов характеристик";
	Результат = ЗаписатьОбъектПриНеобходимости(Объект, ПротоОбъект, ПредставлениеМетаданного, Истина);

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

[Assistant] Функция СоздатьОбъект_ПользовательИБ(ПротоДанные,ПротоОбъект)


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

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

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

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

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

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

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

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

	ИначеЕсли КорневойТипКонфигурации = ВернутьЗначениеСоответствия("РегистрНакопления")
		или КорневойТипКонфигурации = ВернутьЗначениеСоответствия("РегистрБухгалтерии")
		или КорневойТипКонфигурации = ВернутьЗначениеСоответствия("РегистрРасчета") Тогда

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

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

	ИначеЕсли КорневойТипКонфигурации = ВернутьЗначениеСоответствия("ПланВидовХарактеристик") Тогда

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

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

	ИначеЕсли КорневойТипКонфигурации = ВернутьЗначениеСоответствия("ПланСчетов") Тогда

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

		МетаданныеСправочника = ОписательОбъекта[ВернутьЗначениеСоответствия("Ссылка")].Метаданные();
		ВыгружаемыеСтандартныеРеквизиты.Добавить(ВернутьЗначениеСоответствия("Родитель"));

	ИначеЕсли КорневойТипКонфигурации = ВернутьЗначениеСоответствия("ПланВидовРасчета") Тогда

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

		МетаданныеСправочника = ОписательОбъекта[ВернутьЗначениеСоответствия("Ссылка")].Метаданные();

	Иначе
		ВызватьИсключение "Неизвестный КорневойТипКонфигурации <"+КорневойТипКонфигурации+"> КорневойТипКонфигурации()";
	КонецЕсли;

	Возврат ВыгружаемыеСтандартныеРеквизиты;
КонецФункции

[Assistant] Функция ВыгружаемыеСтандартныеРеквизиты(ОписательОбъекта, КорневойТипКонфигурации)


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

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

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

	ЭтоСсылочныйОбъект = ЭтоОписательОбъектаСсылки(ОписательОбъекта);
	Если ЭтоСсылочныйОбъект Тогда
		Мд = Объект.Метаданные();
	Иначе
		Мд = Объект;
	КонецЕсли;

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

		Если ЗаписыватьОбщиеРеквизиты И МассивИменОбщихРеквизитов <> Неопределено Тогда
			Если МассивИменОбщихРеквизитов.Найти(имяРеквизита) = Неопределено Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		БылДобавленСчетДляЗаписиРегистраБухгалтерии = Ложь;

		Если ЭтоСсылочныйОбъект Тогда
			ЗначениеРеквизита = объект[имяРеквизита];

			этоЗначениеБудетСозданоПоУмолчанию = лПустойОбъект[имяРеквизита] = ЗначениеРеквизита;
			Если этоЗначениеБудетСозданоПоУмолчанию Тогда
				Продолжить;
			КонецЕсли;
		Иначе
			Если КорневойТипКонфигурации = "РегистрБухгалтерии" Тогда
				Если Лев(ИмяРеквизита, СтрДлина("Счет")) = "Счет" Тогда
					БылДобавленСчетДляЗаписиРегистраБухгалтерии = Истина;
					ИмяРеквизитаСчет = имяРеквизита;
				ИначеЕсли Не РеквизитМд.Балансовый Тогда
					Суффиксы = Новый Массив;
					Суффиксы.Добавить("Дт");
					Суффиксы.Добавить("Кт");
					Для Каждого Суффикс Из Суффиксы Цикл
						ЗначениеРеквизита = ОписательОбъекта.Реквизиты[имяРеквизита + Суффикс];
						ИмитаторРеквизитаМд = Новый Структура("Имя, Тип", имяРеквизита + Суффикс, РеквизитМд.Тип);
						ДобавилиРеквизит = ОбработатьРеквизитОбъекта(Макет, МассивДанных, Объект, ИмитаторРеквизитаМд, ЗначениеРеквизита, Мд, НомерСтрокиМакета, ШапкаДанных);
						Если ДобавилиРеквизит Тогда
							НомерСтрокиМакета = НомерСтрокиМакета + 1;
						КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ОбработатьРеквизитыОбъекта(Макет, ОписательОбъекта, ШапкаДанных, МассивДанных, Объект, лПустойОбъект, МдРеквизиты, ВыгружаемыеРеквизиты, КорневойТипКонфигурации = "", МассивИменОбщихРеквизитов = Неопределено)
	НомерСтрокиМакета = Макет.ВысотаТаблицы+1;

	ЭтоСсылочныйОбъект = ЭтоОписательОбъектаСсылки(ОписательОбъекта);
	Если ЭтоСсылочныйОбъект Тогда
		Мд = Объект.Метаданные();
	Иначе
		Мд = Объект;
	КонецЕсли;

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

		Если ЗаписыватьОбщиеРеквизиты И МассивИменОбщихРеквизитов <> Неопределено Тогда
			Если МассивИменОбщихРеквизитов.Найти(имяРеквизита) = Неопределено Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		БылДобавленСчетДляЗаписиРегистраБухгалтерии = Ложь;

		Если ЭтоСсылочныйОбъект Тогда
			ЗначениеРеквизита = объект[имяРеквизита];

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

		ДобавилиРеквизит = ОбработатьРеквизитОбъекта(Макет, МассивДанных, Объект, РеквизитМд, ЗначениеРеквизита, Мд, НомерСтрокиМакета, ШапкаДанных);

		Если ДобавилиРеквизит Тогда
			НомерСтрокиМакета = НомерСтрокиМакета + 1;
		КонецЕсли;

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

				ИмитаторРеквизитаМд = Новый Структура("Имя, Тип", НаименованиеРеквизитаСубконто + ОписаниеВидаСубконто.НомерСтроки, ВидСубконто.ТипЗначения);

				ДобавилиРеквизит = ОбработатьРеквизитОбъекта(Макет, МассивДанных, Объект, ИмитаторРеквизитаМд, ЗначениеРеквизита, Мд, НомерСтрокиМакета, ШапкаДанных);

				Если ДобавилиРеквизит Тогда
					НомерСтрокиМакета = НомерСтрокиМакета + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

		НомерКолонкиМакета_ТЧ = ШапкаДанных.ТЧ;

		Для каждого строкаТчОбъекта Из объект[ИмяТЧ] Цикл
			НомерСтрокиМакета = Макет.ВысотаТаблицы+1;
			ОбластьМакета = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_ТЧ, НомерСтрокиМакета, НомерКолонкиМакета_ТЧ);
			ОбластьМакета.Текст = ИмяТЧ;

			ОбработатьРеквизитыТабличнойЧастиОбъекта(Макет, ОписательОбъекта, ШапкаДанных, МассивДанных, Объект, строкаТчОбъекта, МдРеквизиты);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

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

		Режимы.Добавить("Группа");
	КонецЕсли;

	Если Режимы.Количество()>0 Тогда
		НомерКолонкиМакета_ТЧ = ШапкаДанных.ТЧ;
		ОбластьМакета = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_ТЧ, НомерСтрокиМакета, НомерКолонкиМакета_ТЧ);
		ОбластьМакета.Текст = "xddMods";

		Для каждого Режим Из Режимы Цикл
			ДобавитьПростойРеквизитВМакет(Макет, ШапкаДанных, "Режим", Режим);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ОбработатьРеквизитыТабличнойЧастиОбъекта(Макет, ОписательОбъекта, ШапкаДанных, МассивДанных, Объект, строкаТчОбъекта, МдРеквизиты)
	НомерСтрокиМакета = Макет.ВысотаТаблицы+1;

	Мд = Объект.Метаданные();

	Для каждого РеквизитМд Из МдРеквизиты Цикл
		имяРеквизита = РеквизитМд.Имя;

		ЗначениеРеквизита = строкаТчОбъекта[имяРеквизита];

		ДобавилиРеквизит = ОбработатьРеквизитОбъекта(Макет, МассивДанных, Объект, РеквизитМд, ЗначениеРеквизита, Мд, НомерСтрокиМакета, ШапкаДанных);

		Если ДобавилиРеквизит Тогда
			НомерСтрокиМакета = НомерСтрокиМакета + 1;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

	Если ЕстьТипы И Не ЗначениеЗаполнено(ЗначениеРеквизита) И РеквизитМд.Тип.Типы().Количество() = 1 Тогда
		Возврат Ложь;
	КонецЕсли;
	ТипРеквизита = ТипЗнч(ЗначениеРеквизита);
	Если ТипРеквизита = ТипЗнч(Неопределено) Тогда
		Возврат Ложь;
	КонецЕсли;

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

	Если ЕстьТипы И РеквизитМд.Тип.Типы().Количество() = 1 Тогда
		ДополнительныйТипЗначения = "";
	КонецЕсли;

	ДобавитьПростойРеквизитВМакет(Макет, ШапкаДанных, ИмяРеквизита, ПредставлениеЗначенияРеквизита);

	НомерКолонкиМакета_Режим = ШапкаДанных.Режим;
	ОбластьМакета_Режим = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_Режим, НомерСтрокиМакета, НомерКолонкиМакета_Режим);
	Если РежимПоиска <> "" Тогда
		ОбластьМакета_Режим.Текст = РежимПоиска;
	КонецЕсли;

	НомерКолонкиМакета_ДополнительныйТипЗначения = ШапкаДанных.ДополнительныйТипЗначения;
	ОбластьМакета_ДополнительныйТипЗначения = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_ДополнительныйТипЗначения, НомерСтрокиМакета, НомерКолонкиМакета_ДополнительныйТипЗначения);
	ОбластьМакета_ДополнительныйТипЗначения.Текст = ДополнительныйТипЗначения;

	Возврат Истина;
КонецФункции


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

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

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

	МассивСтрок = Новый Массив;
	Если Истина
		И Не ОставлятьПустуюСтроку
		И ПустаяСтрока(Стр)
	Тогда
		Возврат МассивСтрок;
	КонецЕсли;

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

	Возврат МассивСтрок;

КонецФункции // ЛксПолучитьМассивИзСтрокиСРазделителем()

// Получает первый фрагмент, отделяемый разделителем от строки. На базе ЛксПолучитьПервыйФрагмент
// Написана для оптимизации по скорости.
//
// Параметры:
//  пСтрока      - Строка - которую разбиваем;
//  *пРазделитель - Строка, "." - символ-разделитель;
//  *пЛиИспользоватьГраницуЕслиМаркерНеНайден - Булево, *Истина.
//
// Возвращаемое значение:
//               - Строка - первый фрагмент строки;
//  Неопределено - в строке не обнаружен разделитель.
//

Функция ПолучитьПервыйФрагмент_ирЛкс(пСтрока, пРазделитель = ".",
	пЛиИспользоватьГраницуЕслиМаркерНеНайден = Истина) Экспорт

	Позиция = Найти(пСтрока, пРазделитель);
	Если Позиция > 0 Тогда
		Возврат Лев(пСтрока, Позиция - 1);
	Иначе
		Если пЛиИспользоватьГраницуЕслиМаркерНеНайден Тогда
			Возврат пСтрока;
		Иначе
			Возврат пСтрока;
		КонецЕсли;
	КонецЕсли;

КонецФункции // ЛксПолучитьПервыйФрагмент()

// Получает идентификатор из любой строки.
// "3-я Дебиторка По контрагентам с интервалами СНГ (для  Руководства)" => "_3_яДебиторкаПоКонтрагентамСИнтерваламиСНГ_дляРуководства_".
//
// Параметры:
//  Представление - Строка.
//
// Возвращаемое значение:
//  Строка.
//

Функция ПолучитьИдентификаторИзПредставления_Лкс(Знач Представление, ЗаменаПустойСтроки = "_") Экспорт

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

	КонецЦикла;
	Результат = ТекущаяСтрока;
	Возврат ТекущаяСтрока;

КонецФункции // ПолучитьИдентификаторИзПредставления()

Функция ЭтоЦифра(Символ)

	Возврат (Найти("0123456789", Символ) > 0);

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

Функция ЭтоПробельныйСимвол(Символ)

	ПробельныеСимволы = " " + Символы.Таб + Символы.НПП + Символы.ВК + Символы.ВТаб + Символы.ПС + Символы.ПФ;
	Возврат (Найти(ПробельныеСимволы, Символ) > 0)

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

Функция ЭтоВалидныйСимволИдентификатора(Символ)

	Алфавит = "_АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ";
	Возврат (Найти(Алфавит, ВРег(Символ)) > 0 Или ЭтоЦифра(Символ));

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

// } Конец блока методов из ИР (Инструменты Разработчика, автор TormozIt )

//} КОНЕЦ ОСНОВНОГО БЛОКА

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

	Ссылка = ЭлементДанных.Ссылка;
	Если ЗначениеЗаполнено(Ссылка) Тогда
		ОписательЭлемента = СоздатьОписательЭлементаПоСсылке(Ссылка, НовыйМассивИмен);
		ЗаполнитьЗначенияСвойств(ЭлементДанных, ОписательЭлемента);

	КонецЕсли;
КонецПроцедуры

Функция СоздатьМакетДанныхПоТаблицеДанных(Макет) Экспорт
	Макет.Очистить();

	массивДанных = Новый Массив;

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

	Возврат НовыйМакет;
КонецФункции

Функция СоздатьМакетДанныхПоМетаданным(Макет) Экспорт
	Макет.Очистить();

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

	СоздатьПоМетаданным(массивДанных);

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

	МассивИмен = Неопределено;

	Возврат НовыйМакет;
КонецФункции

Функция СоздатьМакетДанныхПоПользователямИБ(Макет, МассивИменПользователей) Экспорт
	Макет.Очистить();

	МассивПользователей = Новый Массив;
	МассивИмен = Новый Массив;

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

		ОписательПользователяИБ = СоздатьОписательЭлементаПользовательИБ(ПользовательИБ, МассивИмен);
		МассивПользователей.Добавить(ОписательПользователяИБ);
	КонецЦикла;

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

	МассивИмен = Неопределено;

	Возврат НовыйМакет;
КонецФункции

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

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

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

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

[Assistant] Функция ПолучитьМассивИзСтрокиСРазделителем_ирЛкс(Знач Стр, Разделитель = ".", ОбрезатьНепечатныеСимволы = Ложь, ОставлятьПустуюСтроку = Истина)


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

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

Функция ИмяФункции(ИмяМетаданных, ОбъектМетаданных, ЕстьДопОтборы, СтрокаПолейДляВыборки = "")

	ЕстьОграничениеПоДатам = ЗначениеЗаполнено(ДатаНачала) Или ЗначениеЗаполнено(ДатаОкончания);

	ВыбираемВсеПоля = НЕ ЗначениеЗаполнено(СтрокаПолейДляВыборки) или СтрокаПолейДляВыборки = "Регистратор";

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

		ИмяМенеджераРегистра = 	?(Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных), "РегистрыНакопления", "РегистрыБухгалтерии");

		Выполнить("МенеджерНабораЗаписей = "+ИмяМенеджераРегистра+"."+ОбъектМетаданных.Имя);

		СтрокаПолейДляВыборки = " Различные " +  ПолучитьСтрокуПолейОтбораРегистра(МенеджерНабораЗаписей);
	Иначе
		СтрокаПолейДляВыборки = " РАЗЛИЧНЫЕ " +  СтрокаПолейДляВыборки;
	КонецЕсли;

	ТекстЗапроса = "ВЫБРАТЬ Разрешенные " + СтрокаПолейДляВыборки + " ИЗ " + ИмяМетаданных + " КАК _ ";

	// возможно нужно ограничение по датам установить
	Если ЕстьОграничениеПоДатам Тогда

		Если ЕстьДопОтборы И
			НЕ ИспользоватьОтборПоДатеДляВсехОбъектов Тогда

			Возврат ТекстЗапроса;

		КонецЕсли;

		ДопОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(ОбъектМетаданных, "Регистр");

		ТекстЗапроса = ТекстЗапроса + Символы.ПС + ДопОграничениеПоДате;

	КонецЕсли;

	Возврат ТекстЗапроса;

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

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

Процедура СоставВыгрузки(ПересчитатьВыгружаемыеПоСсылке = Ложь) Экспорт

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

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

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

	мНаличиеВыгрузкиПодчиненныхОбъектов = СоставВспомогательнойВыгрузки.Количество() > 0;

	Если ПересчитатьВыгружаемыеПоСсылке Тогда

		ПересчитатьВыгружаемыеПоСсылке(СоставПолнойВыгрузки);

	КонецЕсли;

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

// Процедура рекурсивно обрабатывает строку дерева метаданных, образуя списки полной и вспомогательной выгрузки
//
// Параметры
//   СоставПолнойВыгрузки - список полной выгрузки
//   СоставВспомогательнойВыгрузки - список вспомогательной выгрузки
//   СтрокаДЗ - обрабатываемая строка дерева метаданных
//

Процедура ДобавитьВыгружаемыеОбъекты(СоставПолнойВыгрузки, СоставВспомогательнойВыгрузки, СтрокаДЗ)

	Если (СтрокаДЗ.ЭлементОписания <> Неопределено)
		И СтрокаДЗ.ЭлементОписания.Выгружаемый Тогда

		СтрокаДобавления = Неопределено;

		Если СтрокаДЗ.Выгружать Тогда

			СтрокаДобавления = СоставПолнойВыгрузки.Добавить();

		КонецЕсли;
		Если СтрокаДобавления <> Неопределено Тогда
			СтрокаДобавления.ОбъектМД = СтрокаДЗ.ОбъектМД;
			СтрокаДобавления.СтрокаДерева = СтрокаДЗ;

		КонецЕсли;

		Если СтрокаДЗ.ВыгружатьПриНеобходимости Тогда // нужно для иерархических метаданных и подгрузки родителей

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

		КонецЕсли;

		Если СтрокаДобавления <> Неопределено Тогда
			СтрокаДобавления.ОбъектМД = СтрокаДЗ.ОбъектМД;
			СтрокаДобавления.СтрокаДерева = СтрокаДЗ;

		КонецЕсли;

	КонецЕсли;

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

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

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

Процедура ПересчитатьВыгружаемыеПоСсылке(Выгрузка) Экспорт

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

	КоллекцияУжеИспользованныхЭлементовДЗ = Новый Соответствие;

	// 0 уровень - узел конфигурации, 1 - узел справочники, документы, 2-... - реальные метаданные
	НачальныйУровень = 0;
	Если УровеньВыгрузки = 0 Тогда
		МаксимальныйУровень = 99999999999;
	Иначе
		МаксимальныйУровень = НачальныйУровень + УровеньВыгрузки - 1;// уровень выгрузки = 1, значит, грузим только отмеченные метаданные без зависимых
	КонецЕсли;

	// обработка переданного набора объектов
	Для Каждого Выгружаемый Из Выгрузка Цикл

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

	КонецЦикла;

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

// Процедура определяет, на какие объект может ссылаться запись, соответствующая объекту метаданных, отображаемому
// данной строкой дерева метаданных и проставляет им признак ВыгружатьПриНеобходимости
//
// Параметры
//   ЭлементДЗ - строка дерева метаданных
//

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

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

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

	Уровень = Уровень + 1;
	Если Уровень > МаксимальныйУровень Тогда
		Возврат;
	КонецЕсли;

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

		ТипИОбъект = СсылочныеТипы.Получить(СсылочныйТип);
		Если ТипИОбъект = Неопределено Тогда

			ВызватьИсключение("Внутреняя ошибка. Неполное заполнение структуры ссылочных типов - " + СсылочныйТип);

		КонецЕсли;

		ОбъектМД = ТипИОбъект;
		СтрокаДЗ = ЭлементДЗПоОбъектуМД(ОбъектМД);
		Если СтрокаДЗ = Неопределено Тогда

			ВызватьИсключение("Внутреняя ошибка. Неполное заполнение дерева метаданных. Отсутствует объект, образующий тип - " + СсылочныйТип);

		КонецЕсли;

		Если СтрокаДЗ.Выгружать = 1
			И СтрокаДЗ.ВыгружатьПриНеобходимости = 1 Тогда

			Продолжить;

		КонецЕсли;

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

	КонецЦикла;

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

// Функция возвращает массив типов, которые могут иметь поля записи объекта метаданных, соответствующего строке дерева
//
// Параметры
//   ЭлементДЗ - строка дерева метаданных
// Возврат - массив потенциально используемых соответствующей записью типов
//

Функция ПолучитьВсеТипы(ЭлементДЗ)

	ОбъектМД = ЭлементДЗ.ОбъектМД;
	Если ТипЗнч(ОбъектМД) <> Тип("ОбъектМетаданных")
		И ТипЗнч(ОбъектМД) <> Тип("ОбъектМетаданныхКонфигурация") Тогда

		ВызватьИсключение("Внутреняя ошибка обработки выгрузки");

	КонецЕсли;

	Возврат ПолучитьТипыИспользуемыеОМД(ОбъектМД, ЭлементДЗ.ЭлементОписания);

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

// Функция возвращает строку дерева метаданных, соответствующую переданному объекту метаданных
// Поиск осуществляется по всему дереву метаданных
//
// Параметры
//   ОбъектМД - описание метаданного
// Возврат - строка дерева метаданных
//

[Assistant] Функция ПолучитьТекстЗапросаДляРегистра(ИмяМетаданных, ОбъектМетаданных, ЕстьДопОтборы, СтрокаПолейДляВыборки = "")


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

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

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

	СКД = ПодготовитьКомпоновщикДляВыгрузки(СтрокаДереваМетаданных);

	ТаблицаЗначений = Новый ТаблицаЗначений;

	Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
	Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
	Компоновщик.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);

	ПолеГруппировки = Компоновщик.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));

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

	КонецЦикла;

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

	Возврат РезультатЗапроса;

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

// Процедура исполняет переданный запрос и записывает полученные через запрос объекты
//
// Параметры
//   Запрос - запрос для исполнения, результат содержит выборку объектов для записи
//   ЗаписьXML - объект, через которых происходит запись объектов ИБ
//   ЗапросВерхнегоУровня - признак необходимости анимации процесса
//

Процедура ЗапросИЗапись(РезультатЗапроса, ОбъектыВыгруженныеСОшибками, массивДанных, ЗапросВерхнегоУровня = Ложь)

	// универсальная процедура выгрузки ссылочных объектов процедура
	ОбработкаРезультатаЗапроса(РезультатЗапроса, ОбъектыВыгруженныеСОшибками,
		массивДанных, МассивИмен, ЗапросВерхнегоУровня, Истина);

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

// Процедура записывает содержащиеся в выборке результата запроса объекты и необходимые "по ссылке" объекты ИБ
//
// Параметры
//   РезультатЗапроса - результат запроса
//   ЗаписьXML - объект, через которых происходит запись объектов ИБ
//   ЭтоЗапросПоОбъекту - если Истина, выборка должна содержать объекты, на которые может быть ссылка,
//             если Ложь, выгружать, как объект не нужно, только обработать возможные ссылки на др. объекты ИБ
//

Процедура ОбработкаРезультатаЗапроса(РезультатЗапроса, ОбъектыВыгруженныеСОшибками,
		массивДанных, МассивИмен, ЗапросВерхнегоУровня = Ложь, ЭтоЗапросПоОбъекту = Ложь)

	#Если Клиент Тогда
	ОбработкаПрерыванияПользователя();
	#КонецЕсли

	ВыборкаИзРезультатовЗапроса = РезультатЗапроса.Выбрать();
	Если ЗапросВерхнегоУровня Тогда

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

	КонецЕсли;

	ВсегоОбработаноОбъектов = 0;
	ОбработаноОбъектов = 0;

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

		ДанныеОбъекта = ВыборкаИзРезультатаЗапросаВСтруктуру(РезультатЗапроса, ВыборкаИзРезультатовЗапроса);

		Если ЭтоЗапросПоОбъекту Тогда

			// выгрузка ссылочных объектов
			Ссылка = ДанныеОбъекта[ВернутьЗначениеСоответствия("Ссылка")];

			Если СсылкаВыгружена(Ссылка) Тогда

				Если ЗапросВерхнегоУровня Тогда

					ОбработаноОбъектов = ОбработаноОбъектов + 1;
					Если ОбработаноОбъектов % 100 = 0 Тогда
						ОбработаноОбъектов = 0;
					КонецЕсли;

				КонецЕсли;
				Продолжить;

			КонецЕсли;

			ДобавитьСсылкуКВыгруженным(Ссылка);

			ВсегоОбработаноОбъектов = ВсегоОбработанныхЗаписей();

			ПоказатьПользователюИнформациюОСостоянииВыгрузки(ВсегоОбработаноОбъектов, ОбъектыВыгруженныеСОшибками);

		КонецЕсли;

		Если мНаличиеВыгрузкиПодчиненныхОбъектов Тогда

			// перебираем колонки запроса в поисках ссылочных значений, которые, возможно, нужно выгрузить
			Для Каждого КолонкаЗапроса Из РезультатЗапроса.Колонки Цикл

				ЗначениеКолонки = ДанныеОбъекта[КолонкаЗапроса.Имя];

				Если ТипЗнч(ЗначениеКолонки) = мТипРезультатЗапроса Тогда

					ОбработкаРезультатаЗапроса(ЗначениеКолонки, ОбъектыВыгруженныеСОшибками, массивДанных, МассивИмен);

				Иначе

					ЗаписатьЗначениеПриНеобходимости(ЗначениеКолонки, ОбъектыВыгруженныеСОшибками, массивДанных);

				КонецЕсли;

			КонецЦикла;

		КонецЕсли;

		Если ЭтоЗапросПоОбъекту Тогда

			Попытка

				ОписательЭлемента = СоздатьОписательЭлементаПоСсылке(Ссылка, МассивИмен, ДанныеОбъекта);

				МассивДанных.Добавить(ОписательЭлемента);

				Если ВыгружатьСДокументомЕгоДвижения
					И Метаданные.Документы.Содержит(Ссылка.Метаданные()) Тогда

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

						Движение.Прочитать();

						Если мНаличиеВыгрузкиПодчиненныхОбъектов
							И Движение.Количество() > 0 Тогда

							ТипРегистра = Тип(Движение);

							МассивКолонок = мСоответствиеКолонокДвижений.Получить(ТипРегистра);

							Если МассивКолонок = Неопределено Тогда

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

							КонецЕсли;

							ВыгрузитьПодчиненныеЗначенияНабора(Движение, МассивКолонок, ОбъектыВыгруженныеСОшибками, массивДанных);

							ОписательЭлемента = СоздатьОписательЭлементаПоНаборуЗаписей(Движение, МассивИмен);
							МассивДанных.Добавить(ОписательЭлемента);
						КонецЕсли;

					КонецЦикла;

				КонецЕсли;

			Исключение

				СтрокаОписанияОшибки = ОписаниеОшибки();
				//не смогли записать в XML
				// возможно проблема с недопустимыми символами в XML

				ИтоговаяСтрокаСообщения = "Ошибка при выгрузке объекта: " + Строка(Ссылка) + " Тип: " + Строка(ТипЗнч(Ссылка)) + "
				|" + СтрокаОписанияОшибки;

				Сообщить(ИтоговаяСтрокаСообщения);

				ВызватьИсключение ИтоговаяСтрокаСообщения;

			КонецПопытки;

		КонецЕсли;

		Если ЗапросВерхнегоУровня Тогда

			ОбработаноОбъектов = ОбработаноОбъектов + 1;
			Если ОбработаноОбъектов % 100 = 0 Тогда
				ОбработаноОбъектов = 0;
			КонецЕсли;

		КонецЕсли;

	КонецЦикла;

//	ОкноИсполненияОбработано = ОкноИсполненияОбработано + ОбработаноОбъектов;

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

Функция СсылкаВыгружена(Ссылка)

	Возврат мВыгруженныеОбъекты.Найти(Ссылка, ВернутьЗначениеСоответствия("Ссылка")) <> Неопределено;

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

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

	СтрокаДобавления = мВыгруженныеОбъекты.Добавить();
	СтрокаДобавления[ВернутьЗначениеСоответствия("Ссылка")] = Ссылка;

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

// Функция определяет общее количество произведенных записей констант + объектного типа + наборов записей
//
// Возврат - общее количество произведенных записей

[Assistant] Функция ПолучитьРезультатЗапросаСОграничениями(СтрокаДереваМетаданных)


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

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

Функция ИмяФункции(Знач ОжидаемаяДлина) Экспорт

	Перем ФактическаяДлина;

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

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

		СообщениеОшибки = "Утверждение ""ИмеетДлину"" не умеет работать с типом <"
			+ ТипПроверяемогоЗначения + ">." + ФорматДСО(ДопСообщениеОшибки);
		ВызватьИсключение СообщениеОшибки;

	КонецЕсли;

	Если Не ЛогическоеВыражениеВерно(ФактическаяДлина = ОжидаемаяДлина) Тогда

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

	КонецЕсли;

	Возврат ЭтотОбъект;

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

Функция ВыбрасываетИсключение(Знач ФрагментИсключения = "") Экспорт
	Контекст = ПроверяемоеЗначение;
	СтрокаПараметры = "";
	Если ТипЗнч(ПараметрыМетода) = Тип("Массив") Тогда
		Для Сч = 0 По ПараметрыМетода.Количество() - 1 Цикл
			СтрокаПараметры = СтрокаПараметры + ",ПараметрыМетода[" + Сч + "]";
		КонецЦикла;
		СтрокаПараметры = Сред(СтрокаПараметры, 2);
	ИначеЕсли ТипЗнч(ПараметрыМетода) = Тип("Строка") Тогда
		СтрокаПараметры = """" + ПараметрыМетода + """";
	ИначеЕсли ТипЗнч(ПараметрыМетода) = Тип("Число") Тогда
		СтрокаПараметры = Строка( ПараметрыМетода );
	КонецЕсли;
	СтрокаДляВыполнения = "Контекст." + ИмяМетода + "(" + СтрокаПараметры + ")";

	ИсключениеВозникло = Ложь;
	Попытка
		Выполнить(СтрокаДляВыполнения);
	Исключение
		ИсключениеВозникло = Истина;
		ТекстИсключения = ОписаниеОшибки();
	КонецПопытки;

	Если Не ЛогическоеВыражениеВерно(ИсключениеВозникло И Найти(ТекстИсключения, ФрагментИсключения) > 0) Тогда
		СообщениеОшибки = "Ожидали, что " + СтрокаДляВыполнения
			+ ?(ФлагОтрицания, " НЕ ", " ")
			+ "ВЫБРОСИТ ИСКЛЮЧЕНИЕ"
			+ ?(ЗначениеЗаполнено(ФрагментИсключения), " СОДЕРЖАЩЕЕ ТЕКСТ <" + ФрагментИсключения + ">, а был текст <" + ТекстИсключения + ">.", "");
		ВызватьОшибкуПроверки(СообщениеОшибки);
	КонецЕсли;

	Возврат ЭтотОбъект;
КонецФункции

// { Helpers

Функция ФорматДСО(Знач ДопСообщениеОшибки)
	Если ДопСообщениеОшибки = "" Тогда
		Возврат "";
	КонецЕсли;

	Возврат Символы.ПС + ДопСообщениеОшибки;
КонецФункции

Процедура ВызватьОшибкуПроверки(Знач СообщениеОшибки)
	Префикс = "["+ СтатусыРезультатаТестирования.ОшибкаПроверки + "]";
	ВызватьИсключение Префикс + " " + СообщениеОшибки;
КонецПроцедуры

Функция ЛогическоеВыражениеВерно(Знач ЛогическоеВыражение)
	Результат = ФлагОтрицания <> ЛогическоеВыражение;
	ФлагОтрицанияДляСообщения = ФлагОтрицания;
	ФлагОтрицания = Ложь;

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

Функция СформироватьСообщениеОбОшибке(Знач ПроверяемоеЗначение, Знач Ожидание)
	Возврат "Ожидали, что проверяемое значение (" + ПроверяемоеЗначение + ")" + ?(ФлагОтрицанияДляСообщения, " НЕ ", " ") + Ожидание + ФорматДСО(ДопСообщениеОшибки);
КонецФункции

Процедура ПроверитьЧтоМногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Знач Строка, Знач Подстрока, ДопСообщениеОшибки = "")
	СообщениеОшибки = "";
	Нашли = МногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Строка, Подстрока, СообщениеОшибки);
	Если Не Нашли Тогда
		ВызватьОшибкуПроверки( СтрШаблон_("Ожидали, что в строке <
		|%1
		|>
		|найдем подстроку<
		|%2
		|>
		|А это не так.
		|Уточнение: %3.
		|%4", Строка, Подстрока, СообщениеОшибки, ДопСообщениеОшибки));
	КонецЕсли;
КонецПроцедуры

Функция МногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Знач Строка, Знач Подстрока, СообщениеОшибки = "")
	ПерваяСтрока = СокрЛП(СтрПолучитьСтроку(Подстрока, 1));
	НашлиПервуюСтроку = Ложь;
	Для Счетчик = 1 По СтрЧислоСтрок(Строка) Цикл
		ОчереднаяСтрока = СокрЛП(СтрПолучитьСтроку(Строка, Счетчик));
		НашлиПервуюСтроку = Найти(ОчереднаяСтрока, ПерваяСтрока) <> 0;
		Если НашлиПервуюСтроку Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Не НашлиПервуюСтроку Тогда
		СообщениеОшибки = СтрШаблон_("Не нашли первую же подстроку <%1>", ПерваяСтрока);
		Возврат Ложь;
	КонецЕсли;

	СчетчикЧтоИщем = 2;
	Для Счетчик = Счетчик + 1 По СтрЧислоСтрок(Строка) Цикл
		ОчереднаяСтрока = СокрЛП(СтрПолучитьСтроку(Строка, Счетчик));
		ЧтоИщем = СокрЛП(СтрПолучитьСтроку(Подстрока, СчетчикЧтоИщем));
		Поз = Найти(ОчереднаяСтрока, ЧтоИщем);
		Если Поз = 0 Тогда
			СообщениеОшибки = СтрШаблон_("Не нашли подстроку № %1 <%2>", СчетчикЧтоИщем, ЧтоИщем);
			Возврат Ложь;
		Иначе
			СчетчикЧтоИщем  = СчетчикЧтоИщем  + 1;
			Если СчетчикЧтоИщем > СтрЧислоСтрок(Подстрока) Тогда
				Возврат Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Возврат СчетчикЧтоИщем > СтрЧислоСтрок(Подстрока);
КонецФункции

// Замена функции СтрШаблон на конфигурациях с режимом совместимости < 8.3.6
// При внедрении в конфигурацию с режимом совместимости >= 8.3.6 данную функцию необходимо удалить
//

Функция СтрШаблон_(Знач СтрокаШаблон, Знач Парам1 = Неопределено, Знач Парам2 = Неопределено,
		Знач Парам3 = Неопределено, Знач Парам4 = Неопределено) Экспорт

	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(Парам1);
	МассивПараметров.Добавить(Парам2);
	МассивПараметров.Добавить(Парам3);
	МассивПараметров.Добавить(Парам4);

	Для Сч = 1 По МассивПараметров.Количество() Цикл
		ТекЗначение = МассивПараметров[Сч-1];
		СтрокаШаблон = СтрЗаменить(СтрокаШаблон, "%"+Сч, Строка(ТекЗначение));
	КонецЦикла;
	Возврат СтрокаШаблон;
КонецФункции

Функция ЭтоКоллекция(ТипЗначения)

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

	Возврат ТипыКоллекций.Найти(ТипЗначения) <> Неопределено;

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

// } Helpers

СтатусыРезультатаТестирования = Новый Структура;
СтатусыРезультатаТестирования.Вставить("ОшибкаПроверки", "Failed");
СтатусыРезультатаТестирования.Вставить("НеизвестнаяОшибка", "Broken");
СтатусыРезультатаТестирования.Вставить("ТестПропущен", "Pending");
СтатусыРезультатаТестирования = Новый ФиксированнаяСтруктура(СтатусыРезультатаТестирования);

[Assistant] Функция ИмеетДлину(Знач ОжидаемаяДлина)


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

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

#Использовать v8runner
#Использовать cmdline
#Использовать logos
#Использовать 1commands
#Использовать "."

Перем ВозможныеКоманды;
Перем Лог;
Перем ЭтоWindows;

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

	Лог = Логирование.ПолучитьЛог("oscript.app.vanessa-runner");
	Лог.УстановитьРаскладку(ЭтотОбъект);

	СистемнаяИнформация = Новый СистемнаяИнформация;
	ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0;

	УровеньЛога = Лог.Уровень();

	ВозможныеКоманды = Новый Структура("file, server", "file", "server");
	Парсер = Новый ПарсерАргументовКоманднойСтроки();
	Лог1 = Логирование.ПолучитьЛог("oscript.lib.cmdline");
	Лог1.УстановитьУровень(УровеньЛога);

	Парсер.ДобавитьИменованныйПараметр("--tag", "Тэг для запуска", Истина); //
	Парсер.ДобавитьИменованныйПараметр("--path", "Путь для запуска тестов", Истина);
	Парсер.ДобавитьИменованныйПараметр(Исходники.КлючКаталогБинарныхФайлов(), "Каталог сборки исходников");
	Парсер.ДобавитьИменованныйПараметр("--settings", "Файл настроек ванессы", Истина);

	ОписаниеКоманды = Парсер.ОписаниеКоманды("all");
	Парсер.ДобавитьКоманду(ОписаниеКоманды);

	ОписаниеКоманды = Парсер.ОписаниеКоманды("debug");
	Парсер.ДобавитьКоманду(ОписаниеКоманды);

	Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки);

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

	СтрокаЗапуска = "runner vanessa";

	Если Аргументы.ЗначенияПараметров.Получить("--tag") <> Неопределено Тогда
		УстановитьПеременнуюСреды("VANESSA_FILTERTAGS", Аргументы.ЗначенияПараметров["--tag"]);
	КонецЕсли;

	Если Аргументы.ЗначенияПараметров.Получить("--path") <> Неопределено Тогда
		УстановитьПеременнуюСреды("VANESSA_FEATUREPATH", Аргументы.ЗначенияПараметров["--path"]);
	КонецЕсли;

	Если Аргументы.ЗначенияПараметров.Получить("--settings") <> Неопределено Тогда
		СтрокаЗапуска = СтрШаблон("%1 %2", СтрокаЗапуска, "--vanessasettings " + Аргументы.ЗначенияПараметров["--settings"]);
	КонецЕсли;

	Если НЕ ЭтоWindows Тогда
		Если ЗначениеЗаполнено(ПолучитьПеременнуюСреды("WAYLAND_DISPLAY")) Тогда
			УстановитьПеременнуюСреды("VANESSA_commandscreenshot",
				"dbus-send --type=method_call --print-reply --dest=org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot org.gnome.Shell.Screenshot.Screenshot boolean:true boolean:false string:");
		Иначе
			УстановитьПеременнуюСреды("VANESSA_commandscreenshot", "import -window root ");
		КонецЕсли;
	КонецЕсли;

	БезОжидания = Ложь;
	Если (Аргументы.Команда = "debug") Тогда
		БезОжидания = Истина;
		УстановитьПеременнуюСреды("VANESSA_vanessashutdown", "false");
		УстановитьПеременнуюСреды("VANESSA_startfeatureplayer", "false");
	КонецЕсли;

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

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

Функция ЗапуститьИПодождать(СтрокаЗапуска, БезОжидания = Ложь)
	ЗаписьXML = Новый ЗаписьXML();
	ЗаписьXML.УстановитьСтроку();

	Процесс = СоздатьПроцесс(СтрокаЗапуска, "./", Истина, Истина);
	Попытка
		Процесс.Запустить();
	Исключение
		Если ЭтоWindows Тогда
			ШаблонЗапуска = "cmd /c %1";
		Иначе
			ШаблонЗапуска = "sh -c '%1'";
		КонецЕсли;
		Процесс = СоздатьПроцесс(СтрШаблон(ШаблонЗапуска, СтрокаЗапуска), "./", Истина, Истина);
		Процесс.Запустить();
	КонецПопытки;

	Если БезОжидания Тогда
		Возврат Новый Структура("КодВозврата, Результат", 0, "");
	КонецЕсли;
	ПериодОпросаВМиллисекундах = 1000;
	Если ПериодОпросаВМиллисекундах <> 0 Тогда
		Приостановить(ПериодОпросаВМиллисекундах);
	КонецЕсли;
	Пока НЕ Процесс.Завершен ИЛИ Процесс.ПотокВывода.ЕстьДанные ИЛИ Процесс.ПотокОшибок.ЕстьДанные Цикл
		//Сообщить(""+ ТекущаяДата() + " Завершен:"+Строка(Процесс.Завершен) + Строка(Процесс.ПотокВывода.ЕстьДанные) + Строка(Процесс.ПотокОшибок.ЕстьДанные) );
		Если ПериодОпросаВМиллисекундах <> 0 Тогда
			Приостановить(ПериодОпросаВМиллисекундах);
		КонецЕсли;

		ОчереднаяСтрокаВывода = Процесс.ПотокВывода.Прочитать();
		ОчереднаяСтрокаОшибок = Процесс.ПотокОшибок.Прочитать();

		Если Не ПустаяСтрока(ОчереднаяСтрокаВывода) Тогда
			ОчереднаяСтрокаВывода = СтрЗаменить(ОчереднаяСтрокаВывода, Символы.ВК, "");
			Если ОчереднаяСтрокаВывода <> "" Тогда
				Лог.Информация("%1", ОчереднаяСтрокаВывода);
				ЗаписьXML.ЗаписатьБезОбработки(ОчереднаяСтрокаВывода);
			КонецЕсли;
		КонецЕсли;

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

			Если ОчереднаяСтрокаОшибок <> "" Тогда
				//Сообщить(ОчереднаяСтрокаОшибок);
				Лог.Информация("%1", ОчереднаяСтрокаОшибок);
				ЗаписьXML.ЗаписатьБезОбработки(ОчереднаяСтрокаОшибок);
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;

	ОчереднаяСтрока = СтрЗаменить(Процесс.ПотокВывода.Прочитать(), Символы.ВК, "");
	Лог.Информация("%2%1", ОчереднаяСтрока, Символы.ПС);
	ЗаписьXML.ЗаписатьБезОбработки(ОчереднаяСтрока);
	РезультатРаботыПроцесса = ЗаписьXML.Закрыть();

	Возврат Новый Структура("КодВозврата, Результат", Процесс.КодВозврата, РезультатРаботыПроцесса);

КонецФункции // ЗапуститьИПодождать(СтрокаЗапуска)

Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт

	Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);

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

ИнициализацияВанесса();

[Assistant] Процедура ИнициализацияВанесса()


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

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

Функция ИмяФункции()

	Если мВозможныеКоманды = Неопределено Тогда
		//Работаем в 8.3.8, внешние обработки как исходники и только исходники.
		мВозможныеКоманды = Новый Структура;
		мВозможныеКоманды.Вставить("ИнициализацияОкружения", "init-dev");
		мВозможныеКоманды.Вставить("ОбновлениеОкружения", "update-dev");
		мВозможныеКоманды.Вставить("СозданиеБазы", "create");
		мВозможныеКоманды.Вставить("Помощь", "--help");
	КонецЕсли;

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

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

Процедура ВывестиСправку()

	Сообщить("Утилита для инициализации окружения разработчика для доработки vanessa");
	Сообщить(" ");
	Сообщить("Параметры командной строки:");

	Сообщить(" init-dev");
	Сообщить("     инициализируем пустую базу данных для выполнения необходимых тестов");
	Сообщить("     указываем путь к исходниками с конфигурацией");
	Сообщить("     указываем версию платформы которую хотим использовать");
	Сообщить("     и получаем по пути build\ib готовую базу для тестирования. ");

	Сообщить(" update-dev");
	Сообщить("     обновляет пустую базу данных для выполнения необходимых тестов");
	Сообщить("     указываем путь к исходниками с конфигурацией");
	Сообщить("     указываем версию платформы которую хотим использовать");
	Сообщить("     и получаем по пути build\ib готовую базу для тестирования. ");

	Сообщить(" общие для всех параметры");
	Сообщить("       --v8version Маска версии платформы (8.3, 8.3.5, 8.3.6.2299 и т.п.)");
	Сообщить(" общие для xunit, vaness, tests, compilecurrent, decompilecurrent, run, dbupdate");
	Сообщить("       --ibconnection строка подключения к базе данных");
	Сообщить("       --db-user имя пользователя для подключения к базе");
	Сообщить("       --db-pwd пароль пользователя");

	Сообщить("	--help");
	Сообщить("		Показ этого экрана");

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

Процедура ДобавитьОписаниеКомандыИнициализацияОкружения(Знач Парсер)
	ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().ИнициализацияОкружения);
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--src", "Путь к папке исходников");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--dt", "Путь к файлу с dt выгрузкой");
	Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--dev", "Признак dev режима, создаем и загружаем автоматом структуру конфигурации");
	Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--storage", "Признак обновления из хранилища");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver",	"Номер версии, по умолчанию берем последнюю");
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры

Процедура ДобавитьОписаниеКомандыОбновлениеОкружения(Знач Парсер)
	ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().ОбновлениеОкружения);
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--src", "Путь к папке исходников");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--dt", "Путь к файлу с dt выгрузкой");
	Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--dev", "Признак dev режима, создаем и загружаем автоматом структуру конфигурации");
	Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--storage", "Признак обновления из хранилища");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver",	"Номер версии, по умолчанию берем последнюю");
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры

Процедура ДобавитьОписаниеКомандыСоздатьБазу(Знач Парсер)
	ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().СозданиеБазы);

	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--connstring", "Строка подключения/создания базы данных");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--addinlist", "Имя названия подключения к базе");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--usetemplate", "Использовать файл шаблона");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--language", "Код языка запуска");
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры

Процедура ДобавитьОписаниеКомандыПомощь(Знач Парсер)
	ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Помощь);
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры

Процедура ДополнитьАргументыИзПеременныхОкружения(ЗначенияПараметров = Неопределено, СоответствиеПеременных)

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

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

Функция ЗапуститьПроцесс(Знач СтрокаВыполнения)
	Перем ПаузаОжиданияЧтенияБуфера;

	ПаузаОжиданияЧтенияБуфера = 10;

	Лог.Отладка(СтрокаВыполнения);
	Процесс = СоздатьПроцесс(СтрокаВыполнения,,Истина);
	Процесс.Запустить();

	ТекстБазовый = "";
	Счетчик = 0; МаксСчетчикЦикла = 100000;

	Пока Истина Цикл
		Текст = Процесс.ПотокВывода.Прочитать();
		Лог.Отладка("Цикл ПотокаВывода "+Текст);
		Если Текст = Неопределено ИЛИ ПустаяСтрока(СокрЛП(Текст))  Тогда
			Прервать;
		КонецЕсли;
		Счетчик = Счетчик + 1;
		Если Счетчик > МаксСчетчикЦикла Тогда
			Прервать;
		КонецЕсли;
		ТекстБазовый = ТекстБазовый + Текст;

		sleep(ПаузаОжиданияЧтенияБуфера); //Подождем, надеюсь буфер не переполниться.

	КонецЦикла;

	Процесс.ОжидатьЗавершения();

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

		Иначе
			ТекстБазовый = ТекстБазовый + Текст;
		КонецЕсли;
		Лог.Отладка(ТекстБазовый);
		Возврат ТекстБазовый;
	Иначе
		ВызватьИсключение "Сообщение от процесса
		| код:" + Процесс.КодВозврата + " процесс: "+ Процесс.ПотокОшибок.Прочитать();
	КонецЕсли;

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

Функция ПрочитатьФайлИнформации(Знач ПутьКФайлу)

	Текст = "";
	Файл = Новый Файл(ПутьКФайлу);
	Если Файл.Существует() Тогда
		Чтение = Новый ЧтениеТекста(Файл.ПолноеИмя);
		Текст = Чтение.Прочитать();
		Чтение.Закрыть();
	Иначе
		Текст = "Информации об ошибке нет";
	КонецЕсли;

	Лог.Отладка("файл информации:
	|"+Текст);
	Возврат Текст;

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

Процедура ОбеспечитьКаталог(Знач Каталог)

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

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

[Assistant] Функция ВозможныеКоманды()


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

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

Процедура ИмяФункции(Макет, ОписательОбъекта, ШапкаДанных, МассивДанных, Объект)
	НомерСтрокиМакета = Макет.ВысотаТаблицы+1;

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

	ДобавитьДопСвойстваВМакет(Макет, ШапкаДанных, "Режим", ДопСвойства);
КонецПроцедуры

Процедура ДобавитьМетаданныеВМакетДляДобавляемогоОбъекта(Макет, ОписательОбъекта, ШапкаДанных, НомерСтрокиМакета, Мд)
	НомерКолонкиМакета_Тип = ШапкаДанных.Тип;
	ОбластьМакета = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_Тип, НомерСтрокиМакета, НомерКолонкиМакета_Тип);
	ОбластьМакета.Текст = ПолучитьКорневойТипКонфигурации_ирЛкс(Мд);

	НомерКолонкиМакета_Вид = ШапкаДанных.Вид;
	ОбластьМакета = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_Вид, НомерСтрокиМакета, НомерКолонкиМакета_Вид);
	ОбластьМакета.Текст = Мд.Имя;

	НомерКолонкиМакета_ИмяПеременной = ШапкаДанных.ИмяПеременной;
	ОбластьМакета = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_ИмяПеременной, НомерСтрокиМакета, НомерКолонкиМакета_ИмяПеременной);

	ИмяПеременной = ИмяПеременнойИзОписателяОбъекта(Мд, ОписательОбъекта);
	ОбластьМакета.Текст = ИмяПеременной;

	НомерКолонкиМакета_Режим = ШапкаДанных.Режим;
	ОбластьМакета_Режим = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_Режим, НомерСтрокиМакета, НомерКолонкиМакета_Режим);
	ОбластьМакета_Режим.Текст = ОписательОбъекта.РежимСоздания;

	НомерКолонкиМакета_Значение = ШапкаДанных.Значение;
	ОбластьМакета_Значение = Макет.Область(НомерСтрокиМакета, НомерКолонкиМакета_Значение, НомерСтрокиМакета, НомерКолонкиМакета_Значение);
	ОбластьМакета_Значение.Текст = ОписательОбъекта.Значение;
КонецПроцедуры

[Assistant] Процедура ДобавитьДополнительныеСвойства(Макет, ОписательОбъекта, ШапкаДанных, МассивДанных, Объект)


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

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

Процедура ИмяФункции(ЭлементДЗ)

	Если ЭлементДЗ = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если (ЭлементДЗ.ЭлементОписания <> Неопределено) И ЭлементДЗ.ЭлементОписания.Выгружаемый Тогда
		Возврат; // обновляем вверх или до корня, или до первого встретившегося выгружаемого
	КонецЕсли;

	Состояние = Неопределено;
	Для Каждого ПодчиненныйЭлементДЗ Из ЭлементДЗ.Строки Цикл

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

	КонецЦикла;

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

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

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

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

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

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

	Если ЕстьДопОтборы Тогда

		НастройкиКомпоновщикаXDTO = СериализаторXDTO.ЗаписатьXDTO(СтрокаДереваМетаданных.НастройкиКомпоновщика);
		СКДXDTO = СериализаторXDTO.ЗаписатьXDTO(СхемаКомпоновкиДанных);
		СКДXDTO.defaultSettings = СКДXDTO.settingsVariant[0].settings;
		СКДXDTO.defaultSettings.filter = НастройкиКомпоновщикаXDTO;
		СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXDTO(СКДXDTO);

	КонецЕсли;

	ПараметрДатаНачала = Новый ПараметрКомпоновкиДанных("ДатаНачала");
	ПараметрДатаОкончания = Новый ПараметрКомпоновкиДанных("ДатаОкончания");

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

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

	Возврат СхемаКомпоновкиДанных; //ПостроительОтчета;

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

Функция ПолучитьТекстЗапросаПоСтроке(СтрокаДереваМетаданных, ЕстьДопОтборы, СтрокаПолейДляВыборки = "") Экспорт

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

	Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда

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

	ИначеЕсли   Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)
		ИЛИ Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда

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

	КонецЕсли;

	ЕстьОграничениеПоДатам = ЗначениеЗаполнено(ДатаНачала) Или ЗначениеЗаполнено(ДатаОкончания);

	Если НЕ ЗначениеЗаполнено(СтрокаПолейДляВыборки) Тогда
		СтрокаПолейДляВыборки = "_.*";
	КонецЕсли;

	ТекстЗапроса = "ВЫБРАТЬ Разрешенные " + СтрокаПолейДляВыборки + " ИЗ " + ИмяМетаданных + " КАК _ ";

	// возможно нужно ограничение по датам установить
	Если ЕстьОграничениеПоДатам Тогда

		Если ЕстьДопОтборы И
			НЕ ИспользоватьОтборПоДатеДляВсехОбъектов Тогда

			Возврат ТекстЗапроса;

		КонецЕсли;

		ДопОграничениеПоДате = "";

		// можно ли для данного объекта МД сторить ограничения по датам
		Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда

			ДопОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(ОбъектМетаданных, "Документ");

		ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных)
			ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда

			ДопОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(ОбъектМетаданных, "Регистр");

		КонецЕсли;

		ТекстЗапроса = ТекстЗапроса + Символы.ПС + ДопОграничениеПоДате;

	КонецЕсли;

	Возврат  ТекстЗапроса;

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

Функция ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, ИмяТипа) Экспорт

	ИтоговоеОграничениеПоДате = "";
	ИмяАлиасаТаблицы = "_";

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

	ИмяПоляОграничения = ИмяАлиасаТаблицы + "." + ?(ИмяТипа = "Документ", "Дата", "Период");

	Если ЗначениеЗаполнено(ДатаНачала) Тогда

		ИтоговоеОграничениеПоДате = "
		|	ГДЕ
		|		" + ИмяПоляОграничения + " >= &ДатаНачала";

	КонецЕсли;

	Если ЗначениеЗаполнено(ДатаОкончания) Тогда

		Если ПустаяСтрока(ИтоговоеОграничениеПоДате) Тогда

			ИтоговоеОграничениеПоДате = "
			|	ГДЕ
			|		" + ИмяПоляОграничения + " <= &ДатаОкончания";

		Иначе

			ИтоговоеОграничениеПоДате = ИтоговоеОграничениеПоДате + "
			|	И
			|		" + ИмяПоляОграничения + " <= &ДатаОкончания";

		КонецЕсли;

	КонецЕсли;

	Возврат ИтоговоеОграничениеПоДате;

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

[Assistant] Процедура ОбновитьСостояниеВыгружатьПриНеобходимости(ЭлементДЗ)


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

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

Процедура ИмяФункции(ЭлементДЗ, КоллекцияУжеИспользованныхЭлементовДЗ, Знач Уровень, Знач МаксимальныйУровень)
	Если Уровень > МаксимальныйУровень Тогда
		Возврат;
	КонецЕсли;

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

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

	Уровень = Уровень + 1;
	Если Уровень > МаксимальныйУровень Тогда
		Возврат;
	КонецЕсли;

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

		ТипИОбъект = СсылочныеТипы.Получить(СсылочныйТип);
		Если ТипИОбъект = Неопределено Тогда

			ВызватьИсключение("Внутреняя ошибка. Неполное заполнение структуры ссылочных типов - " + СсылочныйТип);

		КонецЕсли;

		ОбъектМД = ТипИОбъект;
		СтрокаДЗ = ЭлементДЗПоОбъектуМД(ОбъектМД);
		Если СтрокаДЗ = Неопределено Тогда

			ВызватьИсключение("Внутреняя ошибка. Неполное заполнение дерева метаданных. Отсутствует объект, образующий тип - " + СсылочныйТип);

		КонецЕсли;

		Если СтрокаДЗ.Выгружать = 1
			И СтрокаДЗ.ВыгружатьПриНеобходимости = 1 Тогда

			Продолжить;

		КонецЕсли;

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

	КонецЦикла;

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

// Функция возвращает массив типов, которые могут иметь поля записи объекта метаданных, соответствующего строке дерева
//
// Параметры
//   ЭлементДЗ - строка дерева метаданных
// Возврат - массив потенциально используемых соответствующей записью типов
//

Функция ПолучитьВсеТипы(ЭлементДЗ)

	ОбъектМД = ЭлементДЗ.ОбъектМД;
	Если ТипЗнч(ОбъектМД) <> Тип("ОбъектМетаданных")
		И ТипЗнч(ОбъектМД) <> Тип("ОбъектМетаданныхКонфигурация") Тогда

		ВызватьИсключение("Внутреняя ошибка обработки выгрузки");

	КонецЕсли;

	Возврат ПолучитьТипыИспользуемыеОМД(ОбъектМД, ЭлементДЗ.ЭлементОписания);

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

// Функция возвращает строку дерева метаданных, соответствующую переданному объекту метаданных
// Поиск осуществляется по всему дереву метаданных
//
// Параметры
//   ОбъектМД - описание метаданного
// Возврат - строка дерева метаданных
//

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

// Функция возвращает массив типов, которые могут иметь поля записи объекта метаданных
//
// Параметры
//   ОбъектМД - описание метаданного
//   ЭлементОписания - описание класса объекта метаданного
// Возврат - массив потенциально используемых соответствующей записью типов
//

Функция ПолучитьТипыИспользуемыеОМД(ОбъектМД, ЭлементОписания)

	ВсеТипы = Новый Массив;

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

		ЗначениеСвойства = ОбъектМД[Свойство.Значение];
		Если ТипЗнч(ЗначениеСвойства) = Тип("КоллекцияЗначенийСвойстваОбъектаМетаданных") И ЗначениеСвойства.Количество() > 0 Тогда

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

				СсылочныйТипКлючИЗначение = СоответствиеОбъектовМетаданныхИСсылочныхТипов[СтрокаКоллекции];

				Если СсылочныйТипКлючИЗначение <> Неопределено Тогда

					ДобавитьВМассивЕслиУникальный(ВсеТипы, СсылочныйТипКлючИЗначение);

				КонецЕсли;

			КонецЦикла;

		ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("ОбъектМетаданных") Тогда

			Для Каждого СсылочныйТипКлючИЗначение Из СсылочныеТипы Цикл

				Если ЗначениеСвойства = СсылочныйТипКлючИЗначение.Значение Тогда
					ДобавитьВМассивЕслиУникальный(ВсеТипы, СсылочныйТипКлючИЗначение.Ключ);
				КонецЕсли;

			КонецЦикла;

		КонецЕсли;

	КонецЦикла;

	Если КлассМДТипизированный(ЭлементОписания) Тогда

		ОписаниеТипа = ОбъектМД.Тип;
		Для Каждого ОдинТип Из ОписаниеТипа.Типы() Цикл

			Если СсылочныйТип(ОдинТип) Тогда
				ДобавитьВМассивЕслиУникальный(ВсеТипы, ОдинТип);
			КонецЕсли;

		КонецЦикла;

	Иначе

		Если Метаданные.РегистрыСведений.Содержит(ОбъектМД) Или
			Метаданные.РегистрыНакопления.Содержит(ОбъектМД) Или
			Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМД) Или
			Метаданные.РегистрыРасчета.Содержит(ОбъектМД) Тогда

			// какой-то из регистров, ищем в возможных регистраторах
			Для Каждого ДокументМД Из Метаданные.Документы Цикл

				Если ДокументМД.Движения.Содержит(ОбъектМД) Тогда

					ДобавитьВМассивЕслиУникальный(ВсеТипы, ТипЗнч(Документы[ДокументМД.Имя].ПустаяСсылка()));

				КонецЕсли;

			КонецЦикла;

		 // нужно для иерархических метаданных и подгрузки родителей
		ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМД) И ОбъектМД.Иерархический Тогда
			ДобавитьВМассивЕслиУникальный(ВсеТипы, ТипЗнч(Справочники[ОбъектМД.Имя].ПустаяСсылка()));
		ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМД) И ОбъектМД.Иерархический Тогда
			ДобавитьВМассивЕслиУникальный(ВсеТипы, ТипЗнч(ПланыВидовХарактеристик[ОбъектМД.Имя].ПустаяСсылка()));
		КонецЕсли;

	КонецЕсли;

	Для Каждого ПодчиненныйКласс Из ЭлементОписания.Строки Цикл

		Для Каждого ПодчиненныйОбъектМД Из ОбъектМД[ПодчиненныйКласс.Класс] Цикл

			ТипыПодчиненного = ПолучитьТипыИспользуемыеОМД(ПодчиненныйОбъектМД, ПодчиненныйКласс);
			Для Каждого ОдинТип Из ТипыПодчиненного Цикл
				ДобавитьВМассивЕслиУникальный(ВсеТипы, ОдинТип);
			КонецЦикла;

		КонецЦикла;

	КонецЦикла;

	Возврат ВсеТипы;

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

// Функция возвращает строку дерева метаданных, соответствующую переданному объекту метаданных
// Поиск осуществляется среди строк, подчиненных переданной
//
// Параметры
//   СтрокаДЗ - строка дерева метаданных, от которй осуществляется поиск
//   ОбъектМД - описание метаданного
// Возврат - строка дерева метаданных
//

Функция ЭлементДЗПоОбъектуМДИСтроке(СтрокаДЗ, ОбъектМД)

	Возврат СтрокаДЗ.Строки.Найти(ОбъектМД, "ОбъектМД", Истина);

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

// Процедура добавляет в массив новый элемент, если он является уникальным
//
// Параметры
//   Массив - исследуемый тип
//   Элемент - добавляемый элемент
//

Процедура ДобавитьВМассивЕслиУникальный(Массив, Элемент)

	Если Массив.Найти(Элемент) = Неопределено Тогда
		Массив.Добавить(Элемент);
	КонецЕсли;

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

// Функция определяет, являются ли объекты данного класса метаданных типизированными
//
// Параметры
//   Описание - Описание класса
// Возврат - Истина, если объекты данного класса метаданных типизированы, Ложь в противном случае
//

Функция КлассМДТипизированный(Описание)

	Для Каждого Свойство Из Описание.Свойства Цикл
		Если Свойство.Значение = "Тип" Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;

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

Функция КлассМДИерархический(ОбъектМД)
	Рез = Ложь;
	Если ОбъектМД = Неопределено Тогда

	ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМД) И ОбъектМД.Иерархический Тогда
		Рез = Истина;
	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМД) И ОбъектМД.Иерархический Тогда
		Рез = Истина;
	КонецЕсли;

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

// Функция определяет, являются ли тип ссылочным
//
// Параметры
//   Тип - исследуемый тип
// Возврат - Истина, если тип ссылочный, Ложь в противном случае
//

Функция СсылочныйТип(Тип)

	МетаданныеТипа = СсылочныеТипы.Получить(Тип);
	Возврат МетаданныеТипа <> Неопределено;

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

[Assistant] Процедура УстановкаСостоянияВыгружатьПриНеобходимости(ЭлементДЗ, КоллекцияУжеИспользованныхЭлементовДЗ, Знач Уровень, Знач МаксимальныйУровень)


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

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

Процедура ИмяФункции(массивДанных)

	ОбработанныхКонстант = 0;
	ОбработанныхНаборовЗаписей = 0;

	ОбъектыВыгруженныеСОшибками = Новый Соответствие;
	СоставВыгрузки();

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

	Если ОбъектыВыгруженныеСОшибками = Неопределено Тогда
		ОбъектыВыгруженныеСОшибками = Новый Соответствие;
	КонецЕсли;

	//ОкноИсполнения = ПолучитьФорму("ОкноИсполнения");
	//ОкноИсполненияОбщееКоличество = 1;
	//ОкноИсполненияОбработано = 0;
	//ОкноИсполнения.Открыть();

	Попытка

		Для Каждого СтрокаТаблицыВыгрузки Из СоставПолнойВыгрузки Цикл

			СтрокаДереваМетаданных = СтрокаТаблицыВыгрузки.СтрокаДерева;

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

			Если Метаданные.Константы.Содержит(СтрокаДереваМетаданных.ОбъектМД) Тогда

				//ЗаписьКонстанты(СтрокаДереваМетаданных.ОбъектМД, ОбъектыВыгруженныеСОшибками);

			ИначеЕсли Метаданные.РегистрыСведений.Содержит(СтрокаДереваМетаданных.ОбъектМД) Или
				Метаданные.РегистрыНакопления.Содержит(СтрокаДереваМетаданных.ОбъектМД) Или
				Метаданные.РегистрыРасчета.Содержит(СтрокаДереваМетаданных.ОбъектМД) Тогда

				ЗаписьРегистра(СтрокаДереваМетаданных, ОбъектыВыгруженныеСОшибками,, массивДанных);

			ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(СтрокаДереваМетаданных.ОбъектМД) Тогда

				ЗаписьРегистра(СтрокаДереваМетаданных, ОбъектыВыгруженныеСОшибками, Истина, массивДанных);

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

			ИначеЕсли Метаданные.Последовательности.Содержит(СтрокаДереваМетаданных.ОбъектМД) Тогда

				//ЗаписьПоследовательности(СтрокаДереваМетаданных, ОбъектыВыгруженныеСОшибками);

			Иначе
				ЗаписьДанныхОбъектногоТипа(СтрокаДереваМетаданных, ОбъектыВыгруженныеСОшибками, массивДанных);

			КонецЕсли;

			#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
			#КонецЕсли

		КонецЦикла;

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

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

		//ВыгрузитьДанныеМассиваСсылок(ТекущийМассивСсылок, ТекущееИмяЗапроса, ОбъектыВыгруженныеСОшибками);

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

	//ОкноИсполнения.Закрыть();
	#Если Клиент Тогда
	Состояние();
	#КонецЕсли

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

Процедура ЗаписьДанныхОбъектногоТипа(СтрокаДереваМетаданных, ОбъектыВыгруженныеСОшибками, массивДанных)

	ПодзаголовокОкнаИсполнения = СтрокаДереваМетаданных.ОбъектМД.ПолноеИмя();

	ОкноИсполненияОбщееКоличество = 1;
	//ОкноИсполненияОбработано = 0;

	РезультатЗапроса = ПолучитьРезультатЗапросаСОграничениями(СтрокаДереваМетаданных);

	ЗапросИЗапись(РезультатЗапроса, Истина, ОбъектыВыгруженныеСОшибками, массивДанных);

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

Функция ПолучитьРезультатЗапросаСОграничениями(СтрокаДереваМетаданных)

	СКД = ПодготовитьКомпоновщикДляВыгрузки(СтрокаДереваМетаданных);

	ТаблицаЗначений = Новый ТаблицаЗначений;

	Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
	Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
	Компоновщик.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);

	ПолеГруппировки = Компоновщик.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));

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

	КонецЦикла;

	//#Если Клиент Тогда
	//
	//НастройкиКомпоновщикаXDTO = СериализаторXDTO.ЗаписатьXDTO(Компоновщик.Настройки);
	//СКДXDTO = СериализаторXDTO.ЗаписатьXDTO(СКД);
	//СКДXDTO.defaultSettings = НастройкиКомпоновщикаXDTO;
	//СКД = СериализаторXDTO.ПрочитатьXDTO(СКДXDTO);
	//
	//КонструкторСКД = Новый КонструкторСхемыКомпоновкиДанных(СКД);
	//КонструкторСКД.Редактировать(ПолучитьФорму("Форма"));
	//#КонецЕсли

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

	//Возврат ТаблицаЗначений;
	//ПостроительОтчета.Выполнить();
	//РезультатЗапроса = ПостроительОтчета.Результат;
	//
	Возврат РезультатЗапроса;

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

// Процедура исполняет переданный запрос и записывает полученные через запрос объекты
//
// Параметры
//   Запрос - запрос для исполнения, результат содержит выборку объектов для записи
//   ЗаписьXML - объект, через которых происходит запись объектов ИБ
//   ЗапросВерхнегоУровня - признак необходимости анимации процесса
//

[Assistant] Процедура СоздатьПоМетаданным(массивДанных)