Внешняя обработка в 1С 8.3: как пересчитать сумму документа, после изменения табличных значений документа

1. user966277 2 26.06.18 13:06 Сейчас в теме
Добрый день!пишу внешнею обработку для УНФ,проверка цены номенклатуры документов по договору,после изменения номенклатуры Сумма документа не меняется,подскажите как написать чтоб изменилась сумма документов примерно я думаю что необходимо вызвать процедуру самого документа формы только незнаю как это сделать
+
По теме из базы знаний
Найденные решения
17. Denis_CFO 48 26.06.18 13:57 Сейчас в теме
(1) СуммаДокумента = Объект.Запасы.Итог("Сумма")
georgebgk; +1
20. Elnur54442 26.06.18 14:07 Сейчас в теме
или скачайте anydesk я помогу
+
39. Elnur54442 27.06.18 11:59 Сейчас в теме
40. user966277 2 27.06.18 12:00 Сейчас в теме
(20)спасибо большое за помощь
Прикрепленные файлы:
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. singlych 26.06.18 13:14 Сейчас в теме
(1)
необходимо вызвать процедуру самого документа формы

Необходимо посмотреть туда и написать что-то похожее. Наверняка там какие-нибудь общие методы используются.
+
16. Boneman 298 26.06.18 13:56 Сейчас в теме
(1) обычно сумма документа - это отдельный реквизит, который является Итогом ТЧ.Колонка
не понимаю зачем массировать полные функции пересчета строк, при смене номенклатуры. Если у нас со строками уже все в порядке, и проблема только в сумме документа.
Что мешает сумму документа актуализировать ?
Одна строка кода
Объект.СуммаДокумента = Объект.Запасы.Итог("Всего");

не ?
Denis_CFO; +1
21. neuro88 26.06.18 14:12 Сейчас в теме
(16) в типовых конфигурация реквизит СуммаДокумента пересчитывается в обработчике ПередЗаписью
пример из авансового отчета БП 3.0:
	// Посчитать суммы документа и записать ее в соответствующий реквизит шапки для показа в журналах
	СуммаДокумента = УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Товары") 
		+ ОплатаПоставщикам.Итог("Сумма") 
		+ УчетНДСПереопределяемый.ПолучитьСуммуДокументаСНДС(ЭтотОбъект, "Прочее");

поэтому при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произойдет при записи.
+
22. Boneman 298 26.06.18 14:21 Сейчас в теме
(21)
при программном изменении табличных частей документов нет смысла отдельно пересчитывать сумму документа, это произо

ну это далеко не везде,
к тому же БП это, достаточно флагманская конфа, по сравнению с УНФ.
в моей УНФ такого нет. (последние релизы не смотрел).
+
37. neuro88 27.06.18 11:19 Сейчас в теме
(22) ну в таком случае необходимо самому собрать сумму документа.

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


Под рукой УНФки нет, набросал в блокноте. Обычно Всего - реквизит формы, а не ТЧ документа. поэтому собираем результат из суммы и суммындс.
+
24. ben19791010 27.06.18 06:26 Сейчас в теме
Вам в (16) уже сказали как делать
Прикрепленные файлы:
+
25. user966277 2 27.06.18 06:36 Сейчас в теме
(24)
При изменений цены сумма самого документа тоже не пересчитывается
+
26. ben19791010 27.06.18 06:47 Сейчас в теме
(25) Вы форму обновляете после записи? У вас событи изменения объект.РЭКВЫЗИТТЧ.Итог(Итоговый) ПослеЗаписи? или в обработке проведения?
я к тому что меняете на форме документа элемент формы какое событие вызывается?
+
27. user966277 2 27.06.18 07:13 Сейчас в теме
(26)извините я только начинаю программировать в 1с,как понять обновить форму после записи?и для чего это нужно?
+
30. ben19791010 27.06.18 07:42 Сейчас в теме
(27) ну чтоб форма обновилась и показала измененные элементы
у меня такой конфы нету, а в БП немного другая тема, но суть та же события при изменении элемента тч мц04
Объект.МЦ04.Итог(Количество) например это путь к данным (и на счёт убрать объект не слушай) - данные же будут изменены
+
31. user966277 2 27.06.18 08:15 Сейчас в теме
(30)
а можно вопрос а когда копируешь функций в модуль объекта копировать с &НаКлиенте или без ?
+
32. ben19791010 27.06.18 09:12 Сейчас в теме
(31)
в модуль объекта копировать с &НаКлиенте или без ?

)) без
+
34. user966277 2 27.06.18 11:07 Сейчас в теме
(30)смотрите дописал код на изменение суммы документа,опять же он как бы изменился а вот все поля с этой суммой не меняются
+
28. user966277 2 27.06.18 07:13 Сейчас в теме
(26)и как это сделать?
+
29. user966277 2 27.06.18 07:15 Сейчас в теме
(26)
я к тому что меняете на форме документа элемент формы какое событие вызывается?
скриншоты в ответе(18) посмотрите пожалуйста
+
17. Denis_CFO 48 26.06.18 13:57 Сейчас в теме
(1) СуммаДокумента = Объект.Запасы.Итог("Сумма")
georgebgk; +1
2. Elnur54442 26.06.18 13:10 Сейчас в теме
а где указывается цена?
+
3. Elnur54442 26.06.18 13:11 Сейчас в теме
если возможна фото скин
+
7. user966277 2 26.06.18 13:38 Сейчас в теме
(3)
Функция ИзДокРН()Экспорт
	

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

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

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

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

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

КонецЦикла; 	
	
КонецЦикла;	
	
КонецЦикла; 	 



КонецФункции // ИзДокРН()
Показать
+
4. Timur.V 78 26.06.18 13:12 Сейчас в теме
6. SagittariusA 26.06.18 13:24 Сейчас в теме
Посмотрите, какие обработчики выполняются при смене поля, которое вы меняете. После внесения всех изменений, вызывайте этот обработчик.
Пример на картинках.
Прикрепленные файлы:
+
8. user966277 2 26.06.18 13:41 Сейчас в теме
(6)Там есть вот но как сделать чтоб она заработала поле выполнения обработки
Прикрепленные файлы:
+
9. user966277 2 26.06.18 13:44 Сейчас в теме
после выполнения в табличной части меняется цена и сумма а вот когда ты смотришь сумму самого документа стоит старая сумма и я даже попробовал пере провести все равно остается та же сумма пока не изменишь руками цену либо сумму не чего не меняется
+
10. SagittariusA 26.06.18 13:45 Сейчас в теме
(9)
В этой процедуре что происходит? Картинку кода покажите.
+
12. user966277 2 26.06.18 13:49 Сейчас в теме
(10)
Прикрепленные файлы:
+
15. SagittariusA 26.06.18 13:52 Сейчас в теме
(12)
Картинку процедуры, которая при изменении цены отрабатывает. Та, что в форме документа.
+
11. SagittariusA 26.06.18 13:47 Сейчас в теме
(9)
пока не изменишь руками цену либо сумму

Потому что когда вы меняете сами, отрабатывает обработчик, которые передавая управление на общие модули пересчитывает данные обрабатываемого объекта.
+
13. user966277 2 26.06.18 13:50 Сейчас в теме
(11)
а как быть необходимо чтоб отработал обработчик,либо как его вызвать чтоб он отработал?
+
14. Elnur54442 26.06.18 13:51 Сейчас в теме
вы посмотрите при изменении цены что происходит ту процедуру добавьте в свой код
SagittariusA; +1
18. user966277 2 26.06.18 13:59 Сейчас в теме
(14)
если я копирую их в модуль объекта то он выдает ошибки ошибки на последнем скиншоте
Прикрепленные файлы:
+
19. Elnur54442 26.06.18 14:04 Сейчас в теме
(18) удалите слово Объект
+
20. Elnur54442 26.06.18 14:07 Сейчас в теме
или скачайте anydesk я помогу
+
23. user966277 2 27.06.18 06:04 Сейчас в теме
(20)очень признателен буду,в какое время вам удобно будет?
+
33. Elnur54442 27.06.18 10:53 Сейчас в теме
(23) напищите когда будете здесь
+
35. user966277 2 27.06.18 11:07 Сейчас в теме
36. user966277 2 27.06.18 11:08 Сейчас в теме
(33)
Прикрепленные файлы:
+
40. user966277 2 27.06.18 12:00 Сейчас в теме
(20)спасибо большое за помощь
Прикрепленные файлы:
+
41. Elnur54442 27.06.18 12:01 Сейчас в теме
(40)Вам тоже спасибо
+
38. Elnur54442 27.06.18 11:24 Сейчас в теме
39. Elnur54442 27.06.18 11:59 Сейчас в теме
Внимание! Тема сдана в архив

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