В документе в табличной части выбирается несколько позиций.
Все эти позиции текстовые-строковые.
ну к примеру товары и их наименования
Хочу в таблицу (приходный кассовый ордер) вывести их все в одно поле (основание) ну скажем через запятую.
Что нибудь вроде
ВыбратьСтроки();
пока ПолучитьСтроку()=1 Цикл
Товар=Товар+ТоварИзТаблицы;
можно и так... только конкатенацию строк причесать. Что-то типа
Товар = "";
ВыбратьСтроки();
пока ПолучитьСтроку()=1 Цикл
Если ПустоеЗначение (Товар) = 1 Тогда
Товар=Товар+СокрЛП(ТоварИзТаблицы.Наименование);
Иначе
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
КонецЕсли;
Да не крутизна это, а полная фигня. Типичное решение "в лоб" с отключенными мозгами. Если бы poppy забрела на эту тему - такое решение расчехвостила бы в пух и прах (кстати, почитай ее посты и к другим темам тоже - много полезного почерпнешь).
Итак, первое, что бросается в глаза - главный недостаток метода, что конструкция
Если ПустоеЗначение (Товар) = 1 Тогда
выполняется в цикле по количеству строк документа. А это уже есть не хорошо. И это, заметь, только ради того, чтобы запятая не была первым символом в результирующей строке.
Опять же очевидное решение "в лоб" - вынести эту бодягу за пределы цикла:
Товар = "";
ВыбратьСтроки();
пока ПолучитьСтроку()=1 Цикл
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
...
КонецЦикла;
Если Лев(Товар, 1) = "," Тогда
Товар = Прав(Товар, СтрДлина(Товар) - 1);
КонецЕсли;
Товар = "";
ВыбратьСтроки();
Если ПолучитьСтроку()=1 Тогда
Товар=Товар + СокрЛП(ТоварИзТаблицы.Наименование);
Пока ПолучитьСтроку()=1 Цикл
Товар=Товар + "," + СокрЛП(ТоварИзТаблицы.Наименование);
КонецЦикла;
КонецЕсли;
Показать полностью
Вместо СокрЛП(ТоварИзТаблицы.Наименование) ИМХО быстрее будет
Товар=Товар + ТоварИзТаблицы
если основное представление справочника - наименование
Преобразование в строку гарантировано начальным значением переменной Товар.
poppy Написал:
> ИМХО метод СокрЛП можно убрать. Он бы пригодился в
> том случае, если использовался реквизит, например
> ПолнНаименование.
Не согласен. Атрибут Наименование все равно имеет значение с пробелами в конце.
А вот в основном представлении (если оно - по наименованию) пробелы убраны.
Так что надо писать Строка(ТоварИзТаблицы) или просто
Товар=Товар + ТоварИзТаблицы
если Товар изначально был строкой.
ssp_ Написал:
-------------------------------------------------------
> Не согласен. Атрибут Наименование все равно имеет
> значение с пробелами в конце.
Ты уверен? Проверял? Я соглашусь, что там есть пробелы в начале, но в конце их точно нет.
Короче так: СокрЛП-ою никогда каши не испортишь, я за привычку взял ставить её всегда, чтобы не вышло так, что как-нибудь вышел прокол (не поставил там, где надо). Просто выработал рефлекс ;)
Abadonna Написал:
-------------------------------------------------------
> Короче так: СокрЛП-ою никогда каши не испортишь, я
> за привычку взял ставить её всегда, чтобы не вышло
> так, что как-нибудь вышел прокол (не поставил там,
> где надо). Просто выработал рефлекс
>Не просёк, ты с чем сравниваешь?
Барабашку сравниваю....
РазделительСтрок - надо набить....
Потом СтрЗаменить(Товар,ПазделительСтрок,","); - надо набить.
Нах извращаться: последний Васькин вариант самый "буквосберегающий"
И ваще - развели тут чайниковскую бодягу по части коннектации строк
Нечего обсуждать ваще-то
Хех. И в самом деле. Большущее всем спасибо за такое живое обсуждение. Это тот самый опыт который в книжках не почерпнеш.
На практике применил самый первый вариант.
Все работает как надо. Теперь разбираюсь уже с другим документом. Другие головные. Этот работает и хорошо. Хотя конечно после стольких "вариаций" понимаю как правильно можно все улучшить.
Хочу не согласиться с Abadonna'й, это не пустое место. Извращаться нужно и полезно, ибо :
1) когда я, в рабочее время, устаю от 1С, я (лично) отдыхаю в той же 1С, делаю какую-нибудь приятную фигню, затачиваю мегасуперприбамбас для 1С, или, вот такие штуки придумываю. И поделиться этим - просто приятно :)
2) именно подобные ветки на Т1С и 1СиЯ дали мне несколько просветлений, когда я начинал, после этого мой код стал менее корявым. Такие фишки могут раскрепощать сознание. Хотя конкретный вопрос и мелковат, развернуться негде))
Конструкция с РазделителемСтрок - самая изящная, ибо пофиг есть он впереди/сзади результата - СокрЛП() его автоматом сожрет.
кругом не просто ламеры, а упертые ламеры..
;-)
Решения с разделителем строк и Сред(,2) достаточно оригинальны, в чем то даже красивы и изящны. Но они сложны не только при синтезе, но и при анализе. Можно сказать что они неочевидны.
>Можно сказать что они неочевидны.
Ну это смотря для каких мозгов... Для меня - стопудово очевидны
А если говорить об одновременной очевидности и красивости, то самое красивое решение
у dnp
(+1)