Из запроса по тч документа вставить значение в поле тч

1. Lllypuk 29.09.22 13:26 Сейчас в теме
Здравствуйте! Подскажите пожалуйста. Есть ТЧ документа. В нем есть реквизит "Номер Инвойса" - текстовый. Так же есть реквизит "Справочник Номер Инвойса" - ссылка на справочник. Вот, я пытаюсь из поля "Номер Инвойса" значение вставить в поле "Справочник Номер Инвойса". но как не сделаю пишет : Поле объекта недоступно для записи (СправочникНомерИнвойса)
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(48)}:Стр.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(57)}:ПускНаСервере();

Делаю это через обработку по кнопке пуск. За ранее спасибо за помощь!

&НаСервере
Процедура ПускНаСервере()

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


Еще пытался так: ошибка та же
Выборка.СправочникНомерИнвойса = Выборка.НомерИнвойса;

// И так то же самое

Выборка.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
По теме из базы знаний
Найденные решения
10. YozZzhik 29.09.22 14:26 Сейчас в теме
(9) удаляйте все и пишите:
Для Каждого СтрокаТЧ ИЗ Объект.Товары Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
13. YozZzhik 29.09.22 14:49 Сейчас в теме
(11) Понял, тут немного я затупил, думал, что у вас кнопка на форме.
Ваш план таков:
1. пишете запрос - получаете оттуда только ссылки на документы
2. получаете объект по ссылке для изменения
3. меняете нужный реквизит, записываете объект
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YozZzhik 29.09.22 13:41 Сейчас в теме
У вас есть выборка, которая попадает в переменную Выборка. Далее вы к каждому полю выборки обращаетесь через точку. В первом варианте вы пытаетесь результату поля СправочникНомерИнвойса присвоить значение результата поля НомерИнвойса. Во втором вы так же пытаетесь присвоить полю выборки, но уже ссылку на объект.
Если реквизит, в который нужно вставить значение выборки находится в ТЧ документа, то необходимо присвоить Объекту ТЧ результат выборки
В модуле формы:
Объект.<ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>
В модуле объекта: <ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>

В первом коде где запрос вы получаете только ссылку. Чтобы получить Объект для изменения необходимо использовать метод ПолучитьОбъект()
Объект = Ссылка.ПолучитьОбъект()

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

А в дальнейшем, если будут в ручную вводится номера, лучше вообще это обработать в событии ПриИзменении реквизита НомерИнвойса
3. Lllypuk 29.09.22 14:02 Сейчас в теме
(2) Делаю в модуле формы:
	ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
	ДокументОбъект.Товары.СправочникНомерИнвойса = Выборка.НомерИнвойса; 

Дает ошибку: Поле объекта не обнаружено (СправочникНомерИнвойса)
4. YozZzhik 29.09.22 14:13 Сейчас в теме
(3) Во-первых, что вы хотите сделать?
Во-вторых, у вас какой-то круговорот инвойса в 1С происходит)
У вас сейчас есть табличная часть где заполнен строковый реквизит НомерИнвойса, но не заполнен реквизит с ссылкой на справочник с номерами инвойсов. Вы нажимаете кнопку, программа на сервере делает запрос к БД, где берет вообще все данные всех табличных частей, которые есть в системе. Далее вы, обходя каждую строку запроса, пытаетесь получить объект по ссылке и найти строку для изменения. Это какая-то ерунда

Для чего вы вообще используете запрос? Запросом можно только получить данные, но не менять их. Табличная часть документа для обработки у вас доступна при обращении к Объект.Товары.
5. Zevzm 29.09.22 14:15 Сейчас в теме
(3) Ну так "ДокументОбъект.Товары" это табличная часть, которая состоит из строк. Перебирайте строки и обращайтесь к реквизитам строки. У вас в документах часть реквизитов "Справочник Номер Инвойса" не заполнены или все?
6. Lllypuk 29.09.22 14:19 Сейчас в теме
(2) Я делал через цикл

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


Вот так:
	Для Каждого СтрокаТч Из Метаданные.Документы.ЗаказПоставщику.ТабличныеЧасти.Товары.Реквизиты Цикл			
		СтрокаТч.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
  	КонецЦикла;


Но ошибка "Поле объекта не обнаружено (СправочникНомерИнвойса)"
7. user1831019 29.09.22 14:22 Сейчас в теме
(6) Ну значит нет таких метаданных. Обращайтесь к данным по их именам, а не по тому, как вам удобнее.
8. YozZzhik 29.09.22 14:22 Сейчас в теме
(6) Очень много точек. Достаточно на форме использовать "Из Объект.Товары Цикл"
И для понятности, делайте точку останова и проверяйте переменную, что в ней вообще находится - правой кнопкой на переменную - вычислить выражение
9. Lllypuk 29.09.22 14:24 Сейчас в теме
Было первоначально поле "Номер инвойса" оно текстовое, в него вносились номера. Потом захотели добавить поле чтобы туда можно было вносить и дату и комментарий, по этому был создан справочник с формой, а в табличной части реквизит "СправочникНомерИнвойса". В этот справочник я обработкой уже перенес все существующие инвойсы, теперь пытаюсь добавить в поле табличной части СправочникНомерИнвойса = Номер инвойса , чтобы потом удалить поле "Номер инвойса" окончательно
10. YozZzhik 29.09.22 14:26 Сейчас в теме
(9) удаляйте все и пишите:
Для Каждого СтрокаТЧ ИЗ Объект.Товары Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
11. Lllypuk 29.09.22 14:38 Сейчас в теме
(10) А как указать что мне нужны ТЧ только по документам "Заказ поставщику" ? Если так не верно - Метаданные.Документы.ЗаказПоставщику.ТабличныеЧасти.Товары.Реквизиты
12. Zevzm 29.09.22 14:40 Сейчас в теме
(11)Выберите запросом нужные вам документы и перебирайте выборку. Внутри цикла используйте то, что вам написали в (10)
13. YozZzhik 29.09.22 14:49 Сейчас в теме
(11) Понял, тут немного я затупил, думал, что у вас кнопка на форме.
Ваш план таков:
1. пишете запрос - получаете оттуда только ссылки на документы
2. получаете объект по ссылке для изменения
3. меняете нужный реквизит, записываете объект
14. Zevzm 29.09.22 14:51 Сейчас в теме
(13) Насколько я понял у него внешняя обработка и список документов он получает произвольный: "Делаю это через обработку по кнопке пуск"
15. YozZzhik 29.09.22 14:52 Сейчас в теме
(14) дада, я понял уже, исправил сообщение
16. Lllypuk 29.09.22 14:56 Сейчас в теме
(15)Да, сделал уже всё успешно. Спасибо за помощь!

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

Показать
17. YozZzhik 29.09.22 14:58 Сейчас в теме
(16)
&НаСервере
Процедура ПускНаСервере()

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

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