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

Создать программно СписокВыбора

Автор Public_enemy, 29 дек 2011, 20:42

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

Public_enemy

Всем доброго времени суток.
Я начинающий программист, тока недавно сдал на профессионала
Есть не большая загвоздка, для собственных нужд создаю БД (что-то вместо практики)
     Имеется  БД (не типовая) на платформе 8.2 . Есть документ Приходная с реквизитами и табличной частью, в таблице есть колонки номенклатура ,   ,   ,  , цена.   У данного поля(ТекущиеДанные.Цена )  табличной части  есть Свойство  "СписокВыбора"
необходимо создать этот список с помощью запроса из Регистра Сведений "ЦеныНоменклатуры" , что-бы при нажатии на кнопку списка выбора выпадал СписокВыбора с вариантами цен, взятых из этого регистра
Все выше описаное мной сделано, но в результате в "СписокВыбора"  возвращается одно значение вместо нескольких .
Никак ни могу сообразить как передать несколько значений.
Кто знает пожалуйста подскажите
Здесь текст кода:
         
        &НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     СтрокаТаблицы = Строка.Номенклатура;
     Элементы.ТаблицаПокупокЦена.СписокВыбора.Добавить( СписокЦенНоменклатуры(СтрокаТаблицы));
КонецПроцедуры

  &НаСервере
  Функция  СписокЦенНоменклатуры(СтрокаТаблицы)
             
    Запрос = Новый Запрос;
    Запрос.Текст =  "ВЫБРАТЬ
                    |   ЦеныНоменклатуры.Номенклатура,
                    |   ЦеныНоменклатуры.Цена КАК Цена
                    |ИЗ
                    |   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                    |ГДЕ
                    |   ЦеныНоменклатуры.Номенклатура = &СтрокаТаблицы";

    Запрос.УстановитьПараметр("СтрокаТаблицы",СтрокаТаблицы);

    Результат = Запрос.Выполнить();
    Итог = Результат.Выбрать();
   
    Пока Итог.Следующий() Цикл
      Возврат  Итог.Цена; 
         
    КонецЦикла;
   
 
  КонецФункции

Dethmontt

Как то так.
       &НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
    Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
    СтрокаТаблицы = Строка.Номенклатура;
    Элементы.ТаблицаПокупокЦена.СписокВыбора = СписокЦенНоменклатуры(СтрокаТаблицы);
КонецПроцедуры

 &НаСервере
 Функция  СписокЦенНоменклатуры(СтрокаТаблицы)
           
   Запрос = Новый Запрос;
   Запрос.Текст =  "ВЫБРАТЬ
                   |   ЦеныНоменклатуры.Номенклатура,
                   |   ЦеныНоменклатуры.Цена КАК Цена
                   |ИЗ
                   |   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                   |ГДЕ
                   |   ЦеныНоменклатуры.Номенклатура = &СтрокаТаблицы";

   Запрос.УстановитьПараметр("СтрокаТаблицы",СтрокаТаблицы);
   Список = Новый СписокЗначений;
   Результат = Запрос.Выполнить();
   Итог = Результат.Выбрать();
 
   Пока Итог.Следующий() Цикл
         Список.Добавить(Итог.Цена);  
       
   КонецЦикла;
Возврат  Список;
 

 КонецФункции
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Public_enemy

При исполнении кода вот таткаяошибка
{Документ.Покупки.Форма.ФормаДокумента.Форма(170)}: Поле объекта недоступно для записи (СписокВыбора)
     Элементы.ТаблицаПокупокЦена.СписокВыбора =  СписокЦенНоменклатуры(СтрокаТаблицы);

Если написать Элементы.ТаблицаПокупокЦена.СписокВыбора.Добавить(СписокЦенНоменклатуры(СтрокаТаблицы));
Тогда все получиться, но вывод происходит в оду строку через " ; "и выбрать значение из списка в режиме предприятия не получится
по данному коду результат выводиться (в одну строку) вот так: 23.5;25.4;65.8;и т. д. в зависимости от количества значений
Такой вариант не устраивает т.к. в результате выбора из списка будет 0

список должен выглядеть вот так  23.5
                                                 25.4
                                                 65.8
В таком варианте можно выбрать.  Но как это сделать пока до меня не дошло

Dethmontt

Самому подумать не судьба?
Ты передай этот список на сервер и там заполни!!!
        &НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     СтрокаТаблицы = Строка.Номенклатура;
     СписокЦенНоменклатуры(СтрокаТаблицы,Элементы.ТаблицаПокупокЦена.СписокВыбора);
КонецПроцедуры

  &НаСервере
  Процедура СписокЦенНоменклатуры(СтрокаТаблицы,Список)
             
    Запрос = Новый Запрос;
    Запрос.Текст =  "ВЫБРАТЬ
                    |   ЦеныНоменклатуры.Номенклатура,
                    |   ЦеныНоменклатуры.Цена КАК Цена
                    |ИЗ
                    |   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                    |ГДЕ
                    |   ЦеныНоменклатуры.Номенклатура = &СтрокаТаблицы";

    Запрос.УстановитьПараметр("СтрокаТаблицы",СтрокаТаблицы);
   
    Результат = Запрос.Выполнить();
    Итог = Результат.Выбрать();
   
    Пока Итог.Следующий() Цикл
          Список.Добавить(Итог.Цена);           
    КонецЦикла;
   
  КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Public_enemy

Опять таже ошибка "Поле объекта недоступно для записи"


&НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     СтрокаТаблицы = Строка.Номенклатура;
     Элементы.ТаблицаПокупокЦена.СписокВыбора.Добавить(СписокЦенНоменклатуры(СтрокаТаблицы));
КонецПроцедуры

  &НаСервере
Функция  СписокЦенНоменклатуры(СтрокаТаблицы)
             
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                    |   ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
                    |   ЦеныНоменклатуры.Цена КАК Цена
                    |ИЗ
                    |   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                    |ГДЕ
                    |   ЦеныНоменклатуры.Номенклатура = &СтрокаТаблицы";

    Запрос.УстановитьПараметр("СтрокаТаблицы",СтрокаТаблицы);
    СписокВыбора = Новый  СписокЗначений;
    Результат = Запрос.Выполнить();
    Итог = Результат.Выбрать();
   
   
    Пока Итог.Следующий() Цикл
     СписокВыбора.Добавить(Итог.Цена);
    КонецЦикла;;
   
    Возврат СписокВыбора;
  КонецФункции


В данном примере возвращаются все значения имеющиеся в регистре вот результат
но значения записаны в одну строку,
а должно быть вот так

Dethmontt

А так тоже ошибка?  
&НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     СтрокаТаблицы = Строка.Номенклатура;
     Список = СписокЦенНоменклатуры(СтрокаТаблицы);
Для каждого х Из Список Цикл
Элемент.СписокВыбора.Добавить(х);
КонецЦикла;
КонецПроцедуры

  &НаСервере
  Функция  СписокЦенНоменклатуры(СтрокаТаблицы)
             
    Запрос = Новый Запрос;
    Запрос.Текст =  "ВЫБРАТЬ
                    |   ЦеныНоменклатуры.Номенклатура,
                    |   ЦеныНоменклатуры.Цена КАК Цена
                    |ИЗ
                    |   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                    |ГДЕ
                    |   ЦеныНоменклатуры.Номенклатура = &СтрокаТаблицы";

    Запрос.УстановитьПараметр("СтрокаТаблицы",СтрокаТаблицы);
    Список = Новый СписокЗначений;
    Результат = Запрос.Выполнить();
    Итог = Результат.Выбрать();
   
    Пока Итог.Следующий() Цикл
          Список.Добавить(Итог.Цена);   
         
    КонецЦикла;
Возврат  Список;
   

  КонецФункции
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Public_enemy

Да этого я и сам дошол. Все получается прекрасно. Список отображается как надо. Но вылезла другая проблема:
при повторном вызове функции выдает ошибку   
{Документ.Покупки.Форма.ФормаДокумента.Форма(168)}: Ошибка при вызове метода контекста (СписокЦенНоменклатуры)
     Список = СписокЦенНоменклатуры(СтрокаТаблицы, Список);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'valList':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/logform}valList
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/core}value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЭлементСпискаЗначений'


В не зависимости где от того где создается список значений на клиенте и потом передается на сервер
или на сервере потом передается на клиент

Public_enemy

Так. С этой проблемой вопрос решен. Ошибка заключалась в том, что при повторном вызове функции  СписокЦенНоменклатуры(СтрокаТаблицы) передовался не только параметр СтрокаТаблицы, но и сохраненные параметры переменной Список. Как то так на сколько я смог понять.
Лечится достаточно просто:перед отправкой на сервер список выбора надо очищать
&НаКлиенте
Процедура ТаблицаПокупокЦенаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     СтрокаТаблицы = Строка.Номенклатура;
     Элемент.СписокВыбора.Очистить(); ///Это и есть решение проблеммы
     Список = СписокЦенНоменклатуры(СтрокаТаблицы);
     
Для Каждого Значения ИЗ Список   Цикл
     Элемент.СписокВыбора.Добавить(Значения);   
       
КонецЦикла;
КонецПроцедуры


Дело осталось за малым это обработка выбора


Public_enemy

Да, еще можно использовать метод ВыбратьИзСписка(Здесь список который вы создали на сервере);, при использовании данного метода не потребуется очищать список выбора  при отправке на сервер

Public_enemy

Продолжаем тему.
После нового года чет голова туго соображает.  Выбранное значение из списка выбора не сохраняется при выборе (в графе цена получается 0)

&НаКлиенте
Процедура
ТаблицаПокупокЦенаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
   
     Строка = Элементы.ТаблицаПокупок.ТекущиеДанные;
     Строка.Цена = ВыбранноеЗначение;
     
КонецПроцедуры

не получается присвоить выбранное значение.
Подскажите, может я чет не так делаю

Теги:

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

Рейтинг@Mail.ru

Поиск