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

Итог по полю табличной части документа.

Автор Конст_007, 30 июн 2015, 12:17

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

Конст_007

Всем доброго времени суток!

Помогите пожалуйста, не получается посчитать в форме документа итог по столбцу табличной части.
УТ 11.1
В справочнике номенклатуры добавлен числовой реквизит.
В табличной часть документа (накладная на внутреннее перемещение) выведен столбец с этим реквизитом, и по нему надо посчитать
итоговую сумму. Не получается обратиться в модуле формы к этому полю, пытаюсь так:

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


Ругается, пишет поле объекта "СуммаИсходная" не обнаружено, хотя
путь к данным на форме для этого столбца: Объект.Товары.Номенклатура.СуммаИсходная
Пытался посчитать через функцию подсчета итога:
Объект.Товары.Итог( ТекСтрокаНоменклатура.Номенклатура.СуммаИсходная) 
Тоже не получается, это же ссылочное поле, как блин к нему обратиться и просуммировать, уже всю голову сломал...

vitasw

Подобный подсчет надо выполнять на сервере. На клиенте нет реквизитов.
Если нужна только номенклатура, то
ТекСтрокаНоменклатура.Номенклатура - можно использовать на клиенте.
А если нужен реквизит номенклатуры,
ТекСтрокаНоменклатура.Номенклатура.СуммаИсходная - то только на сервере.

Rasty

а может проще отобразить итог в подвале колонки таблицы?
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

vitasw

Как? нужен итог по реквизиту номенклатуры.

Rasty

Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

Конст_007

vitasw и Rasty спасибо за ответы!

Пытаюсь получить значение реквизита через функцию на сервере и передать значение реквизита в модуль формы просто в сообщение для проверки
(все написано в модуле формы). Номенклатуру ищу просто по Артикулу:

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

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


Выводит пустые значения. Вроде все верно, ТекСтрокаНоменклатура.Артикул в форме точно выводит правильное значение, проверил.
Подскажите пожалуйста, кто знает...

vitasw

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

&НаКлиенте
Процедура РассчитатьИтоги(Команда)
         Итого=0;
         Для Каждого ТекСтрокаНоменклатура Из Объект.Товары Цикл
            Итого=Итого+ПолучитьЗначениеСуммыПоПозиции(ТекСтрокаНоменклатура.Номенклатура);
         КонецЦикла;
КонецПроцедуры


Вариант2(стратегически правильный):
&НаСервере
Функция ПолучитьЗначениеСуммыПоПозиции(ПараметрДляПоиска)
   Запрос = Новый Запрос(   
    "ВЫБРАТЬ
     |    Номенклатура.СуммаИсходная
     |ИЗ
     |    Справочник.Номенклатура КАК Номенклатура
     |ГДЕ
     |    Номенклатура.Ссылка в (&МассивНоменклатуры)";
     Запрос.УстановитьПараметр("МассивНоменклатуры",Объект.Товары.ВыгрузитьКолонку("Номенклатура"));
     РезультатЗапроса = Запрос.Выполнить().Выгрузить();
     Возврат РезультатЗапроса.Итог("СуммаИсходная");
КонецФункции

&НаКлиенте
Процедура РассчитатьИтоги(Команда)
         Итого=ПолучитьЗначениеСуммыПоПозиции();
КонецПроцедуры

LexaK

vitasw, ну зачем так-то

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


агрегатные функции в запросе надо искользовать, получится так


&НаСервере
Функция ПолучитьЗначениеСуммыПоПозиции(ПараметрДляПоиска)

   //если табличная часть пустая сразу возвращаем 0
   Если Объект.Товары.Количество() = 0 Тогда
      Возврат 0;
   КонецЕсли;

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

   РезультатЗапроса = Запрос.Выполнить().Выбрать();
   РезультатЗапроса.Следующий();

   Возврат РезультатЗапроса.СуммаИсходная;

КонецФункции
если помогло нажмите: Спасибо!

vitasw


Конст_007

Спасибо за ответы, ленивый вариант работает!!!

На вариантах с запросами правда ругается:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(2548)}: Метод объекта не обнаружен (ВыгрузитьКолонку)
     Запрос.УстановитьПараметр("МассивНоменклатуры",Объект.Товары.ВыгрузитьКолонку("Номенклатура"));



Теги:

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

Рейтинг@Mail.ru

Поиск