Внешняя обработка в 1С 8.3: как пересчитать сумму документа, после изменения табличных значений документа
Добрый день!пишу внешнею обработку для УНФ,проверка цены номенклатуры документов по договору,после изменения номенклатуры Сумма документа не меняется,подскажите как написать чтоб изменилась сумма документов примерно я думаю что необходимо вызвать процедуру самого документа формы только незнаю как это сделать
По теме из базы знаний
- Честное распределение суммы по таблице значений (3.1.4.1)
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Как сдать экзамен 1С:Специалист по платформе?
- Инструментарий для анализа и редактирования регистров 1С (Управляемые формы)
- Интеграции с маркетплейсами из одного окна: Озон, ВБ, Яндекс, Сбер, Али, ЛаМода для 1С:УНФ, УТ, КА, ERP
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) обычно сумма документа - это отдельный реквизит, который является Итогом ТЧ.Колонка
не понимаю зачем массировать полные функции пересчета строк, при смене номенклатуры. Если у нас со строками уже все в порядке, и проблема только в сумме документа.
Что мешает сумму документа актуализировать ?
Одна строка кода
Объект.СуммаДокумента = Объект.Запасы.Итог("Всего");
не ?
не понимаю зачем массировать полные функции пересчета строк, при смене номенклатуры. Если у нас со строками уже все в порядке, и проблема только в сумме документа.
Что мешает сумму документа актуализировать ?
Одна строка кода
Объект.СуммаДокумента = Объект.Запасы.Итог("Всего");
не ?
(16) в типовых конфигурация реквизит СуммаДокумента пересчитывается в обработчике ПередЗаписью
пример из авансового отчета БП 3.0:
поэтому при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произойдет при записи.
пример из авансового отчета БП 3.0:
// Посчитать суммы документа и записать ее в соответствующий реквизит шапки для показа в журналах
СуммаДокумента = УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Товары")
+ ОплатаПоставщикам.Итог("Сумма")
+ УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Прочее");
поэтому при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произойдет при записи.
(21)
ну это далеко не везде,
к тому же БП это, достаточно флагманская конфа, по сравнению с УНФ.
в моей УНФ такого нет. (последние релизы не смотрел).
при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произо
ну это далеко не везде,
к тому же БП это, достаточно флагманская конфа, по сравнению с УНФ.
в моей УНФ такого нет. (последние релизы не смотрел).
(22) ну в таком случае необходимо самому собрать сумму документа.
будет это выглядеть примерно так:
Под рукой УНФки нет, набросал в блокноте. Обычно Всего - реквизит формы, а не ТЧ документа. поэтому собираем результат из суммы и суммындс.
будет это выглядеть примерно так:
Функция ИзДокРН()Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(РасходнаяНакладнаяЗапасы.Цена) КАК Цена,
| РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура
|ИЗ
| Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
|ГДЕ
| РасходнаяНакладная.Дата >= &ДатаНачало
| И РасходнаяНакладная.Дата <= &ДатаКонец
| И РасходнаяНакладная.Договор = &Договор
| И РасходнаяНакладная.Организация = &Организация
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяЗапасы.Номенклатура.Номенклатура";
Запрос.УстановитьПараметр("ДатаКонец", Период.ДатаОкончания);
Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
Запрос.УстановитьПараметр("Договор",Договор);
Запрос.УстановитьПараметр("Организация",Организация);
ТЗ = Запрос.Выполнить().Выгрузить();
Запрос2= новый Запрос();
Запрос2.Текст=
"ВЫБРАТЬ
| РасходнаяНакладная.Ссылка КАК Ссылка
|ИЗ
| Документ.РасходнаяНакладная КАК РасходнаяНакладная
|ГДЕ
| РасходнаяНакладная.Дата >= &ДатаНачало
| И РасходнаяНакладная.Дата <= &ДатаКонец
| И РасходнаяНакладная.Договор = &Договор
| И РасходнаяНакладная.Организация = &Организация";
Запрос2.УстановитьПараметр("ДатаКонец",Период.ДатаОкончания);
Запрос2.УстановитьПараметр("ДатаНачало",Период.ДатаНачала);
Запрос2.УстановитьПараметр("Договор",Договор);
Запрос2.УстановитьПараметр("Организация",Организация);
Выборка= Запрос2.Выполнить().Выгрузить();
Для Каждого СтрокаДок Из Выборка Цикл
Док = СтрокаДок.Ссылка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
ПараметрыРасчета = Новый Структура("СуммаВключаетНДС", Док.СуммаВключаетНДС);
Для каждого ном Из ТЗ Цикл
МассивСтрок = Док.Запасы.НайтиСтроки(Новый Структура("Номенклатура",ном.Номенклатура));
Для Каждого Запас Из МассивСтрок Цикл
Запас.Цена = ном.Цена;
УправлениеНебольшойФирмойКлиент.РассчитатьСуммыВСтрокеТЧ(Запас, ПараметрыРасчета);
КонецЦикла;
КонецЦикла;
Док.СуммаДокумента = Док.Запасы.Итог("Сумма") + Док.СтоимостьДоставки + ?(Док.СуммаВключаетНДС, 0 , Док.Запасы.Итог("СуммаНДС") + Док.СуммаНДСДоставки);
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
КонецФункции
ПоказатьПод рукой УНФки нет, набросал в блокноте. Обычно Всего - реквизит формы, а не ТЧ документа. поэтому собираем результат из суммы и суммындс.
(27) ну чтоб форма обновилась и показала измененные элементы
у меня такой конфы нету, а в БП немного другая тема, но суть та же события при изменении элемента тч мц04
Объект.МЦ04.Итог(Количество) например это путь к данным (и на счёт убрать объект не слушай) - данные же будут изменены
у меня такой конфы нету, а в БП немного другая тема, но суть та же события при изменении элемента тч мц04
Объект.МЦ04.Итог(Количество) например это путь к данным (и на счёт убрать объект не слушай) - данные же будут изменены
(3)
Функция ИзДокРН()Экспорт
ТЗ = новый ТабличныйДокумент;
ТЗ.Очистить();
ТЗНом= новый ТабличныйДокумент;
ТЗНом.Очистить();
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяЗапасы.Ссылка.Договор КАК Договор,
| РасходнаяНакладнаяЗапасы.Ссылка.Организация КАК Организация,
| РасходнаяНакладнаяЗапасы.Цена КАК Цена,
| РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура
|ИЗ
| Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
|ГДЕ
| РасходнаяНакладнаяЗапасы.Ссылка.Дата >= &ДатаНачала
| И РасходнаяНакладнаяЗапасы.Ссылка.Дата <= &ДатаКонец";
Запрос.УстановитьПараметр("ДатаКонец", Период.ДатаОкончания);
Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
Запрос.УстановитьПараметр("Договор",Договор);
Запрос.УстановитьПараметр("Организация",Организация);
РезультатЗапроса = Запрос.Выполнить();
ТЗ = РезультатЗапроса.выгрузить();
ТЗНом = РезультатЗапроса.Выгрузить();
ТЗНом.Свернуть("Номенклатура");
ПеремНоменклатура="";
махЦена=0;
Для каждого Строка из ТЗНом Цикл
ПеремНоменклатура = Строка.Номенклатура;
махЦена=0;
Для каждого Строка1 из ТЗ Цикл
Если Строка1.Номенклатура=ПеремНоменклатура Тогда
Если махЦена < Строка1.Цена тогда махЦена=Строка1.Цена ;
Сообщить(""+ Строка1.Номенклатура+" Цена: "+Строка1.Цена)
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для каждого Строка2 из ТЗ Цикл
Если Строка2.Номенклатура = ПеремНоменклатура
тогда
Строка2.Цена = махЦена ;
Сообщить(""+ Строка2.Номенклатура+" Максимальная цена: "+ махЦена)
КонецЕсли;
КонецЦикла;
КонецЦикла;
//ТЗ.свернуть("Номенклатура","Цена") ;
Запрос2= новый Запрос();
Запрос2.Текст=
"ВЫБРАТЬ
| РасходнаяНакладная.Ссылка КАК Ссылка
|ИЗ
| Документ.РасходнаяНакладная КАК РасходнаяНакладная
|ГДЕ
| РасходнаяНакладная.Дата >= &ДатаНачало
| И РасходнаяНакладная.Дата <= &ДатаКонец
| И РасходнаяНакладная.Договор = &Договор
| И РасходнаяНакладная.Организация = &Организация";
Запрос2.УстановитьПараметр("ДатаКонец",Период.ДатаОкончания);
Запрос2.УстановитьПараметр("ДатаНачало",Период.ДатаНачала);
Запрос2.УстановитьПараметр("Договор",Договор);
Запрос2.УстановитьПараметр("Организация",Организация);
РезультатЗапроса = Запрос2.Выполнить();
Выборка= РезультатЗапроса.Выгрузить();
Для каждого ном Из тз Цикл
Для каждого СтрокаДок Из Выборка Цикл
Док = СтрокаДок.Ссылка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Для каждого Запас Из Док.Запасы Цикл
Если Запас.Номенклатура= ном.Номенклатура Тогда
Запас.Цена=0;
Запас.Цена=ном.Цена;
Запас.Сумма=Запас.Количество*Запас.Цена;
ПолучитьФорму("Документ.РасходнаяНакладная.Форма.ФормаДокумента",);
Док.Записать(РежимЗаписиДокумента.Запись);
ТексСообщения = ""+Запас.Номенклатура + " " + Док.Номер ;
Сообщить(ТексСообщения);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецФункции // ИзДокРН()
Показать
Посмотрите, какие обработчики выполняются при смене поля, которое вы меняете. После внесения всех изменений, вызывайте этот обработчик.
Пример на картинках.
Пример на картинках.
Прикрепленные файлы:
после выполнения в табличной части меняется цена и сумма а вот когда ты смотришь сумму самого документа стоит старая сумма и я даже попробовал пере провести все равно остается та же сумма пока не изменишь руками цену либо сумму не чего не меняется
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот