Переменная не определена

1. user1210511 24.04.19 14:40 Сейчас в теме
Здравствуйте, у меня есть документ. В модуле объекта (прочее-модуль объекта) есть процедура, в которой я считаю цену/стоимость заказов..
Нужно создать в модуле формы документа событие ПриИзменении для реквизита цена/стоимость, взяв туда из модуля объекта одну переменную которая считает это, но если ее взять просто так то в модуле формы документа напишет, что переменная не определена
Так как (в модуле формы документа) обратиться ко всей процедуре или хотя бы к этой переменной, которая это считает(которая находится в модуле объекта)?
По теме из базы знаний
Найденные решения
16. herfis 513 24.04.19 16:46 Сейчас в теме
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.
&НаСервере
Функция ПолучитьСтоимость(Номенклатура)
	
	Стоимость = 0;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
	|	ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
	|ИЗ 
	|	РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
	|	ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
		Стоимость = Выборка.Сумма / Выборка.Кво;
	КонецЕсли;
	
	Возврат Стоимость;	
	
КонецФункции

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

КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. koln 24.04.19 14:47 Сейчас в теме
1. Если хотите, чтоб возвращался какой-то результат, то необходимо использовать не процедуру, а функцию.
2. Эту функцию нужно сделать экспортной, т.е. добавить ключевое слово "экспорт", чтоб можно было к ней обращаться из других модулей.
3. herfis 513 24.04.19 15:32 Сейчас в теме
Начинающий?
Формы обычные или управляемые?
Покажи блок расчета в модуле объекта, который ты хочешь "натянуть" на форму. Всю процедуру.
ЗЫ. Привет Алтайскому краю :)
4. user1210511 24.04.19 15:41 Сейчас в теме
5. herfis 513 24.04.19 15:46 Сейчас в теме
(4) Запрос тоже показывай.
6. user1210511 24.04.19 15:49 Сейчас в теме
(5)

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


ну я не знаю что сюда надо написать, поэтому и прошу помощи
Чтобы здесь автоматически бралось значение из регистра (того что выше, где считает себестоимость)

Да, я начинающий
7. herfis 513 24.04.19 16:07 Сейчас в теме
(4) Ты очень странного хочешь. В проведении у тебя рассчитывается себестоимость (фактически - средняя закупочная стоимость) . Там это нормально - чтобы списать ее при проведении. А в форме тебе это зачем?
И, кстати, себестоимость ты не совсем правильно списываешь. Может возникнуть разница на погрешностях округления и на остатках "зависнут" копейки. Хотя нет. Вроде в твоем случае нормально будет.
Кроме того, у тебя не используются блокировки и поэтому при одновременном проведении с разных компьютеров возможен неправильный расчет стоимости.
Но это так - к слову.
8. user1210511 24.04.19 16:08 Сейчас в теме
(7) то есть если сделаю Блокировку данных, которые читаются и изменяются при проведении, всё будет норм рассчитываться?
Просто нужно еще и в форме

Скину то что выше лучше сюда

Вот тут считаю стоимость

		Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
			СтоимостьТовара = 0;
		Иначе
			СтоимостьТовара =
				ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
			КонецЕсли;


Дальше идут движения по регистрам...
9. herfis 513 24.04.19 16:13 Сейчас в теме
(8) Вот я и задаю вопрос - зачем нужно рассчитывать себестоимость в форме? Просто показать? Или ты собираешься сохранять рассчитанную себестоимость в документе? Тогда у тебя может получится так, что данные себестоимости из документа и по регистрам будут отличаться.
10. user1210511 24.04.19 16:15 Сейчас в теме
11. herfis 513 24.04.19 16:19 Сейчас в теме
Не получится красиво использовать готовый расчет из модуля проведения. Там он адаптирован именно для проведения и не имеет смысла переписывать этот код, чтобы сделать его переиспользуемым. Проще написать отдельную функцию в модуле формы, которая будет получать себестоимость по указанной позиции.
Но я так и не понял, зачем тебе показывать себестоимость в форме. Кто на нее будет смотреть и зачем? Рентабельность смотрят в отчетах по регистру продаж.
12. user1210511 24.04.19 16:21 Сейчас в теме
13. herfis 513 24.04.19 16:25 Сейчас в теме
(12) Похоже, преподаватель подозревает что проведение делал не ты и хочет вывести тебя на чистую воду :) И похоже, что он не ошибается :)
14. user1210511 24.04.19 16:26 Сейчас в теме
15. user1210511 24.04.19 16:27 Сейчас в теме
(11)
А как функция будет получать значение по отдельной позиции?
16. herfis 513 24.04.19 16:46 Сейчас в теме
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.
&НаСервере
Функция ПолучитьСтоимость(Номенклатура)
	
	Стоимость = 0;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
	|	ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
	|ИЗ 
	|	РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
	|	ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
		Стоимость = Выборка.Сумма / Выборка.Кво;
	КонецЕсли;
	
	Возврат Стоимость;	
	
КонецФункции

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

КонецПроцедуры
Показать
17. zarankony 311 24.04.19 16:52 Сейчас в теме
&НаСервере
ОбъектНаФорме = РеквизитФормыВЗначение("Объект");
ОбъектНаФорме.ПосчитатьСебестоимость()
Объект.Себестоимость = ОбъектНаФорме.Себестоимость;

Таким же образом можно обращаться ко всем процедурам и функциям объекта, надеюсь правильно понял что вам нужно
18. Altez 258 03.03.21 22:12 Сейчас в теме
(17) Переиспользуемый код в общий модуль помещать норм, передавая контекст, дабы минимизировать
накладные расходы на создание прикладного объекта из структур данных формы
(коменты к https://infostart.ru/1c/articles/374322/ )

Во внешних обработках частое РеквизитФормыВЗначение("Объект") для вызова модуля объекта режет глаз, может есть более красивое решение для вызова переиспользуемого меж разными формами кода ?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот