В реальной работе прикладного решения часто возникает необходимость автоматизировать некоторые подсчеты согласно собственному алгоритму. Например, сделать так, чтобы сумма в строке табличной части документа автоматически вычислялась при изменении цены или количества в строке.
Это небольшое вычисление производится в модуле формы в процедуре, выполняющейся на клиенте. Такой процедурой являются обработчики события ПриИзменении полей Цена и Количество табличной части документа.
Итак, сначала нужно создать форму документа, чтобы в ней описать собственный алгоритм вычислений. Затем, открыв палитру свойств полей Цена и Количество табличной части документа, создать для них обработчики события ПриИзменении и внести в них следующий код:
При выполнении этого кода в переменную СтрокаТабличнойЧасти помещается объект, содержащий данные текущей строки документа, которую требуется пересчитать. Получив этот объект, можно обратиться к данным конкретной колонки табличной части, указав имя колонки в качестве свойства объекта. Таким образом, во второй строке процедуры обработчика вычисляется значение колонки Сумма как произведение значений колонок Количество и Цена.
Если процедура расчета суммы может понадобиться сразу для нескольких документов, то полезно разместить эту процедуру в общем модуле, и обращаться к ней из форм документов. Например, в общем модуле РаботаСДокументами поместить процедуру РассчитатьСумму():
В модуле формы документа вызывать ее из обработчиков события ПриИзменении:
Продолжаем изучать 1С сегодня напишем пару процедур, с помощью которых автоматически будет рассчитываться сумма в строке табличной части. И так это буде продолжение предыдущей статьи, в которой мы свами создавали новый документ. Если кто не читал советую для начал ознакомиться с ней.
Мы создали документ Приход товара. В котором есть дата прихода и Поставщик. В табличной части добавили четыре поля это Наименование, Количество, Цена и Сумма. Все вроде бы нормально но вот по логике нужно сделать так чтобы поле Сумма подсчитывалось автоматически. Этим вопросом сейчас и займемся.
Рассчитываем сумму в строке 1C 8
И так открываем конфигуратор заходим в созданный ранее документ и переходим на вкладку Формы. В ней нужно открыть и отредактировать Форма Документа кликаем на ней два раза или выбираем Карандашик.
Теперь необходимо перейти в Модуль.
В окне модуля пишем небольшой код
Теперь немного поясню код который нужно написать.
&НаКлиенте — Это значить что вычисление будет происходить на компьютере пользователя, а не на сервере.
Процедура — Это собственно процедура)
МатериалыКоличествоПриИзменении — Это название нашей процедуры.
Строка — Это переменная
Элементы.Материалы.ТекущиеДанные — Этой строкой мы получаем данные строки.
Строка.Сумма=Строка.Количество*Строка.Цена — Это формула (Строка.Сумма, Строка.Количество, Строка.Цена этими строчками мы обращаемся к значениям которые находятся в таблице)
КонецПроцедуры — Это как вы уже догадались конец процедуры.
После чего запускаем отладку и проверяем. Для этого в документе вводим значения в поля Количество и Цена после чего сумма должна подставиться автоматически.
Вот вы и узнали, как рассчитать сумму в строке табличной части.
Скриншоты, опубликованные в данной статье, являются цитатами и иллюстрациями программного продукта «1C:Предприятие», авторское право на который принадлежит ЗАО 1С.
user1c |
---|
Прочитано: 59966 |
При расчете суммы по колонке "Сумма" в таблице формы использую следующий код (1С 8.2):
Все работает хорошо, но при добавлении копированием выбранной строки (F9) в первый случай копирования значение Объект.СуммаПоДокументу не обновляется. В дальнейшем расчет идет без данных этой строки. Последующее использование F9 (несколько раз) для любой строки вызывает пересчет за исключением бедной строки. При добавлении строки стандартным способом (ins) и вводе значений — расчет получается правильный. Если добавить копированием (F9) – опять появляется неучтенная в итогах сумма для новой строки.
Рассмотрел значения полей по шагам. В процедуру
Код 1C v 8.2 УП
Передается элемент с типом ТаблицаФормы с новой строкой с нулевыми значениями, установлено значение только в поле НомерСтроки:
Элемент.ТекущиеДанные.НомерСтроки
Вопрос знатокам: это глюк системы или можно обойтись другими программными средствами? Например отслеживать F9 и вызывать функцию РсчетСуммыПоДокументу()
Спасибо.
Yandex |
---|
Возможно, вас также заинтересует |
bugor666 |
---|
Ответ № 1 |
E_Migachev |
---|
Ответ № 2 |
snfr1c |
---|
Ответ № 3 |
user1c |
---|
Ответ № 4 |
Как правильно рассчитать сумму по документу из табличной части, ведь пользователь может использовать добавление строки копированием?
user1c |
---|
Ответ № 5 |
Что такое процедура ПриВыводеСтроки?
Напомню:
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 |
---|
Ответ № 6 |
snfr1c |
---|
Ответ № 7 |
СписокНоменклатурыЦенаПриИзменении(Элемент)
snfr1c |
---|
Ответ № 8 |
Код 1C v 8.х
user1c |
---|
Ответ № 9 |
Спасибо, не получается. 1С 8.2. У Вас пример для 8.1. Не смог сделать.
Разбирал глюки системы:
В табличном поле установим флаг «Подвал».
В 1С 8.0 в табличном поле для колонки можно было установить флаг «Показывать итог в подвале». В 1С 8.2 такого нет. Приходится указывать для реквизита «СписокНоменклатурыСумма» путь к данным подвала «Объект.СписокНоменклатуры.ИтогСумма». Для наглядности в окне редактирования формы в правом верхнем углу (в окне реквизитов формы) раскроем основной реквизит формы «Объект», потом раскроем «СписокНоменклатуры». Мышкой «схватим» элемент «ИтогСумма» и перетащим в окно элементов формы (левая верхняя часть окна редактирования формы). Получим поле надписи «СписокНоменклатурыИтогСумма», а на форме надпись «Сумма (итог):». При этом, остается пустым свойство «Заголовок» поля надписи «СписокНоменклатурыИтогСумма».
Для устойчивости добавим процедуру:
В результате на форме отображаются два поля надписи:
«Сумма по документу»,
«Сумма (итог):».
При изменении данных в таблице происходит пересчет суммы, отображаются одинаковые данные. Но если добавить новый элемент копированием текущего (кнопкой или F9), то в подвале таблицы и в поле «Сумма (итог):» отображаются правильные данные, а в поле «Сумма по документу» — нет.
Не получается получить значение (текст) из Элементы.СписокНоменклатурыИтогСумма.
ПОМОГИТЕ правильно рассчитать сумму документа!
Спасибо.
user1c |
---|
Ответ № 10 |
Скачивать файлы может только зарегистрированный пользователь!
user1c |
---|
Ответ № 11 |
Да, в 1С 8.2 пока есть глюк с расчетом при копировании текущего элемента (кнопкой или F9). С этим надо смириться и учитывать при работе.
Решение проблемы:
На форме не показывать поле из объекта, рассчитываемое суммированием записей таблицы, например для документа «ПриходнаяНакладная» реквизит «СуммаПоДокументу», а показывать поле надписи «СписокНоменклатурыИтогСумма» (выше подробно описал, как его отобразить).
Отслеживаем событие для формы «ПередЗаписью»:
Код 1C v 8.2 УП
Для дальнейших расчетов в документе «ПриходнаяНакладная» реквизит «СуммаПоДокументу» будет показывать правильное значение.