Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 23:50

Сворачивать, сортировать набор записей

Автор bolobol, 09 окт 2011, 00:25

0 Пользователей и 1 гость просматривают эту тему.

bolobol

Здравствуйте.

Не уверен, что делаю всё правильно, поэтому вопросы по правильности решений (задачи переформулированы):
1. В документе имеется табличная часть с реквизитом Товары.
По подписке "обработка проведения" документа, по товару отбирается склад и другие реквизиты и ресурс из периодического регистра:
Стракт= Новый Структура;
Стракт.Вставить("Товар", Источник.ТабЧасть.ВыгрузитьКолонку("Товары"));
СкладыТоваров= РегистрыСведений.СкладыТоваров.СрезПоследних(Источник.Дата, Стракт);


2. В документе нет указания, что он формирует движения по периодическому регистру сведений "РегСв", таким образом, как я понимаю, чистить движения нужно самостоятельно, для того чтобы получить состояние регистра на дату документа:
НаборЗаписей= РегистрыСведений.РегСВ.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Источник.Ссылка);
НаборЗаписей.Записать();


3. Нужно создать таблицу значений аналогичной структуры как РегСВ:
ТЗВсеСклады= НаборЗаписей.Выгрузить();

4. Полученную выборку необходимо отсортировать по реквизиту "Склад":
СкладыТоваров.Сортировать("Склад");
и при определённых условиях остальных реквизитов - опустошить значение ресурса, но так как обход идёт по неизвестному заранее сценарию (надо ли опустошать и несколько записей регистра или одну), то получается такая схема:
ПредыдущийСклад= Неопределено;
ТЗОпустошения= Неопределено;
ВыполнениеУсловияОпустошения= ложь;
Для каждого Стр из СкладыТоваров Цикл
   Если ПредыдущийСклад <> Стр.Склад Тогда
      Если ПредыдущийСклад <> неопределено Тогда
         Если ВыполнениеУсловияОпустошения Тогда

Необходимо скопировать ТЗОпустошения в ТЗВсеСклады
            Для каждого Стр2 из ТЗОпустошения Цикл
               НовСтр= ТЗВсеСклады.Добавить();
               ЗаполнитьЗначенияСвойств(НовСтр, Стр2);
            КонецЦикла;

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

и повтор кода (здесь сделано через повтор, чтобы не путать текстом оптимизации, типа - зачем добавляется пустая строка в СкладыТоваров):
Если ПредыдущийСклад <> неопределено Тогда ... КонецЕсли;
Получается, что при заполнении по Стр, а затем по вдруг необходимому заполнению по Стр2 (которая может включать в себя отдельные записи Стр, уже добавленные) в ТЗВсеСклады появятся дублирующиеся записи, которые необходимо свернуть по реквизитам и ресурсам РегСВ:
Метаданное= Метаданные.РегистрыСведений.РегСВ;
СтрСвернуть= "";
Для каждого Стр из Метаданное.Реквизиты Цикл
   СтрСвернуть= СтрСвернуть + "," + Стр.Имя;
КонецЦикла;
Для каждого Стр из Метаданное.Ресурсы Цикл
   СтрСвернуть= СтрСвернуть + "," + Стр.Имя;
КонецЦикла;
ТЗВсеСклады.Свернуть(Сред(СтрСвернуть, 2));


5. И когда ТЗВсеСклады подготовлена к записи в регистр РегСВ, ведь с дублирующимися записями регистр не запишется:
НаборЗаписей.Загрузить(ТЗВсеСклады);
НаборЗаписей.Записать();


6. Что нужно изменить, чтобы было правильно? ))

Спасибо.

comol

По-моему нужно чуть поучиться пользоваться отладчиком - представлением выражений и просмотром их  и вы сами свои вопросы решите... а так это конечно долго разбираться в том что там у вас получается...
Статьи по оптимизации 1С: http://comol.livejournal.com/

bolobol

Цитата: comol от 09 окт 2011, 12:34
По-моему нужно чуть поучиться пользоваться отладчиком - представлением выражений и просмотром их  и вы сами свои вопросы решите... а так это конечно долго разбираться в том что там у вас получается...
По-моему, я что-то слышал про это средство, не могу вспомнить только где ))
Вот, по поводу первого пункта - он не работает. Вопрос - почему ИЛИ как правильно исправить? Тут уж за разработчика не догадаешься, либо знания, либо толковая литература, которой, к сожалению, найдено не было.

Klyacksa

Отладчик - в Конфигураторе ставим точки останова в нужных местах (не ленимся, ищем их установку в меню, там все прозрачно), запускаем предприятие в режиме отладки (так же из основного меню Конфигуратора), и изучаем меню "Отладка", много там чего интересного есть.

Про первый пункт - кто ж в Структуру засовывает целую колонку значений... Структура - это соответствие "Ключ"->"Значение". То есть, в Вашем случае, "Товар"->Конфета (ссылка на товар из справочника)
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск