Консультация № 53854
31.08.2006, 10:41
0.00 руб.
0 7 4
Здравствуйте!
Загвоздка в следующем: нужно свернуть таблицу документа группируя только по полю "номенклатура" и суммируя по полю "сумма", но при этом необходимо чтобы в таблице было поле "цена".
Код: Таб.Свернуть("Номенклатура, Цена", "Сумма") сворачивает и по номенклатуре и по цене, цены разные, а мне нужно чтобы таблица сворачивалась ТОЛЬКО по номенклатуре, а цена бралась из последней строки с одинаковой номенклатурой. Можно ли это сделать?
Прошу прощенья за путанность объяснений, если непонятно - постараюсь объяснить в мини-форуме. Заранее спасибо всем ответившим.

Обсуждение

Неизвестный
31.08.2006, 11:07
общий
это ответ
Здравствуйте, Palkin!
Такова особенность этого метода, вам ничего не остается сделать кроме, как "вручную" находить последние цены, потом после первой свертки заменить цены в других строках, а потом применить еще одну свертку.
Неизвестный
31.08.2006, 11:19
общий
это ответ
Здравствуйте, Palkin!

Таб.Свернуть("Номенклатура", "Сумма");
Таб.НоваяКолонка("Цена","Число",12,2);

После этого заполняете колонку "Цена" теми значениями, которые Вам нужны.

Можно также вместо "НоваяКолонка" использовать метод "ВставитьКолонку" если хотите чтобы колонка "Цена" была именно перед колонкой "Сумма"
Неизвестный
31.08.2006, 11:38
общий
Ответ Шалькова Павла Владимировича абсолютно верный, другого варианта нет, а неоправданные надежды -- это штука такая...
Неизвестный
31.08.2006, 12:57
общий
это ответ
Здравствуйте, Palkin!
Сверните таблицу по сумме и количеству, зная сумму и количество узнаете среднюю цену
Таб.Свернуть("Номенклатура", "Сумма,Количество")
Таб.НоваяКолонка("Цена","Число",15,6);
Таб.ВыбратьСтроки()
Пока Таб.ПолучитьСтроку Цикл
Таб.Цена=Таб.Сумма/Таб.Количество(если колво не нулевое)
Обращаю Ваше внимание на то, что в цене нужно поставить достаточное количество знаков после запятой, как минимум 6. Ни в коем случае не 2, как ставят многие бумагомаратели. Округлить до двух знаков всегда успеете

Брать цену из последней строки - глюконеустойчивый метод, результат превзойдет все ваши кошмарные ожидания.

Но если все же нужна цена из последней строки (мало ли какая поставлена задача), то сделать это несложно. Создайте еще одну таблицу значений, и копируйте из первой таблицы во вторую данные

ТЗ=СоздатьОбъект("ТаблицаЗначений")
ТЗ.НоваяКолонка
Таб.ВыбратьСтроки
Пока Таб.ПолучитьСтроку()=1 Цикл
Стр=0;
Если ТЗ.НайтиЗначение(Таб.номенклатура,Стр,"Номенклатура")=0 Тогда
ТЗ.НоваяСтрока
ТЗ.Номенклатура=Таб.Номенклатура
Иначе
ТЗ.ПолучитьСтрокуПоНомеру(Стр)
КонецЕсли
ТЗ.Сумма=ТЗСумма+Таб.Сумма
ТЗ.Количество=ТЗ.Количество+Таб.Количество
ТЗ.Цена=Таб.Цена
КонецЦикла

В данном примере цена в ТЗ постоянно обновляется, и есть ценой последней строки данной номенклатуры
Неизвестный
31.08.2006, 13:01
общий
А вот я никак не пойму, зачем в модуле проведения знать цену. Нужно знать сумму и количество. А ориентироваться на цену - это значит получить ненулевую сумму при нулевом количестве. Или чтото еще хуже
Неизвестный
31.08.2006, 13:16
общий
Всё проще гораздо: задача стоит синхронизировать остатки на конец месяца по отчету "Ведомость по остаткам ТМЦ", который, как известно, собирает только количественные остатки, а сумму выводит умножением кол-ва на цену на дату конца отчета, и остатки по "Оборотно-сальдовой ведомости" по счету 41.1. Для этого при проведении поступления при условии изменения цен производится переоценка остатка товара на складе по новым ценам. Всё бы было совсем просто (брать цену из док-та), но почему-то некоторые позиции заносятся на одну карточку товара, но по разным ценам и это в одном документе!!! Вот и ломаю голову... В итоге решил просто брать цену на дату док-та и всё.Всем большое спасибо за участие!
Неизвестный
31.08.2006, 15:28
общий
это ответ
Здравствуйте, Palkin!

Я думаю, что цена, взятая из последней строки с одинаковой номенклатурой, будет не корректной. Произведение Цена*Количество не даст итоговую сумму.
Поэтому корректнее будет так:
Таб.Свернуть("Номенклатура", "Количество, Сумма");
Таб.НоваяКолонка("Цена");
Для i = 1 По Таб.КоличествоСтрок() Цикл //выбираем строки таблицы значений
Таб.ПолучитьСтрокуПоНомеру(i); //получаем строку по номеру
Таб.Цена = Окр(Таб.Сумма / Таб.Количество, 2); //высчитываем и записываем цену по данной строке таблицы значений
КонецЦикла;
Форма ответа