Не срабатывают события формы ЗаказКлиента при программном резервировании товаров 1С УТ из события формы ПриобретениеТоваровУслуг 1С:Предприятие 8.3 (8.3.17.2198)

1. YA_1681264775 29.03.24 14:54 Сейчас в теме
Здравствуйте, уважаемое сообщество!


1С:Предприятие 8.3 (8.3.17.2198)
1С:Управление торговлей (11.4.13.280)

Столкнулся с проблемой при реализации функционала в 1С:Предприятие. Задача заключалась в автоматическом резервировании товаров при проведении документа "Приобретение Товаров Услуг", ссылаясь на "Заказ Клиента" через "Заказ Поставщику" как на документ-основание. Программа должна резервировать товары, совпадающие по номенклатуре и количеству в заказе поставщика. В случае, если количество товара в заказе клиента превышает наличие, необходимо разбивать строки заказа и резервировать только требуемое количество.

Я успешно реализовал указанный механизм, однако столкнулся с неожиданной, для меня как для новичка, проблемой: при такой реализации не срабатывают стандартные события формы (ПриЗаписи, ПередЗаписью, ПослеЗаписи и т.д.) у Заказа клиента. Это существенно затрудняет дальнейшую работу, так как для полной интеграции моего решения в бизнес-процессы компании требуется выполнение этих событий.

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

Спасибо за внимание и потенциальную помощь!

Код реализации в модуле формы ПриобретениеТоваровУслуг:
&НаСервере
Процедура СП_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)

ПриобретениеТоваровУслуг = ТекущийОбъект;

ЗаказКлиента = ПриобретениеТоваровУслуг.ЗаказПоставщику.ДокументОснование;

Если НЕ ЗначениеЗаполнено(ЗаказКлиента) Тогда
	Возврат;
КонецЕсли;

Если НЕ ЗаказКлиента.Проведен или ЗаказКлиента.ПометкаУдаления Тогда
	Возврат;
КонецЕсли;

ПолныйРезерв = Истина;
ПолнаяОтгрузка = Истина;
Для Каждого Товар из ЗаказКлиента.Товары Цикл;
	Если НЕ Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.СоСклада Тогда
		ПолныйРезерв = Ложь;
	КонецЕсли;

	Если НЕ Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить Тогда
		ПолнаяОтгрузка = Ложь;
	КонецЕсли;
КонецЦикла;

Если ПолныйРезерв или ПолнаяОтгрузка Тогда
	Возврат;
КонецЕсли;

МенеджерЗаказКлиента = ЗаказКлиента.ПолучитьОбъект();

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

СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(МенеджерЗаказКлиента);

СтруктураДействий = Новый Структура;

СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));


КэшированныеЗначения = Неопределено;
ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(МенеджерЗаказКлиента.Товары, СтруктураДействий, КэшированныеЗначения);
МенеджерЗаказКлиента.Записать(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Показать
Найденные решения
4. YA_1681264775 01.04.24 11:43 Сейчас в теме
Мой подход содержал ошибку: в данной задаче было целесообразнее написать функции обработки заказа клиента не в модуле формы, а в модуле объекта. В таком случае, при вызове функции ПолучитьОбъект и последующем изменении данных, активируются события ПередЗаписью (Перед/После). В моем случае при проведении ПриобретениеТоваровУслуг, как показано в приведенном выше коде, при изменении данных объекта заказа клиента, инициирует соответствующие события из модуля объекта заказа клиента. Задача успешно решена. Надеюсь, это окажется полезным для кого-то.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Nick_Angel 29.03.24 17:03 Сейчас в теме
Я верно понимаю, что ваш код отрабатывает в модуле объекта при проведении? Может как вариант сделать создание документа из окна формы?
3. YA_1681264775 29.03.24 17:05 Сейчас в теме
(2)

Код находится в модуле формы документа ПриобретениеТоваровУслуг и там отрабатывает в ПослеЗаписиНаСервереПосле. Что вы имеете ввиду под созданием документа? Документ Приобретение создает сотрудник на основании Заказа поставщику, документ Заказ клиента уже создан.
4. YA_1681264775 01.04.24 11:43 Сейчас в теме
Мой подход содержал ошибку: в данной задаче было целесообразнее написать функции обработки заказа клиента не в модуле формы, а в модуле объекта. В таком случае, при вызове функции ПолучитьОбъект и последующем изменении данных, активируются события ПередЗаписью (Перед/После). В моем случае при проведении ПриобретениеТоваровУслуг, как показано в приведенном выше коде, при изменении данных объекта заказа клиента, инициирует соответствующие события из модуля объекта заказа клиента. Задача успешно решена. Надеюсь, это окажется полезным для кого-то.
Оставьте свое сообщение

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