Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 00:05

Создание списка из строки

Автор Golickoff, 05 фев 2015, 07:19

0 Пользователей и 1 гость просматривают эту тему.

Golickoff

Всем привет.
Есть форма с полем текстового документа. При нажатии на одну кнопку, она заполняется текстовой строкой с тестовым набором символов, разделённых пробелами (пример в коде). При нажатии на вторую кнопку, эта строка разбивается на несколько строк (пробел заменяется на перенос строки). Возможно ли эти строки превратить в список с возможностью выбрать в нём отдельную строку? Если да, то нужен совет каким образом это можно реализовать.

Допустим, поле текстового документа заполняется следующим образом:
&НаКлиенте
Процедура ЗаполнениеПоля(Команда)
Объект.Поле = "1234 2345 3456 4567 5678 6789 7890";
КонецПроцедуры

Затем я разбиваю полученный результат:
&НаКлиенте
Функция РазбитьСтроку(ИсходнаяСтрока,Разделитель)
Результат=СтрЗаменить(Объект.Поле," ",Символы.ПС);
Объект.Поле=Результат;
КонецФункции

То есть, по нажатию на одну кнопку я получил строку типа "1234 2345 3456 4567 5678 6789 7890", а по нажатию на вторую у меня выходит следующее:
1234
2345
3456
4567
5678
6789
7890
Ещё раз вопрос, можно ли мне превратить конечный результат в список, который будет выведен на форму в виде тумблера с возможностью выбрать только "1234", или "2345" и так далее? Версия платформы -- 8.3
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Если пробел разделитель, то можно как-то так

Результат = СокрЛП(Объект.Реквизит1);
СЗ = Новый СписокЗначений;
Пока СтрДлина(Результат) > 0 Цикл
ПозицияПервогоПробела = Найти(Результат, " ");
Если ПозицияПервогоПробела > 0 Тогда
ЭлементСписка = СокрЛП(Лев(Результат, ПозицияПервогоПробела - 1));
Результат = Прав(Результат, СтрДлина(Результат) - ПозицияПервогоПробела);
Иначе
ЭлементСписка = Результат;
Результат = "";
КонецЕсли;
СЗ.Добавить(ЭлементСписка);
КонецЦикла;


Golickoff

Цитата: has от 05 фев 2015, 08:00
...можно как-то так...
Спасибо, сейчас попробую.
Добавлено: 05 фев 2015, 09:04


has, не знаю насколько правильно я уловил мысль, но сделал следующее: в форме объекта создал новый реквизит СписокЗначений с типом СписокЗначений (помаслил масло), затем вставил в модуль формы предложенный код и немного изменил его.
&НаКлиенте
Функция ПрисвоитьЗначениеПеречислений()
    Результат = СокрЛП(Объект.Метки);
    СЗ = Новый СписокЗначений();
    Пока СтрДлина(Результат) > 0 Цикл
        ПозицияПервогоПробела = Найти(Результат, " ");
        Если ПозицияПервогоПробела > 0 Тогда
            ЭлементСписка = СокрЛП(Лев(Результат, ПозицияПервогоПробела - 1));
            Результат = Прав(Результат, СтрДлина(Результат) - ПозицияПервогоПробела);
        Иначе
            ЭлементСписка = Результат;
            Результат = "";
        КонецЕсли;
        СЗ.Добавить(ЭлементСписка);
    КонецЦикла;
    Объект.Метки = СЗ; //убедиться в работе кода
    Объект.СписокЗначений.ЗагрузитьЗначения(СЗ);
КонецФункции
   
После этого поле текстового документа принимает значение "1234; 2345; 3456; 4567; 5678; 6789; 7890", то есть код работает, однако при попытке присвоить реквизиту СписокЗначений эти же параметры, появляется ошибка {Обработка.РаботаСМетками.Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (ЗагрузитьЗначения)
Объект.ДоступныеМетки.ЗагрузитьЗначения(СЗ);
по причине:
Несоответствие типов (параметр номер '1')

Где я ошибся?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Перетащить реквизит формы СписокЗначений на саму форму в виде поля, указать у поля КнопкаСпискаВыбора. И тогда так

&НаКлиенте
Функция ПрисвоитьЗначениеПеречислений()
    Результат = СокрЛП(Объект.Метки);
    Пока СтрДлина(Результат) > 0 Цикл
        ПозицияПервогоПробела = Найти(Результат, " ");
        Если ПозицияПервогоПробела > 0 Тогда
            ЭлементСписка = СокрЛП(Лев(Результат, ПозицияПервогоПробела - 1));
            Результат = Прав(Результат, СтрДлина(Результат) - ПозицияПервогоПробела);
        Иначе
            ЭлементСписка = Результат;
            Результат = "";
        КонецЕсли;
        Элементы.СписокЗначений.СписокВыбора.Добавить(ЭлементСписка);
    КонецЦикла;
КонецФункции

Golickoff

Цитата: has от 05 фев 2015, 09:54
И тогда так...
Всё сделал по инструкции, код не менял, никаких ошибок не возникло, но список значений остался пустым :dfbsdfbsdf:
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

У поля, где должен быть список, надо еще указать выводить Кнопку списка выбора в свойствах.

Вот у меня простая форма обработки.

вот свойства Поля СписокДанных

Вот код комады по нажатию на кнопку Кнопка


&НаКлиенте
Процедура Команда1(Команда)
Результат = СокрЛП(Объект.Реквизит1);
СписокДанных = Новый СписокЗначений;
Пока СтрДлина(Результат) > 0 Цикл
ПозицияПервогоПробела = Найти(Результат, " ");
Если ПозицияПервогоПробела > 0 Тогда
ЭлементСписка = СокрЛП(Лев(Результат, ПозицияПервогоПробела - 1));
Результат = Прав(Результат, СтрДлина(Результат) - ПозицияПервогоПробела);
Иначе
ЭлементСписка = Результат;
Результат = "";
КонецЕсли;
СписокДанных.СписокВыбора.Добавить(ЭлементСписка);
КонецЦикла;
КонецПроцедуры

Вот результат, после нажатия на кнопку Кнопка и после нажатия на кнопку списка выбора у поля

Golickoff

Я создал реквизит у обработки, а не у формы. Судя по тому, что всё заработало после смены расположения реквизита, дело было в нём. Большое спасибо.

P.S. Тут возникла новая проблема: я только зарегистрировался на этом форуме и не могу найти где можно закрыть тему.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Теги: Список строка 8.3 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск