Здравствуйте. Есть механизм заполнения Характеристик в процедуре ПриЗаписи(). ПОнимаю, что написано не очень хорошо..
Как тут избежать запроса в цикле, чтобы ускорить работу?

```1c
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

    Для каждого Строка Из Объект.Товары Цикл

    СозданиеХарактеристики(Строка.Номенклатура);

    Строка.Характеристика = ПолучитьХарактеристику(Строка.Номенклатура);

    КонецЦикла;
    ....
    КонецПроцедуры;

    &НаСервере
    Процедура СозданиеХарактеристики(Номенклатура) Экспорт

    Если ЗначениеЗаполнено(НайтиХарактеристику(Номенклатура)) = Ложь Тогда

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

    КонецЕсли;

    КонецПроцедуры

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ХарактеристикиНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |ГДЕ
    | ХарактеристикиНоменклатуры.Владелец = &Номенклатура
    | И ХарактеристикиНоменклатуры.Наименование = &Наименование";

    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));

    Возврат Запрос.Выполнить().Выгрузить();

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

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ХарактеристикиНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |ГДЕ
    | ХарактеристикиНоменклатуры.Владелец = &Номенклатура
    | И ХарактеристикиНоменклатуры.Наименование = &Наименование";

    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));

    ТЗ = Запрос.Выполнить().Выгрузить();

    Возврат ТЗ[0].Ссылка;

    КонецФункции
```
---
а, ну конечно, условие на номенклатуру я потерял :)

```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
    | Номенклатура.Ссылка КАК Номенклатура
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
    |ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
    |";
```
---
Мастерство не спрячешь...
Можно сделать СозданиеХарактеристики() функцией, которая будет возвращать ссылка на созданный элемент. Но это, наверное, слишком просто.
И не вижу поиска уже существующей характеристики... каждый раз новую делаем?
---
Функция НайтиХарактеристику(Номенклатура) для поиска
---
ну она ПриЗаписи() не вызывается
т.е. на каждую запись документа мы всем товарам записываем новые характеристики. Это стремноватая логика на мой взгляд, а?
---
Тут проблема не столько про запрос в цикле, а в вызове сервера в цикле.
Перенесите этот код в новую процедуру ЗаполнитьХарактеристикиНаСервере().
В ней запросом получите характеристики для всей номенклатуры в документе. И потом для не заполненных создайте новые.
---
а если написать свою процедуру, в которую передается массив номенклатур,
а в ответ получается Соответствие, которое содержит ссылки на все характеристики?
---
Примерно так:

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
    | Номенклатура.Ссылка КАК Номенклатура
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
    |";

    Запрос.УстановитьПараметр("МассивНоменклатур", МассивНоменклатур);
    Запрос.УстановитьПараметр("Наименование", Формат(Объект.Дата, "ДФ=гггг") + "_" + Формат(Объект.Дата, "ДФ=ММ") + "_" + Формат(Объект.Дата, "ДФ=дд"));

    Таблица = Запрос.Выполнить().Выгрузить();
    Для Каждого Стр Из Таблица Цикл
    Если Не ЗначениеЗаполнено(Стр.Характеристика) Тогда
    //тут надо создать характеристику
    КонецЕсли;
    КонецЦикла;
    Возврат Таблица;
    КонецФункции
```
---
пробую так, как вы сказали. Но тут что-то с запросом не впорядке
---
а, ну конечно, условие на номенклатуру я потерял :)

```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | ISNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика,
    | Номенклатура.Ссылка КАК Номенклатура
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | Справочник.ХарактеристикиНоменклатуры КАК Характеристики ПО Характеристики.Владелец = Номенклатура.Ссылка И Характеристики.Наименование = &Наименование
    |ГДЕ Номенклатура.Ссылка В (&МассивНоменклатур)
    |";
```
---
простите, но у меня такая вот ошибка почему-то
---
ошибку поправил, протестирую
---
вроде работает правильно, запрос возвращает значения, но после выполнения Функции ошибка такая:

```1c
    Помилка перетворення даних XDTO:
    ПочатокВластивості: ret Форма: Елемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
    через:
    Помилка відображення типів:
    Відсутнє відображення для типу '{http://v8.1c.ru/8.1/data/core}ValueTable'
```
---
функция вроде верно отработала, но после её выполнения ошибка такая и значения Характеристикам не присвоились
---
в подробности вашей писанины вашего кода не вникал. Но вы на клиент возвращаете таблицу значений, а она там недоступна. Можете её перед возвращением клиенту поместить в массив, есть даже функция общего модуля для этого, точно не помню, поищите.
---
спасибо, это сделал
---
может вы бы могли последний момент мне подсказать, как характеристики тч заполнить характеристиками из массива результата
---
навскидку - идете по строкам ТЧ и по каждой номенклатуре находите характеристику из ТЗ

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