Внешний обработчик

1. G_110913743683437366230 27.11.20 07:02 Сейчас в теме
Здравствуйте Уважаемые,
Не могу сам дойти до мысли, прошу помочь:
Внешним обработчик меняю значение Количество в проведенных документах ЗаказПокупателя. Обработчик значения меняет, но не изменяет сумму и итог Всего в документе. Как можно обновить данные таблицы проведенного документа через внешний обработчик.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
5. burgomister 59 27.11.20 07:44 Сейчас в теме +0.46 $m
ПрименяютсяСтавки4и2 = Ложь;
СуммаВключаетНДС = Документ.СуммаВключаетНДС;
ТЧ = Документ.Метаданные().ТабличныеЧасти.Найти("Товары");
		ЕстьРеквизитВсего = НЕ (ТЧ.Реквизиты.Найти("Всего") = Неопределено);
ЕстьИзменения = Ложь;


ТабЧасть = Документ.Товары;
      
		Для Каждого СтрокаТаблицы Из ТабЧасть Цикл

			СтавкаНДС = ПолучитьСтавкуНДС(СтрокаТаблицы.СтавкаНДС, ПрименяютсяСтавки4и2);
			СуммаНДС = РассчитатьСуммуНДС(СтрокаТаблицы.Сумма, СуммаВключаетНДС,	СтавкаНДС);

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




Функция РассчитатьСуммуНДС(Сумма, СуммаВключаетНДС, СтавкаНДС)

	Если СуммаВключаетНДС Тогда
		СуммаБезНДС = 100 * Сумма / (100 + СтавкаНДС);
		СуммаНДС = Сумма - СуммаБезНДС;
	Иначе
		СуммаБезНДС = Сумма;
	КонецЕсли;

	Если НЕ СуммаВключаетНДС Тогда
		СуммаНДС = СуммаБезНДС * СтавкаНДС / 100;
	КонецЕсли;
	
	Возврат СуммаНДС;

КонецФункции // РассчитатьСуммуНДС()

Функция ПолучитьСтавкуНДС(СтавкаНДС, ПрименяютсяСтавки4и2 = Ложь)

	Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
		Возврат 20;
	ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
		Ставка = ?(ПрименяютсяСтавки4и2, 2, 10);
		Возврат Ставка;
	ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС18 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
		Ставка = ?(ПрименяютсяСтавки4и2, 4, 18);
		Возврат Ставка;
	КонецЕсли;

	Возврат 0;

КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. burgomister 59 27.11.20 07:17 Сейчас в теме
1. Надо выполнить "Записать()";
2. Запустить процедуру обработки табличной части документа. Как правило она есть в общих модулях, а вызов в конкретном документе можно подсмотреть в форме на события: изменить количество или цену.
3. G_110913743683437366230 27.11.20 07:25 Сейчас в теме
(2) а есть решение без общего модуля?
4. burgomister 59 27.11.20 07:34 Сейчас в теме
Конечно, скопируйте эти процедуры во внешний обработчик. Или сделайте свою - цикл по строка табличной части. Там ничего сложного. Только аккуратно с НДС.
5. burgomister 59 27.11.20 07:44 Сейчас в теме +0.46 $m
ПрименяютсяСтавки4и2 = Ложь;
СуммаВключаетНДС = Документ.СуммаВключаетНДС;
ТЧ = Документ.Метаданные().ТабличныеЧасти.Найти("Товары");
		ЕстьРеквизитВсего = НЕ (ТЧ.Реквизиты.Найти("Всего") = Неопределено);
ЕстьИзменения = Ложь;


ТабЧасть = Документ.Товары;
      
		Для Каждого СтрокаТаблицы Из ТабЧасть Цикл

			СтавкаНДС = ПолучитьСтавкуНДС(СтрокаТаблицы.СтавкаНДС, ПрименяютсяСтавки4и2);
			СуммаНДС = РассчитатьСуммуНДС(СтрокаТаблицы.Сумма, СуммаВключаетНДС,	СтавкаНДС);

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




Функция РассчитатьСуммуНДС(Сумма, СуммаВключаетНДС, СтавкаНДС)

	Если СуммаВключаетНДС Тогда
		СуммаБезНДС = 100 * Сумма / (100 + СтавкаНДС);
		СуммаНДС = Сумма - СуммаБезНДС;
	Иначе
		СуммаБезНДС = Сумма;
	КонецЕсли;

	Если НЕ СуммаВключаетНДС Тогда
		СуммаНДС = СуммаБезНДС * СтавкаНДС / 100;
	КонецЕсли;
	
	Возврат СуммаНДС;

КонецФункции // РассчитатьСуммуНДС()

Функция ПолучитьСтавкуНДС(СтавкаНДС, ПрименяютсяСтавки4и2 = Ложь)

	Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
		Возврат 20;
	ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
		Ставка = ?(ПрименяютсяСтавки4и2, 2, 10);
		Возврат Ставка;
	ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС18 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
		Ставка = ?(ПрименяютсяСтавки4и2, 4, 18);
		Возврат Ставка;
	КонецЕсли;

	Возврат 0;

КонецФункции
Показать
6. karamazoff 96 27.11.20 20:13 Сейчас в теме
можно с меньшим кодом:
получить форму документа (не открывая ее), пройтись по строкам тч, меняя кол-во и вызывая процедуру формы колонки таблицы "Количество" ПриИзвенении (серверную часть) - перезаполнение произойдет как в интерактивном режиме и не надо разбираться как и что там пересчитывается.
пример для БП 3.0 изменение кол-ва в счете на оплату покупателя
&НаКлиенте
Процедура Команда1(Команда)
		    П = Новый Структура;
		    П.Вставить("Ключ", Ссылка);
			
		    ф = ПолучитьФорму("Документ.СчетНаОплатуПокупателю.ФормаОбъекта", П);	
			НалоговыйАгентПоФЗ335           = истина;
			ПокупательНалоговыйАгентПоНДС = ложь;
			ЗначениеПустогоКоличества = 1;
			Для каждого стр из ф.Объект.Товары цикл
				стр.Количество = 99;
				ОбщегоНазначенияБПКлиент.ПересчитатьСумму(стр, ф.Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);
			КонецЦикла;	
			ф.Записать();	
КонецПроцедуры

Показать
Оставьте свое сообщение

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