Изменение сумм в Заказе покупателя в УНФ (обработка заполнения табличной части Запасы)

05.11.14

Учетные задачи - Оптовая торговля

Обработка позволяет изменять суммы в таб.части Запасы документа Заказ покупателя на указанный процент, на указанную сумму, а также уменьшать/увеличивать суммы так, чтобы итого по таб.части Запасы стало равно заданному значению.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
UstanovkaSkidokNaZapasyZakaza.epf.7z
.7z 5,48Kb
42 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Появилась необходимость в УНФ в заказах покупателей предоставлять ручные скидки. Например, уменьшить все суммы на 5%, или уменьшить все суммы так, чтобы итоговая сумма документа уменьшилась на 1000р., или сказать, что всё вместе продаётся за 10000р., и чтобы при этом все суммы пропорционально уменьшились/увеличились.

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

Обработка добавляется в "Дополнительные отчеты и обработки" (Вид обработки = "Заполнение объекта"). После этого в документе Заказ покупателя появляется кнопка "Заполнить" с тремя командами:

  • "Скидка, %" - уменьшает все суммы в таб.части Запасы на указанный процент (если ввести отрицательное число, то наоборот увеличит на указанный процент).
  • "Скидка, сумма" - уменьшает все суммы в таб.части Запасы так, чтобы итоговая сумма документа уменьшилась на указанную сумму (если ввести отрицательное число, то наоборот итоговая сумма документа будет увеличена на эту сумму).
  • "Скидка, установить Итого" - уменьшает/увеличивает все суммы в таб.части Запасы так, чтобы итого по таб.части Запасы стало равно введённой сумме.

Код модуля обработки:

////////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС

// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
	ПараметрыРегистрации.Версия = "0.99";
	ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПокупателя");
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Скидка, %'");
	НоваяКоманда.Идентификатор = "УстановитьСкидкуПроцент";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
	НоваяКоманда.ПоказыватьОповещение = Истина;
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Скидка, сумма'");
	НоваяКоманда.Идентификатор = "УстановитьСкидкуСумма";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
	НоваяКоманда.ПоказыватьОповещение = Истина;
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Скидка, установить Итого'");
	НоваяКоманда.Идентификатор = "УстановитьСуммуИтого";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
	НоваяКоманда.ПоказыватьОповещение = Истина;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

Код модуля формы (сама форма не содержит никаких реквизитов и элементов):

// {{{ Код взят из модуля формы документа ЗаказПокупателя (обработка события "изменение поля Сумма таб.части Запасы").
// Изменение кода свелось по большому счету к передаче ДокОбъект во все процедуры и обращение к "ДокОбъект" (вместо "Объект") внутри процедур.
// < Начало кода, права на который принадлежат фирме 1С

// Рассчитывается сумма НДС в строке табличной части.
//
&НаСервере
Процедура РассчитатьСуммуНДС(ДокОбъект, СтрокаТабличнойЧасти)
	
	СтавкаНДС = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеСтавкиНДС(СтрокаТабличнойЧасти.СтавкаНДС);
	
	СтрокаТабличнойЧасти.СуммаНДС = ?(ДокОбъект.СуммаВключаетНДС, 
									  СтрокаТабличнойЧасти.Сумма - (СтрокаТабличнойЧасти.Сумма) / ((СтавкаНДС + 100) / 100),
									  СтрокаТабличнойЧасти.Сумма * СтавкаНДС / 100);
											
КонецПроцедуры // ПересчитатьСуммыДокумента() 

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

// Процедура - обработчик события ПриИзменении поля ввода Сумма.
//
&НаСервере
Процедура ЗапасыСуммаПриИзменении(ДокОбъект)
	
	Для Каждого СтрокаТабличнойЧасти Из ДокОбъект.Запасы Цикл
	
		// Цена.
		Если СтрокаТабличнойЧасти.Количество <> 0 Тогда
			СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
		КонецЕсли;
		
		// Скидка.
		Если СтрокаТабличнойЧасти.ПроцентСкидкиНаценки = 100 Тогда
			СтрокаТабличнойЧасти.Цена = 0;
		ИначеЕсли СтрокаТабличнойЧасти.ПроцентСкидкиНаценки <> 0 И СтрокаТабличнойЧасти.Количество <> 0 Тогда
			СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / ((1 - СтрокаТабличнойЧасти.ПроцентСкидкиНаценки / 100) * СтрокаТабличнойЧасти.Количество);
		КонецЕсли;
			
		// Сумма НДС.
		РассчитатьСуммуНДС(ДокОбъект, СтрокаТабличнойЧасти);
		
		// Всего.
		СтрокаТабличнойЧасти.Всего = СтрокаТабличнойЧасти.Сумма + ?(ДокОбъект.СуммаВключаетНДС, 0, СтрокаТабличнойЧасти.СуммаНДС);
		
	КонецЦикла;
		
	// Платежный календарь.
	ПересчитатьПлатежныйКалендарь(ДокОбъект, Истина); // для штатного пересчета платежного календаря нужно во втором параметре передать Ложь или не указывать его вообще
	
КонецПроцедуры // ЗапасыСуммаПриИзменении()
// Конец кода, права на который принадлежат фирме 1С / >
// Код взят из модуля формы документа ЗаказПокупателя (обработка события "изменение поля Сумма таб.части Запасы"). }}}

// отсюда и до конца файла GPLv3

&НаСервере
Процедура УстановитьСкидкуПроцент(ДокОбъект, ЗначСкидки)
	
	Для Каждого СтрокаТЧ Из ДокОбъект.Запасы Цикл
		СтрокаТЧ.Сумма = Окр(СтрокаТЧ.Сумма * (100 - ЗначСкидки) / 100, 2);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьСкидкуСумма(ДокОбъект, ЗначСкидки)
	
	МассивСумм = ДокОбъект.Запасы.ВыгрузитьКолонку("Сумма");
	МассивСкидок = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(ЗначСкидки, МассивСумм);
	
	Для Сч = 0 По МассивСумм.Количество() - 1 Цикл
		МассивСумм[Сч] = МассивСумм[Сч] - МассивСкидок[Сч];
	КонецЦикла;
	
	ДокОбъект.Запасы.ЗагрузитьКолонку(МассивСумм, "Сумма");
	
КонецПроцедуры

&НаСервере
Процедура УстановитьСуммуИтого(ДокОбъект, ЗначСкидки)
	
	МассивСумм = ДокОбъект.Запасы.ВыгрузитьКолонку("Сумма");
	МассивРез = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(ЗначСкидки, МассивСумм);
	
	ДокОбъект.Запасы.ЗагрузитьКолонку(МассивРез, "Сумма");
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
	
	Если ОбъектыНазначения.Количество() > 1 Тогда
		// не будем давать пользователю возможность массово устанавливать скидки
		ВызватьИсключение НСтр("ru = 'Установка скидок для нескольких документов не поддерживается!'");
		Возврат;
	КонецЕсли;
	
	ЗначСкидки = 0;
	ЧислоВведено = Ложь;
	Если ИмяКоманды = "УстановитьСкидкуПроцент" Тогда
		ЧислоВведено = ВвестиЧисло(ЗначСкидки, НСтр("ru = 'Уменьшить на %'"), 4, 1);
	ИначеЕсли ИмяКоманды = "УстановитьСкидкуСумма" Тогда
		ЧислоВведено = ВвестиЧисло(ЗначСкидки, НСтр("ru = 'Уменьшить на сумму'"), 15, 2);
	ИначеЕсли ИмяКоманды = "УстановитьСуммуИтого" Тогда
		ЧислоВведено = ВвестиЧисло(ЗначСкидки, НСтр("ru = 'Установить сумму Итого = '"), 15, 2);
	Иначе
		ВызватьИсключение "Неизвестная команда """ + ИмяКоманды + """!";
		Возврат;
	КонецЕсли;
	
	Если НЕ ЧислоВведено Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(ЗначСкидки) Тогда
		Возврат;
	КонецЕсли;

	УстановитьСкидкуНаСервере(ИмяКоманды, ОбъектыНазначения, ЗначСкидки);
	
	// обновим открытые списки и формы документов
	Для Каждого ДокСсылка Из ОбъектыНазначения Цикл
		ОповеститьОбИзменении(ДокСсылка);
		ПараметрыФормы = Новый Структура("Ключ", ДокСсылка);
		ТекФорма = ПолучитьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента", ПараметрыФормы);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Прочитать();
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Оптовая торговля Розничная торговля НДС 22% 1С 8.3 1С:Управление торговлей 10 Россия Платные (руб)

Пакет обновлений и продолжения поддержки Управление торговлей, редакция 10.3.- обновление которое предоставляет пользователям новые функции, исправления ошибок и т.д.

14640 руб.

19.12.2025    4913    52    30    

53

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта алкогольной продукции. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

15.12.2015    180931    1223    biz-intel    374    

416

Оптовая торговля Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Решение создано для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Задавайте вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, накоплен опыт и знания по данным темам.

5000 руб.

18.03.2019    119812    70    115    

195

SALE! 50%

Производство готовой продукции (работ, услуг) Учет доходов и расходов Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Бухгалтерский учет Налоговый учет Платные (руб)

Данный отчет показывает себестоимость реализованной продукции в разузлованном виде, как с выделением входящих в нее полуфабрикатов любых уровней, так и свернутый до статей затрат и материалов, видов работ. Отчет работает независимо от метода оценки стоимости товаров и подходит для любых производственных компаний с многопередельным производством. Отчет можно использовать как в типовой 1С:ERP, так и в отраслевых решениях на ее базе (например, 1С:ERP Управление птицеводческим предприятием, Молокозавод и т.д.).Отчет подходит для анализа затрат на гособоронзаказы ГОЗ.

96600 48300 руб.

30.11.2022    31752    47    35    

46

Банковские операции Обмен с интернет-банком Эквайринг/ридер магнитных карт Мастера заполнения Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:ERP 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:ERP. Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Корректируйте банковские документы быстро и легко! Создайте правило обработки, и оно автоматически применится при загрузке выписки, экономя ваше время (Можно настроить отбор по любому реквизиту или по регулярному выражению). Решение позволяет автоматически заполнять расшифровку платежа, исключать загрузку ненужных документов (дублей) из банка, заполнять комиссию за эквайринг и многое другое. Вам не нужно доплачивать за алгоритмы, они уже включены в решение. Автоматическая обработка применяется при загрузке данных как из файлов клиент банка, так и через DirectBank. Доступен AI чат бот который умеет консультировать по функционалу решения.

15250 руб.

20.12.2024    13857    61    27    

56
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vlastapov 50 27.12.14 12:26 Сейчас в теме
В УНФ, редакция 1.5 (1.5.2.25) выдает ошибку "Использование модальных окон в данном режиме запрещено!". Можно исправить?
2. q_i 586 30.12.14 12:53 Сейчас в теме
(1) vlastapov, вместо процедуры "Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт" вставьте (см. прилагаемый файл):
&НаКлиенте
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
	
	Если ОбъектыНазначения.Количество() > 1 Тогда
		// не будем давать пользователю возможность массово устанавливать скидки
		ВызватьИсключение НСтр("ru = 'Установка скидок для нескольких документов не поддерживается!'");
		Возврат;
	КонецЕсли;
	
	ЗначСкидки = 0;
	Если ИмяКоманды = "УстановитьСкидкуПроцент" Тогда
		ПоказатьВводЧисла(Новый ОписаниеОповещения("ПродолжитьВыполнениеПослеВводаЧисла", ЭтаФорма, Новый Структура("ИмяКоманды, ОбъектыНазначения", ИмяКоманды, ОбъектыНазначения)), ЗначСкидки, НСтр("ru = 'Уменьшить на %'"), 4, 1);
	ИначеЕсли ИмяКоманды = "УстановитьСкидкуСумма" Тогда
		ПоказатьВводЧисла(Новый ОписаниеОповещения("ПродолжитьВыполнениеПослеВводаЧисла", ЭтаФорма, Новый Структура("ИмяКоманды, ОбъектыНазначения", ИмяКоманды, ОбъектыНазначения)), ЗначСкидки, НСтр("ru = 'Уменьшить на сумму'"), 15, 2);
	ИначеЕсли ИмяКоманды = "УстановитьСуммуИтого" Тогда
		ПоказатьВводЧисла(Новый ОписаниеОповещения("ПродолжитьВыполнениеПослеВводаЧисла", ЭтаФорма, Новый Структура("ИмяКоманды, ОбъектыНазначения", ИмяКоманды, ОбъектыНазначения)), ЗначСкидки, НСтр("ru = 'Установить сумму Итого = '"), 15, 2);
	Иначе
		ВызватьИсключение "Неизвестная команда """ + ИмяКоманды + """!";
		Возврат;
	КонецЕсли;
	
КонецПроцедуры	

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

	УстановитьСкидкуНаСервере(ИмяКоманды, ОбъектыНазначения, ЗначСкидки);
	
	// обновим открытые списки и формы документов
	Для Каждого ДокСсылка Из ОбъектыНазначения Цикл
		ОповеститьОбИзменении(ДокСсылка);
		ПараметрыФормы = Новый Структура("Ключ", ДокСсылка);
		ТекФорма = ПолучитьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента", ПараметрыФормы);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Прочитать();
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать

Ещё отвалилось обновление открытой формы документа. При поиске формы с помощью кода
ПараметрыФормы = Новый Структура("Ключ", ДокСсылка);
ТекФорма = ПолучитьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента", ПараметрыФормы);
ТекФорма.Открыта() возвращает Ложь. Пока некогда разбираться с этим. Буду благодарен коллегам если подскажут как найти и обновить форму открытого документа, из которого была вызвана процедура заполнения.
Прикрепленные файлы:
UstanovkaSkidokNaZapasyZakaza_dlya_unf1.5.2.epf.7z
3. nvk1234 29.11.15 19:26 Сейчас в теме
Хорошо ли при вводе процента скидки писать непосредственно в объект документа? Ведь пользователю может не понравиться результат...
4. q_i 586 30.11.15 11:25 Сейчас в теме
(3) nvk1234, когда писалась эта обработка (а это было год назад), количество костылей, которыми нужно было обложить БСП, чтобы что-то хоть как-то работало стремилось к бесконечности.
На данный момент обработка устарела, и я не удаляю эту публикацию только из-за наличия хоть и мизерной, но всё-таки вероятности, что кому-то могут пригодиться какие-нибудь куски кода из неё.
Дорабатывать в ближайшее время не планирую ввиду отсутствия коммерческого заказа.
5. akaky_2001 29.01.16 20:49 Сейчас в теме
Мне пригодилась, так что автору респект
Для отправки сообщения требуется регистрация/авторизация