Запись изменений в табличной части документа

1. ShramkoRS 14.04.23 12:21 Сейчас в теме
Я вроде бы уже писал с подбной проблемой, но методы которые мне посоветовали там не спасают.

Задача: сделать одноразовую обработку, которая пройдется по документам и заполнит недавно добавленные поля ТЧ.

Вычитал в СП про метод ЗагрузитьКолонку, показалось удобным (по крайней мере я воспринял это как оптимальный варинат), однако оно не работает. Подскажите, пожалуйста, как исправить.

Процедура ЗаполнениеТЧ() Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ижЗаказПокупателя.Ссылка КАК Ссылка,
	|	ижЗаказПокупателя.Контрагент.КодПоОКПО
	|ИЗ
	|	Документ.ижЗаказПокупателя.Товары КАК ижЗаказПокупателяТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ижЗаказПокупателя КАК ижЗаказПокупателя
	|		ПО ижЗаказПокупателяТовары.Ссылка = ижЗаказПокупателя.Ссылка
	|ГДЕ
	|	ижЗаказПокупателяТовары.ижВерхнийОпцион = 0
	|	И ижЗаказПокупателяТовары.ижНижнийОпцион = 0");
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	ТЗ.Индексы.Добавить("Ссылка");
	Доки = ТЗ.Скопировать(, "Ссылка");
	Доки.Свернуть("Ссылка");
	Для Каждого Док Из Доки Цикл
		ДокументОбъект = Док.Ссылка.ПолучитьОбъект();
		Опцион = ?(ДокументОбъект.Контрагент.КодПоОКПО = "77304466",5,10);
		Товары = ДокументОбъект.Товары;
		ОпционыВ = Новый Массив(Товары.Количество());
		ОпционыН = Новый Массив(Товары.Количество());
		Для Ь = 0 по (Товары.Количество()-1)Цикл
			ОпционыВ[Ь] = Опцион;
			ОпционыН[Ь] = Опцион * -1;
		КонецЦикла;
		ДокументОбъект.Товары.ЗагрузитьКолонку(ОпционыВ, "ижВерхнийОпцион");
		ДокументОбъект.Товары.ЗагрузитьКолонку(ОпционыН, "ижНижнийОпцион");
		ДокументОбъект.Записать();
		Прервать;
	КонецЦикла;
	
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
2. user1936660 14.04.23 12:44 Сейчас в теме
(1)
Вычитал в СП
Горе от ума.

ДокументОбъект = Док.Ссылка.ПолучитьОбъект();
Опцион = ?(ДокументОбъект.Контрагент.КодПоОКПО = "77304466",5,10);

Для Каждого СтрокаДокумента Из ДокументОбъект.Товары Цикл
    СтрокаДокумента.ижВерхнийОпцион = Опцион;
    СтрокаДокумента.ижНижнийОпцион = - Опцион;
КонецЦикла;

ДокументОбъект.Записать();
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1936660 14.04.23 12:44 Сейчас в теме
(1)
Вычитал в СП
Горе от ума.

ДокументОбъект = Док.Ссылка.ПолучитьОбъект();
Опцион = ?(ДокументОбъект.Контрагент.КодПоОКПО = "77304466",5,10);

Для Каждого СтрокаДокумента Из ДокументОбъект.Товары Цикл
    СтрокаДокумента.ижВерхнийОпцион = Опцион;
    СтрокаДокумента.ижНижнийОпцион = - Опцион;
КонецЦикла;

ДокументОбъект.Записать();
Показать
3. nomad_irk 76 14.04.23 13:29 Сейчас в теме
(1)
Запрос = Новый Запрос;
запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ижЗаказПокупателяТовары.Ссылка КАК Документ,
    |    ВЫБОР
    |            КОГДА ЕСТЬNULL(СпрКонтрагенты.КодПоОКПО, "") = "77304466"
    |                  ТОГДА 5
    |            ИНАЧЕ 10
    |    КОНЕЦ КАК ижВерхнийОпцион,
    |    ВЫБОР
    |            КОГДА ЕСТЬNULL(СпрКонтрагенты.КодПоОКПО, "") = "77304466"
    |                  ТОГДА -5
    |            ИНАЧЕ -10
    |    КОНЕЦ КАК ижНижнийОпцион
    |ИЗ
    |    Документ.ижЗаказПокупателя.Товары КАК ижЗаказПокупателяТовары
    |       ВНУТРЕНЕЕ СОЕДИНЕНИЕ Документ.ижЗаказПокупателя КАК Документы
    |           ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты
    |           ПО Документы.Контрагент = СпрКонтрагенты.Ссылка
    |       ПО ижЗаказПокупателяТовары.Ссылка = Документы.Ссылка
    |             И ижЗаказПокупателяТовары.ижВерхнийОпцион = 0
    |             И ижЗаказПокупателяТовары.ижНижнийОпцион = 0";
ВыборкаДокументы = Запрос.Выполнить().Выбрать();
Пока ВыборкаДокументы.Следующий() Цикл
    ДокОбъект = ВыборкаДокументы.Документ.ПолучитьОбъект();
    ТЗ = ДокОбъект.Товары.Выгрузить();
    ТЗ.ЗаполнитьЗначения("ижВерхнийОпцион", ВыборкаДокументы.ижВерхнийОпцион);
    ТЗ.ЗаполнитьЗначения("ижНижнийОпцион", ВыборкаДокументы.ижНижнийОпцион);
    ДокОбъект.Товары.Загрузить(ТЗ);
    ДокОбъект.Записать();
КонецЦикла;
Показать
4. user1936660 14.04.23 13:38 Сейчас в теме
(3) Еще одно горе от другого ума...

1) Контрагент в шапке, а не в табличной части
2) Достаточно выбирать Ссылка + НомерСтроки, тогда второй цикл банален.
5. nomad_irk 76 14.04.23 13:44 Сейчас в теме
(4)
Контрагент в шапке, а не в табличной части

исправил запрос и постобработку
6. user1936660 14.04.23 13:53 Сейчас в теме
Всё куда проще:
Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    ижЗаказПокупателяТовары.Ссылка КАК Ссылка,
    |    ижЗаказПокупателяТовары.НомерСтроки КАК НомерСтроки,
    |    ВЫБОР
    |            КОГДА ижЗаказПокупателя.Ссылка.Контрагент.КодПоОКПО = "77304466"
    |                  ТОГДА 5
    |            ИНАЧЕ 10
    |    КОНЕЦ КАК ижВерхнийОпцион,
    |    ВЫБОР
    |            КОГДА ижЗаказПокупателя.Ссылка.Контрагент.КодПоОКПО = "77304466"
    |                  ТОГДА -5
    |            ИНАЧЕ -10
    |    КОНЕЦ КАК ижНижнийОпцион
    |ИЗ
    |    Документ.ижЗаказПокупателя.Товары КАК ижЗаказПокупателяТовары
    |ГДЕ
    |    ижЗаказПокупателяТовары.ижВерхнийОпцион = 0
    |    И ижЗаказПокупателяТовары.ижНижнийОпцион = 0
    |ИТОГИ ПО
    |    Ссылка");
ВыборкаДокументы = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДокументы.Следующий() Цикл
    ДокОбъект = ВыборкаДокументы.Ссылка.ПолучитьОбъект();
    Товары = ДокОбъект.Товары

    ВыборкаСтроки = ВыборкаДокументы.Выбрать();
    Пока ВыборкаСтроки.Следующий() Цикл
        ЗаполнитьЗначениеСвойств(Товары[ВыборкаСтроки.НомерСтроки], ВыборкаСтроки, "ижВерхнийОпцион, ижНижнийОпцион");
    КонецЦикла;

    ДокОбъект.Записать();
КонецЦикла;
Показать


Не запускал.
8. nomad_irk 76 14.04.23 13:55 Сейчас в теме
(6)
ЗаполнитьЗначениеСвойств(Товары[ВыборкаСтроки.НомерСтроки], ВыборкаСтроки, "ижВерхнийОпцион, ижНижнийОпцион");

да, да, проще....:)
9. user1936660 14.04.23 13:57 Сейчас в теме
(8) Если что, то твой код вообще всю табличную часть документа портит, невизирая на то в какой строке что находится.
7. user1936660 14.04.23 13:55 Сейчас в теме
Минус единичку в индексе товаров забыл. Можно сразу в запросе отнять.
Оставьте свое сообщение

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