Создание документа "Установка цен номенклатуры" на основании "Поступления от переработчика"

1. Jeslav 30.10.25 07:48 Сейчас в теме
Всем здравствуйте!

В расширении добавил общую команду создания документа "Установка цен номенклатуры". Команда работает, форма документа открывается, заполняются необходимые реквизиты. Но ТЧ с номенклатурой и ценами не заполняется.

Вот код


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

Показать


Всяко уже пробовал, добавлял в заполнении ТЧ следующие строки:

ФормаУстановкаЦенНоменклатуры.Элементы.ГруппаУстановкаЦен.ПодчиненныеЭлементы.ГруппаУкажитеНоменклатуруУточнитеЦены.ПодчиненныеЭлементы.ДеревоЦен.ТекущийЭлемент = ФормаУстановкаЦенНоменклатуры.Элементы.ГруппаУстановкаЦен.ПодчиненныеЭлементы.ГруппаУкажитеНоменклатуруУточнитеЦены.ПодчиненныеЭлементы.ДеревоЦен.ПодчиненныеЭлементы[2];
		ФормаУстановкаЦенНоменклатуры.Элементы.ГруппаУстановкаЦен.ПодчиненныеЭлементы.ГруппаУкажитеНоменклатуруУточнитеЦены.ПодчиненныеЭлементы.ДеревоЦен.ТекущаяСтрока = Стр.ПолучитьИдентификатор();
		ФормаУстановкаЦенНоменклатуры.Элементы.ГруппаУстановкаЦен.ПодчиненныеЭлементы.ГруппаУкажитеНоменклатуруУточнитеЦены.ПодчиненныеЭлементы.ДеревоЦен.ДобавитьСтроку();


Пока безуспешно. То есть, форма должна выглядеть вот так после выполнения команды (см. скрин прикреп.). Прошу помощи у более опытных специалистов
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. glek 119 30.10.25 08:04 Сейчас в теме
(1) В КА (и других УТ-подобных решениях) необходимо вызвать функцию "ЗаполнитьДокумент" в форме установки цен.
3. Jeslav 30.10.25 11:51 Сейчас в теме
(2) А как мне вызвать эту функцию в моем фрагменте кода? Я ведь не из формы документа заполняю его данными
4. glek 119 30.10.25 11:54 Сейчас в теме
(3) А откуда? И форма документа открыта при выполнении кода заполнения?
5. glek 119 30.10.25 11:56 Сейчас в теме
(3) Увидел. Т.е. создаете новый объект и открываете форму.
Вот здесь и надо передать параметр в открываемую форму, чтобы вызвать эту процедуру.
6. Jeslav 30.10.25 12:13 Сейчас в теме
(5) Немного переделал, но пока безуспешно. Код вот такой получается

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

&НаСервере
Функция мит_ЗаполнитьДокумент(ДокПоступление, ДокУстановкаЦен)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВидыЦен.Ссылка КАК Ссылка,
		|	ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании КАК УстанавливатьЦенуПриВводеНаОсновании,
		|	ВидыЦен.ПометкаУдаления КАК ПометкаУдаления
		|ПОМЕСТИТЬ ВидыЦен
		|ИЗ
		|	Справочник.ВидыЦен КАК ВидыЦен
		|ГДЕ
		|	ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании
		|	И ВидыЦен.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияВидовЦен.Действует)
		|	И НЕ ВидыЦен.ПометкаУдаления
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ПоступлениеОтПереработчикаТовары.Номенклатура КАК Номенклатура,
		|	ПоступлениеОтПереработчикаТовары.Характеристика КАК Характеристика,
		|	ПоступлениеОтПереработчикаТовары.Упаковка КАК Упаковка,
		|	ВидыЦен.Ссылка КАК Ссылка,
		|	СУММА(0) КАК Цена
		|ИЗ
		|	Документ.ПоступлениеОтПереработчика.Товары КАК ПоступлениеОтПереработчикаТовары
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВидыЦен КАК ВидыЦен
		|		ПО ПоступлениеОтПереработчикаТовары.Ссылка.ВидЦены = ВидыЦен.Ссылка
		|ГДЕ
		|	ПоступлениеОтПереработчикаТовары.Ссылка = &Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	ПоступлениеОтПереработчикаТовары.Номенклатура,
		|	ПоступлениеОтПереработчикаТовары.Характеристика,
		|	ПоступлениеОтПереработчикаТовары.Упаковка,
		|	ВидыЦен.Ссылка";
	
	Запрос.УстановитьПараметр("Ссылка", ДокПоступление.Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда  
		
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
			ДокПоступление);
		ВызватьИсключение Текст;
		
	Иначе
		
		ДокУстановкаЦен.ДокументОснование = ДокПоступление.Ссылка;
		ДокУстановкаЦен.Товары.Загрузить(РезультатЗапроса.Выгрузить());
		
	КонецЕсли;
	
	Возврат ДокУстановкаЦен;
		
КонецФункции
Показать


Это я по примеру из модуля объекта документа написал функцию. Как-то бы добраться до обработки заполнения или ещё чего. Так как документ не записан, ссылка на него пустая, ПолучитьОбъект() тоже не получается. Уже даже не знаю, что дальше пробовать
7. RoyFincher 4 30.10.25 14:34 Сейчас в теме
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) 

	СтруктураДанных	= Новый Структура();
	СтруктураДанных.Вставить("Основание",		Основание);
	СтруктураДанных.Вставить("ВводНаОсновании",	Истина);
		
	ПараметрыФормы 	= Новый Структура("ЗначенияЗаполнения"	, СтруктураДанных);
	
	ОткрытьФорму("ТвояФорма", 
					ПараметрыФормы);	    

КонецПроцедуры
Показать


Дальше управление передается в модуль объекта в процедуру ОбработкаЗаполнения

Посмотри как реализовано заполнение УстановкиЦен на основании ПриходнойНакладной.
8. Jeslav 30.10.25 16:40 Сейчас в теме
(7) Спасибо за подсказку. Написал вот такой код

В модуле общей команды

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


И добавил ещё процедуру заполнения по поступлению от переработчика

&НаСервере
Процедура ЗаполнитьПоПоступлениюОтПереработчика(Знач ДокументОснование, ДанныеЗаполнения)

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВидыЦен.Ссылка КАК Ссылка,
		|	ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании КАК УстанавливатьЦенуПриВводеНаОсновании,
		|	ВидыЦен.ПометкаУдаления КАК ПометкаУдаления
		|ПОМЕСТИТЬ ВидыЦен
		|ИЗ
		|	Справочник.ВидыЦен КАК ВидыЦен
		|ГДЕ
		|	ВидыЦен.Ссылка = &ВидЦены
		|	И НЕ ВидыЦен.ПометкаУдаления
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ПоступлениеОтПереработчикаТовары.Номенклатура КАК Номенклатура,
		|	ПоступлениеОтПереработчикаТовары.Характеристика КАК Характеристика,
		|	ПоступлениеОтПереработчикаТовары.Упаковка КАК Упаковка,
		|	ВидыЦен.Ссылка КАК ВидЦены,
		|	0 КАК Цена
		|ИЗ
		|	Документ.ПоступлениеОтПереработчика.Товары КАК ПоступлениеОтПереработчикаТовары
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВидыЦен КАК ВидыЦен
		|		ПО (ИСТИНА)
		|ГДЕ
		|	ПоступлениеОтПереработчикаТовары.Ссылка = &Ссылка";
	
	Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
	Запрос.УстановитьПараметр("ВидЦены", ДанныеЗаполнения.ВидЦены);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда  
		
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
			ДокументОснование);
		ВызватьИсключение Текст;
		
	Иначе
		
		ЭтотОбъект.ДокументОснование = ДокументОснование;
		Товары.Загрузить(РезультатЗапроса.Выгрузить());
		
	КонецЕсли;

КонецПроцедуры
Показать


Падает теперь вот в такую ошибку (см. скрин). Она в процедуре "ЗагрузитьТоварыВДеревоЦен" в общем модуле "УстановкаЦенСервер" в строке:

ЭлементНоменклатура[                     ИмяКолонки] = ВыборкаНоменклатура.Цена;
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация

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