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

Из Регистра в Табличную часть

Автор Artex, 18 янв 2013, 18:56

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

Artex

Недавно начал изучение, столкнулся с надобностью при изменении реквизита документа выбрать из регистра сведений данные по этому реквизиту и разместить их в табличной части. Вот что я написал:


Функция ПолучитьЦена(ТипЦены, Номенклатура = Неопределено, Знач Дата = Неопределено) Экспорт
Дата = ?(Дата = Неопределено, ТекущаяДата(),Дата);

Структура = Новый Структура();
Структура.Вставить("ТипЦены", ТипЦены);

Данные = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата,Структура);
Возврат Данные;
КонецЕсли;
КонецФункции



Таким образом пытаюсь выбрать последние цены для всех позиций номенклатуры и вернуть их клиенту. Конфигуратор не ругался, но при отладке ловил ошибку (видимо нельзя вернуть таблицу значений из функции).  Вопрос в том, как это сделать (через массив?) и потом записать в табличную часть:


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

КонецПроцедуры


Планировал сделать это как-то так... Что изменить?




MuI_I_Ika

У вас неправильный вызов функции:

ОбщиеФункции.ПолучитьЦена(Объект.ТипЦены, Объект.Дата);

И раз уж вы меняете цену только в текщей строке, не надо городить циклы.


Цена = ОбщиеФункции.ПолучитьЦена(Объект.ТипЦены,Элементы.ПриходуемыеТовары.ТекущиеДанные.Номенклатура, Объект.Дата);
Элементы.ПриходуемыеТовары.ТекущиеДанные.Цена = Цена;


Функция ПолучитьЦена(ТипЦены, Номенклатура = Неопределено, Знач Дата = Неопределено) Экспорт

        Дата = ?(Дата = Неопределено, ТекущаяДата(),Дата);

        Структура = Новый Структура();
        Структура.Вставить("ТипЦены", ТипЦены);   
        Структура.Вставить("Номенклатура",Номенклатура);
       
        Данные = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата,Структура);
        Если Данные.Количество()>0 Тогда
            Возврат Данные[0].Цена;
        Иначе
            Возврат 0;
        КонецЕсли;
                                         
КонецФункции

Artex

Ах да, вызов функции и правда неправильный)

А вот цены мне надо менять во всех строках табличной части, в которых есть номенклатура, для которой я выбрал цены в регистре. Для одной строки я уже сделал, теперь надо для всех... А для этого передавать надо не одну цену, а все.

sertak

Раз вам надо изменять все строки, нужно использовать один из вариантов:
1) во-первых, изменить последовательность параметров в функции: необязательный параметр "номенклатура" должен идти в вашем случае последним, т.к. вы его не указываете для получения массива:
Функция ПолучитьЦена(ТипЦены, Знач Дата = Неопределено, Номенклатура = Неопределено) Экспорт;
во-вторых, в цикле сравнивать номенклатуру и присваивать значение цены не через
Элементы.ПриходуемыеТовары.ТекущиеДанные.Цена = Цена.Цена (это изменяет только текущий элемент, т.е. тот, который интерактивно выделен пользователем), а через
Строка.Цена = Цена.Цена
 
2) и возможен второй вариант, когда вы в цикле перебора табличной части вызываете функцию для каждого элемента. Тогда функция должна быть такой, как привел [/code]MuI_I_Ika, а обработчик будет следующим:

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

Artex

Сделал по второму способу, появляется следующее:

"Итератор для значения не определен - Для Каждого Строка Из Элементы.ПриходуемыеТовары Цикл"

sertak

Да, есть ошибка, не заметил.
Вместо перебора элемента формы, что бессмысленно в 8.2:

Для Каждого Строка Из Элементы.ПриходуемыеТовары Цикл

нужно написать:
Для Каждого Строка Из Объект.ТЧПриходуемыеТовары Цикл
где ТЧПриходуемыеТовары - это название табличной части, чьи данные отображает элемент формы ПриходуемыеТовары. Посмотрите как называется табличная часть и подставьте. Она может называться так же, как и элемент формы.

Artex

Да, чтото я сам не догадался) Элементы.ПриходуемыеТовары это же элемент формы, а Объект.ПриходуемыеТовары это сама табличная часть)) Пока путаюсь еще. Спасибо, все заработало!

Теги:

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

Рейтинг@Mail.ru

Поиск