Программная обработка табличной части документа

1. user1484450 28.10.20 10:00 Сейчас в теме
Здравствуйте! Подскажите, пожалуйста, как в обработке изменить программно табличную часть документа?
Есть обработка, на ней табличная часть документа выбрана с помощью динамического списка. Условно, при нажатии кнопки на форме, ячейка поля "Готовность" должно меняться на Истину.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 28.10.20 10:03 Сейчас в теме
(1)
табличная часть документа выбрана с помощью динамического списка
- это как ?
3. user1484450 28.10.20 10:09 Сейчас в теме
(2)
- это как ?


Динамический список, в нём запрос:
ВЫБРАТЬ
	ЗаказНаряд.Наряд КАК Наряд,
	ЗаказНаряд.Статус КАК Статус,
	ЗаказНаряд.Поставщик КАК Поставщик,
	ЗаказНаряд.Ссылка как Ссылка1,
	&Отправить как Отправить,
	Выбор
	Когда 
		ЗаказНаряд.Наряд = Значение(Перечисление.Статус.Отправлен)
		тогда 0
		Иначе 1
		Конец как Загрузка
ИЗ
	Документ.Заказ.Наряд КАК ЗаказНаряд
{ГДЕ
	ЗаказНаряд.Поставщик = &Поставщик }
Показать

Который выбирает все наряды указанного поставщика.
4. alex-l19041 8 28.10.20 10:12 Сейчас в теме
(1)
поля "Готовность" должно меняться
- это реквизит документа Заказ ?
5. VictorRGB2 14 28.10.20 10:12 Сейчас в теме
(1) поле где, в документе?
в табличной части или в шапке?

если в шапке - надо просто получить документ как объект и записать ему изменения
если в тч - надо опять получить документ как объект, и перезаполнить ему тч\для нужного поля установить нужное значение в соответствии с данными тч обработки по ключу связи в строке
PhoenixAOD; alex-l19041; +2 Ответить
6. user1484450 28.10.20 10:16 Сейчас в теме
(4)
(5)
Извиняюсь, поле "Статус" должно меняться на "истина" по нажатии кнопки.
8. FatPanzer 28.10.20 10:21 Сейчас в теме
(6) Да хоть "Фигакус"... Вам объясняют порядок действий с документом. Он не зависит от имен реквизитов внутри документа...
17. пользователь 11.02.24 19:59
Сообщение было скрыто модератором.
...
18. пользователь 11.02.24 20:18
Сообщение было скрыто модератором.
...
7. user1484450 28.10.20 10:17 Сейчас в теме
(5)
если в тч - надо опять получить документ как объект, и перезаполнить ему тч\для нужного поля установить нужное значение в соответствии с данными тч обработки по ключу связи в строке


Можно пример, пожалуйста?
9. FatPanzer 28.10.20 10:24 Сейчас в теме
(7)
ДокОбъект = СсылкаДокумента.ПолучитьОбъект();
ДокОбъект.РеквизитШапки = НовоеЗначениеРеквизитаШапки;
Для Каждого Строка ТЧ из ДокОбъект.ИмяТабличнойЧасти Цикл
    СтрокаТЧ.РеквизитТабличнойЧасти = НовоеЗначениеРеквизитаТабличнойЧасти;
КонецЦикла;
ДокОбъект.Записать();
Первый класс же. Или прогуливали уроки?
PhoenixAOD; +1 Ответить
10. VictorRGB2 14 28.10.20 10:44 Сейчас в теме
(7) пример общий дали уже в (9)
или можно такой, с ключем связи, но для этого надо и в запрос ввести его же
ДокОбъект = СсылкаДокумента.ПолучитьОбъект();
Для Каждого СтрокаТЧ из Обработка.ИмяТабличнойЧасти Цикл
    ДокОбъект.ИмяТабличнойЧасти[СтрокаТЧ.НомерСтроки-1].РеквизитТабличнойЧасти = СтрокаТЧ.ЗначениеРеквизитаТабличнойЧасти;
КонецЦикла;
ДокОбъект.Записать();

// где СтрокаТЧ.НомерСтроки -номер строки тч документа из запроса, а минус 1 - и получаем индекс строки
user1464234; +1 Ответить
11. user1484450 28.10.20 11:06 Сейчас в теме
(10)
Спасибо за ответ!
Теперь такая проблема: Не определяется СтрокаТЧ, поэтому выдаёт ошибку "Итератор для значения не определен".
&НаКлиенте
Процедура НарядыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
		Если Поле.Имя = "НарядыОтправить" тогда;
		ТекДанные = Элементы.Наряды.ТекущиеДанные;
		
		ТекДанные.Статус = ИзменитьСтатус(ТекДанные.Ссылка);
		Сообщить(ИзменитьСтатус(ТекДанные.Ссылка));
		КонецЕсли;
КонецПроцедуры

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

Показать
12. user1357043 28.10.20 11:12 Сейчас в теме
(11) Может так:
Пока Выборка1.Следующий() Цикл
        Док = Выборка1.Ссылка.ПолучитьОбъект();
        Выборка2 = Выборка1.Наряды.Выбрать();
        Пока Выборка2.Следующий() Цикл...
13. FatPanzer 28.10.20 11:15 Сейчас в теме
(12) Все-таки прогуливали школу, ок... Но вы попробуйте, прежде чем предполагать. Сами все поймете.
14. user1357043 28.10.20 11:28 Сейчас в теме
(13) Расскажи же мне, о Великий Учитель Первых Классов, что же я не так написал, если у меня вот этот код прекрасно работает (без ошибок и выводит то, что нужно):
&НаСервереБезКонтекста
Процедура кВыполнитьНаСервере(Док)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	РеализацияТоваровУслуг.Ссылка КАК Ссылка,
	               |	РеализацияТоваровУслуг.Товары.(
	               |		Ссылка КАК Ссылка,
	               |		НомерСтроки КАК НомерСтроки,
	               |		Номенклатура КАК Номенклатура,
	               |		КоличествоМест КАК КоличествоМест,
	               |		ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	               |		Коэффициент КАК Коэффициент,
	               |		Количество КАК Количество,
	               |		Цена КАК Цена,
	               |		Сумма КАК Сумма
	               |	) КАК Товары
	               |ИЗ
	               |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	               |ГДЕ
	               |	РеализацияТоваровУслуг.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", Док);
	Выборка1 = Запрос.Выполнить().Выбрать();
	Пока Выборка1.Следующий() Цикл
		ДокТМП = Выборка1.Ссылка.ПолучитьОбъект();
		Выборка2 = Выборка1.Товары.Выбрать();
		Пока Выборка2.Следующий() Цикл
			Сообщить(Выборка2.Номенклатура);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры
Показать

Если Вы вдруг не поняли, то я отвечал на вопрос, почему выходит ошибка и как сделать правильно.
Видимо, изучают это уже не в первом классе...
15. VictorRGB2 14 28.10.20 12:16 Сейчас в теме
(12) во первых уже сами ответили на свой вопрос и понял в чем ошибка была
во вторых - судя по коду, статус надо изменить для документа и для ВСЕХ строк тч

для этого не надо цикл обхода, достаточно использовать ЗаполнитьЗначения(<Значение>, <Колонка>)
и тогда все упростится до, например
Док = Тек.ПолучитьОбъект();
Док.Статус = Перечисления.СтатусНаряды.Отправлен;
Док.Наряды.ЗаполнитьЗначения(Перечисления.СтатусНаряды.Отправлен, "Статус");
Док.Записать();
user1464234; +1 Ответить
16. user1357043 28.10.20 12:18 Сейчас в теме
(15)я отвечал исключительно на вопрос о том, почему возникает ошибка "Итератор для значения не определен".
Оставьте свое сообщение

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