Форум программистов, компьютерный форум, киберфорум
Наши страницы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
НикоН
22 / 21 / 3
Регистрация: 21.01.2010
Сообщений: 95
1

Выбрать только документы "Ввод расчета сотруднику" по указанному сотруднику

10.11.2011, 13:22. Просмотров 2897. Ответов 9
Метки нет (Все метки)

Всем доброго времени суток

Необходимо выбрать все документы "Ввод расчета сотруднику".

Сейчас у меня сделано так:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
...
СпрСотрудники=СоздатьОбъект("Справочник.Сотрудники");
СпрСотрудники.ИспользоватьДату(ТДата);
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент()>0 Цикл
    ФИО=СпрСотрудники.Наименование;
    Док=СоздатьОбъект("Документ");
    Док.ВыбратьПоЗначению(,,"Сотрудник",СпрСотрудники.ТекущийЭлемент());
    Пока Док.ПолучитьДокумент()=1 Цикл
...
    КонецЦикла;
КонецЦикла;
...
Но в этом случае выбираются все документы сотрудника. Соответственно цикл выполняется очень долго.
Как сократить выборку?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2011, 13:22
Ответы с готовыми решениями:

Создание отчета "Сумма продаж по каждому сотруднику"
Имеется 3 сотрудника. Сделал регистр накоплений, где сумма документа(Заказ), записывается на...

БухИтоги: необходимо найти сумму оборота по счетам 69, 70 по конкретному Сотруднику
Вот такая проблема. Для расчета необходимо найти сумму оборота по счетам 69, 70 по конкретному...

У ЗУПа нет данных по сотруднику за предшествующий период, поэтому отпуск ему не рассчитывает
Начали вести ЗУП 2.5 с января 2014. Сотрудник ушел в отпуск в январе 2014. У ЗУПа нет данных по...

Сколько лет сотруднику
День добрый. Нужно вычислить возраст сотрудника в отчете. Есть справочник "Сотрудники" с...

Отчет по выбранному сотруднику
Лабораторная работа. Считаю зар.плату сотрудникам. Есть отчет, который выводит список всех...

9
Dethmontt
Модератор
Эксперт 1С
2653 / 2443 / 418
Регистрация: 10.03.2011
Сообщений: 8,746
Записей в блоге: 1
Завершенные тесты: 1
10.11.2011, 18:13 2
Ты вибираешь все документы по всем сотрудникам?
0
НикоН
22 / 21 / 3
Регистрация: 21.01.2010
Сообщений: 95
11.11.2011, 08:44  [ТС] 3
Практически так и получается.
Для того что бы получить действующую надбавку за выслугу по сотруднику, я перебираю все имеющиеся у него документы. Это не есть гуд.
Вот и хотелось бы, как то ограничить выборку, только документами "Ввода расчета сотруднику". Как правило, таких документов не более десятка.
0
Танцор_С_Бубном
34 / 34 / 3
Регистрация: 31.03.2011
Сообщений: 197
11.11.2011, 09:59 4
Штатные запросы, не?
0
Flamepain
31 / 31 / 0
Регистрация: 19.03.2011
Сообщений: 100
11.11.2011, 10:01 5
1C
1
2
3
4
5
6
7
8
9
10
11
СпрСотрудники=СоздатьОбъект("Справочник.Сотрудники");
СпрСотрудники.ИспользоватьДату(ТДата);
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент()>0 Цикл
 ФИО=СпрСотрудники.Наименование;
 Док=СоздатьОбъект("Документ.ВводРасчетаСотруднику");// или как он там называется в конфигураторе
 Док.ВыбратьПоЗначению(,,"Сотрудник",СпрСотрудники.ТекущийЭлемент());
 Пока Док.ПолучитьДокумент()=1 Цикл
...
 КонецЦикла;
КонецЦикла;
1
НикоН
22 / 21 / 3
Регистрация: 21.01.2010
Сообщений: 95
11.11.2011, 10:12  [ТС] 6
СПС
Буду пробовать
0
Танцор_С_Бубном
34 / 34 / 3
Регистрация: 31.03.2011
Сообщений: 197
11.11.2011, 10:14 7
Flamepain, Не взлетит. Нельзя использовать "ВыбратьПоЗначению" для документа определенного вида.
1
НикоН
22 / 21 / 3
Регистрация: 21.01.2010
Сообщений: 95
11.11.2011, 10:27  [ТС] 8
Не взлетело. )))

Какие еще могут быть варианты?
0
Танцор_С_Бубном
34 / 34 / 3
Регистрация: 31.03.2011
Сообщений: 197
11.11.2011, 10:54 9
Лучший ответ Сообщение было отмечено как решение

Решение

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//способ 1:
т1 = _GetPerformanceCounter();
Док=СоздатьОбъект("Документ");
Док.УстановитьФильтр(1,0);
Док.ВыбратьПоЗначению(НачДата,КонДата,"Сотрудник",СпрСотрудники.ТекущийЭлемент());
Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.Вид() <> "ВводРасчетаСотруднику" Тогда
        Продолжить;
    КонецЕсли;
    //тут что-то делаем с документом
КонецЦикла;
т2 = _GetPerformanceCounter();
 
//или способ 2:
т3 = _GetPerformanceCounter();
Док=СоздатьОбъект("Документ.ВводРасчетаСотруднику");
Док.УстановитьФильтр(1,0);
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.Сотрудник <> СпрСотрудники.ТекущийЭлемент() Тогда
        Продолжить;
    КонецЕсли;
    //тут что-то делаем с документом
КонецЦикла;
т4 = _GetPerformanceCounter();
    
//или способ 3:
т5 = _GetPerformanceCounter();
ТекстЗапроса = "Период С НачДата По КонДата;
|Докум = Документ.ВводРасчетаСотруднику.ТекущийДокумент;
|Сотрудник = Документ.Сотрудник;
|Условие (Сотрудник = СпрСотрудники.ТекущийЭлемент());
|ОбрабатыватьДокументы Проведенные;
|Группировка Докум Без Групп;
|Без Итогов;";
Запрос = СоздатьОбъект("Запрос");
Запрос.Выполнить(ТекстЗапроса);
т6 = _GetPerformanceCounter();
//тут что-то делаем с результатом запроса
    
Сообщить("Выборка по сотруднику: "+(т2-т1)+"Выборка по виду документа: "+(т4-т3)+". Запрос: "+(т6-т5)+".");
запускаете. сравниваете время на вашей базе. выбираете лучший вариант.

Добавлено через 13 минут
Если по времени ни один не устроит - то копаете в сторону TurboBL (ускорение штатной выборки) или 1SQL/1CPP (прямые запросы к базе).
3
PAAG
5 / 5 / 0
Регистрация: 19.11.2011
Сообщений: 41
19.11.2011, 20:09 10
Да, тут зависит от того, как много в базе документов типа ВводРасчетаСотруднику и сколько документов у каждого сотрудника. Танцор с бубном правильно предложил тестирование, если оно не помогает, запросы из базы напрямую на порядок могут ускорить процесс.

Кстати, как вариант оптимизации, если этот поиск нужно проводить для всех сотрудников, т.е. это все в цикле висит, то проще пробежать по всем документам "ВводРасчетаСотруднику", и значения записывать в таблицу, где держать сотрудника и значение из документа, если попается несколько для одного - переписываем.
В итоге имеем данные для всех сотрудников, по нагрузке, как для одного.
0
19.11.2011, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 20:09

Кнопка "Выбрать" на форме выбора или как выполнить нажатие кнопки "Выбрать"
Добрый день! Обычное приложение. Какие мысли есть, чтобы выполнить нажатие на кнопку...

Выбрать только проведеные документы
Есть ФормаСписка в которой нужно отображать только проведенные док, делаю так: Процедура...

Ввод определенного статуса сотруднику по нескольким условиям VBA - Excel
Есть например исходная таблица в которую вводятся данные о сотрудниках. Есть Имя и Фамилия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru