Здравствуйте. Есть механизм заполнения Характеристик в процедуре ПриЗаписи(). ПОнимаю, что написано не очень хорошо..
Как тут избежать запроса в цикле, чтобы ускорить работу?
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Для каждого Строка Из Объект.Товары Цикл
СозданиеХарактеристики(Строка.Номенклатура);
Строка.Характеристика = ПолучитьХарактеристику(Строка.Номенклатура);
КонецЦикла;
....
КонецПроцедуры;
&НаСервере
Процедура СозданиеХарактеристики(Номенклатура) Экспорт
Если ЗначениеЗаполнено(НайтиХарактеристику(Номенклатура)) = Ложь Тогда
НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
НоваяХарактеристика.Владелец = Номенклатура;
НоваяХарактеристика.Наименование = Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд");
НоваяХарактеристика.Записать();
КонецЕсли;
КонецПроцедуры
Функция НайтиХарактеристику(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХарактеристикиНоменклатуры.Ссылка
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &Номенклатура
| И ХарактеристикиНоменклатуры.Наименование = &Наименование";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПолучитьХарактеристику(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХарактеристикиНоменклатуры.Ссылка
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &Номенклатура
| И ХарактеристикиНоменклатуры.Наименование = &Наименование";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));
ТЗ = Запрос.Выполнить().Выгрузить();
Возврат ТЗ[0].Ссылка;
КонецФункции
(8) а, ну конечно, условие на номенклатуру я потерял :)
Запрос.Текст =
"ВЫБРАТЬ
| ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
|ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
|";
Мастерство не спрячешь...
Можно сделать СозданиеХарактеристики() функцией, которая будет возвращать ссылка на созданный элемент. Но это, наверное, слишком просто.
И не вижу поиска уже существующей характеристики... каждый раз новую делаем?
(4) ну она ПриЗаписи() не вызывается
т.е. на каждую запись документа мы всем товарам записываем новые характеристики. Это стремноватая логика на мой взгляд, а?
(4) Тут проблема не столько про запрос в цикле, а в вызове сервера в цикле.
Перенесите этот код в новую процедуру ЗаполнитьХарактеристикиНаСервере().
В ней запросом получите характеристики для всей номенклатуры в документе. И потом для не заполненных создайте новые.
а если написать свою процедуру, в которую передается массив номенклатур,
а в ответ получается Соответствие, которое содержит ссылки на все характеристики?
Функция СоздатьХарактеристики(МассивНоменклатур)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
|";
Запрос.УстановитьПараметр("МассивНоменклатур", МассивНоменклатур);
Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));
Таблица = Запрос.Выполнить().Выгрузить();
Для Каждого Стр Из Таблица Цикл
Если Не ЗначениеЗаполнено(Стр.Характеристика) Тогда
//тут надо создать характеристику
КонецЕсли;
КонецЦикла;
Возврат Таблица;
КонецФункции
(8) а, ну конечно, условие на номенклатуру я потерял :)
Запрос.Текст =
"ВЫБРАТЬ
| ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
|ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
|";
(13)в подробности вашей писанины вашего кода не вникал. Но вы на клиент возвращаете таблицу значений, а она там недоступна. Можете её перед возвращением клиенту поместить в массив, есть даже функция общего модуля для этого, точно не помню, поищите.