Можно ли обойтись без запроса в цикле

1. Tailor_Made 13.01.20 16:32 Сейчас в теме
Здравствуйте. Есть механизм заполнения Характеристик в процедуре ПриЗаписи(). ПОнимаю, что написано не очень хорошо..
Как тут избежать запроса в цикле, чтобы ускорить работу?
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	Для каждого Строка Из Объект.Товары Цикл
		
		СозданиеХарактеристики(Строка.Номенклатура);
		
		Строка.Характеристика = ПолучитьХарактеристику(Строка.Номенклатура);
		
	КонецЦикла; 
   ....
КонецПроцедуры;

&НаСервере
Процедура СозданиеХарактеристики(Номенклатура) Экспорт
	
	Если ЗначениеЗаполнено(НайтиХарактеристику(Номенклатура)) = Ложь Тогда
		
		НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
		НоваяХарактеристика.Владелец	 = Номенклатура;
		НоваяХарактеристика.Наименование = Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"); 
		НоваяХарактеристика.Записать();
		
	КонецЕсли;
	
КонецПроцедуры

Функция НайтиХарактеристику(Номенклатура)

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ХарактеристикиНоменклатуры.Ссылка
		|ИЗ
		|	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
		|ГДЕ
		|	ХарактеристикиНоменклатуры.Владелец = &Номенклатура
		|	И ХарактеристикиНоменклатуры.Наименование = &Наименование";
	
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));
	
	Возврат Запрос.Выполнить().Выгрузить();

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

КонецФункции

Показать
По теме из базы знаний
Найденные решения
9. mar82 13.01.20 17:16 Сейчас в теме
(8) а, ну конечно, условие на номенклатуру я потерял :)

Запрос.Текст =
"ВЫБРАТЬ
| ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
|ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
|";
Показать
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 13.01.20 16:51 Сейчас в теме
Мастерство не спрячешь...
Можно сделать СозданиеХарактеристики() функцией, которая будет возвращать ссылка на созданный элемент. Но это, наверное, слишком просто.
И не вижу поиска уже существующей характеристики... каждый раз новую делаем?
4. Tailor_Made 13.01.20 16:52 Сейчас в теме
(2)Функция НайтиХарактеристику(Номенклатура) для поиска
6. starjevschik 13.01.20 16:58 Сейчас в теме
(4) ну она ПриЗаписи() не вызывается
т.е. на каждую запись документа мы всем товарам записываем новые характеристики. Это стремноватая логика на мой взгляд, а?
7. RustamZz 13.01.20 17:02 Сейчас в теме
(4) Тут проблема не столько про запрос в цикле, а в вызове сервера в цикле.
Перенесите этот код в новую процедуру ЗаполнитьХарактеристикиНаСервере().
В ней запросом получите характеристики для всей номенклатуры в документе. И потом для не заполненных создайте новые.
Jimbo; karpik666; +2 Ответить
3. mar82 13.01.20 16:51 Сейчас в теме
а если написать свою процедуру, в которую передается массив номенклатур,
а в ответ получается Соответствие, которое содержит ссылки на все характеристики?
5. mar82 13.01.20 16:57 Сейчас в теме
Примерно так:

Функция СоздатьХарактеристики(МассивНоменклатур)

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
        |    Номенклатура.Ссылка КАК Номенклатура
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ЛЕВОЕ СОЕДИНЕНИЕ
        |    Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
        |";
    
    Запрос.УстановитьПараметр("МассивНоменклатур", МассивНоменклатур);
    Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));
    
    Таблица = Запрос.Выполнить().Выгрузить();
    Для Каждого Стр Из Таблица Цикл
           Если Не ЗначениеЗаполнено(Стр.Характеристика) Тогда
//тут надо создать характеристику
           КонецЕсли;
    КонецЦикла;
    Возврат Таблица;
КонецФункции
Показать
8. Tailor_Made 13.01.20 17:09 Сейчас в теме
(5)пробую так, как вы сказали. Но тут что-то с запросом не впорядке
9. mar82 13.01.20 17:16 Сейчас в теме
(8) а, ну конечно, условие на номенклатуру я потерял :)

Запрос.Текст =
"ВЫБРАТЬ
| ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
|ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
|";
Показать
10. Tailor_Made 13.01.20 17:20 Сейчас в теме
(9)простите, но у меня такая вот ошибка почему-то
Прикрепленные файлы:
11. Tailor_Made 13.01.20 17:27 Сейчас в теме
(9)ошибку поправил, протестирую
12. Tailor_Made 13.01.20 17:35 Сейчас в теме
(9)вроде работает правильно, запрос возвращает значения, но после выполнения Функции ошибка такая:
Помилка перетворення даних XDTO:
ПочатокВластивості: ret	Форма: Елемент	Тип: {http://www.w3.org/2001/XMLSchema}anyType
через:
Помилка відображення типів:
Відсутнє відображення для типу '{http://v8.1c.ru/8.1/data/core}ValueTable'
13. Tailor_Made 13.01.20 17:37 Сейчас в теме
(9)функция вроде верно отработала, но после её выполнения ошибка такая и значения Характеристикам не присвоились
Прикрепленные файлы:
14. QuickMix 13.01.20 17:47 Сейчас в теме
(13)в подробности вашей писанины вашего кода не вникал. Но вы на клиент возвращаете таблицу значений, а она там недоступна. Можете её перед возвращением клиенту поместить в массив, есть даже функция общего модуля для этого, точно не помню, поищите.
user774630; +1 Ответить
15. Tailor_Made 13.01.20 18:06 Сейчас в теме
16. Tailor_Made 13.01.20 18:11 Сейчас в теме
(9)может вы бы могли последний момент мне подсказать, как характеристики тч заполнить характеристиками из массива результата
17. mar82 14.01.20 09:35 Сейчас в теме
(16) навскидку - идете по строкам ТЧ и по каждой номенклатуре находите характеристику из ТЗ

вариант поизвращенней - в запрос передать и ТЧ, и ТЗ. А там сделать джойн
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот