Здравствуйте, у меня есть документ. В модуле объекта (прочее-модуль объекта) есть процедура, в которой я считаю цену/стоимость заказов..
Нужно создать в модуле формы документа событие ПриИзменении для реквизита цена/стоимость, взяв туда из модуля объекта одну переменную которая считает это, но если ее взять просто так то в модуле формы документа напишет, что переменная не определена
Так как (в модуле формы документа) обратиться ко всей процедуре или хотя бы к этой переменной, которая это считает(которая находится в модуле объекта)?
---
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.

```1c
    &НаСервере
    Функция ПолучитьСтоимость(Номенклатура)

    Стоимость = 0;

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.Текст =
    "ВЫБРАТЬ
    | СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
    | ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
    |ИЗ
    | РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
    | ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
    Стоимость = Выборка.Сумма / Выборка.Кво;
    КонецЕсли;

    Возврат Стоимость;

    КонецФункции

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

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

    КонецПроцедуры
```
---
1. Если хотите, чтоб возвращался какой-то результат, то необходимо использовать не процедуру, а функцию.
2. Эту функцию нужно сделать экспортной, т.е. добавить ключевое слово "экспорт", чтоб можно было к ней обращаться из других модулей.
---
Начинающий?
Формы обычные или управляемые?
Покажи блок расчета в модуле объекта, который ты хочешь "натянуть" на форму. Всю процедуру.
ЗЫ. Привет Алтайскому краю :)
---
ниже скину
---
Запрос тоже показывай.
---
```1c
    &НаКлиенте
    Процедура ПереченьНоменклатурыСебестоимостьПриИзменении(Элемент)

    КонецПроцедуры
```

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

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

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

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

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

Дальше идут движения по регистрам...
---
Вот я и задаю вопрос - зачем нужно рассчитывать себестоимость в форме? Просто показать? Или ты собираешься сохранять рассчитанную себестоимость в документе? Тогда у тебя может получится так, что данные себестоимости из документа и по регистрам будут отличаться.
---
Просто показать, да
---
Не получится красиво использовать готовый расчет из модуля проведения. Там он адаптирован именно для проведения и не имеет смысла переписывать этот код, чтобы сделать его переиспользуемым. Проще написать отдельную функцию в модуле формы, которая будет получать себестоимость по указанной позиции.
Но я так и не понял, зачем тебе показывать себестоимость в форме. Кто на нее будет смотреть и зачем? Рентабельность смотрят в отчетах по регистру продаж.
---
по заданию
---
Похоже, преподаватель подозревает что проведение делал не ты и хочет вывести тебя на чистую воду :) И похоже, что он не ошибается :)
---
так по радченко же)
---
А как функция будет получать значение по отдельной позиции?
---
Приз за честность.
Важный момент - стоимость возвращается на текущий момент, а не на момент документа. Соответственно, может показать ноль, если остатки уже списаны, хотя на момент проведения документа они еще были. Получение остатков на нужный момент времени - уже сам, если надо. Там уже разные ньюансы.
Ну и сразу предупрежу, что преподаватель тоже легко поймет, что это не ты писал.

```1c
    &НаСервере
    Функция ПолучитьСтоимость(Номенклатура)

    Стоимость = 0;

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.Текст =
    "ВЫБРАТЬ
    | СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
    | ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
    |ИЗ
    | РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
    | ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
    Стоимость = Выборка.Сумма / Выборка.Кво;
    КонецЕсли;

    Возврат Стоимость;

    КонецФункции

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

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

    КонецПроцедуры
```
---
```1c
    &НаСервере
    ОбъектНаФорме = РеквизитФормыВЗначение("Объект");
    ОбъектНаФорме.ПосчитатьСебестоимость()
    Объект.Себестоимость = ОбъектНаФорме.Себестоимость;
```

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

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