Имя: Пароль:
1C
 
Наложение отбора на должности при открытии справочника сотрудники
0 falselight
 
19.09.19
05:15
Имеется документ. У которого в шапке есть реквизит типа другого документа.
В этом документе что в реквизите в шапке, в его табличной части хранятся введенные должности.
У основного документа в табличной части вводятся сотрудники.
При открытии списка выбора сотрудников, в форме выбора должны отображаться, только сотрудники с должностями
указанными в табличной части документа что в шапке.

Как правильно наложить этот отбор, на открывающуюся форму выбора справочника сотрудники, из поля табличной части документа?

Это делается похоже только программно. Пытаюсь выявить решение. Подскажите пожалуйста?
1 ppa32
 
19.09.19
06:37
Уважаемый, доброго времени суток. Как - то сильно мутно у тебя всё получается.


Тебе получается при выборе сотрудника в ТЧ основного документа надо получить форму выбора сотрудника, передать туда ссылку на "реквизитный" документ. А в событии "ПриСозданииНаСервере" в форме выбора сотрудника запросом получить всех нужных сотрудников, и отображать только их.

Или еще вариант: при выборе сотрудника в ТЧ основного документа получить (опять же запросом) все должности из "реквизитного" документа, передать их в форму выбора сотрудника, и там уже легко поставишь отбор.
2 falselight
 
19.09.19
06:43
(1) А можно ещё подсказку, как передать? Можно пример кода? параметрами?
3 ppa32
 
19.09.19
06:49
4 falselight
 
19.09.19
08:30
А если нужно должности отбирать запросом, по реквизиту что на форме? А у объекта справочник этого реквизита нет.
Тогда получается это никак же не сделать?
5 falselight
 
19.09.19
08:50
Как отбирать?????
6 ppa32
 
19.09.19
09:19
(4) вопрос не ясен.

У тебя в момент, когда юзер пытается выбрать сотрудника, происходит событие "НачалоВыбора" (если мне не изменяет мой склероз памяти). В этот момент говоришь

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

потом делаешь

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

в форме выбора ПриСозданииНаСервере говоришь:

Если Параметры.Свойство("ОсновнойДокументОбъект") Тогда
        Запрос = Новый Запрос("ВЫБРАТЬ всех долбаных сотрудников ИЗ Справочник.Сотрудники ГДЕ ДолбаннаяДолжность В (&Должности)");
Запрос.УстановитьПараметр("Должности", Параметры.ОсновнойДокументОбъект.СсылкаНаРеквизитныйДокумент.ТЧДолжности.ВыгрузитьКолонку("ДолжностиВсякихКлоунов"));
Результат = Запрос.Выполнить().Выгрузить();
Этаформа.ТаблицаСортудников.УстановитьОтбор...
КонецЕсли;
7 Fram
 
19.09.19
09:22
(5) то есть другого способа связать 2 справочника нет?
8 ppa32
 
19.09.19
09:26
(5) Точнее даже объект передавать - не есть хорошо. Можно завести реквизит в форме, который бы содержал ссылку на "реквизитный" документ. И именно его уже передаёшь как параметр.
9 falselight
 
19.09.19
09:48
Сейчас, есть документ, у него есть тч, там поле Допускающий, составного типа
СправочникСсылка.Сотрудники и СправочникСсылкаФизическоеЛицо, выбирают Сотрудники.
Я в процедуре ДопускающийНачалоВыбора() сформировал список нужных сотрудников для выбора.

Подскажите пожалуйста, как дальше двигаться, что бы открыть форму выбора этих сотрудников ?

/////////////////////////////////////////////////////////////////////

&НаКлиенте
Процедура интДопускающиеДопускающийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    МассПриема = ПолучитьДолжности();
КонецПроцедуры

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


//////////////////////////////////////////////////////////////////////

Как сказали в (1) сейчас я получил список нужных сотрудников, и получать их нужно было из регистра не из справочника. Как дальше правильнее продолжить?
10 falselight
 
19.09.19
09:51
Имея вот тут нужный массив сотрудников, наверное тут и нужно открывать какую то форму выбора с этими сотрудниками?
Подскажите пожалуйста. Наверное нужно открывать форму выбора справочника и передавать туда этот массив сотрудников.
Как это будет?
11 falselight
 
19.09.19
09:51
(10+)

&НаКлиенте
Процедура интДопускающиеДопускающийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    МассПриема = ПолучитьДолжности();
КонецПроцедуры
12 ppa32
 
19.09.19
09:59
(11) Отбор ты должен поставить в форме выбора справочника "Сотрудники".

ПередОткрытием будет что - то типа такого:

ЭтаФорма.СотрудникиСписок.Отбор.Должность.ВидСравнения = ВидСравнения.ВСписке;
ЭтаФорма.СотрудникиСписок.Отбор.Должность.Значение = СписокЗначенийДолжностейКоторыеТыНаковырялЗапросом;
ЭтаФорма.СотрудникиСписок.Отбор.Должность.Использование = Истина;
13 falselight
 
19.09.19
10:06
(12) А если я её сам открою из формы документа в процедуре НачалоВыбора() так что ли нельзя?
14 falselight
 
19.09.19
10:11
Вот так примерно можно делать?

&НаКлиенте
Процедура интДопускающиеДопускающийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    МассПриема        = ПолучитьДолжности();
    СписокСотрудников = Новый СписокЗначений;
    СписокСотрудников.ЗагрузитьЗначения(МассПриема);
    //
    СтандартнаяОбработка = Ложь;
    Форма           = Справочники.Сотрудники.ПолучитьФормуВыбора();
    Форма.Заголовок = "ВЫБОР СОТРУДНИКОВ ПО ДОЛЖНОСТЯМ";
    Форма.Отбор.Ссылка.Использование = Истина;
    Форма.Отбор.Ссылка.ВидСравнения  = ВидСравнения.ВСписке;
    Форма.Отбор.Ссылка.Значение      = СписокСотрудников;
    Форма.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр=Ложь;
    
    ВыбранноеЗначение=Форма.ОткрытьМодально();    
КонецПроцедуры
15 falselight
 
19.09.19
10:15
(14+)  Не это совсем не то.

Подскажите пожалуйста по коду как нужно. Можно ли это сделать в форме документа?
16 falselight
 
19.09.19
11:09
РЕШИЛОСЬ ВСЕ ТАК.


&НаКлиенте
Процедура интДопускающиеДопускающийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    МассПриема                    = ПолучитьСотрудниковПоДолжностям();
    СписокСотрудниковПоДолжностям = Новый СписокЗначений;
    СписокСотрудниковПоДолжностям.ЗагрузитьЗначения(МассПриема[0].МассДолжности2);
    //
    СтандартнаяОбработка = Ложь;
    СтруктураПараметров  = Новый Структура;
    СтруктураПараметров.Вставить("Дата",               Объект.Дата);    
    СтруктураПараметров.Вставить("Организация",       Объект.Организация);
    СтруктураПараметров.Вставить("СписокСотрудников", СписокСотрудниковПоДолжностям);
    ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", СтруктураПараметров, Элемент);
КонецПроцедуры
//
&НаСервере
Функция ПолучитьСотрудниковПоДолжностям()
    МассДолжности   = Объект.интДолжностиЛицаИмеющиеПравоНаВыдачуНарядаДопуска.Должности.ВыгрузитьКолонку("Должность");
    СписокДолжности = Новый СписокЗначений;
    СписокДолжности.ЗагрузитьЗначения(МассДолжности);
    Запрос          = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    КадроваяИсторияСотрудниковСрезПоследних.Период                           КАК Период,
        |    КадроваяИсторияСотрудниковСрезПоследних.Сотрудник                       КАК Сотрудник,
        |    КадроваяИсторияСотрудниковСрезПоследних.Организация                   КАК Организация,
        |    КадроваяИсторияСотрудниковСрезПоследних.Подразделение                   КАК Подразделение,
        |    КадроваяИсторияСотрудниковСрезПоследних.ДолжностьПрофессия               КАК ДолжностьПрофессия,
        |    КадроваяИсторияСотрудниковСрезПоследних.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
        |    КадроваяИсторияСотрудниковСрезПоследних.Статус                           КАК Статус
        |ИЗ
        |    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних КАК КадроваяИсторияСотрудниковСрезПоследних
        |ГДЕ
        |    КадроваяИсторияСотрудниковСрезПоследних.ДолжностьПрофессия В(&СписокДолжностей)
        |   И НЕ КадроваяИсторияСотрудниковСрезПоследних.Статус = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботника.Уволен)";        
    Запрос.УстановитьПараметр("СписокДолжностей", СписокДолжности);
    МассСотрудники = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Сотрудник");
    МассВозврата   = Новый Массив(1);
    СтруктВозврата = Новый Структура;
    СтруктВозврата.Вставить("МассДолжности2", МассСотрудники);
    МассВозврата[0] = СтруктВозврата;
    Возврат МассВозврата;
КонецФункции
17 Fram
 
19.09.19
17:53
(16) где взял этот код?