Не уверен, что делаю всё правильно, поэтому вопросы по правильности решений (задачи переформулированы):
1. В документе имеется табличная часть с реквизитом Товары.
По подписке "обработка проведения" документа, по товару отбирается склад и другие реквизиты и ресурс из периодического регистра:
Стракт= Новый Структура;
Стракт.Вставить("Товар", Источник.ТабЧасть.ВыгрузитьКолонку("Товары"));
СкладыТоваров= РегистрыСведений.СкладыТоваров.СрезПоследних(Источник.Дата, Стракт);
2. В документе нет указания, что он формирует движения по периодическому регистру сведений "РегСв", таким образом, как я понимаю, чистить движения нужно самостоятельно, для того чтобы получить состояние регистра на дату документа:
НаборЗаписей= РегистрыСведений.РегСВ.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Источник.Ссылка);
НаборЗаписей.Записать();
3. Нужно создать таблицу значений аналогичной структуры как РегСВ:
ТЗВсеСклады= НаборЗаписей.Выгрузить();
4. Полученную выборку необходимо отсортировать по реквизиту "Склад":
СкладыТоваров.Сортировать("Склад");
и при определённых условиях остальных реквизитов - опустошить значение ресурса, но так как обход идёт по неизвестному заранее сценарию (надо ли опустошать и несколько записей регистра или одну), то получается такая схема:
ПредыдущийСклад= Неопределено;
ТЗОпустошения= Неопределено;
ВыполнениеУсловияОпустошения= ложь;
Для каждого Стр из СкладыТоваров Цикл
Если ПредыдущийСклад <> Стр.Склад Тогда
Если ПредыдущийСклад <> неопределено Тогда
Если ВыполнениеУсловияОпустошения Тогда
Необходимо скопировать ТЗОпустошения в ТЗВсеСклады
Для каждого Стр2 из ТЗОпустошения Цикл
НовСтр= ТЗВсеСклады.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, Стр2);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ПредыдущийСклад= Стр.Склад;
ВыполнениеУсловияОпустошения= ложь;
КонецЕсли;
Если НЕ ПроверкаВыполненияУсловияОпустошения(Стр, ТЗОпустошения) Тогда
Если НужноОпустошить(Стр) Тогда
НовСтр= ТЗВсеСклады.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, Стр);
КонецЕсли;
Иначе
ВыполнениеУсловияОпустошения= Истина;
КонецЕсли;
КонецЦикла;
и повтор кода (здесь сделано через повтор, чтобы не путать текстом оптимизации, типа - зачем добавляется пустая строка в СкладыТоваров):
Если ПредыдущийСклад <> неопределено Тогда ... КонецЕсли;
Получается, что при заполнении по Стр, а затем по вдруг необходимому заполнению по Стр2 (которая может включать в себя отдельные записи Стр, уже добавленные) в ТЗВсеСклады появятся дублирующиеся записи, которые необходимо свернуть по реквизитам и ресурсам РегСВ:
Метаданное= Метаданные.РегистрыСведений.РегСВ;
СтрСвернуть= "";
Для каждого Стр из Метаданное.Реквизиты Цикл
СтрСвернуть= СтрСвернуть + "," + Стр.Имя;
КонецЦикла;
Для каждого Стр из Метаданное.Ресурсы Цикл
СтрСвернуть= СтрСвернуть + "," + Стр.Имя;
КонецЦикла;
ТЗВсеСклады.Свернуть(Сред(СтрСвернуть, 2));
5. И когда ТЗВсеСклады подготовлена к записи в регистр РегСВ, ведь с дублирующимися записями регистр не запишется:
НаборЗаписей.Загрузить(ТЗВсеСклады);
НаборЗаписей.Записать();
6. Что нужно изменить, чтобы было правильно? ))
Спасибо.