сложение строк

1. DbIM 25.09.07 13:46 Сейчас в теме
В документе в табличной части выбирается несколько позиций.
Все эти позиции текстовые-строковые.
ну к примеру товары и их наименования
Хочу в таблицу (приходный кассовый ордер) вывести их все в одно поле (основание) ну скажем через запятую.
Что нибудь вроде
ВыбратьСтроки();
пока ПолучитьСтроку()=1 Цикл
Товар=Товар+ТоварИзТаблицы;

Насколько это реально?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vasilykushnir 63 25.09.07 14:08 Сейчас в теме
3. DbIM 25.09.07 14:16 Сейчас в теме
не прибегая к секциям...
4. vasilykushnir 63 25.09.07 14:25 Сейчас в теме
можно и так... только конкатенацию строк причесать. Что-то типа

Товар = "";

ВыбратьСтроки();
пока ПолучитьСтроку()=1 Цикл
Если ПустоеЗначение (Товар) = 1 Тогда
Товар=Товар+СокрЛП(ТоварИзТаблицы.Наименование);
Иначе
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
КонецЕсли;
5. DbIM 25.09.07 15:02 Сейчас в теме
Круто!
Спасибо большое!
6. Abadonna 3969 25.09.07 15:04 Сейчас в теме
Я, как говорит Василий, в шорохе...
7. vasilykushnir 63 26.09.07 08:39 Сейчас в теме
DbIM Написал:
-------------------------------------------------------
> Круто!
> Спасибо большое!


Да не крутизна это, а полная фигня. Типичное решение "в лоб" с отключенными мозгами. Если бы poppy забрела на эту тему - такое решение расчехвостила бы в пух и прах (кстати, почитай ее посты и к другим темам тоже - много полезного почерпнешь).
Итак, первое, что бросается в глаза - главный недостаток метода, что конструкция
Если ПустоеЗначение (Товар) = 1 Тогда
выполняется в цикле по количеству строк документа. А это уже есть не хорошо. И это, заметь, только ради того, чтобы запятая не была первым символом в результирующей строке.
Опять же очевидное решение "в лоб" - вынести эту бодягу за пределы цикла:

Товар = "";
ВыбратьСтроки();

пока ПолучитьСтроку()=1 Цикл
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
...
КонецЦикла;

Если Лев(Товар, 1) = "," Тогда
Товар = Прав(Товар, СтрДлина(Товар) - 1);
КонецЕсли;
8. Abadonna 3969 26.09.07 08:43 Сейчас в теме
Опять фигню написал! При твоем раскладе запятая ВСЕГДА впереди будет, поэтому никаких Если не надо ваще
9. Abadonna 3969 26.09.07 08:45 Сейчас в теме
Просто надо Товар=Сред(Товар,2);
10. vasilykushnir 63 26.09.07 08:46 Сейчас в теме
Согласен. Вариант №2 (уже не "в лоб"):

Товар = "";
ВыбратьСтроки();

пока ПолучитьСтроку()=1 Цикл
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
...
КонецЦикла;

Товар = Прав(Товар, СтрДлина(Товар) - 1);
// Или, как предложил Абадонна
Товар=Сред(Товар,2)
// что еще более изящно
11. poppy 26.09.07 09:42 Сейчас в теме
> Если бы poppy забрела на эту тему - такое решение расчехвостила бы в пух и прах

Спасибо за высокую оценку!

Придется поддерживать имидж. Рассмотрим строку:
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);

ИМХО метод СокрЛП можно убрать. Он бы пригодился в том случае, если использовался реквизит, например ПолнНаименование.
12. ssp_ 155 26.09.07 09:44 Сейчас в теме
Не удержался. Лучше так:
Код
Товар = "";
ВыбратьСтроки();
Если ПолучитьСтроку()=1 Тогда
    Товар=Товар + СокрЛП(ТоварИзТаблицы.Наименование);
    Пока ПолучитьСтроку()=1 Цикл
        Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
    КонецЦикла;
КонецЕсли;
Показать полностью


Вместо СокрЛП(ТоварИзТаблицы.Наименование) ИМХО быстрее будет
Товар=Товар + ТоварИзТаблицы
если основное представление справочника - наименование
Преобразование в строку гарантировано начальным значением переменной Товар.
13. Abadonna 3969 26.09.07 09:52 Сейчас в теме
Ребята, ну хватит прикалываться!
Сколько можно чайниковские вопросы обсуждать
14. ssp_ 155 26.09.07 09:53 Сейчас в теме
poppy Написал:
> ИМХО метод СокрЛП можно убрать. Он бы пригодился в
> том случае, если использовался реквизит, например
> ПолнНаименование.

Не согласен. Атрибут Наименование все равно имеет значение с пробелами в конце.
А вот в основном представлении (если оно - по наименованию) пробелы убраны.
Так что надо писать Строка(ТоварИзТаблицы) или просто
Товар=Товар + ТоварИзТаблицы
если Товар изначально был строкой.
15. poppy 26.09.07 10:03 Сейчас в теме
ssp_ Написал:
-------------------------------------------------------
> Не согласен. Атрибут Наименование все равно имеет
> значение с пробелами в конце.

Ты уверен? Проверял? Я соглашусь, что там есть пробелы в начале, но в конце их точно нет.
16. ssp_ 155 26.09.07 10:24 Сейчас в теме
poppy Написал:
> Ты уверен? Проверял? Я соглашусь, что там есть
> пробелы в начале, но в конце их точно нет.
>
упс... извиняюсь...

17. vasilykushnir 63 26.09.07 10:30 Сейчас в теме
ssp_ Написал:
-------------------------------------------------------
упс... извиняюсь...
>
>


То-то же. Поппи всегда права.


18. Abadonna 3969 26.09.07 12:24 Сейчас в теме
Короче так: СокрЛП-ою никогда каши не испортишь, я за привычку взял ставить её всегда, чтобы не вышло так, что как-нибудь вышел прокол (не поставил там, где надо). Просто выработал рефлекс ;)
19. vip 26.09.07 12:28 Сейчас в теме
Abadonna Написал:
-------------------------------------------------------
> Короче так: СокрЛП-ою никогда каши не испортишь, я
> за привычку взял ставить её всегда, чтобы не вышло
> так, что как-нибудь вышел прокол (не поставил там,
> где надо). Просто выработал рефлекс

+1

20. vip 26.09.07 12:30 Сейчас в теме
Сижу, пытаюсь вслух произнести "СокрЛП-ою" :))
21. dnp 26.09.07 16:39 Сейчас в теме
Код
Товар = "";
Запятая = "";
ВыбратьСтроки();
Пока ( ПолучитьСтроку()=1 ) Цикл
    Товар = Товар + Запятая + СокрЛП(ТоварИзТаблицы.Наименование);
    Запятая = ", ";
КонецЦикла;
Показать полностью

:)
22. vasilykushnir 63 26.09.07 17:36 Сейчас в теме
Отлично, dnp!
И кто скажет, что в споре не рождается истина?
23. poppy 26.09.07 22:22 Сейчас в теме
dnp, хорошее решение!
Не зря мы развели флад по простому вопросу.
24. CheBurator 2684 26.09.07 23:11 Сейчас в теме
кругом одни ламеры

Товар="";
ВыбратьСтроки();
Пока ПолучитьСтроку()=1
Цикл Товар = Товар + РазделительСтрок + СокрЛП(ТоварИзТаблицы.Наименование);
КонецЦикла;
Товар = СокрЛП(Товар);
25. CheBurator 2684 26.09.07 23:12 Сейчас в теме
и последней строкой
Товар = СтрЗаменить(Товар,ПазделительСтрок,",");
26. dnp 27.09.07 03:55 Сейчас в теме
Ну, в твоем решении тоже 7 строк, как и в моём, так что может зря про ламера?
И мой уже не сократить по строкам, а твой можно в 6 строк:
Код
Товар=""; 
ВыбратьСтроки(); 
Пока ПолучитьСтроку()=1 Цикл
   Товар = Товар + РазделительСтрок + СокрЛП(ТоварИзТаблицы.Наименование);
КонецЦикла; 
Товар = СтрЗаменить( СокрЛП(Товар), РазделительСтрок, ", " );
Показать полностью
27. Abadonna 3969 27.09.07 05:53 Сейчас в теме
Товар = СтрЗаменить(Товар,ПазделительСтрок,",");
Товар=Сред(Товар,2);
посчитай, где символов набивать меньше, не ламер, блин ;)
28. dnp 27.09.07 06:16 Сейчас в теме
Не просёк, ты с чем сравниваешь?
Ну и опять
Код
// врёте !
Товар=Сред(СтрЗаменить(Товар,РазделительСтрок,"," ),2); // 55 букавак
// или
Товар=СтрЗаменить(СокрЛП(Товар),РазделительСтрок,","); // 54 букавки
Показать полностью

:)
29. dnp 27.09.07 06:34 Сейчас в теме
Извиняюсь, облажался, пробел лишний не удалил, оба варианта по 54 знака.
Код
Товар=Сред(СтрЗаменить(Товар,РазделительСтрок,","),2);
Товар=СтрЗаменить(СокрЛП(Товар),РазделительСтрок,",");
Показать полностью
30. Abadonna 3969 27.09.07 07:04 Сейчас в теме
>Не просёк, ты с чем сравниваешь?
Барабашку сравниваю....
РазделительСтрок - надо набить....
Потом СтрЗаменить(Товар,ПазделительСтрок,","); - надо набить.
Нах извращаться: последний Васькин вариант самый "буквосберегающий"
И ваще - развели тут чайниковскую бодягу по части коннектации строк
Нечего обсуждать ваще-то
31. vasilykushnir 63 27.09.07 08:57 Сейчас в теме
Интересно - автор темы уже давно наверное слинял, а мы все копья ломаем... Хотя для него это обсуждение было бы хорошей школой.
32. DbIM 27.09.07 10:26 Сейчас в теме
Хех. И в самом деле. Большущее всем спасибо за такое живое обсуждение. Это тот самый опыт который в книжках не почерпнеш.
На практике применил самый первый вариант.
Все работает как надо. Теперь разбираюсь уже с другим документом. Другие головные. Этот работает и хорошо. Хотя конечно после стольких "вариаций" понимаю как правильно можно все улучшить.
33. astonvilla 234 02.10.07 09:16 Сейчас в теме
Товар="";
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Товар = Товар + ?(ПустаяСтрока(Товар) = 1,"",",")+ СокрЛП(ТоварИзТаблицы.Наименование);
КонецЦикла;

Такого варианта не было :)))
34. dnp 02.10.07 12:31 Сейчас в теме
Точно! :)

Хочу не согласиться с Abadonna'й, это не пустое место. Извращаться нужно и полезно, ибо :

1) когда я, в рабочее время, устаю от 1С, я (лично) отдыхаю в той же 1С, делаю какую-нибудь приятную фигню, затачиваю мегасуперприбамбас для 1С, или, вот такие штуки придумываю. И поделиться этим - просто приятно :)

2) именно подобные ветки на Т1С и 1СиЯ дали мне несколько просветлений, когда я начинал, после этого мой код стал менее корявым. Такие фишки могут раскрепощать сознание. Хотя конкретный вопрос и мелковат, развернуться негде))
35. vasilykushnir 63 02.10.07 14:22 Сейчас в теме
astonvilla Написал:
-------------------------------------------------------
> Товар="";
> ВыбратьСтроки();
> Пока ПолучитьСтроку()=1 Цикл
> Товар = Товар + ?(ПустаяСтрока(Товар) =
> 1,"",",")+ СокрЛП(ТоварИзТаблицы.Наименование);
> КонецЦикла;
>
> Такого варианта не было ))
>

Был на примете, но.... Конструкция "?" - те же яйца, что и "Если" в теле цикла только в профиль.
36. astonvilla 234 02.10.07 14:25 Сейчас в теме
Конструкция та же, строк меньше :))
37. poppy 02.10.07 14:32 Сейчас в теме
И быстродействие у нее выше. ;)
38. astonvilla 234 02.10.07 14:33 Сейчас в теме
Ну надо провести замеры :))
39. poppy 02.10.07 15:05 Сейчас в теме
Замеры уже проводились, правда по другому поводу http://infostart.ru/forum/read.php?25,4076,5952,ref=4246#msg-5952
40. Abadonna 3969 02.10.07 15:14 Сейчас в теме
Объясните ламеру зачем проверять Товар на пустое значение?
С каких щей он в доке пустым окажется?
41. poppy 02.10.07 15:21 Сейчас в теме
2Abadonna

Это ты о конструкции:
?(ПустаяСтрока(Товар) = 1,"",",")?

С помощью нее они избавляются от первой запятой в строке.
42. CheBurator 2684 02.10.07 15:47 Сейчас в теме
Конструкция с РазделителемСтрок - самая изящная, ибо пофиг есть он впереди/сзади результата - СокрЛП() его автоматом сожрет.
кругом не просто ламеры, а упертые ламеры..
;-)
43. Abadonna 3969 02.10.07 17:38 Сейчас в теме
Неужели проверка первой запятой стоит простого Товар=Сред(Товар,2)
Что за проблема избавиться от первого символа? К чему такие извраты?
44. poppy 02.10.07 18:19 Сейчас в теме
2Сhe Burashka & Abadonna

К сожалению, полет ваших мыслей доступен не всем.

Решения с разделителем строк и Сред(,2) достаточно оригинальны, в чем то даже красивы и изящны. Но они сложны не только при синтезе, но и при анализе. Можно сказать что они неочевидны.
45. CheBurator 2684 03.10.07 02:12 Сейчас в теме
Типа
Пометка = 3 - Пометка
???
46. CheBurator 2684 03.10.07 02:13 Сейчас в теме
ну если Товар заменить на Т,
а СокрЛП на СокрЛ - то я- победитель...
47. Abadonna 3969 03.10.07 04:30 Сейчас в теме
>Можно сказать что они неочевидны.
Ну это смотря для каких мозгов... Для меня - стопудово очевидны
А если говорить об одновременной очевидности и красивости, то самое красивое решение
у dnp
(+1)
48. CheBurator 2684 04.10.07 00:43 Сейчас в теме
.. и эти люди запрещают мне ковыряться в носу....
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот