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