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

Работа с табличной частью

Автор Кот_Леопольд, 14 сен 2018, 11:44

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

Кот_Леопольд

Всем добрый день. Подскажите в чем ошибка?
Простая задача, найти максимальное значение в колонке таблице и вывести его: то есть пройтись по строкам в одной колонке в табличной части документа и найти максимальное значение(тип число) и вывести на реквизит в форме. Нашел на форумах примерное решение задачи.
Делаю так, Создаю новую ТЗ, добавляю туда нужную колонку и сортирую ее, затем присваиваю нужные значения:
       
        ТУ = Новый ТаблицаЗначений;
ТУ.Колонки.Добавить("КоличествоПластин");
ТУ.Сортировать("КоличествоПластин Убыв");
МаксКоличествоПластин = ТУ[0].КоличествоПластин;
Объект.ОбщееКоличествоПластин = МаксКоличествоПластин;


Ошибку выдает что тип не определен у ТЗ:
{Документ.ЗаказНаПроизводство.Форма.ФормаДокумента.Форма(31,14)}: Тип не определен (ТаблицаЗначений)
    ТУ = Новый <<?>>ТаблицаЗначений; (Проверка: Тонкий клиент)
Конфигурацию пишу сам, платформа 8.3.
P.S: Отнесись с пониманием, я только учусь!!!

wise

(0) у Таблицы значений Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
вероятно Вы &наКлиенте ...
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Кот_Леопольд

Цитата: wise от 14 сен 2018, 13:16
(0) у Таблицы значений Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
вероятно Вы &наКлиенте ...
Вы абсолютно правы!!! Спасибо!!!
Добавлено: 14 сен 2018, 14:37


Переделал получилось вот что:
&НаСервере
Процедура  СортировкаЗначений();
ТУ = Новый ТаблицаЗначений;
ТУ.Колонки.Добавить("КоличествоПластин");
ТУ.Сортировать("КоличествоПластин Убыв");
МаксКоличествоПластин = ТУ[0].КоличествоПластин;
Объект.ОбщееКоличествоПластин = МаксКоличествоПластин;
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьОбщееКоличествоПластин(Стр)
Х = Стр.КоличествоВЗаказе/Стр.КоличествоНаМакете/2;
Если Цел(Х)-Окр(Х,0,0) = 0 И Цел(Х)<>Х Тогда
Стр.КоличествоПластин = Цел(Х)+0.5;
   Иначе Стр.КоличествоПластин = Окр(Х,0,0);
   КонецЕсли;
СортировкаЗначений();
Стр.КоличествоНаЗапас = (Объект.ОбщееКоличествоПластин*Стр.КоличествоНаМакете*2) - Стр.КоличествоВЗаказе;
КонецПроцедуры

Выдает ошибку при вводе данных в пользовательском режиме

wise

(2) посмотрите, ЧТО находится в Вашей Таблице значений...
она, ведь - ПУСТА.!!
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Кот_Леопольд

Цитата: wise от 14 сен 2018, 14:45
(2) посмотрите, ЧТО находится в Вашей Таблице значений...
она, ведь - ПУСТА.!!
Она да пуста, Я думал она при заполнении будет сравнивать значения и сортировать. Как же тут правильно все оформить? не подскажешь?=)

Sy4a

Во первых заполните её и проверьте на работоспособность код.
Во вторых можно просто условие написать:
Если ТУ.количество()>0 тогда     
МаксКоличествоПластин = ТУ[0].КоличествоПластин;
Объект.ОбщееКоличествоПластин = МаксКоличествоПластин;
иначе
Объект.ОбщееКоличествоПластин=0;
КонецЕсли;

вообще вы просто создали колонку пустую и зачемто её сортируете, сначало заполните а уж потом сортируйте
Например так:
ТУ.ЗагрузитьКолонку(ВашМассивЗначений,"КоличествоПластин");

Кот_Леопольд

Цитата: Sy4a от 14 сен 2018, 16:31
Во вторых можно просто условие написать:
Если ТУ.количество()>0 тогда     

Не совсем понимаю что означает это условие.
Я написал вот такой код по вашей подсказке =):
  Если Объект.Продукция.Количество()>0 Тогда
   МаксКоличествоПластин = Объект.Продукция[0].КоличествоПластин;
   Объект.ОбщееКоличествоПластин = МаксКоличествоПластин;
   Иначе
   Объект.ОбщееКоличествоПластин = 0;
   КонецЕсли;

Он мне проста первое значение из таблици берет как максимальное

bsn-chita

ЦитироватьТУ.количество()
Получает количество строк таблицы значений.
ЦитироватьОн мне проста первое значение из таблици берет как максимальное
Вроде как что написано то и делает.

  Если Объект.Продукция.Количество()>0 Тогда
      МаксКоличествоПластин = Объект.Продукция[0].КоличествоПластин;
      Объект.ОбщееКоличествоПластин = МаксКоличествоПластин;
  Иначе
      Объект.ОбщееКоличествоПластин = 0;
  КонецЕсли;

Система смотрит есть ли у табличной части хоть одна строка. Если количество()>0 то да есть хотя бы одна строка и в этом случае берется значение КоличествоПластин из первой строки(Продукция[0] индексы начинаются 0). А иначе если в табличной части нет ни одной строки просто присваивается 0.
Добавлено: 19 сен 2018, 03:22


Набросал навскидку варианты разные решения.

&НаСервере
Процедура Рассчитать1НаСервере()
Если Объект.Товары.Количество() > 0 Тогда
Объект.Товары.Сортировать("КоличествоПластин Убыв");
МаксимальноеЗначение = Объект.Товары[0].КоличествоПластин;
Иначе
МаксимальноеЗначение = 0;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = МаксимальноеЗначение;
Сообщение.Сообщить();
КонецПроцедуры


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


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

Кот_Леопольд

ЦитироватьНабросал навскидку варианты разные решения.
Большое спасибо, Попробовал, все варианты. С запросом правда пока плоха знаком, разберу его позже. А так два варианта абсолютно рабочии, а самая главное что понимаю как работают.

Добавлено: 19 сен 2018, 21:52


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


bsn-chita


Стр = Элементы.Продукция.ТекущиеДанные;

ТекущиеДанные представляет доступ к текущим данным (данным текущей строки). Так что и тут все правильно с точки зрения логики. Все что могут изменять ваши процедуры это данные текущей активной строки. А какие такие расчеты требуется делать?

Теги:

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

Рейтинг@Mail.ru

Поиск