В процедуре ПередЗаписью объявил переменную "СуммаИтого", потом в строках регистра взаморасчета указал "Движения.Сумма = СуммаИтого;"
Все рвно выходит ошибка "Переменная не определена (СуммаИтого)" Почему?

```1c
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    СуммаИтого=Товары.Итог("Сумма");
    КонецПроцедуры
    Процедура ОбработкаПроведения(Отказ, Режим)
    //Регистр Взаиморасчеты
    Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.Взаиморосчеты.Записать=Истина;
    Движения.Взаиморосчеты.ДобавитьПриход();
    Движения.Контагент= Контрагент;
    Движения.Сумма = СуммаИтого;

    Движения.Период=Дата;

    ТЗ=Товары.Выгрузить();
    ТЗ.Свернуть("Номенклатура","Количество");
    Для Каждого ТекСтрокаТовары Из ТЗ Цикл
    Движение = Движения.ОстаткиТоваров.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
    Движение.Склад=Склад;
    Движение.Количество = ТекСтрокаТовары.Количество;
    КонецЦикла;

    //Проверка отрицательных остатков
    Движения.Записать();
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
    | ОстаткиТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Склад = &Склад) КАК ОстаткиТоваровОстатки
    |ГДЕ
    | ОстаткиТоваровОстатки.КоличествоОстаток < 0";
    Граница=Новый Граница(Моментвремени(),ВидГраницы.Включая);
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    Отказ=Истина;
    КонецЕсли;
    КонецПроцедуры
```
---
Переменные не наследуются между служебными процедурами модуля объекта. Либо вычисляйте сумму в обработке проведения, либо создайте реквизит документа, который будет заполняться перед записью.
---
есть такое понятие - "область видимости". Разные процедуры это разные области видимости и переменные друг у друга не видят.
---
СуммаИтого это локальная переменная процедуры перед записью и в обработке проведения не видна 9если это не реквизит документа). Лучше использовать ДополнительныеСвойства.
---
Что мешает в обработке сразу написать
```1c
    Движения.Сумма = Товары.Итог("Сумма");
```
 ?
---
это из курса чистова, он говорит что лучше расчитать сумму до записи документа
---
Если её надо сохранять - то конечно правильнее ДО записи. А если вы её нигде не сохраняете и используете всего ОДИН раз за всю итерацию записи/проведения - то нет никакой разницы.
Как вариант можно использовать ДополнительныеСвойства объекта для сохранения промежуточных данных.
---
Переменные не наследуются между служебными процедурами модуля объекта. Либо вычисляйте сумму в обработке проведения, либо создайте реквизит документа, который будет заполняться перед записью.
---
Так переменная не видна. Переменную СуммаИтого необходимо определить в Процедуре ОбработкаПроведения().
---
http://1clenta.ru/pattern/229

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    СуммаИтого=Товары.Итог("Сумма");
КонецПроцедуры

Процедура ОбработкаПроведения
---
Перем СуммаИтого;
Перем СуммаИтого Экспорт;

Процедура ОбработкаПроведения

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