Загрузка данных


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

#Если Клиент Тогда

// Отображает картинку в ФормеСписка
//
// Параметры:
//     ОформленияСтрок - Произвольный
Процедура РучнаяКорректировкаСписокПриПолученииДанных(ОформленияСтрок)  Экспорт

	Картинка = БиблиотекаКартинок.РучнаяКорректировка;
	Для Каждого Строка Из ОформленияСтрок Цикл

		Если Строка.ДанныеСтроки.РучнаяКорректировка Тогда
			Строка.Ячейки.РучнаяКорректировка.УстановитьКартинку(Картинка);
		Иначе
			Строка.Ячейки.РучнаяКорректировка.Текст = "";
		КонецЕсли;

	КонецЦикла

КонецПроцедуры  // РучнаяКорректировкаСписокПриПолученииДанных()


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

#КонецЕсли

// Процедура выполняет действие: ВыполнитьОбновлениеИнформационнойБазы
Процедура СтандартныеПодсистемыСерверВыполнитьОбновлениеИнформационнойБазы() Экспорт
	
	ОбщийМодульСервер.СтандартныеПодсистемыСерверВыполнитьОбновлениеИнформационнойБазы();

КонецПроцедуры  // ВыполнитьОбновлениеИнформационнойБазы


// //////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПРОВЕРКИ НАЛИЧИЯ И ЗАПОЛНЕНИЯ РЕВИЗИТОВ
// Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
// : 
// ИмяРеквизита - строковое имя искомого реквизита, 
// МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
// :
// Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
// Параметры:
//     ИмяРеквизита - Произвольный 
//     МетаданныеДокумента - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт

	Возврат НЕ (МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

КонецФункции  // ЕстьРеквизитДокумента()


// Позволяет определить есть ли среди реквизитов табличной части документа
// реквизит с переданным именем.
// : 
// ИмяРеквизита - строковое имя искомого реквизита, 
// МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
// ИмяТабЧасти  - строковое имя табличной части документа, среди реквизитов которого производится поиск
// :
// Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
// Параметры:
//     ИмяРеквизита - Произвольный 
//     МетаданныеДокумента - Произвольный 
//     ИмяТабЧасти - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт

	ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);

	Если ТабЧасть = Неопределено Тогда  // Нет такой таб. части в документе
		Возврат Ложь;

	Иначе
		Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

	КонецЕсли;

КонецФункции  // ЕстьРеквизитТабЧастиДокумента()


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

	ФорматнаяСтрока = "ЧЦ=15;ЧДЦ=2" +
					?(НЕ ЗначениеЗаполнено(ЧН), "", ";" + "ЧН=" + ЧН) +
					?(НЕ ЗначениеЗаполнено(ЧРГ),"", ";" + "ЧРГ=" + ЧРГ);

	РезультирующаяСтрока = СокрЛ(Формат(Сумма, ФорматнаяСтрока));
	
	Если ЗначениеЗаполнено(Валюта) Тогда
		РезультирующаяСтрока = РезультирующаяСтрока + " " + СокрП(Валюта);
	КонецЕсли;

	Возврат РезультирующаяСтрока;

КонецФункции  // ФорматСумм()


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

	МетаданныеДокумента = Документ.Метаданные();

	ВидОперацииСтр = "";

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

	Возврат "Проведение документа: " + СокрЛП(Документ) + ВидОперацииСтр;

КонецФункции  // ПредставлениеДокументаПриПроведении()

// //////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МЕХАНИЗМА РИБ
//
// Параметры:
//     Префикс - Произвольный
Процедура ДобавитьПрефиксУзла(Префикс) Экспорт
	
	ПрефиксРИБ = Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить();
	Если ЗначениеЗаполнено(ПрефиксРИБ) Тогда
		Префикс = ПрефиксРИБ + Префикс;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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


// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ СО СВОЙСТВАМИ И КАТЕГОРИЯМИ ОБЪЕКТОВ
// Функция возвращает список доступных назначений для "Параметров объектов" 
// по переданной ссылке
// :
// Ссылка - Ссылка на справочник или документ
// :
// Список значений: доступные назначения для свойств и категорий
//
// Параметры:
//     Ссылка - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьСписокНазначенийПараметровОбъектовПоСсылке(Ссылка) Экспорт

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

	ТипСсылки = ТипЗнч(Ссылка);

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

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

	// Если ЭтоХарактеристика Тогда
	// ТекстЗапроса = ТекстЗапроса + "
	// |	 И  Назначения.Ссылка = &НазначениеХарактеристика
	// |";
	// Иначе
	// ТекстЗапроса = ТекстЗапроса + "
	// |	 И  Назначения.Ссылка <> &НазначениеХарактеристика
	// |";
	// КонецЕсли;

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

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

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

КонецФункции  // ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке()


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

	Возврат Метаданные.НайтиПоТипу(ТипЗнч(СтрокаТабличнойЧасти)).Имя;

КонецФункции  // ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку()


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

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

	Номер   = СокрЛП(Документ.Номер);
	Префикс = "";
	Пока Лев(Номер, 1)="0" Цикл
		Номер = Сред(Номер, 2);
	КонецЦикла;

	Возврат Номер;

КонецФункции  // ПолучитьНомерНаПечать()


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

	Возврат НазваниеДокумента + " № " + ПолучитьНомерНаПечать(ДокументОбъект)
	                          + " от " + Формат(ДокументОбъект.Дата, "ДФ='дд ММММ гггг'")+ " г.";

КонецФункции  // СформироватьЗаголовокДокумента()


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

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

КонецФункции  // СформироватьСуммуПрописью()


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

	Если ПозицияПослПробела = 0 Тогда
		ИсходнаяСтрока = "";
		Возврат Буфер;
	КонецЕсли;
	
	ВыделенноеСлово = СокрЛП(Лев(Буфер, ПозицияПослПробела));
	ИсходнаяСтрока = Сред(ИсходнаяСтрока, ПозицияПослПробела + 1);
	
	Возврат ВыделенноеСлово;
	
КонецФункции


// Функция формирует фамилию, имя и отчество одной строкой
// :
// Фамилия  - фамилия физ. лица.
// Имя      - имя физ. лица.
// Отчество - отчество физ. лица.
// ФИОКратко    - Булево - если Истина (по умолчанию), 
// Представление физ.лица включает фамилию и инициалы, если Ложь - фамилию и полностью имя и отчество
// :
// Фамилия, имя, отчество одной строкой.
//
// Параметры:
//     Фамилия - Произвольный 
//     Имя - Произвольный 
//     Отчество - Произвольный 
//     ФИОКратко - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьФамилиюИмяОтчество(Фамилия = " ", Имя = " ", Отчество = " ", ФИОКратко =  ИСТИНА ) Экспорт
	
	Если ФИОКратко Тогда
		Возврат ?(НЕ ПустаяСтрока(Фамилия), Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Лев(Имя,1) + "." + 
				?(НЕ ПустаяСтрока(Отчество) , 
				Лев(Отчество,1)+".", ""), ""), "");
	Иначе
		Возврат ?(НЕ ПустаяСтрока(Фамилия), Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Имя + 
				?(НЕ ПустаяСтрока(Отчество) , " " + Отчество, ""), ""), "");
	КонецЕсли;

КонецФункции  // ПолучитьФамилиюИмяОтчество()


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

	Результат = Новый Структура("Руководитель, РуководительДолжность, РуководительФИО, РуководительПредставление, 
								|ГлавныйБухгалтер, ГлавныйБухгалтерДолжность, ГлавныйБухгалтерФИО, ГлавныйБухгалтерПредставление, 
								|Кассир, КассирДолжность, КассирФИО, КассирПредставление,  
								|ОтветственныйЗаРегистры, ОтветственныйЗаРегистрыДолжность, ОтветственныйЗаРегистрыФИО, ОтветственныйЗаРегистрыПредставление,
								|Исполнитель, ИсполнительДолжность, ИсполнительФИО, ИсполнительПредставление,
								|СтаршийБухгалтер, СтаршийБухгалтерДолжность, СтаршийБухгалтерФИО, СтаршийБухгалтерПредставление");

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

		Пока Руководители.Следующий() Цикл

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

			ИначеЕсли Руководители.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизаций.ГлавныйБухгалтер Тогда
				Результат.ГлавныйБухгалтер           = Руководители.ФизическоеЛицо;
				Результат.ГлавныйБухгалтерДолжность  = Руководители.Должность;
                Результат.ГлавныйБухгалтерФИО        = ФИО;
				Результат.ГлавныйБухгалтерПредставление  = Представление;
				
			ИначеЕсли Руководители.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизаций.Кассир Тогда
				Результат.Кассир                     = Руководители.ФизическоеЛицо;
				Результат.КассирДолжность      		 = Руководители.Должность;
                Результат.КассирФИО            		 = ФИО;
				Результат.КассирПредставление  = Представление;
				
			ИначеЕсли Руководители.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизаций.ОтветственныйЗаНалоговыеРегистры Тогда
				Результат.ОтветственныйЗаРегистры    = Руководители.ФизическоеЛицо;
				Результат.ОтветственныйЗаРегистрыДолжность      = Руководители.Должность;
				Результат.ОтветственныйЗаРегистрыФИО = ФИО;
				Результат.ОтветственныйЗаРегистрыПредставление  = Представление;

			ИначеЕсли Руководители.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизаций.Исполнитель Тогда
				Результат.Исполнитель	   		 	= Руководители.ФизическоеЛицо;
				Результат.ИсполнительДолжность   	= Руководители.Должность;
				Результат.ИсполнительФИО		 	= ФИО;
				Результат.ИсполнительПредставление  = Представление;
				
			ИначеЕсли Руководители.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизаций.СтаршийБухгалтер Тогда
				Результат.СтаршийБухгалтер	   		 	= Руководители.ФизическоеЛицо;
				Результат.СтаршийБухгалтерДолжность   	= Руководители.Должность;
				Результат.СтаршийБухгалтерФИО		 	= ФИО;
				Результат.СтаршийБухгалтерПредставление = Представление;
			КонецЕсли;

		КонецЦикла;

	КонецЕсли;

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

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

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

	ОбщийМодульСервер.СообщитьОбОшибке(ТекстСообщения, Отказ, Заголовок);

КонецПроцедуры  // ОшибкаПриПроведении()


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

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


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

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

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

	ИмяТаблицы = НаборЗаписей.Метаданные().Имя;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ПарамФизЛицо",Физлицо);
	Запрос.УстановитьПараметр("парамДатаСреза", ЧасовыеПоясаСервер.ТекущееВремяИБ());
	
	Запрос.Текст = 
	" ВЫБРАТЬ   РАЗРЕШЕННЫЕ  
	|	СвязанныеДанные.*
	| ИЗ 
	|	РегистрСведений." + ИмяТаблицы + ".СрезПоследних(&парамДатаСреза, ФизЛицо = &ПарамФизЛицо) КАК  СвязанныеДанные";
	
	НаборЗаписей.Очистить();
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
	КонецЕсли;
	
КонецПроцедуры  // ПолучитьСвязанныеДанныеФизлица()


// Возвращает рабочую дату
// :
// Дата - рабочая дата
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьРабочуюДату() Экспорт

// #Если Клиент Тогда
// Дата = ТекущаяДатаСеанса();
// #Иначе
	Дата = ЧасовыеПоясаСервер.ТекущееВремяИБ();
// #КонецЕсли

	Возврат Дата;

КонецФункции  // ПолучитьРабочуюДату()


// Формирует структуру с ключами Статус (Истина) и Значение
//
// Параметры:
//     Значение - Произвольный 
//     Статус - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ЗаполнитьРезультат(знач Значение, знач Статус = Истина) Экспорт
	
	Если Статус Тогда
		Возврат Новый Структура("Статус, Значение",  ИСТИНА , Значение);
	Иначе
		Возврат Новый Структура("Статус, СообщениеОбОшибке",  ЛОЖЬ , Значение);
	КонецЕсли;
	
КонецФункции


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


// Функция из исходной строки формирует строку для поиска данных в запросе
//
// Параметры:
//     СтрокаПоиска - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт
	
	ИтоговаяСтрокаДляПоиска = СтрокаПоиска;
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "~", "~~");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "%", "~%");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "_", "~_");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "[", "~[");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "-", "~-");

	Возврат ИтоговаяСтрокаДляПоиска;
	
КонецФункции


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


// Функция проверки корректности введенного адреса электронной почты
//
// Параметры:
//     СтрокаАдреса - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПроверитьКорректностьEmail(СтрокаАдреса) Экспорт
	
	Если Не ПустаяСтрока(СтрокаАдреса) Тогда
		
		
		Инфо = Новый СистемнаяИнформация;
		Если Инфо.ТипПлатформы = ТипПлатформы.Linux_x86 или 
			Инфо.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
			
			Возврат Истина;
			
		КонецЕсли;
		Шаблон = ПолучитьЗначениеКонстанты("ИТ_ШаблонПроверкиКорректностиАдресаПочты");
		
		Если Не ЗначениеЗаполнено(Шаблон) Тогда
			
			Возврат Истина;
			
		КонецЕсли;
		Попытка		
			RegExp = Новый COMОбъект("VBScript.RegExp");  // Создаем объект для работы  с регулярными выражениями
			RegExp.MultiLine = Ложь;     // Истина — текст многострочный, ложь — одна строка
			RegExp.Global = Истина;      // Истина — поиск по всей строке, ложь — до первого совпадения
			RegExp.IgnoreCase = Истина;  // Истина — игнорировать регистр строки при поиске
			RegExp.Pattern = Шаблон;     // Шаблон (регулярное выражение) для проверки  корректности e-mail
			Если RegExp.Test(СтрокаАдреса) Тогда
				Возврат Истина;
			Иначе
				Возврат Ложь;
			КонецЕсли;
		Исключение
			Возврат Ложь;
		КонецПопытки;
		
	КонецЕсли;
	
	Возврат Истина;
КонецФункции


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


// //////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПАРАМЕТРОВ СЕАНСА, ПЕРЕМЕННЫХ МОДУЛЯ ПРИЛОЖЕНИЯ
// Функция предназначена для получения значения по имени переменной из КЭШа конфигурации
// Вызывается из функции ПолучитьЗначениеПеременной
// :
// Имя					- Строка, имя переменной
// НайденноеЗначение	- Произвольное значение, значение переменной. Заполняется в ходе выполнения функции
// Кэш					- КЭШ из которого получали значение. Заполняется в ходе выполнения функции
// ПоместитьВКэш		- Булево, Истина, если значение требуется поместить в КЭШ. Заполняется в ходе выполнения функции
// : 
// Булево - Истина, если значение было получено из КЭШа, иначе Ложь
//
// Параметры:
//     Имя - Произвольный 
//     НайденноеЗначение - Произвольный 
//     Кэш - Произвольный 
//     ПоместитьВКэш - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьИзКэшаКонфигурации(Имя, НайденноеЗначение, Кэш, ПоместитьВКэш) Экспорт
	
	#Если  ВнешнееСоединение  Тогда
	Кэш = глОбщиеЗначения;
	#Иначе	
	Кэш = ПараметрыСеанса.ОбщиеЗначения.Получить();
	#КонецЕсли
	
	Если Кэш <> Неопределено Тогда
		// Ищем значение в структуре
		Если Кэш.Свойство(Имя, НайденноеЗначение) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;

	// Не нашли значение в кэше - вычисленное значение надо будет поместить в Кэш
	ПоместитьВКэш = Истина;
	
	Возврат Ложь;
	
КонецФункции //


// Функция предназначена для получения значения по имени переменной
// Вызывается из функции глЗначениеПеременной
// :
// Имя - Строка, имя переменной
// : 
// Произвольное значение
//
// Параметры:
//     Имя - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьЗначениеПеременной(Имя) Экспорт
	
	ИмяПараметраВР = ВРег(Имя);
	НайденноеЗначение = Неопределено;
	
	Кэш = Неопределено;
	ПоместитьВКэш = Ложь;
	
	Если НайденноеЗначение = Неопределено Тогда
		
		Если ИмяПараметраВР = ВРег("глТекущийПользователь") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ПараметрыСеанса.ТекущийПользователь;
			КонецЕсли; 
			
		ИначеЕсли ИмяПараметраВР = ВРег("ИТ_ИспользоватьПравилаОбработки") Тогда			
			
			Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПравилаОбработки") = Истина;
			
		ИначеЕсли ИмяПараметраВР = ВРег("глТекущийСотрудник") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ИТ_ПользователиПолныеПрава.ОпределитьТекущегоСотрудника();
			КонецЕсли; 
			
		ИначеЕсли ИмяПараметраВР = ВРег("глТекущееКонтактноеЛицо") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ИТ_ПользователиПолныеПрава.ОпределитьТекущееКонтактноеЛицо();
			КонецЕсли; 
			
		ИначеЕсли ИмяПараметраВР = ВРег("глТекущееФизическоеЛицо") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ИТ_ПользователиПолныеПрава.ОпределитьТекущееФизЛицо();
			КонецЕсли; 
			
			
		ИначеЕсли ИмяПараметраВР = ВРег("глЧасовойПояс") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ПолучениеЗначенийСервер.ПолучитьПараметр("ИТ_ЧасовойПояс");
				
				// Не установлен часовой пояс, значит будем считать что работает по времени ИБ
				Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
					НайденноеЗначение = Константы.ИТ_ЧасовойПоясИБ.Получить();
				КонецЕсли;
			КонецЕсли; 
			
		ИначеЕсли ИмяПараметраВР = ВРег("глЧасовойПоясБазы") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = Константы.ИТ_ЧасовойПоясИБ.Получить();
			КонецЕсли;
			
		ИначеЕсли ИмяПараметраВР = ВРег("idсеанса") Тогда
			
			Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
				НайденноеЗначение = ПараметрыСеанса.IDСеанса;
			КонецЕсли;
			
		// ИначеЕсли ИмяПараметраВР = ВРег("ИспользоватьВерсионированиеОбъектов") Тогда
		// 	
		// Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
		// НайденноеЗначение = ПолучениеЗначенийСервер.ПолучитьПараметр("ИспользоватьВерсионированиеОбъектов");
		// 		
		// // не установлен часовой пояс, значит будем считать что работает по времени ИБ
		// Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
		// НайденноеЗначение = Константы.ИспользоватьВерсионированиеОбъектов.Получить();
		// КонецЕсли;
		// КонецЕсли; 
		// 	
		// ИначеЕсли ИмяПараметраВР = ВРег("ИТ_УчетТрудозатратСотрудниковПоГрафикуРаботы") Тогда
		// 	
		// Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
		// НайденноеЗначение = ПолучениеЗначенийСервер.ПолучитьПараметр(ИмяПараметраВР);
		// 						
		// Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
		// НайденноеЗначение = Константы[ИмяПараметраВР].Получить();
		// КонецЕсли;
		// КонецЕсли; 			
		// 	
		// ИначеЕсли ИмяПараметраВР = ВРег("ПредварительныйПросмотр") Тогда
		// 	
		// Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
		// НайденноеЗначение = ПолучениеЗначенийСервер.ПолучитьПараметр(ИмяПараметраВР);
		// 		
		// Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
		// НайденноеЗначение = Константы[ИмяПараметраВР].Получить();
		// КонецЕсли;
		// КонецЕсли;
		// 	
		// ИначеЕсли ИмяПараметраВР = ВРег("ВалютаРегламентированногоУчета") Тогда
		// Если НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш) Тогда
		// НайденноеЗначение = ПолучениеЗначенийСервер.ПолучитьПараметр(ИмяПараметраВР);
		// 		
		// Если Не ЗначениеЗаполнено(НайденноеЗначение) Тогда
		// НайденноеЗначение = Константы[ИмяПараметраВР].Получить();
		// КонецЕсли;
		// КонецЕсли;
		// ИначеЕсли ИмяПараметраВР = ВРег("глЧасовойПояс")  ИЛИ  ИмяПараметраВР = ВРег("глЧасовойПоясБазы") Тогда
		// НайденноеЗначение = ИТ_ПолучениеПараметров.ИТ_ПолучениеЗначениеПараметра("ИТ_ЧасовойПоясИБ")
		ИначеЕсли Метаданные.Константы.Найти(ИмяПараметраВР) <> Неопределено Тогда 
			НайденноеЗначение = ИТ_ПолучениеПараметров.ИТ_ПолучениеЗначениеПараметра(ИмяПараметраВР)
		КонецЕсли;
		
	КонецЕсли;
	
	Если ПоместитьВКэш Тогда
		
		#Если  ВнешнееСоединение  Тогда
			
			Если глОбщиеЗначения = Неопределено Тогда
				глОбщиеЗначения = Новый Структура;
			КонецЕсли; 
			глОбщиеЗначения.Вставить(Имя, НайденноеЗначение);
			
		#Иначе	
			
			// В функции ПолучитьИзКэшаКонфигурации получили значение параметра сеанса
			// Добавим в него новое значение переменной и поместим в КЭШ
			Кэш.Вставить(Имя, НайденноеЗначение);
			ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(Кэш);
			
		#КонецЕсли
		
	КонецЕсли; 
	
	Возврат НайденноеЗначение;
	
КонецФункции

// Функция выполняет действие:
//   Установить Значение Переменной
//
// Параметры:
//     ИмяПараметра - Произвольный 
//     ЗначениеПараметра - Произвольный 
//     ОбновитьКэшНаСервере - Произвольный
Процедура УстановитьЗначениеПеременной(ИмяПараметра, ЗначениеПараметра, ОбновитьКэшНаСервере = Ложь) Экспорт
	
	#Если ВнешнееСоединение  Тогда
		// Обновление переменной на клиенте или во внешнем соединении  
		
		// Если глобальная переменная глОбщиеЗначения еще не инициализирована, инициализируем ее 
		Если глОбщиеЗначения = Неопределено Тогда
			глОбщиеЗначения = Новый Структура;
		КонецЕсли;
		
		// Установим новое значение переменной
		глОбщиеЗначения.Вставить(ИмяПараметра, ЗначениеПараметра);
		
		Если НЕ ОбновитьКэшНаСервере Тогда
			Возврат;			
		КонецЕсли;
	#КонецЕсли
	
	// Обновим значение переменной в кэше на сервере. Это происходит в двух случаях:
	// 1. при выполнении на клиенте, когда ОбновитьКэшНаСервере = Истина (см. выше)
	// 2. при выполнении на сервере
	КэшНаСервере = ПараметрыСеанса.ОбщиеЗначения.Получить();
		
	// Если ПараметрыСеанса.ОбщиеЗначения еще не инициализирована, инициализируем ее 
	Если КэшНаСервере = Неопределено Тогда
		КэшНаСервере = Новый Структура;
	КонецЕсли;
	
	КэшНаСервере.Вставить(ИмяПараметра, ЗначениеПараметра);
	
	ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(КэшНаСервере);
	
КонецПроцедуры


// //////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ СО СВОЙСТВАМИ И КАТЕГОРИЯМИ ОБЪЕКТОВ
// Функция возвращает список доступных назначений для "Свойств  И  категорий объектов" 
// по переданной ссылке
// :
// Ссылка - Ссылка на справочник или документ
// :
// Список значений: доступные назначения для свойств и категорий
//
// Параметры:
//     Ссылка - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Ссылка) Экспорт

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

	ТипСсылки = ТипЗнч(Ссылка);
	ЭтоХарактеристика = (ТипСсылки = Тип("СправочникСсылка.ХарактеристикиНоменклатуры"));

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

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

	Если ЭтоХарактеристика Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|	 И  Назначения.Ссылка = &НазначениеХарактеристика
		|";
	Иначе
		ТекстЗапроса = ТекстЗапроса + "
		|	 И  Назначения.Ссылка <> &НазначениеХарактеристика
		|";
	КонецЕсли;

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

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

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

КонецФункции  // ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке()


// Функция ищет элемент в массиве. Если находит - возвращает его индекс, иначе -1
//
// Параметры:
//     МассивДанные - Произвольный 
//     Элемент - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ВернутьИндексВМассиве(МассивДанные, Элемент) Экспорт 
	
	Если МассивДанные = Неопределено Тогда
		Возврат -1;
	КонецЕсли;
	
	Для ИндексЭлемента = 0 По МассивДанные.ВГраница() Цикл
		
		Если  (МассивДанные[ИндексЭлемента] = Элемент) Тогда
			Возврат ИндексЭлемента;
		КонецЕсли;	
		
	КонецЦикла;
	
	// Не нашли элемент
	Возврат -1;
	
КонецФункции


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

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

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

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


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