helpf.pro
Регистрация

Табличное поле. Как рассчитать сумму по колонке в таблице формы при F9 ?

user1c
19.01.2011 02:58Прочитано: 35795
В форме таблица СписокНоменклатуры с полями: Номенклатура, Количество, Цена, Сумма. Поле надписи СуммаПоДокументу, данные: Объект.СуммаПоДокументу
При расчете суммы по колонке "Сумма" в таблице формы использую следующий код (1С 8.2):

Код 1C v 8.2 УП
 &НаКлиенте
Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент)
Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
Стр.Сумма = Стр.Количество * Стр.Цена;
КонецПроцедуры

&НаКлиенте
Процедура СписокНоменклатурыЦенаПриИзменении(Элемент)
// Для наглядности повторюсь
Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
Стр.Сумма = Стр.Количество * Стр.Цена;
КонецПроцедуры

&НаКлиенте
Процедура СписокНоменклатурыПриИзменении(Элемент)
РасчетСуммыПоДокументу();
КонецПроцедуры

&НаКлиенте
Процедура РасчетСуммыПоДокументу()
Объект.СуммаПоДокументу=Объект.СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры


Все работает хорошо, но при добавлении копированием выбранной строки (F9) в первый случай копирования значение Объект.СуммаПоДокументу не обновляется. В дальнейшем расчет идет без данных этой строки. Последующее использование F9 (несколько раз) для любой строки вызывает пересчет за исключением бедной строки. При добавлении строки стандартным способом (ins) и вводе значений - расчет получается правильный. Если добавить копированием (F9) – опять появляется неучтенная в итогах сумма для новой строки.
Рассмотрел значения полей по шагам. В процедуру
Код 1C v 8.2 УП
 Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент)   

Передается элемент с типом ТаблицаФормы с новой строкой с нулевыми значениями, установлено значение только в поле НомерСтроки:
Элемент.ТекущиеДанные.НомерСтроки

Вопрос знатокам: это глюк системы или можно обойтись другими программными средствами? Например отслеживать F9 и вызывать функцию РсчетСуммыПоДокументу()

Спасибо.
Yandex
Возможно, вас также заинтересует
Реклама на портале
bugor666
19.01.2011 08:40Ответ № 1
(0) user1c, конечно проще отследить F9... А при добавлении строки не копированием все работает?
E_Migachev
19.01.2011 09:41Ответ № 2
(0) а если копировать через кнопочку - считает?
snfr1c
19.01.2011 10:45Ответ № 3
(1) мне кажется необходимо добавить расчет итоговой суммы в процедуру ПриВыводеСтроки
user1c
19.01.2011 11:12Ответ № 4
Повторюсь - проблема только при первом случае использования в таблице формы добавления строки копированием (при нажатии кнопки или F9 - одинаковый эффект). При последующем добавлении строки копированием считает все, кроме данных той строки, которая получилась при первом копировании. Если добавить строки обычным интерактивным способом (кнопка добавить или Ins) - считает правильно. Потом при добавлении строки копированием вся история с данными вновь полученной строки (только при первом добавлении) повторяется. Скорее всего - это глюк системы.
Как правильно рассчитать сумму по документу из табличной части, ведь пользователь может использовать добавление строки копированием?
user1c
19.01.2011 11:25Ответ № 5
Для snfr1c:
Что такое процедура ПриВыводеСтроки?
Напомню:
1С 8.2. ТаблицаФормы. Отслеживаю изменения в:
Код 1C v 8.2 УП
 Процедура СписокНоменклатурыПриИзменении(Элемент)   

Для ТаблицаФормы события:

Выбор (S_election)
ВыборЗначения (ValueChoice)
НачалоПеретаскивания (DragStart)
ОбработкаВыбора (ChoiceProcessing)
ОбработкаЗаписиНового (NewWriteProcessing)
ОкончаниеПеретаскивания (DragEnd)
ПередНачаломДобавления (BeforeAddRow)
ПередНачаломИзменения (BeforeRowChange)
ПередОкончаниемРедактирования (BeforeEditEnd)
ПередРазворачиванием (BeforeExpand)
ПередСворачиванием (BeforeCollapse)
ПередУдалением (BeforeDeleteRow)
Перетаскивание (Drag)
ПослеУдаления (AfterDeleteRow)
ПриАктивизацииПоля (OnActivateField)
ПриАктивизацииСтроки (OnActivateRow)
ПриАктивизацииЯчейки (OnActivateCell)
ПриИзменении (OnChange)
ПриНачалеРедактирования (OnStartEdit)
ПриОкончанииРедактирования (OnEditEnd)
ПриСменеТекущегоРодителя (OnCurrentParentChange)
ПроверкаПеретаскивания (DragCheck)

Синтаксис-помошник вам в помощь!
Если у Вас своя процедура - поделитесь, пожалуйста.
Спасибо.
snfr1c
19.01.2011 13:24Ответ № 6
прошу прощения опечатался процедура "ПриВыводеСтроки" находится в поле ТабличноеПоле в разделе "события". она как раз этим и занимается - пересчетом и перерисовкой значений итоговых сумм в таблице
snfr1c
19.01.2011 13:26Ответ № 7
также можно добавить РасчетСуммыПоДокументу() в процедуры СписокНоменклатурыКоличествоПриИзменении(Элемент)
СписокНоменклатурыЦенаПриИзменении(Элемент)
snfr1c
19.01.2011 13:44Ответ № 8
вот пример:
Код 1C v 8.х
 
Процедура ТабличнаяЧастьДокументаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
//установка итоговой суммы документа
СуммаПоДокументу = ДанныеСтроки.Сумма;
//у меня есть поле "Всего" на форме документа ОформлениеСтроки.Ячейки.Всего.УстановитьТекст(ОбщегоНазначения.ФорматСумм(ДанныеСтроки.Сумма + ?(СуммаВключаетНДС, 0, ДанныеСтроки.СуммаНДС)));

КонецПроцедуры
user1c
19.01.2011 14:42Ответ № 9
Для snfr1c:
Спасибо, не получается. 1С 8.2. У Вас пример для 8.1. Не смог сделать.

Разбирал глюки системы:
В табличном поле установим флаг «Подвал».
В 1С 8.0 в табличном поле для колонки можно было установить флаг «Показывать итог в подвале». В 1С 8.2 такого нет. Приходится указывать для реквизита «СписокНоменклатурыСумма» путь к данным подвала «Объект.СписокНоменклатуры.ИтогСумма». Для наглядности в окне редактирования формы в правом верхнем углу (в окне реквизитов формы) раскроем основной реквизит формы «Объект», потом раскроем «СписокНоменклатуры». Мышкой «схватим» элемент «ИтогСумма» и перетащим в окно элементов формы (левая верхняя часть окна редактирования формы). Получим поле надписи «СписокНоменклатурыИтогСумма», а на форме надпись «Сумма (итог):». При этом, остается пустым свойство «Заголовок» поля надписи «СписокНоменклатурыИтогСумма».

Для устойчивости добавим процедуру:

Код 1C v 8.2 УП
 &НаКлиенте
Процедура СписокНоменклатурыИтогСуммаПриИзменении(Элемент)
Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры


В результате на форме отображаются два поля надписи:
«Сумма по документу»,
«Сумма (итог):».
При изменении данных в таблице происходит пересчет суммы, отображаются одинаковые данные. Но если добавить новый элемент копированием текущего (кнопкой или F9), то в подвале таблицы и в поле «Сумма (итог):» отображаются правильные данные, а в поле «Сумма по документу» - нет.
Не получается получить значение (текст) из Элементы.СписокНоменклатурыИтогСумма.

ПОМОГИТЕ правильно рассчитать сумму документа!
Спасибо.
user1c
19.01.2011 14:54Ответ № 10
Напомню: управляемая форма 1С 8.2, внешний вид:
Скачивать файлы может только зарегистрированный пользователь!
user1c
19.01.2011 15:38Ответ № 11
В результате долгих мучений сам нашел правильное решение.
Да, в 1С 8.2 пока есть глюк с расчетом при копировании текущего элемента (кнопкой или F9). С этим надо смириться и учитывать при работе.
Решение проблемы:
На форме не показывать поле из объекта, рассчитываемое суммированием записей таблицы, например для документа «ПриходнаяНакладная» реквизит «СуммаПоДокументу», а показывать поле надписи «СписокНоменклатурыИтогСумма» (выше подробно описал, как его отобразить).
Отслеживаем событие для формы «ПередЗаписью»:
Код 1C v 8.2 УП
 &НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры

//Убираем процедуры, указанные ранее:
//СписокНоменклатурыПриИзменении
// РасчетСуммыПоДокументу

//Оставляем процедуры:
&НаКлиенте
Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент)
Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
Стр.Сумма = Стр.Количество * Стр.Цена;
КонецПроцедуры

&НаКлиенте
Процедура СписокНоменклатурыЦенаПриИзменении(Элемент)
// Для наглядности повторюсь
Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
Стр.Сумма = Стр.Количество * Стр.Цена;
КонецПроцедуры


Для дальнейших расчетов в документе «ПриходнаяНакладная» реквизит «СуммаПоДокументу» будет показывать правильное значение.

Может, это решение и методически не совершенно, зато исключает описанный выше глюк с расчетом итогов при F9.
Mokey
19.01.2011 15:53Ответ № 12
Фи... а я-то думал, что всё-таки надо в реальном времени видеть изменение сумма документа (без записи в базу).
user1c
19.01.2011 19:11Ответ № 13
Для Mokey:
Да, при изменении данных в строках идет пересчет и сумма автоматически, в реальном времени, отображается в подвале и на форме через поле надписи «СписокНоменклатурыИтогСумма».
Проблема была в обновлении данных.
Если поле описанного добавления (F9) нажать кнопку с кодом:
Код 1C v 8.2 УП
 &НаКлиенте
Процедура Пересчет(Команда)
Объект.СуммаПоДокументу = Объект.СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры

и вывести на форму поле СуммаПоДокументу, то все будет считаться правильно.

Процедура СписокНоменклатурыПриИзменении(Элемент)
не "до конца" отслеживает изменения, т.е. вызывается 2 раза, но рассчитывает только при добавлении новой записи с пустыми значениями. А после этого значения копируются на уровне платформы, а эта процедура уже "не успевает" их отследить. Надо после такого добавления (и реального обновления) вызывать расчет.
В 1С 8.2. я не нашел такого механизма, что-то типа после обновления данных. Поэтому предложил свой вариант - работающий.
user1c
20.01.2011 18:05Ответ № 14
Всем спасибо. Вопрос закрыт.
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.