Добрый день!пишу внешнею обработку для УНФ,проверка цены номенклатуры документов по договору,после изменения номенклатуры Сумма документа не меняется,подскажите как написать чтоб изменилась сумма документов примерно я думаю что необходимо вызвать процедуру самого документа формы только незнаю как это сделать
---
СуммаДокумента = Объект.Запасы.Итог("Сумма")
---
или скачайте anydesk я помогу
---
Решено
---
спасибо большое за помощь
---
необходимо вызвать процедуру самого документа формы
Необходимо посмотреть туда и написать что-то похожее. Наверняка там какие-нибудь общие методы используются.
---
обычно сумма документа - это отдельный реквизит, который является Итогом ТЧ.Колонка
не понимаю зачем массировать полные функции пересчета строк, при смене номенклатуры. Если у нас со строками уже все в порядке, и проблема только в сумме документа.
Что мешает сумму документа актуализировать ?
Одна строка кода
Объект.СуммаДокумента = Объект.Запасы.Итог("Всего");

не ?
---
в типовых конфигурация реквизит СуммаДокумента пересчитывается в обработчике ПередЗаписью
пример из авансового отчета БП 3.0:

```1c
    // Посчитать суммы документа и записать ее в соответствующий реквизит шапки для показа в журналах
    СуммаДокумента = УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Товары")
    + ОплатаПоставщикам.Итог("Сумма")
    + УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Прочее");
```

поэтому при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произойдет при записи.
---
при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произо
ну это далеко не везде,
к тому же БП это, достаточно флагманская конфа, по сравнению с УНФ.
в моей УНФ такого нет. (последние релизы не смотрел).
---
ну в таком случае необходимо самому собрать сумму документа.

будет это выглядеть примерно так:

```1c
    Функция ИзДокРН()Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | МАКСИМУМ(РасходнаяНакладнаяЗапасы.Цена) КАК Цена,
    | РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура
    |ИЗ
    | Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
    |ГДЕ
    | РасходнаяНакладная.Дата >= &ДатаНачало
    | И РасходнаяНакладная.Дата <= &ДатаКонец
    | И РасходнаяНакладная.Договор = &Договор
    | И РасходнаяНакладная.Организация = &Организация
    |
    |СГРУППИРОВАТЬ ПО
    | РасходнаяНакладнаяЗапасы.Номенклатура.Номенклатура";
    Запрос.УстановитьПараметр("ДатаКонец", Период.ДатаОкончания);
    Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
    Запрос.УстановитьПараметр("Договор",Договор);
    Запрос.УстановитьПараметр("Организация",Организация);
    ТЗ = Запрос.Выполнить().Выгрузить();
    Запрос2= новый Запрос();
    Запрос2.Текст=
    "ВЫБРАТЬ
    | РасходнаяНакладная.Ссылка КАК Ссылка
    |ИЗ
    | Документ.РасходнаяНакладная КАК РасходнаяНакладная
    |ГДЕ
    | РасходнаяНакладная.Дата >= &ДатаНачало
    | И РасходнаяНакладная.Дата <= &ДатаКонец
    | И РасходнаяНакладная.Договор = &Договор
    | И РасходнаяНакладная.Организация = &Организация";
    Запрос2.УстановитьПараметр("ДатаКонец",Период.ДатаОкончания);
    Запрос2.УстановитьПараметр("ДатаНачало",Период.ДатаНачала);
    Запрос2.УстановитьПараметр("Договор",Договор);
    Запрос2.УстановитьПараметр("Организация",Организация);
    Выборка= Запрос2.Выполнить().Выгрузить();
    Для Каждого СтрокаДок Из Выборка Цикл
    Док = СтрокаДок.Ссылка.ПолучитьОбъект();
    Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    ПараметрыРасчета = Новый Структура("СуммаВключаетНДС", Док.СуммаВключаетНДС);
    Для каждого ном Из ТЗ Цикл
    МассивСтрок = Док.Запасы.НайтиСтроки(Новый Структура("Номенклатура",ном.Номенклатура));
    Для Каждого Запас Из МассивСтрок Цикл
    Запас.Цена = ном.Цена;
    УправлениеНебольшойФирмойКлиент.РассчитатьСуммыВСтрокеТЧ(Запас, ПараметрыРасчета);
    КонецЦикла;
    КонецЦикла;
    Док.СуммаДокумента = Док.Запасы.Итог("Сумма") + Док.СтоимостьДоставки + ?(Док.СуммаВключаетНДС, 0 , Док.Запасы.Итог("СуммаНДС") + Док.СуммаНДСДоставки);
    Док.Записать(РежимЗаписиДокумента.Запись);
    КонецЦикла;
    КонецФункции
```

Под рукой УНФки нет, набросал в блокноте. Обычно Всего - реквизит формы, а не ТЧ документа. поэтому собираем результат из суммы и суммындс.
---
Вам в (16) уже сказали как делать
---
При изменений цены сумма самого документа тоже не пересчитывается
---
Вы форму обновляете после записи? У вас событи изменения объект.РЭКВЫЗИТТЧ.Итог(Итоговый) ПослеЗаписи? или в обработке проведения?
я к тому что меняете на форме документа элемент формы какое событие вызывается?
---
извините я только начинаю программировать в 1с,как понять обновить форму после записи?и для чего это нужно?
---
ну чтоб форма обновилась и показала измененные элементы
у меня такой конфы нету, а в БП немного другая тема, но суть та же события при изменении элемента тч мц04
Объект.МЦ04.Итог(Количество) например это путь к данным (и на счёт убрать объект не слушай) - данные же будут изменены
---
а можно вопрос а когда копируешь функций в модуль объекта копировать с &НаКлиенте или без ?
---
в модуль объекта копировать с &НаКлиенте или без ?
)) без
---
смотрите дописал код на изменение суммы документа,опять же он как бы изменился а вот все поля с этой суммой не меняются
---
и как это сделать?
---
я к тому что меняете на форме документа элемент формы какое событие вызывается?скриншоты в ответе(18) посмотрите пожалуйста
---
СуммаДокумента = Объект.Запасы.Итог("Сумма")
---
а где указывается цена?
---
если возможна фото скин
---
```1c
    Функция ИзДокРН()Экспорт

    ТЗ = новый ТабличныйДокумент;
    ТЗ.Очистить();
    ТЗНом= новый ТабличныйДокумент;
    ТЗНом.Очистить();
    МенеджерВТ = Новый МенеджерВременныхТаблиц;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РасходнаяНакладнаяЗапасы.Ссылка.Договор КАК Договор,
    | РасходнаяНакладнаяЗапасы.Ссылка.Организация КАК Организация,
    | РасходнаяНакладнаяЗапасы.Цена КАК Цена,
    | РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура
    |ИЗ
    | Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
    |ГДЕ
    | РасходнаяНакладнаяЗапасы.Ссылка.Дата >= &ДатаНачала
    | И РасходнаяНакладнаяЗапасы.Ссылка.Дата <= &ДатаКонец";

    Запрос.УстановитьПараметр("ДатаКонец", Период.ДатаОкончания);
    Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
    Запрос.УстановитьПараметр("Договор",Договор);
    Запрос.УстановитьПараметр("Организация",Организация);

    РезультатЗапроса = Запрос.Выполнить();

    ТЗ = РезультатЗапроса.выгрузить();
    ТЗНом = РезультатЗапроса.Выгрузить();
    ТЗНом.Свернуть("Номенклатура");

    ПеремНоменклатура=";
    махЦена=0;

    Для каждого Строка из ТЗНом Цикл
    ПеремНоменклатура = Строка.Номенклатура;
    махЦена=0;
    Для каждого Строка1 из ТЗ Цикл
    Если Строка1.Номенклатура=ПеремНоменклатура Тогда

    Если махЦена < Строка1.Цена тогда махЦена=Строка1.Цена ;
    Сообщить("+ Строка1.Номенклатура+" Цена: "+Строка1.Цена)

    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Для каждого Строка2 из ТЗ Цикл
    Если Строка2.Номенклатура = ПеремНоменклатура
    тогда
    Строка2.Цена = махЦена ;
    Сообщить("+ Строка2.Номенклатура+" Максимальная цена: "+ махЦена)

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    //ТЗ.свернуть("Номенклатура","Цена") ;

    Запрос2= новый Запрос();
    Запрос2.Текст=
    "ВЫБРАТЬ
    | РасходнаяНакладная.Ссылка КАК Ссылка
    |ИЗ
    | Документ.РасходнаяНакладная КАК РасходнаяНакладная
    |ГДЕ
    | РасходнаяНакладная.Дата >= &ДатаНачало
    | И РасходнаяНакладная.Дата <= &ДатаКонец
    | И РасходнаяНакладная.Договор = &Договор
    | И РасходнаяНакладная.Организация = &Организация";

    Запрос2.УстановитьПараметр("ДатаКонец",Период.ДатаОкончания);
    Запрос2.УстановитьПараметр("ДатаНачало",Период.ДатаНачала);
    Запрос2.УстановитьПараметр("Договор",Договор);
    Запрос2.УстановитьПараметр("Организация",Организация);

    РезультатЗапроса = Запрос2.Выполнить();

    Выборка= РезультатЗапроса.Выгрузить();

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

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

    Док.Записать(РежимЗаписиДокумента.Запись);

    ТексСообщения = "+Запас.Номенклатура + " " + Док.Номер ;
    Сообщить(ТексСообщения);

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;

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