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

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) навскидку - идете по строкам ТЧ и по каждой номенклатуре находите характеристику из ТЗ

вариант поизвращенней - в запрос передать и ТЧ, и ТЗ. А там сделать джойн
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

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