Имя: Пароль:
1C
1С v8
передать параметры в функцию
0 dft2014
 
14.11.17
17:37
На форме отчета есть два реквизита: Сотрудник и Подразделение. Если пользователь указал Сотрудника или Подразделение, то отчет должен сформироваться с отбором по Сотруднику или Подразделению. Если отбор на форме не указан, то отчет должен формироваться по всем Сотрудникам  или всем Подразделениям.
Проблема в том, что в отчете я использую типовую функцию. Условие с отбором по сотруднику срабатывает верно. Но не получается передать правильно параметры в эту функцию, чтобы выполнялись условия:
- если не задан сотрудник, то формировать по всем сотрудникам;
- если задано подразделение, то формировать только по этому  подразделению;
- если не задано подразделение, то формировать по всем.
Помогите пож-та, ниже код:


ЧтоИщу = "Подразделение, Должность, ТабельныйНомер, ФИО, Состояние";

Если ЗначениеЗаполнено(Отчет.Сотрудник) Тогда
    КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Отчет.Сотрудник, ЧтоИщу, ПериодОтчета); //это срабатывает правильно
Иначе
    //вот здесь как задать условие, без отбора по Сотруднику    
КонецЕсли;

Если ЗначениеЗаполнено(Отчет.Подразделение) Тогда
    //вот здесь как задать условие, с отбором по Подразделению    
Иначе
    //вот здесь как задать условие, без отбора по Подразделению    
КонецЕсли;



//ИЗ ОПИСАНИЯ:
Функция КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных = '00010101', ПоляОтбораПериодическихДанных = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
    //    Параметры:
    //    ТолькоРазрешенные - Булево
    //  СписокСотрудников - Массив ссылок на элементы справочника сотрудники или СправочникСсылка.Сотрудники.
    //  КадровыеДанные -     Строка - список полей данных, перечисленных через запятую
    //                        или Массив строк с полями данных,
    //                        которые необходимо получить.
    //
    //    ДатаПолученияДанных    - дата на которую необходимо получить данные сотрудников,
    //
    //  ПоляОтбораПериодическихДанных - Структура, в качестве ключа указывается имя таблицы, содержащей
    //                                    периодические данные (например ФИОФизическихЛиц, ГражданствоФизическихЛиц).
    //                                    В качестве значений коллекция условий отбора,
    //                                    соединяемых по "И" и применяемых к регистру сведений.
    //                                    Коллекция строки которой имеют поля.
    //                                        * ЛевоеЗначение - строка, имя поля регистра сведений.
    //                                        * ВидСравнения - строка, вид сравнения, допустимый в языке запросов.
    //                                        * ПравоеЗначение - значение для сравнения с полем ЛевоеЗначение.
1 Ёпрст
 
гуру
14.11.17
17:43
(0) передавай пустой список сотрудников
2 Ёпрст
 
гуру
14.11.17
17:44
ну и в функции не видно, как там и чего фильтруется и как ты туда подразделения свои передаешь
3 dft2014
 
14.11.17
17:46
(1) Как передать пустой список (массив) сотрудников?

Отборы передаются в пятом параметре функции: Функция КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных = '00010101', ПоляОтбораПериодическихДанных = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
4 Ёпрст
 
гуру
14.11.17
17:48
(3)
СписокСотрудников = Новый СписокЗначений;
5 dft2014
 
14.11.17
17:48
Отбор по сотруднику я передала во ВТОРОМ параметре, все отлично сработало:
КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Отчет.Сотрудник, ЧтоИщу, ПериодОтчета);

А вот остальные условия не удается сделать...
6 dft2014
 
14.11.17
17:48
(4) Сейчас попробую...
7 dft2014
 
14.11.17
17:59
Написала, если нет отбора по сотруднику, но отчет ничего не вернул:

СписокСотрудников = Новый Массив;
КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, ЧтоИщу, ПериодОтчета);
8 Ёпрст
 
гуру
14.11.17
18:00
покажи текст функции целиком
9 breezee
 
14.11.17
18:05
Может на СКД можно сформировать? Она умеет в пусты параметры через "{}"
10 dft2014
 
14.11.17
18:06
(8) Вот исходник:

// Возвращает таблицу значений заполненную данными сотрудников, перечисленными в
// параметре СписокНеобходимыхДанных.
//
// Параметры:
//    ТолькоРазрешенные - Булево
//  СписокСотрудников - Массив ссылок на элементы справочника сотрудники или
//                          СправочникСсылка.Сотрудники.
//  КадровыеДанные -     Строка - список полей данных, перечисленных через запятую
//                        или Массив строк с полями данных,
//                        которые необходимо получить. Ниже приведены идентификаторы
//                        получаемых данных и описание значения, которое будет возвращено в
//                        таблице значений
//                        которые необходимо получить. Ниже приведены идентификаторы
//                        получаемых данных и описание значения, которое будет возвращено в
//                        таблице значений.
//
//    ДатаПолученияДанных    - дата на которую необходимо получить данные сотрудников,
//                        применимо к данным, носящим периодический характер.
//                        Если дату не указывать, будут получены самые последние данные.
//
//
//  ПоляОтбораПериодическихДанных - Структура, в качестве ключа указывается имя таблицы, содержащей
//                                    периодические данные (например ФИОФизическихЛиц, ГражданствоФизическихЛиц).
//                                    В качестве значений коллекция условий отбора,
//                                    соединяемых по "И" и применяемых к регистру сведений.
//                                    Коллекция строки которой имеют поля.
//                                        * ЛевоеЗначение - строка, имя поля регистра сведений.
//                                        * ВидСравнения - строка, вид сравнения, допустимый в языке запросов.
//                                        * ПравоеЗначение - значение для сравнения с полем ЛевоеЗначение.
//
//    Список полей, допустимых в параметре КадровыеДанные см. КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников.
//
// Возвращаемое значение:
//   ТаблицаЗначений   - Таблица значений, содержащая запрошенные данные.
//
Функция КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных = '00010101', ПоляОтбораПериодическихДанных = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
    
    // Подготовим Запрос и Менеджер временных таблиц.
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    // Сформируем временную таблицу ВТКадровыеДанныеФизическихЛиц.
    СоздатьНаДатуВТКадровыеДанныеСотрудников(Запрос.МенеджерВременныхТаблиц, ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных, ПоляОтбораПериодическихДанных, ФормироватьСПериодичностьДень);
    
    // Выберем кадровые данные физлиц из временной таблицы.
    Запрос.Текст = "ВЫБРАТЬ КадровыеДанныеСотрудников.* ИЗ ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудников";
    КадровыеДанныеСотрудников = Запрос.Выполнить().Выгрузить();
    
    Возврат КадровыеДанныеСотрудников;
    
КонецФункции
11 dft2014
 
14.11.17
18:08
// Формирует временную таблицу ВТКадровыеДанныеСотрудников, содержащую кадровые данные сотрудников,
// переданных ей в качестве параметра на указанную дату.
//
// Параметры:
//        МенеджерВременныхТаблиц - МенеджерВременныхТаблиц в котором формируется временная таблица.
//        ТолькоРазрешенные - Булево
//        СписокСотрудников - Массив ссылок или ссылка на элемент справочника Сотрудники.
//        КадровыеДанные - см. описание к функции КадровыеДанныеСотрудников.
//        ДатаПолученияДанных - Дата, на которую необходимо получить "периодические" данные.
//        ПоляОтбораПериодическихДанных -  см. описание к функции КадровыеДанныеСотрудников.
//
Процедура СоздатьНаДатуВТКадровыеДанныеСотрудников(МенеджерВременныхТаблиц, ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, Знач ДатаПолученияДанных, ПоляОтбораПериодическихДанных = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
    
    // Проверим, если в качестве параметра СписокФизическихЛиц, передана ссылка, создадим массив.
    Если ТипЗнч(СписокСотрудников) = Тип("СправочникСсылка.Сотрудники") Тогда
        МассивСотрудников = Новый Массив;
        МассивСотрудников.Добавить(СписокСотрудников);
    Иначе
        МассивСотрудников = СписокСотрудников;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("МассивСотрудников", МассивСотрудников);
    Запрос.УстановитьПараметр("ДатаПолученияДанных", ДатаПолученияДанных);
    
    Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    &ДатаПолученияДанных КАК Период,
        |    ДанныеСотрудников.Ссылка КАК Сотрудник
        |ПОМЕСТИТЬ ВТСписокСотрудников
        |ИЗ
        |    Справочник.Сотрудники КАК ДанныеСотрудников
        |ГДЕ
        |    ДанныеСотрудников.Ссылка В(&МассивСотрудников)";
    
    УстановитьПривилегированныйРежим(Истина);
    Запрос.Выполнить();
    УстановитьПривилегированныйРежим(Ложь);
    
    ОписательВременныхТаблиц = ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
        МенеджерВременныхТаблиц, "ВТСписокСотрудников");
    
    СоздатьВТКадровыеДанныеСотрудников(ОписательВременныхТаблиц, ТолькоРазрешенные, КадровыеДанные, ПоляОтбораПериодическихДанных, ФормироватьСПериодичностьДень);
    
    Запрос.Текст = "УНИЧТОЖИТЬ ВТСписокСотрудников";
    Запрос.Выполнить();
    
КонецПроцедуры
12 dft2014
 
14.11.17
18:19
Ап!
13 Ёпрст
 
гуру
14.11.17
18:19
(11)
судя по

    |ГДЕ
        |    ДанныеСотрудников.Ссылка В(&МассивСотрудников)";

- никак не сделаешь. Только лили переделывать код процы
СоздатьНаДатуВТКадровыеДанныеСотрудников

или передавать массив всех сотрудников.
А так, в своём коде не используй эту функцию вообще.
14 Ёпрст
 
гуру
14.11.17
18:20
напиши свою, которая вернёт что надо о и как надо.
15 dft2014
 
15.11.17
10:43
(13) А как передать массив всех сотрудников?

(14) Мне надо использовать типовую, она уже готовая и возвращает то, что мне надо.
16 Ёпрст
 
гуру
15.11.17
10:48
(15)
1. не надо этого делать
2. не надо использовать типовую
17 dft2014
 
15.11.17
10:54
(16) Типовая функция, помимо этого:
ЧтоИщу = "Подразделение, Должность, ТабельныйНомер, ФИО, Состояние";
тянет еще около 15-ти показателей, которые я просто не указала. Т.е. если писать свои функции, то это очень много времени займет. А тут все тянется с помощью одной типовой  функции!!!
18 h-sp
 
15.11.17
11:06
(17) посмотрите в типовой как в других местах вызывается эта функция, перенесите к себе
19 Ёпрст
 
гуру
15.11.17
11:12
(17) как скажешь

Запрос = Новый Запрос("выбрать ссылка из СправочникюСотрудники");
СписокСотрудников = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ССылка");