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

Как сложить значения Столбца "Объем"

Автор anton.kislov, 07 окт 2013, 09:54

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

anton.kislov

Добавил в подвал документа надпись ИтогоОбъем
Рядом хотел добавить СуммуОбъемов по данным столбца Объем, сделать как автосумма..

Подскажите как это сделать?

Новенькая

СуммаОбъемов =ТвояТаблица.Итог("Объем");

mixqn

В свойствах колонки табличного поля поставьте флажок у поля ОтображатьИтогиВПодвале

anton.kislov

Цитата: mixqn от 07 окт 2013, 10:04
В свойствах колонки табличного поля поставьте флажок у поля ОтображатьИтогиВПодвале
У колонки Сумма есть данное Флажок, а у Объема нет((
Добавлено: 07 окт 2013, 10:54


Цитата: Новенькая от 07 окт 2013, 10:02
СуммаОбъемов =ТвояТаблица.Итог("Объем");
Дело в том, что данные (объем и вес) у меня хранятся в Массиве, который я получаю запросом, а потом расставляю согласно номенклатурам...

Новенькая

Ты сумму объемов где хочешь вывести-то? в таблице? или отдельно? Формы у тебя обычные или управляемые? Тип у реквизита "Объем" - число?

mixqn

Цитата: anton.kislov от 07 окт 2013, 10:37Дело в том, что данные (объем и вес) у меня хранятся в Массиве, который я получаю запросом, а потом расставляю согласно номенклатурам...
раз так, то и текст в подвале устанавливайте программно: рассчитайте итог и через свойство ТекстПодвала соответствующей колонки разместите.
Итог предварительно нужно отформатировать в нужном виде.

anton.kislov

Цитата: Новенькая от 07 окт 2013, 12:19
Ты сумму объемов где хочешь вывести-то? в таблице? или отдельно? Формы у тебя обычные или управляемые? Тип у реквизита "Объем" - число?
Сумму хочу вывести в подвале.. Формы обычные, не управляемые.. Тип у реквизита - число
Добавлено: 08 окт 2013, 03:35


Цитата: mixqn от 07 окт 2013, 12:31
Цитата: anton.kislov от 07 окт 2013, 10:37Дело в том, что данные (объем и вес) у меня хранятся в Массиве, который я получаю запросом, а потом расставляю согласно номенклатурам...
раз так, то и текст в подвале устанавливайте программно: рассчитайте итог и через свойство ТекстПодвала соответствующей колонки разместите.
Итог предварительно нужно отформатировать в нужном виде.
Я понимаю, что программно..
СуммаОбъем = Структура.Итог("Объем");
ЭлементыФормы.ВсегоОбъем.Значение = СуммаОбъем;

Пытаюсь вот так... Структура - массив со значениями объема..
Но не выходит

Добавлено: 08 окт 2013, 06:27


Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)

// в этот массив соберем всю номенклатуру, которая присутствует в выводимых строках.
МассивНоменклатуры = Новый Массив;

// в этот массив соберем все единицы измерения, которые присутствуют в выводимых строках.
МассивЕдиницИзмерения = Новый Массив;

// обходим выводимые строки и одним циклом собираем сразу и номенклатуру, и единицы измерения.
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл

МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
МассивЕдиницИзмерения.Добавить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);


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




// устанавливаем параметры запроса

// это контрагент, для которого доставать артикулы
Запрос.УстановитьПараметр("Контрагент", Контрагент);

// список номенклатуры, для которой доставать артикулы
Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);

// список единиц измерения, для которых доставать веса и объемы
Запрос.УстановитьПараметр("ЕдиницыИзмерения", МассивЕдиницИзмерения);

// выполняем разом запросы за одно обращение к БД
// возвращается массив результатов каждого запроса
Результаты = Запрос.ВыполнитьПакет();


СоответствиеЕдиницИзмерения = Новый Соответствие;

// обходим результат первого запроса
Выборка = Результаты[0].Выбрать();
Пока Выборка.Следующий() Цикл
// собираем в соответствие веса и объемы.
СоответствиеЕдиницИзмерения.Вставить(Выборка.Ссылка, Новый Структура("Объем", Выборка.Объем));

КонецЦикла;

// и такая же оптимизация для поиска артикула по номенклатуре
СоответствиеАртикулов = Новый Соответствие;

// обходим результат второго запроса
Выборка = Результаты[1].Выбрать();
Пока Выборка.Следующий() Цикл
// сгребаем в кучу артикулы.
СоответствиеАртикулов.Вставить(Выборка.Номенклатура, Выборка.АртикулНоменклатурыКонтрагента);
КонецЦикла;

//для номенклатур
СоответствиеНоменклатурКонтрагента = Новый Соответствие;
// обходим результат третьего запроса
Выборка = Результаты[2].Выбрать();
Пока Выборка.Следующий() Цикл
// сгребаем в кучу номенклатуры.
СоответствиеНоменклатурКонтрагента.Вставить(Выборка.Номенклатура, Выборка.НаименованиеНоменклатурыКонтрагента);
КонецЦикла;

СоответствиеВес = Новый Соответствие;

// обходим результат четвертого запроса
Выборка = Результаты[3].Выбрать();
Пока Выборка.Следующий() Цикл
// собираем в соответствие веса.
СоответствиеВес.Вставить(Выборка.Ссылка, Новый Структура("Вес", Выборка.Вес));

КонецЦикла;


//предварительные данные готовы.
// обходим еще раз оформления строк и расставляем куда чего нужно.
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл


ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.Вес.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.Объем.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.НоменклатураКонтрагента.ОтображатьТекст = Истина;

// ищем артикул
Артикул = СоответствиеАртикулов.Получить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Если Артикул <> Неопределено Тогда

// нашли - показываем его
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Артикул;

Иначе

// не нашли - показываем пустую строку.
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = "!!!";

КонецЕсли;
//---------------конец Артикулы
//ищем НаименованиеНоменклатурыКонтрагента
НаименованиеНоменклатурыКонтрагента = СоответствиеНоменклатурКонтрагента.Получить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Если НаименованиеНоменклатурыКонтрагента <> Неопределено Тогда

// нашли - показываем его
ОформлениеСтроки.Ячейки.НоменклатураКонтрагента.Текст = НаименованиеНоменклатурыКонтрагента;

Иначе

// не нашли - показываем пустую строку.
ОформлениеСтроки.Ячейки.НоменклатураКонтрагента.Текст = "!!!";

КонецЕсли;
      //-------------конец Наименования

// ищем объемы по единице измерения
Структура = СоответствиеЕдиницИзмерения.Получить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
Если Структура <> Неопределено Тогда

// нашли - считаем цифры и показываем
ОформлениеСтроки.Ячейки.Объем.Текст = Формат(Структура.Объем * ОформлениеСтроки.ДанныеСтроки.Количество, "ЧЦ=15; ЧДЦ=3");

Иначе

// не нашли - ничего не показываем
ОформлениеСтроки.Ячейки.Объем.Текст = "";

КонецЕсли;
   
//----------------------конец объемы

// ищем вес по единице измерения
Структура = СоответствиеВес.Получить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
Если Структура <> Неопределено Тогда

// нашли - считаем цифры и показываем
ОформлениеСтроки.Ячейки.Вес.Текст = Формат(Структура.Вес * ОформлениеСтроки.ДанныеСтроки.Количество, "ЧЦ=15; ЧДЦ=3");

Иначе

// не нашли - ничего не показываем
ОформлениеСтроки.Ячейки.Вес.Текст = "";

КонецЕсли;

КонецЦикла;
        //Итого Объем в подвале
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
         //Итого объемы по единице измерения
Структура = СоответствиеЕдиницИзмерения.Получить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
Итог = Формат(Структура.Объем * ОформлениеСтроки.ДанныеСтроки.Количество, "ЧЦ=15; ЧДЦ=3");
Для каждого Элемент из Структура Цикл
        Если ТипЗнч(Элемент) = Тип("Число") Тогда //Проверим что элемент массива является числом для математической операции сложения
          Итог = Итог + Элемент;
         КонецЕсли;
КонецЦикла;


ЭлементыФормы.ВсегоОбъем.Значение = Итог;



КонецЦикла;

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

Весь код процедуры...
Выводит в "ЭлементыФормы.ВсегоОбъем.Значение" - последнее значение объема, но никак не сумму..
Может кто что подскажет?

sdilshod

Что у тебя конкретно не получается. Не получает просчитывать сумму или не получается вставлять полученную сумму в подвал таблицы?

anton.kislov

Цитата: sdilshod от 08 окт 2013, 09:12
Что у тебя конкретно не получается. Не получает просчитывать сумму или не получается вставлять полученную сумму в подвал таблицы?
Не получается рассчитать сумму..
В подвал попадает последнее значение столбца объем..
//Итого Объем в подвале
   Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
         //Итого объемы по единице измерения
      Структура = СоответствиеЕдиницИзмерения.Получить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
      Итог = Формат(Структура.Объем * ОформлениеСтроки.ДанныеСтроки.Количество, "ЧЦ=15; ЧДЦ=3");
      Для каждого Элемент из Структура Цикл
        Если ТипЗнч(Элемент) = Тип("Число") Тогда //Проверим что элемент массива является числом для математической операции сложения
             Итог = Итог + Элемент;
         КонецЕсли;
      КонецЦикла;

вот этим кодом пытаюсь вычислить сумму, но видимо плохо пытаюсь

mixqn

ПриПолученииДанных отрабатывает несколько раз, кажется, 2 раза ( я уже писал на форуме, можно поискать по истории) - первый раз для первой строки, потом для всех остальных.
Не суть важно, 2, 3 или 4 раза отрабатывает событие, факт в том, что не 1 раз, и при каждом срабатывании события обрабатывается только часть строк.

Что это значит для нас? Это значит, что мы не можем получать итог в этой процедуре. Нужен более хитрый алгоритм. Должна быть переменная модуля, в которой мы накапливаем итог. Я подобные задачи решал, но примера "под рукой" нет. Попробуйте подумать в этом направлении: проанализируйте, сколько в точности раз отрабатывает ПриПолученииДанных, для каких строк и на основе этого продумайте алгоритм.
Если время позволит, позже постараюсь пример подготовить и выложить.
Добавлено: 08 окт 2013, 10:14


нашел ту тему про ПриПолученииДанных, там есть обработка для демонстрации, в общем, почитайте

Теги:

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

Рейтинг@Mail.ru

Поиск