&НаСервере
Функция ВыбратьИсполнителяНаСервере()
Наименование=объект.Район;
нама=СтрРазделить(Наименование," ");
Район=ВРег(нама[0]);
Исполнители=Новый Массив();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоступВЛКДляКонтрагентаРайоныОбслуживания.Ссылка.Ссылка КАК Ссылка,
| ДоступВЛКДляКонтрагентаРайоныОбслуживания.Доля КАК Доля
|ИЗ
| Справочник.ДоступВЛКДляКонтрагента.РайоныОбслуживания КАК ДоступВЛКДляКонтрагентаРайоныОбслуживания
|ГДЕ
| ВРЕГ(ДоступВЛКДляКонтрагентаРайоныОбслуживания.Район.Наименование) ПОДОБНО &Наименование";
Запрос.УстановитьПараметр("Наименование", "%"+Район+"%");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВсегоДолей=0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Исполнители.Добавить(Новый Структура("исполнитель,доля",ВыборкаДетальныеЗаписи.Ссылка,ВыборкаДетальныеЗаписи.Доля));
ВсегоДолей=ВсегоДолей+ВыборкаДетальныеЗаписи.Доля;
КонецЦикла;
Если Исполнители.Количество()=0 тогда
возврат неопределено;
конецесли;
// если исполнитель один, то с долями не морочимся
Если Исполнители.Количество()=1 тогда
Возврат Исполнители[0].исполнитель;
конецесли;
// если всего долей 0, а исполнителей более чем 1, то тогда исполнитель - первый попавшийся
если ВсегоДолей=0 тогда
Возврат Исполнители[0].исполнитель;
конецесли;
// А вот тут уже мудрим с долями
ЗаполненныеДоли=Новый Массив();
для каждого исполнитель из Исполнители цикл
для поз=1 по исполнитель.доля цикл
ЗаполненныеДоли.Добавить(исполнитель.исполнитель);
конеццикла
конеццикла;
// Здесь уже имеем массив с заполненными развернутыми исполнителями. Например: Вася,Вася,Вася,Петя,Петя
// Осталось сгенерировать случайное число 1-5, и назначить в соответствии с выпавшим числом исполнителя
Генератор = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
СлучайноеЧисло = Генератор.СлучайноеЧисло(0,ЗаполненныеДоли.Количество()-1);
Возврат ЗаполненныеДоли[СлучайноеЧисло];
КонецФункции