Здравствуйте, столкнулся с небольшой проблемкой:
1) сервер Intel XEON CPU E5 - 2667 V4 3,200гГц х32, ОЗУ 256, RAID 10
2) ОС Win сервер 2016
3) платформа 1С 8.3.10.2561
Запросом получаю данные: 18 столбцов, 40000 строк - запрос отрабатывает за 1-2 сек.
Перебираю результат (4 строки с логикой, одна с арифметикой), записываю в текстовый файл.
1 способ:

```1c
    Лог("Количество позиций в запросе Номенклатуры = " + Выборка.Количество());
    Сообщить("+ТекущаяДата());
    ТекстДок = Новый ТекстовыйДокумент;
    Пока Выборка.Следующий() Цикл
    Стр = " + Выборка.ШтрихКод; //1
    Стр = Стр + Символ(166) + Выборка.Уровень3; //2
    Стр = Стр + Символ(166) + Выборка.Номенклатура; //3
    Стр = Стр + Символ(166) + Выборка.Производитель; //4
    Стр = Стр + Символ(166) + Выборка.Бренд; //5
    Стр = Стр + Символ(166) + Выборка.Уровень1; //6
    Стр = Стр + Символ(166) + Выборка.Уровень2; //7
    Стр = Стр + Символ(166) + Выборка.Уровень3; //8
    Стр = Стр + Символ(166) + СокрЛП(Выборка.Сезон); //9 Сезон
    Стр = Стр + Символ(166) + "; //10 Дисплей -
    Стр = Стр + Символ(166) + Формат(Выборка.Остаток, "ЧГ="); //11
    Стр = Стр + Символ(166) + Формат(Выборка.ДатаС, "ДЛФ=Д"); //12
    Стр = Стр + Символ(166) + Формат(Выборка.ДатаПо, "ДЛФ=Д"); //13
    Стр = Стр + Символ(166) + "шт"; //14
    Стр = Стр + Символ(166) + ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),"ПОДАРКИ, ТЕСТЕРЫ, ОБОРУДОВАНИЕ")>0, 0, Формат(Выборка.РозничнаяЦена, "ЧГ=")); //15
    Стр = Стр + Символ(166) + ?(Выборка.Вес > 0.0001, Формат(Выборка.Вес, "ЧН=0; ЧГ=0"), 1); //16
    Объем = Выборка.Объем*1000000;
    Стр = Стр + Символ(166) + ?(Объем > 0.0001, Формат(Объем, "ЧН=0; ЧГ=0"), 1); //17
    Стр = Стр + Символ(166) + ?(Лев(Выборка.Номенклатура, 2) = "**", 1, 0); //18 вывод
    ТекстДок.ДобавитьСтроку(Стр);
    КонецЦикла;
    ТекстДок.Записать(КаталогВыгрузки + "skuheader_" + ГГГГММДД + ".csv",КодировкаТекста.UTF8);
    Сообщить("+ТекущаяДата());
```

записывается 180 секунд

2 способ:

```1c
    Лог("Количество позиций в запросе Номенклатуры = " + Выборка.Количество());
    Сообщить("+ТекущаяДата());
    ФайлНоменклатура = Новый ЗаписьТекста(КаталогВыгрузки + "skuheader_" + ГГГГММДД + ".csv");
    Пока Выборка.Следующий() Цикл
    Стр = " + Выборка.ШтрихКод; //1
    Стр = Стр + Символ(166) + Выборка.Уровень3; //2
    Стр = Стр + Символ(166) + Выборка.Номенклатура; //3
    Стр = Стр + Символ(166) + Выборка.Производитель; //4
    Стр = Стр + Символ(166) + Выборка.Бренд; //5
    Стр = Стр + Символ(166) + Выборка.Уровень1; //6
    Стр = Стр + Символ(166) + Выборка.Уровень2; //7
    Стр = Стр + Символ(166) + Выборка.Уровень3; //8
    Стр = Стр + Символ(166) + СокрЛП(Выборка.Сезон); //9 Сезон
    Стр = Стр + Символ(166) + "; //10 Дисплей -
    Стр = Стр + Символ(166) + Формат(Выборка.Остаток, "ЧГ="); //11
    Стр = Стр + Символ(166) + Формат(Выборка.ДатаС, "ДЛФ=Д"); //12
    Стр = Стр + Символ(166) + Формат(Выборка.ДатаПо, "ДЛФ=Д"); //13
    Стр = Стр + Символ(166) + "шт"; //14
    Стр = Стр + Символ(166) + ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),"ПОДАРКИ, ТЕСТЕРЫ, ОБОРУДОВАНИЕ")>0, 0, Формат(Выборка.РозничнаяЦена, "ЧГ=")); //15
    Стр = Стр + Символ(166) + ?(Выборка.Вес > 0.0001, Формат(Выборка.Вес, "ЧН=0; ЧГ=0"), 1); //16
    Объем = Выборка.Объем*1000000;
    Стр = Стр + Символ(166) + ?(Объем > 0.0001, Формат(Объем, "ЧН=0; ЧГ=0"), 1); //17
    Стр = Стр + Символ(166) + ?(Лев(Выборка.Номенклатура, 2) = "**", 1, 0); //18 вывод
    ФайлНоменклатура.ЗаписатьСтроку(Стр);
    КонецЦикла;
    ФайлНоменклатура.Закрыть();
    Сообщить("+ТекущаяДата());
```

записывается 160 секунд
3 минуты на 1 файл - это очень долго.
Может как то по другому можно данные записать?
P.S. вообще перебор строк долго работает. Но тогда в запрос арифметику перенесу, а как разделитель между данными добавить?
---
- Использование ЗаписьТекста должно работать быстрее, чем ТекстовыйДокумент.
- замените строки с конкатенацией на ФайлНоменклатура.ЗаписатьСтроку(<конкатенация всех значений>), причем значение Символ166 = Символ(166) вынесите до цикла.
- арифметику и получение значений через точку (типа Выборка.Номенклатура.ПолноеНаименование()) вынесите в запрос.
---
Главный совет: все поля ссылочного типа(Думаю, это Номенклатура, Брэнд, Производитель) заменить(дополнить) их текстовыми представлениями - это минимизирует количество обращений к БД во время вывода.
Не даром СКД при выборке данных для отчета добавляет поля Представление()

С этой строкой

```1c
    ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),"ПОДАРКИ, ТЕСТЕРЫ, ОБОРУДОВАНИЕ")>0, 0, Формат(Выборка.РозничнаяЦена, "ЧГ="))
```

что-то надо делать - я бы добавил в запрос флаг, отвечающий, что номенклатура входит в эту группу

p.s. замер производительности покажет где проблемные места
---
```1c
    Стр = Стр + Символ(166) + ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),
```

Проблема здесь, в этой строке идет запрос к справочнику Номенклатура, попробуйте ПолноеНаименование поместить в запрос, чтобы было

```1c
    Выборка.ПолноеНаименование
```
---
```1c
    Стр = Стр + Символ(166) + ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),
```

Проблема здесь, в этой строке идет запрос к справочнику Номенклатура, попробуйте ПолноеНаименование поместить в запрос, чтобы было

```1c
    Выборка.ПолноеНаименование
```
---
- Использование ЗаписьТекста должно работать быстрее, чем ТекстовыйДокумент.
- замените строки с конкатенацией на ФайлНоменклатура.ЗаписатьСтроку(<конкатенация всех значений>), причем значение Символ166 = Символ(166) вынесите до цикла.
- арифметику и получение значений через точку (типа Выборка.Номенклатура.ПолноеНаименование()) вынесите в запрос.
---
ой, да, перепутал замеры, ЗаписьТекста 160 сек, ТекстовыйДокумент 180.
---
КаталогВыгрузки на сервере ?
---
да, на локальный диск пишется. Да даже без записи, просто перебор строк 110 сек (с записью + 50-60)
---
Главный совет: все поля ссылочного типа(Думаю, это Номенклатура, Брэнд, Производитель) заменить(дополнить) их текстовыми представлениями - это минимизирует количество обращений к БД во время вывода.
Не даром СКД при выборке данных для отчета добавляет поля Представление()

С этой строкой

```1c
    ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),"ПОДАРКИ, ТЕСТЕРЫ, ОБОРУДОВАНИЕ")>0, 0, Формат(Выборка.РозничнаяЦена, "ЧГ="))
```

что-то надо делать - я бы добавил в запрос флаг, отвечающий, что номенклатура входит в эту группу

p.s. замер производительности покажет где проблемные места
---
Сбор строки помести в запрос, были аналогичные проблемы со сбором почтовых адресов.
т.к. функции с объединение строк здорово фрагментируют и жрут память, ещё как вариант объединять всё в одной строке Стр = Выборка.____ + Символ166 + Выборка.____+ Символ166 + Выборка.____, тоже работать будет быстрее.
---
Вы всегда редактируете одну большую строку. Для 1С это долгая операция.
Варианты есть:
1 - составить шаблон строки Стр ="блабла %1% бла %2%, блабла %3%" и подставлять параметры в эту строку.
2 - все строки добавлять в массив, а потом воспользоваться СтрСоединить(МассивСтрок,Символ(166))
---
2 - все строки добавлять в массив, а потом воспользоваться СтрСоединить(МассивСтрок,Символ(166))
(18 колонок) переделал - дало ускорение в 3 сек. (40000 строк)
---
все строки добавлять в массив, а потом воспользоваться СтрСоединить(МассивСтрок,Символ(166))
(18 колонок) переделал - дало ускорение в 3 сек. (40000 строк)
А если пойти дальше и эти 40000 тоже добавить в массив, соединить аналогично и записать итоговую строку в файл?
---
еще на 4-5 сек быстрее =)
---
магия =)
---
всем спасибо за советы:
1) ПРЕДСТАВЛЕНИЕССЫЛКИ - (6 ссылок) - дало ускорение на 40 сек
2) арифметика - (объем * 100000) - ничего
3) ?(СтрНайти(СокрЛП(Выборка.Номенклатура.ПолноеНаименование()),"ПОДАРКИ, ТЕСТЕРЫ, ОБОРУДОВАНИЕ")>0, 0, Формат(Выборка.РозничнаяЦена, "ЧГ=")) - в запрос (ВЫБОР КОГДА ... 1 ИНАЧЕ 0 КОНЕЦ) - дало ускорение на 90 сек.
В итоге со 160 сек запись ускорилась до 25-30 сек.
Проблема решена, еще раз всем спасибо =)
---
Хорошенькое решение:)
Всю Вашу таблицу можно получить в запросе, и логику и арифметику. Может все-таки между приемлемым и лучшим решением попытаетесь выбрать лучшее? Заодно и запросы потренируетесь писать?
---
Сообщение было скрыто модератором.