Здравствуйте, у меня есть документ. В модуле объекта (прочее-модуль объекта) есть процедура, в которой я считаю цену/стоимость заказов..
Нужно создать в модуле формы документа событие ПриИзменении для реквизита цена/стоимость, взяв туда из модуля объекта одну переменную которая считает это, но если ее взять просто так то в модуле формы документа напишет, что переменная не определена
Так как (в модуле формы документа) обратиться ко всей процедуре или хотя бы к этой переменной, которая это считает(которая находится в модуле объекта)?
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.
&НаСервере
Функция ПолучитьСтоимость(Номенклатура)
Стоимость = 0;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.Текст =
"ВЫБРАТЬ
| СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
| ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
|ИЗ
| РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
| ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
Стоимость = Выборка.Сумма / Выборка.Кво;
КонецЕсли;
Возврат Стоимость;
КонецФункции
&НаКлиенте
Процедура ПереченьНоменклатурыСебестоимостьПриИзменении(Элемент)
ТекущиеДанные = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
ТекущиеДанные.Стоимость = ТекущиеДанные.Количество * ПолучитьСтоимость(ТекущиеДанные.Номенклатура);
КонецПроцедуры
1. Если хотите, чтоб возвращался какой-то результат, то необходимо использовать не процедуру, а функцию.
2. Эту функцию нужно сделать экспортной, т.е. добавить ключевое слово "экспорт", чтоб можно было к ней обращаться из других модулей.
Начинающий?
Формы обычные или управляемые?
Покажи блок расчета в модуле объекта, который ты хочешь "натянуть" на форму. Всю процедуру.
ЗЫ. Привет Алтайскому краю :)
ну я не знаю что сюда надо написать, поэтому и прошу помощи
Чтобы здесь автоматически бралось значение из регистра (того что выше, где считает себестоимость)
(4) Ты очень странного хочешь. В проведении у тебя рассчитывается себестоимость (фактически - средняя закупочная стоимость) . Там это нормально - чтобы списать ее при проведении. А в форме тебе это зачем?
И, кстати, себестоимость ты не совсем правильно списываешь. Может возникнуть разница на погрешностях округления и на остатках "зависнут" копейки. Хотя нет. Вроде в твоем случае нормально будет.
Кроме того, у тебя не используются блокировки и поэтому при одновременном проведении с разных компьютеров возможен неправильный расчет стоимости.
Но это так - к слову.
(7) то есть если сделаю Блокировку данных, которые читаются и изменяются при проведении, всё будет норм рассчитываться?
Просто нужно еще и в форме
Скину то что выше лучше сюда
Вот тут считаю стоимость
Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
СтоимостьТовара = 0;
Иначе
СтоимостьТовара =
ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
КонецЕсли;
(8) Вот я и задаю вопрос - зачем нужно рассчитывать себестоимость в форме? Просто показать? Или ты собираешься сохранять рассчитанную себестоимость в документе? Тогда у тебя может получится так, что данные себестоимости из документа и по регистрам будут отличаться.
Не получится красиво использовать готовый расчет из модуля проведения. Там он адаптирован именно для проведения и не имеет смысла переписывать этот код, чтобы сделать его переиспользуемым. Проще написать отдельную функцию в модуле формы, которая будет получать себестоимость по указанной позиции.
Но я так и не понял, зачем тебе показывать себестоимость в форме. Кто на нее будет смотреть и зачем? Рентабельность смотрят в отчетах по регистру продаж.
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.
&НаСервере
Функция ПолучитьСтоимость(Номенклатура)
Стоимость = 0;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.Текст =
"ВЫБРАТЬ
| СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
| ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
|ИЗ
| РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
| ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
Стоимость = Выборка.Сумма / Выборка.Кво;
КонецЕсли;
Возврат Стоимость;
КонецФункции
&НаКлиенте
Процедура ПереченьНоменклатурыСебестоимостьПриИзменении(Элемент)
ТекущиеДанные = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
ТекущиеДанные.Стоимость = ТекущиеДанные.Количество * ПолучитьСтоимость(ТекущиеДанные.Номенклатура);
КонецПроцедуры
(17) Переиспользуемый код в общий модуль помещать норм, передавая контекст, дабы минимизировать
накладные расходы на создание прикладного объекта из структур данных формы
(коменты к https://infostart.ru/1c/articles/374322/ )
Во внешних обработках частое РеквизитФормыВЗначение("Объект") для вызова модуля объекта режет глаз, может есть более красивое решение для вызова переиспользуемого меж разными формами кода ?