Как запросом проверить документы заказы покупателя на заполнение реквизита

1. Tailor_Made 18.10.19 08:15 Сейчас в теме
Здравствуйте!
УТП 8.3, обычные формы
Есть такая проблема:
В документе "Заказ покупателя" дописана Табличная часть "Расшифровка", куда выгружаются с Битрикс задачи и их подзадачи(колонки: Задача, ID, Исполнитель, Количество часов, Цена). Выгрузка происходит в модуле объекта. Я бы хотел, чтобы при заполнении каждой задачи сделать проверку как-то запросом по всех проведенных документах и их табличной части "Расшифровка" . Чтобы узнать есть ли по этой задаче ранее проведенное какое-то время и если есть, то получить его и минусовать от полученого с выгрузки.
Я не понимаю как это лучше сделать.
Механизм заполнения:
Для  ЭлементРезультата = 0 По Результат.result.tasks.Количество()-1 Цикл
		Если  Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда 
			НоваяСтрока 										= Расшифровка.Добавить();
			НоваяСтрока.Задание 								= Результат.result.tasks[ЭлементРезультата].title;
			НоваяСтрока.ID 										= Результат.result.tasks[ЭлементРезультата].ID;
			НоваяСтрока.IDРодителя 								= Результат.result.tasks[ЭлементРезультата].parentId;
			НоваяСтрока.Исполнитель 							= Результат.result.tasks[ЭлементРезультата].responsible.name;
			НоваяСтрока.КоличествоЧасов 						= Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
			НоваяСтрока.КоличествоЧасов 						= НоваяСтрока.КоличествоЧасов / 3600;
			НоваяСтрока.Цена 									= НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
		КонецЕсли;
	КонецЦикла;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
14. DenP2010 22.10.19 11:37 Сейчас в теме +0.3 $m
1. Если объем базы большой - сделайте регистр сведений, где будете хранить ИД задачи и количество часов. При проведении заявки пишите в этот регистр, при контроле делайте запрос к нему. При большом объеме документов запрос к табличной части документов гарантировано "умрет", к регистру вполне будет работать. Причем именно регистр сведений (т.к. это самая быстрая таблица в 1С), а суммировать и в запросе можно и отработает это быстро.
2. Если ИД имеет тип "Строка" используйте в запросе " ВЫРАЗИТЬ(ЗаказПокупателяРасшифровка.ID КАК СТРОКА(100)) = ВЫРАЗИТЬ(&ИД КАК СТРОКА(100))". При прямом сравнении в случае, если длина строки динамическая, условие может не отработать и результат запроса будет пустой, так отработает точно.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. killitch 30 18.10.19 08:22 Сейчас в теме
Если поиск по ИД, то все загружаемые ИД в массив и из базы вибираете задачи с вхождением в этот массив, все что нашлось вам не надо.
3. Tailor_Made 18.10.19 08:27 Сейчас в теме
(2)но может быть, что ранее задача была проведена на 3 часа, а по ней теперь выгрузилось 8 и мне бы надо её не отсеять, а оставить 5 часов
4. VictorRGB2 13 18.10.19 08:40 Сейчас в теме
(3) продолжить предложенное в (2)
поиск по ID, вернуть результат в виде ID, Задание, Исполнитель, КоличествоЧасов. Будет таблица ранее загруженных данных по ID.
Далее при загрузке искать среди загруженных ранее по ID и вычитать из загружаемых часов ранее загруженные часы.
Не забыть пересчитать и Цена. А еще проверять, что КоличествоЧасов - КоличествоЧасовРанее <=0, типа дважды отчитались по одной и той же задаче.
killitch; +1 Ответить
5. Azamatex 12 18.10.19 11:38 Сейчас в теме
(3) в таком случае думаю лучше использовать регистр накопления, чтобы получить остаток, и на разницу посадить новые данные
6. Tailor_Made 18.10.19 14:50 Сейчас в теме
(5)тогда придется его создать, я думал что можно как-то из табличных частей документов вытащить это
Я пытался так, но не вышло:
Процедура ПроверкаИДЗадачи(ИД)
	
	Запрос = Новый Запрос;
	Запрос.Текст =	
		"ВЫБРАТЬ
		|	ЗаказПокупателяРасшифровка.КоличествоЧасов КАК КоличествоЧасов
		|ИЗ
		|	Документ.ЗаказПокупателя.Расшифровка КАК ЗаказПокупателяРасшифровка
		|ГДЕ
		|	ЗаказПокупателяРасшифровка.ID = &ИД";
	Запрос.УстановитьПараметр("ИД", ИД);
	
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	КоличествоЧасовВыборка = 0;
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		КоличествоЧасовВыборка =  КоличествоЧасовВыборка + ВыборкаДетальныеЗаписи.КоличествоЧасов;
	КонецЦикла;
	Сообщить(КоличествоЧасовВыборка);
	
КонецПроцедуры
Показать
7. Azamatex 12 18.10.19 14:59 Сейчас в теме
(6)со временем это замедлит работу системы, так как объем документов у вас будет расти.
8. uk09 21.10.19 09:03 Сейчас в теме
Добрый день!
Вопрос - актуален?
Если актуален, сразу деталь:
НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
Получается, что результат, который Вы выгружаете, изначально - дробный. А тот, который проводите ( фиксируете у себя, как сделанный) вероятнее всего - целый. Опишите, пожалуйста, формат этих двух величин, потому что, потом, будет девиация именно по этому показателю
9. Tailor_Made 21.10.19 11:43 Сейчас в теме
(8)Здравствуйте! Очень актуален ещё, т.к. не смог реализовать хорошее решение.
Дробный потому, что с Битрикса в секундах выгружается, я хотел в часы перевести
10. uk09 21.10.19 12:26 Сейчас в теме
А само решение - ПроверкаИДЗадачи(ИД) , чем не устраивает? то, что при увеличении количества документов, дольше цикл будет выполняться ?
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КоличествоЧасовВыборка = КоличествоЧасовВыборка + ВыборкаДетальныеЗаписи.КоличествоЧасов;
КонецЦикла;
Если это пугает, напишите, есть способ это обойти

Как думаете решить :
НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
У Вас Поле количество часов - одно, а схожих показателей - 2:
КоличествоПоданныхЧасов - то, сколько отправили к защите ,
КоличествоПроведенныхЧасов - то, сколько засчитали, из поданных.
Не предполагаете завести 2 показателя ( один, который есть, КоличествоПроведенныхЧасов , и , добавить второй - КоличествоПоданныхЧасов) ?
Полезная статистика из 2-х показателей - ПроцентПринятыхЧасов ( КоличествоПроведенныхЧасов/КоличествоПоданныхЧасов) * 100 .
Чем выше ПроцентПринятыхЧасов , тем качественнее работа исполнителя
11. Tailor_Made 21.10.19 12:56 Сейчас в теме
(10)в моём случае ПроверкаИДЗадачи не работает, отладчиком смотрел и оказалось, что запрос результата никакого не возращает

А вы не знаете, как лучше бы реализовать перевод с секунд в часы, чтобы не делать это деление на 3600 ?
Суть в том, что я не знаю как правильно реализовать эту проверку.
Задача по сути для такого случая:
Есть задача, Исполнитель её сделал и она выгрузилась в документ(принята и оплачена). Но потом Клиент решил доделать какой-то функционал и отправил ту же задачу на доработку, на которую Исполнитель потратил ещё время. Мне бы надо узнать ранее потраченое время(с проведенных документов, сделать проверку по ID задачи) и разницу дальше выгружать. Чтобы при каждой выгрузке задач делалась эта проверка, была ли задача ранее выгружена и если да то сколько часов по ней закрыто
12. uk09 21.10.19 15:01 Сейчас в теме +0.3 $m
"Мне бы надо узнать ранее потраченное время"
....
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПокупателяРасшифровка.КоличествоЧасов КАК КоличествоЧасов
|ИЗ
| Документ.ЗаказПокупателя.Расшифровка КАК ЗаказПокупателяРасшифровка
|ГДЕ
| ЗаказПокупателяРасшифровка.ID = &ИД";
Запрос.УстановитьПараметр("ИД", ИД);

РезультатЗапроса = Запрос.Выполнить();
ТаблицаДетальныеЗаписи = РезультатЗапроса.Выбрать().Выгрузить();
КоличествоЧасов = ТаблицаДетальныеЗаписи.Итог("КоличествоЧасов");

Сообщить(КоличествоЧасов);
....
15. Tailor_Made 23.10.19 12:10 Сейчас в теме
(12)
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДетальныеЗаписи = РезультатЗапроса.Выбрать().Выгрузить();
КоличествоЧасов = ТаблицаДетальныеЗаписи.Итог("КоличествоЧасов");

{Документ.ЗаказПокупателя.МодульОбъекта(3280)}: Метод объекта не обнаружен (Выгрузить)
ТаблицаДетальныеЗаписи = РезультатЗапроса.Выбрать().Выгрузить();
13. uk09 21.10.19 15:02 Сейчас в теме
"в моём случае ПроверкаИДЗадачи не работает, отладчиком смотрел и оказалось, что запрос результата никакого не возвращает"
Запрос проверьте в консоли запросов
14. DenP2010 22.10.19 11:37 Сейчас в теме +0.3 $m
1. Если объем базы большой - сделайте регистр сведений, где будете хранить ИД задачи и количество часов. При проведении заявки пишите в этот регистр, при контроле делайте запрос к нему. При большом объеме документов запрос к табличной части документов гарантировано "умрет", к регистру вполне будет работать. Причем именно регистр сведений (т.к. это самая быстрая таблица в 1С), а суммировать и в запросе можно и отработает это быстро.
2. Если ИД имеет тип "Строка" используйте в запросе " ВЫРАЗИТЬ(ЗаказПокупателяРасшифровка.ID КАК СТРОКА(100)) = ВЫРАЗИТЬ(&ИД КАК СТРОКА(100))". При прямом сравнении в случае, если длина строки динамическая, условие может не отработать и результат запроса будет пустой, так отработает точно.
16. Tailor_Made 23.10.19 12:23 Сейчас в теме
(14)
ВЫРАЗИТЬ(ЗаказПокупателяРасшифровка.ID КАК СТРОКА(100)) = ВЫРАЗИТЬ(&ИД КАК СТРОКА(100))

а как это в запрос поместить? А то я не смог сделать, выдало ошибку
17. Tailor_Made 23.10.19 15:53 Сейчас в теме +0.25 $m
Я не могу понять, почему в Таб ничего не попадает. Проверяю отладкой и просто пустое значение, хоть сам запрос верный
Прошу помочь, если кто-то знает в чём беда
Запрос = Новый Запрос;
	Запрос.Текст =	
		"ВЫБРАТЬ
		|	КоличествоЧасовЗадачБитрикс.КоличествоЧасов КАК КоличествоЧасов
		|ИЗ
		|	РегистрСведений.КоличествоЧасовЗадачБитрикс КАК КоличествоЧасовЗадачБитрикс
		|ГДЕ
		|	КоличествоЧасовЗадачБитрикс.ID = &ИД";
	Запрос.УстановитьПараметр("ИД",ИД);
	
	РезультатЗапроса = Запрос.Выполнить();
	Таб = РезультатЗапроса.Выгрузить();
	
	Для Каждого Стр Из Таб Цикл
        Сообщить(Стр.КоличествоЧасов);
    КонецЦикла;
Показать
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Санкт-Петербург
зарплата от 100 руб. до 150 руб.
Полный день