// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

// Процедура очищает основные реквизиты настроек в справочнике, например для тестовых баз и т.д.
Процедура ОчиститьОсновныеРеквизитыНастроекИнтеграции() Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	пбп_НастройкиИнтеграции.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.пбп_НастройкиИнтеграции КАК пбп_НастройкиИнтеграции
		|ГДЕ
		|	НЕ пбп_НастройкиИнтеграции.ЭтоГруппа";

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

	ОчищаемыеРеквизиты = Новый Структура("СтрокаПодключения");
	КоллекцияОшибок = Новый Массив;

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

		Попытка

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

		Исключение

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

			ИнформацияОбОшибке = ИнформацияОбОшибке();

			// Собираем информацию об ошибке для последующего логирования
			ОписаниеОшибки = Новый Структура;
			ОписаниеОшибки.Вставить("Ссылка", ВыборкаДетальныеЗаписи.Ссылка);
			ОписаниеОшибки.Вставить("ПредставлениеДляПользователя",
				ОбработкаОшибок.ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке));
			ОписаниеОшибки.Вставить("ПодробноеОписание",
				ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));

			КоллекцияОшибок.Добавить(ОписаниеОшибки);

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

	КонецЦикла;

	// Логирование результатов обработки
	Если КоллекцияОшибок.Количество() > 0 Тогда

		ИмяСобытия = НСтр("ru = 'Очистка реквизитов настроек интеграции'");

		ТекстОшибки = СтрШаблон("Обработано записей: %1, из них с ошибками: %2%3%3",
			ВыборкаДетальныеЗаписи.Количество(),
			КоллекцияОшибок.Количество(),
			Символы.ПС);

		Для Каждого ОписаниеОшибки Из КоллекцияОшибок Цикл
			ТекстОшибки = ТекстОшибки + СтрШаблон("Настройка: %1%2%3%4%2",
				ОписаниеОшибки.Ссылка,
				Символы.ПС,
				ОписаниеОшибки.ПредставлениеДляПользователя,
				Символы.ПС + "Техническая информация: " + ОписаниеОшибки.ПодробноеОписание);
		КонецЦикла;

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

	КонецЕсли;

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

#КонецОбласти // ПрограммныйИнтерфейс

#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/

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

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

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

	НепроверяемыеРеквизиты = Новый Массив;

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

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

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

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

	пбп_Переадресация.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НепроверяемыеРеквизиты);

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

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

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

		ЗаполнитьРеквизитыНаОснованииЭлементаНаследования(ЭлементНаследования);
	КонецЕсли;

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

		ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();
		ВыборкаРезультатаЗапроса.Следующий();

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

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

Процедура ПриЗаписи(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

#КонецОбласти // ОбработчикиСобытий

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

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

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

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/

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

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

	Если Параметры.Свойство("НастройкаИнтеграции") Тогда
		НастройкаИнтеграции = Параметры.НастройкаИнтеграции;

		Элементы.ГруппаОсновная.Заголовок = СтрШаблон(Элементы.ГруппаОсновная.Заголовок, НастройкаИнтеграции.Наименование);

		Если Параметры.АдресВнешнейКомпоненты = "" Тогда
			ИсточникПравил = "ТиповаяИзКонфигурации";
		Иначе
			ИсточникПравил = "ЗагруженныеИзФайла";

			ИмяФайлаКомпоненты = Параметры.ИмяФайла;
			ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(Параметры.АдресВнешнейКомпоненты);
		КонецЕсли;
	КонецЕсли;

	Элементы.ИсточникФайл.Доступность = (ИсточникПравил = "ЗагруженныеИзФайла");

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

	Элементы.ЗагрузитьВнешнююКомпоненту.Видимость = ДоступноПоРолям;

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

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

#КонецОбласти // ОбработчикиСобытийФормы

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

&НаКлиенте
Процедура ЗагрузитьВнешнююКомпонентуИзФайла(Команда)

	ЗаголовокДиалога = НСтр("ru = 'Укажите файл внешней компоненты'");

	РежимОткрытияДиалога = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытия = Новый ДиалогВыбораФайла(РежимОткрытияДиалога);
	ДиалогОткрытия.Каталог					= "";
	ДиалогОткрытия.Фильтр					= "Динамически подключаемая библиотека (*.dll)|*.dll| ZIP-архив (*.zip)|*.zip";
	ДиалогОткрытия.Расширение				= "dll, zip";
	ДиалогОткрытия.Заголовок				= ЗаголовокДиалога;
	ДиалогОткрытия.ПредварительныйПросмотр	= Ложь;

	Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораФайлаЗавершениеПослеВыбораВДиалоге", ЭтотОбъект);

	ДиалогОткрытия.Показать(Оповещение);

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

&НаКлиенте
Процедура СохранитьВнешнююКомпонентуВФайл(Команда)

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

	ЗаголовокДиалога = НСтр("ru = 'Укажите файл внешней компоненты'");

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

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

	Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораКаталогаСохранениеЗавершениеПослеВыбораВДиалоге", ЭтотОбъект);

	ДиалогСохранения.Показать(Оповещение);

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

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

	ИзмененВручную = ИсточникПравил = "ЗагруженныеИзФайла"
		И ЗначениеЗаполнено(ИмяФайлаКомпоненты);

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

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

		Если МассивРазделителей.Количество() Тогда
			ИмяФайла = МассивРазделителей[МассивРазделителей.Количество() - 1];
		КонецЕсли;
	КонецЕсли;

	ПараметрыЗакрытия.Вставить("ИмяФайла", ИмяФайла);

	Закрыть(ПараметрыЗакрытия);

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

&НаКлиенте
Процедура ЗакрытьБезИзменений(Команда)
	Закрыть();
КонецПроцедуры

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

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

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

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

	ИмяФайлаКомпоненты = Результат[0];

	ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаКомпоненты);

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

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

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

	ПутьКФайлу = Результат[0];

	ДвоичныеДанныеФайла.Записать(ПутьКФайлу);

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

// Процедура заполняет компоновщик настроек для выбранного объекта метаданных
//
// Параметры:
//   КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных
//   ОбъектМетаданных - Строка - Строковое представление объекта метаданных (пример - Документ.ПоступлениеТоваровУслуг)
//
Процедура ИнициализироватьКомпоновщик(КомпоновщикНастроек, Знач ОбъектМетаданных) Экспорт

	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных;

	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ИсточникДанных1";
	ИсточникДанных.ТипИсточникаДанных = "Local";

	НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "НаборДанных1";
	НаборДанных.ИсточникДанных = ИсточникДанных.Имя;
	НаборДанных.Запрос = ТекстЗапроса;

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

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

// Процедура используется для копирования элементов отбора из пользовательского компоновщика
//
// Параметры:
//   НовыйОтбор - ОтборКомпоновкиДанных
//   СтарыйОтбор - ОтборКомпоновкиДанных
//
Процедура СкопироватьЭлементыОтбора(НовыйОтбор, СтарыйОтбор) Экспорт

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

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

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

	ОбъектМетаданных = пбп_Переадресация.ЗначениеРеквизитаОбъекта(Настройка, "ОбъектМетаданных");
	Отбор = пбп_Переадресация.ЗначениеРеквизитаОбъекта(Настройка, "Отбор");

	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	ТекстЗапроса = "ВЫБРАТЬ * ИЗ " + ОбъектМетаданных;

	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ИсточникДанных1";
	ИсточникДанных.ТипИсточникаДанных = "Local";

	НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "НаборДанных1";
	НаборДанных.ИсточникДанных = ИсточникДанных.Имя;
	НаборДанных.Запрос = ТекстЗапроса;

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

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

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

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

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

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

	ПроцессорВывода.УстановитьОбъект(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

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

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

#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ТекущийОбъект = Параметры.ТекущийОбъект;
	ТипТекущегоОбъекта = Параметры.ТипТекущегоОбъекта;

	ВидОперации = Параметры.ВидОперации;
	СписокКоллекций = Параметры.СписокКоллекций;
	ВыводитьТЧОбъектов = Параметры.ВыводитьТЧОбъектов;

	ЗакрыватьПриВыборе = Истина;
	ЗакрыватьПриЗакрытииВладельца = Истина;

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

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

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

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

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

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

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

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

&НаСервере
Процедура ВывестиОбъекты()

	СоответствиеТипаЗначенияКоллекциямОбъектов = СоответствиеТипаЗначенияКоллекциямОбъектов();

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

		ДобавитьСтрокиДереваПоВидуОбъектов(СтруктураКоллекции);
	КонецЦикла;

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

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

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

		СтрокиДерева = СтрокаКартинка.ПолучитьЭлементы();

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

&НаСервере
Процедура ДобавитьСтрокиДереваПоВидуОбъектов(Знач СтруктураКоллекции)

	СтрокиДерева = Дерево.ПолучитьЭлементы();

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

	ПодчиненныеСтроки = СтрокаВида.ПолучитьЭлементы();

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

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

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

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

&НаСервереБезКонтекста
Функция СоответствиеТипаЗначенияКоллекциямОбъектов()

	Соответствие = Новый Соответствие;

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

	Возврат Соответствие;

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

	ИнициализироватьКомпоновщик();

	Если Не ПустаяСтрока(Объект.Отбор) Тогда

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

	КонецЕсли;

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	ТекущийОбъект.Отбор = пбп_Переадресация.ЗначениеВСтрокуXML(Компоновщик.Настройки.Отбор);

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

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

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ВидОперации", "ВыборОбъекта");
	ПараметрыФормы.Вставить("ВыводитьТЧОбъектов", Истина);
	ПараметрыФормы.Вставить("ТекущийОбъект", Объект.ОбъектМетаданных);
	ПараметрыФормы.Вставить("ТипТекущегоОбъекта", Объект.ТипОбъекта);

	СписокКоллекций = Новый СписокЗначений;
	// Формируем список коллекций объектов
	СписокКоллекций.Добавить("Справочники");
	СписокКоллекций.Добавить("Документы");
	СписокКоллекций.Добавить("ПланыВидовХарактеристик");
	СписокКоллекций.Добавить("ПланыСчетов");
	СписокКоллекций.Добавить("ПланыВидовРасчета");

	ПараметрыФормы.Вставить("СписокКоллекций", СписокКоллекций);

	ОткрытьФорму("Справочник.пбп_НастройкиОтбораОбъектов.Форма.ФормаВыбораОбъектаМетаданных", ПараметрыФормы, Элементы.ОбъектМетаданных);

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

&НаКлиенте
Процедура ОбъектМетаданныхОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, СтандартнаяОбработка)

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

	Если ТипЗнч(ВыбранноеЗначение) = Тип("ДанныеФормыЭлементДерева") Тогда

		Объект.ОбъектМетаданных = ВыбранноеЗначение.ТипЗначения + "." + ВыбранноеЗначение.ИдентификаторПоля;

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

		ИнициализироватьКомпоновщик();

		Элементы.КомпоновщикНастройкиОтбор.Обновить();

	КонецЕсли;

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

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

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

&НаСервере
Процедура ИнициализироватьКомпоновщик()

	Если ЗначениеЗаполнено(Объект.ОбъектМетаданных) Тогда
		Справочники.пбп_НастройкиОтбораОбъектов.ИнициализироватьКомпоновщик(Компоновщик, Объект.ОбъектМетаданных);
	КонецЕсли;

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

	Возврат ПолучитьМакет("КаркасОтладки");

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

#КонецОбласти // ПрограммныйИнтерфейс

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

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

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

		Если ПустаяСтрока(КодПодпрограммы) Тогда
			КодПодпрограммы = СтрШаблон("Результат = %1", КодПодпрограммы + Символы.ПС);
		КонецЕсли;
	КонецЕсли;

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

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

	СтруктураПараметров = Новый Структура;

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

		НомерСтроки = СтрокаТаблицы.НомерСтроки - 1;

		Попытка
			СвойствоДоступно = СтруктураПараметров.Свойство(СтрокаТаблицы.Имя);
		Исключение
			СвойствоДоступно = Ложь;
		КонецПопытки;

		Если Не СвойствоДоступно Тогда

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

				ТекстСообщения = СтрШаблон(НСтр("ru='Обнаружено некорректное имя ""%1"" в таблице ""Переменные"".';
					|en='Found an incorrect name ""%1"" in table ""Variables.""'"),СтрокаТаблицы.Имя);
				пбп_Переадресация.СообщитьПользователю(
					ТекстСообщения, ЭтотОбъект, СтрШаблон("Переменные[%1].Имя", НомерСтроки),, Отказ);
			КонецПопытки;
		Иначе

			ТекстСообщения = СтрШаблон(НСтр("ru='Обнаружено дублирующееся имя ""%1"" в таблице ""Переменные"".';
				|en='Found a duplicate name ""%1"" in the table ""Variables.""'"), СтрокаТаблицы.Имя);
			пбп_Переадресация.СообщитьПользователю(
				ТекстСообщения, ЭтотОбъект, СтрШаблон("Переменные[%1].Имя", НомерСтроки),, Отказ);
		КонецЕсли;
	КонецЦикла;

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

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

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

Процедура ПриЗаписи(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

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

#Иначе
ВызватьИсключение НСтр("ru='Недопустимый вызов объекта на клиенте.';en='Invalid object call on client'");
#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

	Параметры.Свойство("Режим", Режим);

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

	НадписьСинтаксис = НСтр("ru = '?(<ЛогическоеВыражение>,<ВыражениеЕслиИстина>,<ВыражениеЕслиЛожь>)';
		|en = '?(<BolleanExpression>,<ExpressionIfTrue>,<ExpressionIfFalse>)'");

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

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

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

&НаКлиенте
Процедура ЛогическоеВыражениеПриИзменении(Элемент)

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

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

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

	ОткрытьФормуВыбораПоля("ЛогическоеВыражение");

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

&НаКлиенте
Процедура ВыражениеИстинаПриИзменении(Элемент)

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

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

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

	ОткрытьФормуВыбораПоля("ВыражениеИстина");

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

&НаКлиенте
Процедура ВыражениеЛожьПриИзменении(Элемент)

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

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

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

	ОткрытьФормуВыбораПоля("ВыражениеЛожь");

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

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

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

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

	ОбновитьВыражениеРезультат();
	ОповеститьОВыборе(Новый Структура("Поле", ВыражениеРезультат));

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

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

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

// Выполняет обновление результирующего выражения.
//
&НаКлиенте
Процедура ОбновитьВыражениеРезультат()

	ВыражениеРезультат = СтрШаблон("?(%1, %2, %3)", ЛогическоеВыражение, ВыражениеИстина, ВыражениеЛожь);

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

// Открывает помошник для выбора поля.
//
&НаКлиенте
Процедура ОткрытьФормуВыбораПоля(ИмяПриемника)

	ПараметрыФормы = Новый Структура;

	ПараметрыФормы.Вставить("Режим", Режим);

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

	ОткрытьФорму("ОбщаяФорма.пбп_ФормаВыбораПоля", ПараметрыФормы, ЭтотОбъект);

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

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

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

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)

	ПодключитьОбработчикОжидания("ПоказатьОписаниеФункции", 0.1, Истина);

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

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

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

// Формирует описание функции или группы функций.
//
// Параметры:
// 	Ссылка - СправочникСсылка.пбп_ПользовательскиеФункции.
//
&НаСервере
Процедура ПоказатьОписаниеФункцииСервер(Ссылка, ЭтоГруппа)

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

	Элементы.ГруппаШапкаФункции.Видимость = Не ЭтоГруппа;
	Элементы.ГруппаПодвалФункции.Видимость = Не ЭтоГруппа;

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

// Обработчик ожидания активизации строки.
//
&НаКлиенте
Процедура ПоказатьОписаниеФункции()

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

	ПоказатьОписаниеФункцииСервер(ТекДанные.Ссылка, ТекДанные.ЭтоГруппа);

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)

	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;

	Если СохранитьРезультат Тогда
		Адрес = АдресМассиваВХранилище();
		ОповеститьОВыборе(Новый Структура("Адрес", Адрес));
	КонецЕсли;

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

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

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

&НаКлиенте
Процедура СохранитьРезультат(Команда)
	СохранитьРезультат = Истина;
	Закрыть();
КонецПроцедуры

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

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

&НаСервере
Функция АдресМассиваВХранилище()

	Результат = Массив.ВыгрузитьЗначения();
	// Если коллекция помещена в хранилище перезапишем в тот же адрес
	УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
	Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);

	Возврат Адрес;

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

КонецПроцедуры // ПриСозданииНаСервере()

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

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)

	ПодключитьОбработчикОжидания("ПоказатьОписаниеФункции", 0.1, Истина);

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

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

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

// Формирует описание функции или группы функций.
//
// Параметры:
// 	Ссылка - СправочникСсылка.пбп_ПользовательскиеФункции.
//
&НаСервере
Процедура ПоказатьОписаниеФункцииСервер(Ссылка, ЭтоГруппа)

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

	Элементы.ГруппаШапкаФункции.Видимость = Не ЭтоГруппа;
	Элементы.ГруппаПодвалФункции.Видимость = Не ЭтоГруппа;

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

// Обработчик ожидания активизации строки.
//
&НаКлиенте
Процедура ПоказатьОписаниеФункции()

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

	ПоказатьОписаниеФункцииСервер(ТекущиеДанные.Ссылка, ТекущиеДанные.ЭтоГруппа);

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)

	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;

	Если СохранитьРезультат Тогда
		Адрес = АдресСтруктурыВХранилище();
		ОповеститьОВыборе(Новый Структура("Адрес", Адрес));
	КонецЕсли;

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

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

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

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

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

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

&НаКлиенте
Процедура СохранитьРезультат(Команда)
	СохранитьРезультат = Истина;
	Закрыть();
КонецПроцедуры

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

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

&НаСервере
Функция АдресСтруктурыВХранилище()

	Результат = Новый Структура;
	Для Каждого Пара Из Структура Цикл
		Результат.Вставить(Пара.Ключ, Пара.Значение);
	КонецЦикла;
	УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
	Адрес = ПоместитьВоВременноеХранилище(Результат, УИД);

	Возврат Адрес;

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

	УстановитьВидимостьЭлементов();

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)

	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;

	Если СохранитьРезультат Тогда
		Адрес = АдресТаблицыВХранилище();
		ОповеститьОВыборе(Новый Структура("Адрес", Адрес));
	КонецЕсли;

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

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

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

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

&НаКлиенте
Процедура КолонкиТаблицыЗначенийПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

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

	ТекДанные = Элементы.КолонкиТаблицыЗначений.ТекущиеДанные;
	ТекДанные.Имя = "Колонка_";
	// Установим тип по умолчанию "Строка"
	ТекДанные.ТипЗначения = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10));

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

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

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

&НаКлиенте
Процедура КолонкиСтроки(Команда)
	УстановитьВидимостьЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура СохранитьРезультат(Команда)
	СохранитьРезультат = Истина;
	Закрыть();
КонецПроцедуры

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

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

&НаСервере
Функция АдресТаблицыВХранилище()

	УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
	ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
	Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);

	Возврат Адрес;

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

&НаСервере
Процедура ОбновитьТаблицуСтрок()

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

	ИмяТаблицы = "СтрокиТаблицыЗначений";
	РеквизитыТаблицы = ПолучитьРеквизиты(ИмяТаблицы);
	ИменаРеквизитов = Новый Массив();

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

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

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

	НачатьТранзакцию();
	Попытка

		ИзменитьРеквизиты(, УдаляемыеРеквизиты);
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);

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

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

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

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

&НаСервере
Процедура ОбновитьЗаголовокКнопки()
	Элементы.ФормаПоказатьКолонкиСтроки.Заголовок = ?(ПоказатьТаблицу, "Показать колонки", "Показать строки");
КонецПроцедуры

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

Функция ЗначениеСоответствияПоИдентиифкатору(Идентификатор) Экспорт

	Результат = Неопределено;

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

	Запрос.УстановитьПараметр("ИдентификаторНастройки", Идентификатор);

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

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

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Результат = ВыборкаДетальныеЗаписи.Ссылка;
	КонецЦикла;

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

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

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

#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

Процедура ПриЗаписи(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

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

#КонецЕсли


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

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

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

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

	ПоказатьВводСтроки(Новый ОписаниеОповещения("КомментарийОткрытиеЗавершение", ЭтотОбъект),
		Объект.Комментарий, НСтр("ru='Комментарий'; en = 'Comment'"), , Истина);

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

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

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

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

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

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

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

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

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец пбп_ПредопределенныеЗначения

	пбп_МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначенияКлиент.ОбработкаОповещения(ИмяСобытия, Элементы.Список);
	// Конец пбп_ПредопределенныеЗначения

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

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

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

	УправлениеФормой();

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	ДанныеХранилища = Неопределено;

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

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

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

	УстановитьНаличиеПароля(ДанныеХранилища);

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

#КонецОбласти // ОбработчикиСобытийФормы

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

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

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

	ПоказатьВводСтроки(Новый ОписаниеОповещения("ВводСтрокиЗавершение",
		ЭтотОбъект, Новый Структура("РеквизитШапки, ТолькоПросмотр, Реквизит", Истина, Истина, "Наименование")),
		Объект.Наименование, НСтр("ru='Наименование'; en = 'Name'"), , Истина);

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

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

	Если ТипЗнч(Объект.Значение) <> Тип("Строка") Тогда

		Объект.Пароль = Ложь;

		пбп_ПереадресацияКлиент.СообщитьПользователю(
			НСтр("ru='Пароль может использовать только тип ""Строка"".';
			| en='The password can only use the type ""String"".'"),
			Объект.Ссылка, "ТипЗначения", "Объект.ТипЗначения");

		Возврат;

	ИначеЕсли Объект.Пароль И Объект.СписокЗначений Тогда

		Объект.Пароль = Ложь;

		пбп_ПереадресацияКлиент.СообщитьПользователю(
			НСтр("ru='Использование пароля недоступен для списка значений.';
			| en='Password usage is not available for the list of values.'"),
			Объект.Ссылка, "СписокЗначений", "Объект.СписокЗначений");

		Возврат;

	ИначеЕсли НЕ Объект.Пароль И ЗначениеЗаполнено(Объект.Значение) Тогда

		ПоказатьВопрос(Новый ОписаниеОповещения("ПарольПриИзмененииПродолжение", ЭтотОбъект),
			НСтр("ru='Пароль будет очищен. Продолжить?';
			| en='The password will be cleared. Continue?'"),
			РежимДиалогаВопрос.ДаНет, 60);

	Иначе
		УправлениеФормой();
	КонецЕсли;

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

&НаКлиенте
Процедура СписокЗначенийПриИзменении(Элемент)

	УправлениеФормой();

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

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

	Если ТипЗнч(Объект.Значение) <> Тип("Строка") ИЛИ Объект.Пароль Тогда
		Возврат;
	КонецЕсли;

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

	ПоказатьВводСтроки(Новый ОписаниеОповещения("ВводСтрокиЗавершение",
		ЭтотОбъект, Новый Структура("РеквизитШапки, Реквизит", Истина, "Значение")),
		Объект.Значение, НСтр("ru='Значение'; en = 'Value'"), , Истина);

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

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

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

	ПоказатьВводСтроки(Новый ОписаниеОповещения("ВводСтрокиЗавершение",
		ЭтотОбъект, Новый Структура("РеквизитШапки, Реквизит", Истина, "Комментарий")),
		Объект.Комментарий, НСтр("ru='Комментарий'; en = 'Comment'"), , Истина);

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

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

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

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

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

	Если ТипЗнч(ТекущиеДанные.Значение) <> Тип("Строка") Тогда
		Возврат;
	КонецЕсли;

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

	ПоказатьВводСтроки(Новый ОписаниеОповещения("ВводСтрокиЗавершение",
		ЭтотОбъект, Новый Структура("РеквизитШапки, Реквизит", Ложь, ТекущиеДанные)),
		ТекущиеДанные.Значение, НСтр("ru='Значение'; en = 'Value'"), , Истина);

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

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

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

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

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

&НаСервере
Процедура УправлениеФормой()

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

	УстановитьНаличиеПароля();

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

&НаСервере
Процедура УстановитьНаличиеПароля(ДанныеХранилища = Неопределено);

	Если НЕ Объект.Пароль Тогда
		Возврат;
	КонецЕсли;

	Если ДанныеХранилища = Неопределено Тогда

		УстановитьПривилегированныйРежим(Истина);
		ДанныеХранилища = пбп_Переадресация.ПрочитатьДанныеИзБезопасногоХранилища(
			Строка(Объект.Ссылка.УникальныйИдентификатор()));
		УстановитьПривилегированныйРежим(Ложь);

	КонецЕсли;

	Если ТипЗнч(ДанныеХранилища) = Тип("Структура")
		И НЕ ПустаяСтрока(пбп_ПереадресацияКлиентСервер.СвойствоСтруктуры(ДанныеХранилища, "bit_password", "")) Тогда

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

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

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

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Объект.Значение = "";
	Иначе
		Объект.Пароль = Истина;
	КонецЕсли;

	УправлениеФормой();

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

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

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

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

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

	Параметры.Свойство("Режим", Режим);

	Параметры.Свойство("ИмяПриемника", ИмяПриемника);

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

	ЗаполнитьДерево(ЗначенияЗаполнения);

	ОписаниеСправочники = Справочники.ТипВсеСсылки();
	ОписаниеДокументы = Документы.ТипВсеСсылки();

	Если Не Поля.ПолучитьЭлементы().Количество() Тогда
		пбп_Переадресация.СообщитьПользователю(НСтр("ru='Нет полей для выбора.';en='No fields to select.'"),,,, Отказ);
	КонецЕсли;

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

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

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

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

	ВыбраннаяСтрока = Элементы.Поля.ТекущиеДанные;
	Если ВыбраннаяСтрока.Доступно Тогда
		ВыбратьПолеИЗакрыть(ВыбраннаяСтрока.Имя);
	КонецЕсли;

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

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

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

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

	РазвернутьПодчиненные(Строка);

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

&НаКлиенте
Процедура РазвернутьСтроки(Команда)

	пбп_ПереадресацияКлиент.РазвернутьУзлыДерева(ЭтотОбъект, "Поля");

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

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

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

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

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

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

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

	ВыбраннаяСтрока = Элементы.Поля.ТекущиеДанные;
	Если ВыбраннаяСтрока.Доступно Тогда
		ВыбратьПолеИЗакрыть(ВыбраннаяСтрока.Имя);
	КонецЕсли;

	пбп_ПереадресацияКлиент.СообщитьПользователю(НСтр("ru = 'Выбрано недоступное поле!'"));

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

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

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

&НаКлиенте
Процедура ВыбратьПолеИЗакрыть(ИмяПоля)

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

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

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

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

	ЭлементДерева.Доступно = Доступность;

	Если ДобавлятьПодчиненные Тогда

		МассивТипов = ЭлементДерева.Тип.Типы();
		Для Каждого Тип Из МассивТипов Цикл

			Если ОписаниеСправочники.СодержитТип(Тип) Или ОписаниеДокументы.СодержитТип(Тип) Тогда

				Коллекция = ЭлементДерева.ПолучитьЭлементы();
				ЗаполнитьЭлементДерева(Коллекция.Добавить(), "СлужебнаяДляРазворота");

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

	Если Не Картинка = Неопределено Тогда
		ЭлементДерева.Картинка = Картинка;
	Иначе
		ЭлементДерева.Картинка = БиблиотекаКартинок.пбп_Реквизит;
	КонецЕсли;

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

&НаСервере
Процедура РазвернутьПодчиненные(ИдСтроки)

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

	ДобавитьОписаниеРеквизитов(СтрокаДерева, "Справочники", ОписаниеСправочники, "СправочникСсылка");
	ДобавитьОписаниеРеквизитов(СтрокаДерева, "Документы", ОписаниеДокументы, "ДокументСсылка");

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

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

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

	Для Каждого Тип Из СтрокаДерева.Тип.Типы() Цикл

		Если ОписаниеКоллекции.СодержитТип(Тип) Тогда

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

				Коллекция = СтрокаДерева.ПолучитьЭлементы();

				Если Не Коллекция.Количество() = 1 Тогда
					Продолжить;
				КонецЕсли;

				ПерваяСтрока = Коллекция[0];

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

				Если ИмяКоллекции = "Справочники" Тогда

					ЭлементПодч = Коллекция.Добавить();
					ЗаполнитьЭлементДерева(ЭлементПодч, "Код");

					ЭлементПодч = Коллекция.Добавить();
					ЗаполнитьЭлементДерева(ЭлементПодч, "Наименование");

				ИначеЕсли ИмяКоллекции = "Документы" Тогда

					ЭлементПодч = Коллекция.Добавить();
					ЗаполнитьЭлементДерева(ЭлементПодч, "Дата");

					ЭлементПодч = Коллекция.Добавить();
					ЗаполнитьЭлементДерева(ЭлементПодч, "Номер");

					ЭлементПодч = Коллекция.Добавить();
					ЗаполнитьЭлементДерева(ЭлементПодч, "Проведен");

				КонецЕсли;

				Для Каждого ТекущийОбъект Из Метаданные[ИмяКоллекции][Результат.Имя].Реквизиты Цикл

					ЗаполнитьЭлементДерева(Коллекция.Добавить(),
						ТекущийОбъект.Имя, ТекущийОбъект.Синоним, ТекущийОбъект.Тип, Истина, Истина);
				КонецЦикла;

				Прервать;

			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

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

// Процедура заполняет дерево формы "Поля"
//
// Параметры:
//  ЗначенияЗаполнения - Структура - переданные значения
//   * Ключ - Строка - Имя класса (переменные, параметры и т.д.)
//   * Значение - Массив из Строка - Имена выбираемых полей.
//
&НаСервере
Процедура ЗаполнитьДерево(ЗначенияЗаполнения = Неопределено)

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

	ДанныеДерева = Поля.ПолучитьЭлементы();
	Для Каждого Пара Из ЗначенияЗаполнения Цикл
		ЭлементВерх = ДанныеДерева.Добавить();
		ЗаполнитьЭлементДерева(ЭлементВерх, Пара.Ключ,,,,, БиблиотекаКартинок.пбп_Реквизиты);

		Коллекция = ЭлементВерх.ПолучитьЭлементы();

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

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

// Функция - Схемы данных спецификации
//
// Параметры:
//  Спецификация -  Строка - OpenApi Схема.
//
// Возвращаемое значение:
//  Соответствие - Схемы данных в виде соответствия.
//
Функция СхемыДанныхСпецификации(Знач Спецификация) Экспорт

	Попытка
		СпецификацияВФорматеOpenAPI = JsonВОбъект(Спецификация);
	Исключение
		ВызватьИсключение "Ошибка при разборе спецификации OpenAPI: " + ОписаниеОшибки();
	КонецПопытки;

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

	СхемыДанныхСпецификации = КомпонентыСпецификации.Получить("schemas");

	Если Не ЗначениеЗаполнено(СхемыДанныхСпецификации) Тогда
		ВызватьИсключение "В спецификации отсутствует блок <schemas>";
	КонецЕсли;

	Возврат СхемыДанныхСпецификации;

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

// Функция - Схема по строковому пути
//
// Параметры:
//  СтроковыйПуть 	- Строка	 - Путь к получению схемы или части схемы.
//  Спецификация 	- Строка	 - Спецификация openApi котора будет использоваться для разыменования
//
// Возвращаемое значение:
//  Соответствие - Найденная схема данных.
//
Функция СхемаПоСтроковомуПути(Знач СтроковыйПуть, Знач Спецификация) Экспорт

	СхемаПоСтроковомуПути = Неопределено;
	СтроковыйПутьБезРешетки = СтрЗаменить(СтроковыйПуть, "#", "");
	МассивЧастейПути = СтрРазделить(СтроковыйПутьБезРешетки, "/", Ложь);

	Попытка
		СхемаПоСтроковомуПути = JsonВОбъект(Спецификация);
	Исключение
		ВызватьИсключение "Ошибка при разборе спецификации OpenAPI: " + ОписаниеОшибки();
	КонецПопытки;

	Для Каждого ЭлементПути Из МассивЧастейПути Цикл
		СхемаПоСтроковомуПути = СхемаПоСтроковомуПути.Получить(ЭлементПути);
		Если СхемаПоСтроковомуПути = Неопределено Тогда
			ТекстОшибки = СтрШаблон("Ошибка при разборе схемы! Не удается получить схему по пути <%1>",
									СтроковыйПуть);
			ЗаписьЖурналаРегистрации("пбп_ВалидаторПакетов", // BSLLS:Typo-off
										УровеньЖурналаРегистрации.Ошибка, , ,
										ТекстОшибки);

			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
	КонецЦикла;

	Возврат СхемаПоСтроковомуПути;

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

// Преобразование JSON в Объект.
//
// Параметры:
//   Json - Поток, ДвоичныеДанные, Строка - данные в формате JSON.
//   Кодировка - Строка - кодировка текста JSON. Значение по умолчанию - utf-8.
//
// Возвращаемое значение:
//   Произвольный - значение, десериализованное из JSON.
//
Функция JsonВОбъект(Json, Кодировка = "utf-8") Экспорт

	ПараметрыПреобразованияJSON = ПараметрыПреобразованияJSONПоУмолчанию();

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

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

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

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

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

Функция ПараметрыПреобразованияJSONПоУмолчанию() // BSLLS:LatinAndCyrillicSymbolInWord-off

	ПараметрыПреобразованияПоУмолчанию = Новый Структура;
	ПараметрыПреобразованияПоУмолчанию.Вставить("ПрочитатьВСоответствие", Истина);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ФорматДатыJSON", ФорматДатыJSON.ISO);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ИменаСвойствСоЗначениямиДата", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ВариантЗаписиДатыJSON", ВариантЗаписиДатыJSON.ЛокальнаяДата);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ИмяФункцииПреобразования",
													 "ПреобразованиеПоУмолчаниюПриСериализацииJSON"); // BSLLS:Typo-off
	ПараметрыПреобразованияПоУмолчанию.Вставить("МодульФункцииПреобразования", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ДополнительныеПараметрыФункцииПреобразования", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ИмяФункцииВосстановления", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("МодульФункцииВосстановления", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ДополнительныеПараметрыФункцииВосстановления", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("ИменаСвойствДляОбработкиВосстановления", Неопределено);
	ПараметрыПреобразованияПоУмолчанию.Вставить("МаксимальнаяВложенность", 500); // BSLLS:MagicNumber-off

	Возврат ПараметрыПреобразованияПоУмолчанию;

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

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


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

// Процедура - Формирование таблицы
//
// Параметры:
//  АдресВХранилище	 - Строка - Адрес файла во временном хранилище
//  Расширение		 - Строка - Расширение файла (xls, xlsx)
//  ПараметрыЧтения	 - Структура - структура параметров загрузки Excel-файла
//  см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла
//
Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, ПараметрыЧтения) Экспорт

	ТаблицаСвойств = ПолучитьИзВременногоХранилища(ПараметрыЧтения.АдресМакета);

	ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер
		.КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений(
		АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения);

	ПоместитьВоВременноеХранилище(ТаблицаДанных, ПараметрыЧтения.АдресПомещения);

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

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

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

	МакетТаблица = ПолучитьИзВременногоХранилища(Макет);

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

	ИД = ПоместитьВоВременноеХранилище(Заглушка, Новый УникальныйИдентификатор);

	Возврат ИД;

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

// Инициализирует таблицу со свойствами колонок загружаемого файла
//
// Возвращаемое значение:
//  ТаблицаЗначений - таблица готовая для заполнения данных колонок
//
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт

	Возврат пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ИнициализироватьТаблицуСоСвойствамиКолонок();

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

// Получить параметры чтения файла
//
// Возвращаемое значение:
//  Структура - см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла
//
Функция ПолучитьПараметрыЧтенияФайла() Экспорт

	Возврат пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла();

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

#КонецОбласти // ПрограммныйИнтерфейс


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

// Инициализирует структуру параметров чтения
//
// Возвращаемое значение:
//  Структура - см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла
//
Функция ПолучитьПараметрыЧтенияФайла() Экспорт

	СтруктураПараметров = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПолучитьПараметрыЧтенияФайла();
	СтруктураПараметров.Вставить("АдресМакета"		, "");
	СтруктураПараметров.Вставить("АдресПомещения"	, "");

	Возврат СтруктураПараметров;

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

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

	АдресПомещения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(АдресСоответствияКолонок);

	ПараметрыЧтения.АдресМакета		= АдресСоответствияКолонок;
	ПараметрыЧтения.АдресПомещения	= АдресПомещения;

	ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
	ПараметрыДиалога.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|CSV-файл (*.csv)|*.csv";
	ПараметрыДиалога.МножественныйВыбор = Ложь;
	ПараметрыДиалога.ИндексФильтра = 0;
	ПараметрыДиалога.Заголовок = "Выберите файл для загрузки";

	ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх( , , , ПараметрыДиалога);

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

	Возврат АдресПомещения;

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

#КонецОбласти // ПрограммныйИнтерфейс

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

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


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

	ЗаголовокОшибки = "Данные не были получены из внешнего источника данных";
	СообщениеОбОшибке = "";

	РеквизитыОбъекта = пбп_Переадресация.ЗначенияРеквизитовОбъекта(
		ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода");

	Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда
		ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
			"в настройках интеграции не заполнено наименование внешнего источника данных");
		СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
	КонецЕсли;

	Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда
		ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
			"в интеграционном потоке не заполнено имя таблицы внешнего источника данных");
		СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
	КонецЕсли;

	Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда
		Возврат СообщениеОбОшибке;
	КонецЕсли;

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

		Запрос = Новый Запрос;

		ТекстЗапроса = "ВЫБРАТЬ
		|	&ПоляЗапроса
		|ИЗ
		|	ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта
			+ ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица";

		Если Не ПустаяСтрока(ПоляЗапроса) Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса);
		Иначе
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*");
		КонецЕсли;

		УсловияЗапроса = "";

		// Установка предопределенных параметров запроса из интеграционного потока
		Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл
			НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", "
			|	И ");
			УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2",
				НуженПеренос, СтрокаПредопределенногоПараметра.Имя);

			Запрос.УстановитьПараметр(
				СтрокаПредопределенногоПараметра.Имя,
				СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию);
		КонецЦикла;

		// Установка опциональных параметров запроса
		Для Каждого КлючЗначениеОператор Из ПараметрыЗапроса Цикл
			НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", "
				|	И ");
			НужныСкобки = ТипЗнч(КлючЗначениеОператор.Значение) = Тип("Массив");
			Скообка1 = ?(НужныСкобки, "(", "");
			Скообка2 = ?(НужныСкобки, ")", "");
			УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 %3 %4&%2%5",
				НуженПеренос, КлючЗначениеОператор.НаименованиеПоля, КлючЗначениеОператор.Оператор,
				Скообка1, Скообка2);

			Запрос.УстановитьПараметр(КлючЗначениеОператор.НаименованиеПоля, КлючЗначениеОператор.Значение);
		КонецЦикла;

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

		Если КоличествоПервых <> 0 Тогда
			ТекстЗапроса = пбп_СхемыЗапросов.УстановитьКоличествоПолучаемыхЗаписей(ТекстЗапроса, КоличествоПервых);
		КонецЕсли;

		Если СтруктураУпорядочивания <> Неопределено Тогда
			ДопустимыеНаправления = Новый Массив;
			ДопустимыеНаправления.Добавить("ВОЗР");
			ДопустимыеНаправления.Добавить("УБЫВ");

			ПорядокЗапроса = "";
			МассивПорядка = Новый Массив;

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

				ИмяПараметра = "П_" + КлючЗначениеПорядка.Ключ;
				Запрос.УстановитьПараметр(ИмяПараметра, КлючЗначениеПорядка.Ключ);
				СтрокаПорядка = СтрШаблон("Таблица.&%1 %2",
					ИмяПараметра, КлючЗначениеПорядка.Значение);
				МассивПорядка.Добавить(СтрокаПорядка);
			КонецЦикла;

			ПорядокЗапроса = СтрСоединить(МассивПорядка, ",
			|	");

			ТекстЗапроса = ТекстЗапроса + "
			|УПОРЯДОЧИТЬ ПО
			|	" + ПорядокЗапроса;
		КонецЕсли;

		Запрос.Текст = ТекстЗапроса;

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

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

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

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

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

		Возврат ТаблицаВыборки;
	Исключение
		СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке());
	КонецПопытки;

	Возврат СообщениеОбОшибке;

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

// Возвращает инициализированную таблицу значений из таблицы внешнего
// источника по метаданным с типизированными колонками
//
// Параметры:
//  ИмяВнешнегоИсточника - Строка - имя внешнего источника данных
//  ИмяТаблицы			 - Строка - имя таблицы внешнего источника данных
//  НеобходимыеПоля		 - Строка - название полей таблицы, перечисленных через запятую
//
// Возвращаемое значение:
//  ТаблицаЗначений - пустая таблица значений с типизированными колонками
//

Функция ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника(
	ИмяВнешнегоИсточника, ИмяТаблицы, НеобходимыеПоля = "") Экспорт

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

	МетаданныеИсточника = Метаданные.ВнешниеИсточникиДанных[ИмяВнешнегоИсточника];
	МетаданныеТаблицы = МетаданныеИсточника.Таблицы[ИмяТаблицы];

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

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

		ТаблицаДанных.Колонки.Добавить(ПолеТаблицы.Имя, ПолеТаблицы.Тип);
	КонецЦикла;

	Возврат ТаблицаДанных;

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

#КонецОбласти // ПрямоеПодключениеКБД

#Область REST

// Конвертирует тело HTTP-запроса из соответствия в строку
//
// Параметры:
//  ТелоЗапросаJSON - Структура, Соответствие - данные тела запроса
//
// Возвращаемое значение:
//  Строка - тело HTTP-запроса
//

Функция ПолучитьЗапросТекстомИзСоответствияJSON(ТелоЗапросаJSON) Экспорт

	НастройкиСериализации = Новый НастройкиСериализацииJSON;
	НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
	НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ТелоЗапросаJSON, НастройкиСериализации);
	СтрокаJSON = ЗаписьJSON.Закрыть();

	Возврат СтрокаJSON;

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

// Возвращает таблицу кодов ответа HTTP
//
// Возвращаемое значение:
//  ТаблицаЗначений - таблица с данными соответствия кода значений HTTP и его описанием
//


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

//Длительность хранения ошибок интеграции на месяц дольше, чем успешных записей
Процедура ОчисткаИсторииИнтеграции() Экспорт

	пбп_Переадресация.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.пбп_ОчисткаИсторииИнтеграции);
	Справочники.пбп_ИсторияИнтеграции.ОчиститьИсториюИнтеграции();

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

// Выполнение пользовательских функций файловых обменов
//
// Параметры:
//  ИнтеграционныйПоток		 - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный
//   поток, для которого выполняется регламентное задание
//  ПользовательскаяФункция	 - СправочникСсылка.пбп_ПользовательскиеФункции - выполняемая пользовательская функция
//
Процедура ВыполнениеПользовательскихФункцийФайловыхОбменов(ИнтеграционныйПоток, ПользовательскаяФункция) Экспорт

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

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

	пбп_ОбщегоНазначенияСервер.ВыполнитьПользовательскуюФункциюСПараметрами(
		ПользовательскаяФункция, ПараметрыФункции);

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

// Заполнение предопределенных элементов, с выводом серверного оповещения при возникновении конфликтов.
//
Процедура ЗаполнениеПредопределенныхЭлементов() Экспорт

	пбп_Переадресация.ПриНачалеВыполненияРегламентногоЗадания(
		Метаданные.РегламентныеЗадания.пбп_ЗаполнениеПредопределенныхЭлементов);

	пбп_ПредопределенныеЗначения.ЗаполнениеПредопределенныхЭлементов(Истина);

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

#КонецОбласти // ПрограммныйИнтерфейс


// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

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

// Процедура - При открытии
//
// Параметры:
//  Форма	 - ФормаКлиентскогоПриложения - модифицируемая форма
//  Отказ	 - Булево - если Истина, то объект не будет создан
//
Процедура ПриОткрытии(Форма, Отказ) Экспорт

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

	ИмяОбработчика = "ПриОткрытии";

	ИмяМетода = ПолучитьИмяМетода(Форма, ИмяОбработчика);

	Если ЗначениеЗаполнено(ИмяМетода) Тогда

		ПараметрыМетода = Новый Массив;
		ПараметрыМетода.Добавить(Форма);
		ПараметрыМетода.Добавить(Отказ);

		ВызватьМетод(ИмяМетода, ПараметрыМетода);
	КонецЕсли;

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

// Процедура - После записи
//
// Параметры:
//  Форма			 - ФормаКлиентскогоПриложения - модифицируемая форма
//  ПараметрыЗаписи	 - Структура - параметры записи
//
Процедура ПослеЗаписи(Форма, ПараметрыЗаписи) Экспорт

	ИмяОбработчика = "ПослеЗаписи";

	ИмяМетода = ПолучитьИмяМетода(Форма, ИмяОбработчика);

	Если ЗначениеЗаполнено(ИмяМетода) Тогда

		ПараметрыМетода = Новый Массив;
		ПараметрыМетода.Добавить(Форма);
		ПараметрыМетода.Добавить(ПараметрыЗаписи);

		ВызватьМетод(ИмяМетода, ПараметрыМетода);
	КонецЕсли;

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

// Функция - Существует обработчик события
//
// Параметры:
//  ИмяФормы	 - Строка - Форма.ИмяФормы
//  Обработчик	 - Строка - Имя проверяемого обработчика
//
// Возвращаемое значение:
//  Булево - Возвращает истину, если в списке форм найдена форма
//
Функция СуществуетОбработчикСобытия(ИмяФормы, Обработчик = "") Экспорт

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

	Возврат Список.Получить(ИмяФормы) <> Неопределено;

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

#КонецОбласти // ПрограммныйИнтерфейс

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

Функция ПолучитьИмяМетода(Форма, ИмяПроцедурыВход)

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

	КолЭлементов = ЧастиИмениФормы.Количество();
	Если КолЭлементов = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	// Удалим класс
	ЧастиИмениФормы.Удалить(0);
	Если КолЭлементов > 2 Тогда
		// Удалим слово "Форма"
		ЧастиИмениФормы.Удалить(1);
	КонецЕсли;

	ИмяМодуля = "пбп_МодификацияКонфигурацииКлиентПереопределяемый";
	ИмяПроцедуры = СтрСоединить(ЧастиИмениФормы, "") + ИмяПроцедурыВход;
	ИмяМетода = ИмяМодуля + "." + ИмяПроцедуры;

	Возврат ИмяМетода;

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

Процедура ВызватьМетод(ИмяМетода, Параметры)

	ПараметрыСтрока = "";
	Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
		Для Индекс = 0 По Параметры.ВГраница() Цикл
			ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Формат(Строка(Индекс), "ЧГ=") + "],";
		КонецЦикла;
		ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
	КонецЕсли;

	Попытка
		Результат = Вычислить(ИмяМетода + "(" + ПараметрыСтрока + ")");
	Исключение
		ТекстСообщения = СтрШаблон("ru = 'Не удалось выполнить метод ""%1"", по причине: %2'",
			ИмяМетода, ОписаниеОшибки());
		ВызватьИсключение НСтр(ТекстСообщения);
	КонецПопытки;

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

Функция ДемоРаботаСФормамиФормаДокументаПриОткрытии(Форма, Отказ) Экспорт

	пбп_ПереадресацияКлиент.СообщитьПользователю(НСтр("ru = 'Проверка'"));

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

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

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