8 июн. 2012 г.

Параметры расшифровки


На днях пришлось разбирать следующую проблему: при обходе выборки формировался список значений и передавался в параметры расшифровки табличного документа. Но в результирующем документе расшифровка содержала отличные от расчетных значения. Причем в отладчике было видно, что в параметры заходят верные данные.
Я набросал простой код, моделирующий ситуацию. Результатом обработки должен стать табличный документ, содержащий столбец чисел. При расшифровке значения должен выдаваться список значений, содержащий следующие данные: для 1 - 1; для 2 - 1, 2; для 3 - 1, 2, 3. В результате получаем для всех чисел один и тот же список: 1, 2, 3. Почему?

    Макет = ПолучитьМакет("Макет");
   
ОблСтрока = Макет.ПолучитьОбласть("Строка");
   
спЗначений = Новый СписокЗначений;
   
ТабДок = ЭлементыФормы.ТабДок;
   
ТабДок.Очистить();

    Для
а = 1 По 3 Цикл
       
спЗначений.Очистить();
        Для
б = 1 По а Цикл
           
спЗначений.Добавить(б);
        КонецЦикла;
       
ОблСтрока.Параметры.ТекЗначение = а;
       
ОблСтрока.Параметры.спЗначений = спЗначений;
       
ТабДок.Вывести(ОблСтрока);
    КонецЦикла;

   
ТабДок.ТолькоПросмотр = Истина;

Предлагаю скачать обработку, чтобы в этом убедиться и найти решение.

А дело вот в чем:
Мы объявили список до цикла, а в самом цикле уже очищаем его и заполняем значениями. И в значение расшифровки каждый раз помещается ссылка на один и тот же список. Для корректной работы объявление списка необходимо поместить в первый цикл.

    Макет = ПолучитьМакет("Макет");
   
ОблСтрока = Макет.ПолучитьОбласть("Строка");

   
ТабДок = ЭлементыФормы.ТабДок;
   
ТабДок.Очистить();

    Для
а = 1 По 3 Цикл
       
спЗначений = Новый СписокЗначений;
        Для
б = 1 По а Цикл
           
спЗначений.Добавить(б);
        КонецЦикла;
       
ОблСтрока.Параметры.ТекЗначение = а;
       
ОблСтрока.Параметры.спЗначений = спЗначений;
       
ТабДок.Вывести(ОблСтрока);
    КонецЦикла;

   
ТабДок.ТолькоПросмотр = Истина;

1 комментарий:

  1. Поменяйте в цикле "спЗначений.Очистить();" на "спЗначений = Новый СписокЗначений;" - и будет Вам счастье

    ОтветитьУдалить