Имя: Пароль:
1C
 
Как запросом склеить текст
0 m1_1976
 
03.06.15
11:29
Доброго дня
Есть самописный БЭК-ОФИС на 1С 8.
Есть АтолФронтол 5 на кассах.
Сейчас в БЭК-офисе 80 тыс товаров.
Полная выгрузка в Атол-Фронтол методом перебора элементов и для каждого элемента состряпыванивем строки - занимает уйму времени. Процедура редкая, но не быстрая.
Даже выкидывание. Части товара - скажем одной группы из 500 элементов - долго. Что хочу. Могу готовую строку выгрузки для Атола хранить скажем в регистре сведений и переформировавыть ее туда при изменении карточки товара, цены добавления штрихкодов и т.д.
То есть будет Регистр Сведений в котором у меня всегда будет готовая строка выгрузки для АТОЛ-ФРонтола.
Запросом собрал быстренько - но теперь все равно получается бегу по Выборе из результата запроса и добавляю в будущий текст по одной строчке.
А не могу я их склеить сразу внутри запроса. Чтобы на выходе была одна стркоа - а в ней весь текст, в которых все строки из регистра сведений разделились символом Конца строки.
Чтобы я из выборки получил один элемент и в нем уже был готовый текст.
???
1 ДенисЧ
 
03.06.15
11:31
из чего стряпается строка?
2 m1_1976
 
03.06.15
11:33
из букв и цифр :)))
3 m1_1976
 
03.06.15
11:33
ну и всяких знаков препинания типа точек с запятой
4 ДенисЧ
 
03.06.15
11:34
гениально.
Данные откуда берутся?
5 m1_1976
 
03.06.15
11:36
Вот пример готовой строки


100090;4607076260015;Крупа пшеничная Баралетти;Крупа пшеничная Баралетти;9;;;0,1,1,1,0,0,0,1,1,0,0,0,0,0;7.2;;0;0;;1;;107992;1;;;;;;;;100090;100090;;;;;;;1;0;0;0;1;;;;;;;;;;0;;;;
6 pessok
 
03.06.15
11:37
уже было про
"конкатенация в запросе - вытягивание гланд через задницу!"?
7 mikecool
 
03.06.15
11:38
выбрать строка
из регистрсведений.строки
8 ДенисЧ
 
03.06.15
11:38
выбрать код + ";"+ШтрихКод+";"+наименование+";"+родитель.Наименование
из справочник.номенклатура
9 чувак
 
03.06.15
11:40
Т.е. Из списка:

"Иванов"
"Петров"
"Сидоров"

хочешь получить

"ИвановПетровСидоров"?
10 НП
 
03.06.15
11:40
(0) Первоначально базы данных были предназначены для хранения, обновления и быстрой выборки структурированных данных. Затем появилась возможность производить одновременно с выборкой некоторые вычисления.
Но превращать всю программу в один большой запрос - путь в никуда. В СКД пошли примерно по такому пути. Но тут есть один нюанс: доказать, что программа правильно работает бывает трудновато.
Я бы, получив искомые строки, ни в коем случае не стал бы пытаться их обратно в запрос запихнуть. Склейте сами. Пара лишних операторов никого не утомит.
11 Timon1405
 
03.06.15
11:41
я может недопонял, но что мешает хранить склеенную строку в том же РС в последней колонке?
12 m1_1976
 
03.06.15
11:42
(9) ну почему бы и нет...
только в списке 80 тыс позиций и хочу их еще разделить символом конца строки
13 Fragster
 
гуру
03.06.15
11:43
(0) замени конкатенацию всех строк на конкатенацию одной строки и  запихиванием её в ТекстовыйДокумент
14 m1_1976
 
03.06.15
11:43
Строка вида

100090;4607076260015;Крупа пшеничная Баралетти;Крупа пшеничная Баралетти;9;;;0,1,1,1,0,0,0,1,1,0,0,0,0,0;7.2;;0;0;;1;;107992;1;;;;;;;;100090;100090;;;;;;;1;0;0;0;1;;;;;;;;;;0;;;;

У меня уже есть. Я ее храню в регситре у которого измерение ТОВАР, а ресурс СТРОКА_ДЛЯ_КММ

Запрос по нему отрабатывает отлично. Но мне не хочется потом перебирать результат запроса и клеить все строки в один текст. Который потом записывается в каталог обмена!
15 ДенисЧ
 
03.06.15
11:46
(14) Возьми СКД )
А вообще - это поиск Тополя для стрельбы по мухам.
16 чувак
 
03.06.15
11:47
(14) Может СКЛ запрос сможет?
17 Fragster
 
гуру
03.06.15
11:48
(13)+ типа

Результат = Новый ТекстовыйДокумент;

Пока Выборка.Следующий() Цикл
  ТМП = "" + Выборка.Поле + ";" + ....;
  Результат.ДобавитьСтроку(ТМП);
КонецЦикла;


А если у тебя это в файл выгружается - то вообще ЗаписьТекста без промежуточных склеиваний
18 m1_1976
 
03.06.15
11:49
(16) вот я про тоже самое... Точно sql же есть... вопрос как?
19 Fragster
 
гуру
03.06.15
11:50
(18) забей на sql, если у тебя для выгрузки используется много сложений строк - замени на ТекстовыйДокумент или ЗаписьТекста
20 чувак
 
03.06.15
11:50
(18) http://www.sql.ru тебе помощь
21 m1_1976
 
03.06.15
11:51
У меня типа вот так

Т = Новый ТекстовыйДокумент;

Пока Выборка.Следующий() Цикл
  Т.ДобавитьСтроку(Выборка.СТРОКА_ДЛЯ_КММ);
КонецЦикла;
22 чувак
 
03.06.15
11:51
(19) Но он же хочет именно в запросе все склеитью
23 Fragster
 
гуру
03.06.15
11:52
(21) ну тогда попробуй поменять на записьтекста - должно быть побыстрее. смысла в запросе клеить нет.
24 Fragster
 
гуру
03.06.15
11:52
а по замеру именно Т.ДобавитьСтроку(Выборка.СТРОКА_ДЛЯ_КММ); самое медленное место?
25 m1_1976
 
03.06.15
11:53
ладно. Пошел в sql читать... поищу смысл клеить в запросе sql
(23) Нужна скорость.
(24) нет конечно. Просто их 80 тыс...
26 GROOVY
 
03.06.15
11:53
Конкатенация в запросе - легко. Но про конкатенация - это операция только для строк, запрос не поддерживает преобразование типов, так что из ссылки строку сделать не получится.
27 Fragster
 
гуру
03.06.15
11:54
(25) так если не это самое медленное место, нафига ты туда лезешь? о_О
28 m1_1976
 
03.06.15
11:54
(26)
У меня тип СТРОКА как раз. ССЫлок никаких нет!
29 Fragster
 
гуру
03.06.15
11:54
какое самое медленное место по замеру производительности?
30 m1_1976
 
03.06.15
11:55
(27) зачем вам эти данные?
31 Fragster
 
гуру
03.06.15
11:57
(30) потому что в (25) (да и в (0)) написано, что на самом деле автор хочет не СКЛЕИТЬ СТРОКИ ЗАПРОСОМ, а БЫСТРО ВЫГРУЗИТЬ ДАННЫЕ
32 Fragster
 
гуру
03.06.15
11:58
и в том же (25) написано, что собственно вывод в текстовый документ - не самое медленное место
33 m1_1976
 
03.06.15
11:59
(32) Вывод? Уменьшить количество товаров с 80 тыс до 10 тыс??? :)
ОК. Я пойду скажу шефу... :)
34 чувак
 
03.06.15
11:59
35 GROOVY
 
03.06.15
11:59
(28)  Ну тогда

ВЫБРАТЬ
    Поле1+Поле2 КАК СклееннаяСтрока

В чем вопрос?!
36 m1_1976
 
03.06.15
12:00
(32) - просто я ищу в том числе и такое решение. Думаю. Дергаюсь. Не получиться. Буду дальше думать и дергаться.
37 GROOVY
 
03.06.15
12:00
Если тормозит вывод, то значит представление запросом не получено, для каждой строки еще запрос формируется.
38 Fragster
 
гуру
03.06.15
12:01
(36) сколько % занимает самая медленная строка в замере? и сколько % кусок из (21)?
39 m1_1976
 
03.06.15
12:03
Ладно спасибо. Пойду читать про sql.
Закрываем тему
Спасибо.
40 Ildarovich
 
03.06.15
12:05
Склеить строки в запросе все-таки можно. Вот статья http://catalog.mista.ru/public/200275/ , где показано как это делать.
Однако по-любому размер результирующей строки будет не больше, чем 1024 (или 2048 иногда), что в вашей задаче явно будет мало.
Так что запрос здесь принципиально не подойдет.

Кроме того, причина замедления у вас - не запрос, а проблемы с конкатенацией строк, причины которых подробно описаны в статье http://catalog.mista.ru/public/163662/.
Используйте решение из комментария (23) - и проблема будет решена.
41 badboychik
 
03.06.15
12:09
Способ 1) Выгрузить колонку результата в массив, применить функцию "СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок"

Способ 2) Применить функцию СКД "ВычислитьВыражениеСГруппировкойМассив"
42 Ildarovich
 
03.06.15
12:10
+ (40) я имел ввиду комментарий (23) к статье по ссылке, но по случайности и здешний комментарий (23) может помочь, но ЗаписьXML вроде бы быстрее. Она работает как StringBuilder.
43 ЧеловекДуши
 
03.06.15
12:33
(0) 80 тыс строк готовых для загрузки, это же пару сек работы на сервере.

...Чет мне подсказывает, что ТС не там замерял время... :)
44 ЧеловекДуши
 
03.06.15
12:35
+ Думается СКЛ тут не поможет. Дешевле обычным циклом обойтись :)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший