Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Предприятие 7.7 Установка Списка значений в Таблицу Значений          
Sharzem Подменю пользователя
сообщение 06.08.15, 19:15
Сообщение #1

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Имеется вот такой кусок кода:
//лпТЗ = Таблица Значений в строках которой уже есть Списки Значений, которые должны быть еще обработаны и обратно помещены в эти строки, колонка - "Параметры"
//лпНовоеЗначение - Какое то там значение полученное в процессе обработки, тип любой

лпКолСтрок = лпТЗ.КоличествоСтрок();
Для лпСч = 1 По лпКолСтрок Цикл
    лпТЗ.ПолучитьСтрокуПоНомеру(лпСч);
    лпНовоеЗначение = ПолучитьКакоеТоТамЗначение(Парам1,Парам2);
    лпЗначение = лпТЗ.ПолучитьЗначение(лпСч,"Параметры");
    лпЗначение.Установить("Значение",лпНовоеЗначение);
    лпТЗ.УстановитьЗначение(лпСч,"Параметры",лпЗначение);
КонецЦикла


В таком случае получается заполненая Таблица значений где в Списках значений во всех строках присутствует одно и тоже значение которое было последним полученым в цикле. 19000000.gif

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


Кстати, вот так тоже не работает:
лпТЗ.Параметры.Установить("Значение",лпНовоеЗначение);


Вопрос: Что неправильно в первом варрианте ? Почему без СоздатьОбъект("СписокЗначений") последнее полученное значение расставляется в уже обработанные строки ? Как будет правильнее реализовать установку Списка значений в Таблицу значений ?

Сообщение отредактировал Sharzem - 06.08.15, 19:33


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Домовик Подменю пользователя
сообщение 06.08.15, 19:54
Сообщение #2

Ветеран
Иконка группы
Группа: Местный
Сообщений: 975
Из: Киев
Спасибо сказали: 168 раз
Рейтинг: 0

а так, наверное, тоже работает?

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


оно как бы создает копию, но с той же ссылкой...(в первом коде)...


Сообщение отредактировал Домовик - 06.08.15, 20:11

Sharzem Подменю пользователя
сообщение 06.08.15, 20:18
Сообщение #3

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Цитата(Домовик @ 06.08.15, 20:54) *
оно как бы создает копию, но с той же ссылкой...(в первом коде)...


Вы знаете, на самом деле оказалось все намного хуже. Ни один из всех описанных выше варриантов не работоспособны... Со времени когда была выложена тема попробовал еще парочку варриантов, но увы... не выходит icon_cuss.gif


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

vadim007 Подменю пользователя
сообщение 06.08.15, 20:32
Сообщение #4

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1298
Из: Донецк
Спасибо сказали: 208 раз
Рейтинг: 0

Покажите код начального заполнения таблицы лпТЗ.
Похоже, что уже на этом этапе вы в столбец Параметр всех строк записываете один и тот-же список значений.

Sharzem Подменю пользователя
сообщение 06.08.15, 20:43
Сообщение #5

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Цитата(vadim007 @ 06.08.15, 21:32) *
Покажите код начального заполнения таблицы

К сожалению очень много, вряд ли будет читабельным... Но поверьте, что данные там абсолютно разные. Заполнение происходит из других обработок. На завтра постараюсь сделать готовую заполненую универсальную форму.


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Домовик Подменю пользователя
сообщение 06.08.15, 21:51
Сообщение #6

Ветеран
Иконка группы
Группа: Местный
Сообщений: 975
Из: Киев
Спасибо сказали: 168 раз
Рейтинг: 0

поняла.
список один и тот же, кот висит на всю таблицу.
вы когда строки в табзнач создавали, то список указывали одной и той же переменной.
добавьте еще одну строку, списокзначений задайте другой, с другой переменной и созданной отдельно через СоздатьОбъект().
и увидите, последнее значение будет отличаться.
понятия не имею, как только с этим работать.

хоть это и некрасиво, проще всего при создании строк, в цикле создавать объект список и заполнять - будет потом пересчитывать.

Сообщение отредактировал Домовик - 06.08.15, 22:14

Sharzem Подменю пользователя
сообщение 06.08.15, 22:25
Сообщение #7

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Нет, к сожалению, эта догадка мимо. Список в таблицу попадает в виде возврата из другой обработки
В доп обработке:
Форма.Параметр.Установить("Выполнить",1);

В основной:
Выполнить = СписЗнач.Получить("Выполнить"); 
Если Выполнить = 1 Тогда
лпТЗ.НоваяСтрока()
лпТЗ.Параметры = СоздатьОбъект("СписокЗначений");
СписЗнач.Выгрузить(лпТЗ.Параметры);

Но суть не в том. Впервые за годы почти ежедневного программирования, о себе могу сказать зірка в шоці !
Значения стали обновляться корректно, но я не понимаю почему:
лпКолСтрок = лпТЗ.КоличествоСтрок();
Для лпСч = 1 По лпКолСтрок Цикл
    лпТЗ.ПолучитьСтрокуПоНомеру(лпСч);
    лпНовоеЗначение = ПолучитьКакоеТоТамЗначение(Парам1,Парам2);
    лпЗначение = лпТЗ.ПолучитьЗначение(лпСч,"Параметры");
    лпЗначение.Установить("Значение",лпНовоеЗначение);
    //лпТЗ.УстановитьЗначение(лпСч,"Параметры",лпЗначение); УБРАЛ СТРОКУ !
КонецЦикла

И это все ! Где логика ? Почему оно так работает ? Почему полученое значение после редактирования само установилось в ячейку, или оно и есть ячейка ? А чем не нравится 1 С-ке УстановитьЗначение() - это ведь прямая запись в нужном месте ?


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

vadim007 Подменю пользователя
сообщение 07.08.15, 7:27
Сообщение #8

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1298
Из: Донецк
Спасибо сказали: 208 раз
Рейтинг: 0

Цитата(Sharzem @ 06.08.15, 23:25) *
зірка в шоці

Как только это просмотрели?!:
Цитата(Sharzem @ 06.08.15, 23:25) *
лпЗначение = лпТЗ.ПолучитьЗначение(лпСч,"Параметры");
лпЗначение.Установить("Значение",лпНовоеЗначение);

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

Спасибо сказали: Sharzem,

Домовик Подменю пользователя
сообщение 07.08.15, 8:01
Сообщение #9

Ветеран
Иконка группы
Группа: Местный
Сообщений: 975
Из: Киев
Спасибо сказали: 168 раз
Рейтинг: 0

тестирую, у меня и этот ниже кусок работает. при условии, что изначально при создании строк и формир. списков в цикле СоздатьОбъект() используется.
(как и при схеме создания строк и заполнения списков Sharzem).



     для Инд=1 по 4 цикл 
         текСписок=тз.ПолучитьЗначение(Инд,"Параметры");
         текСписок.УстановитьЗначение(2,    число(текСписок.ПолучитьЗначение(2))*инд);    
     КонецЦикла;


Сообщение отредактировал Домовик - 07.08.15, 8:13

Спасибо сказали: Sharzem,

Sharzem Подменю пользователя
сообщение 07.08.15, 9:06
Сообщение #10

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Цитата(vadim007 @ 07.08.15, 8:27) *
Операция лпЗначение = лпТЗ.ПолучитьЗначение(лпСч,"Параметры") присваивает ей адрес списка


Вы знаете, вот не могу как-то с этим согласиться.
ПолучитьЗначение(<?>,);
Синтаксис:
ПолучитьЗначение(<Строка>,<Колонка>)
Назначение:
Получить значение заданной ячейки таблицы значений. Возвращает значение заданной ячейки.
Параметры:
<Строка> - номер строки.
<Колонка> - номер или идентификатор колонки.

Вот именно, что должно быть значение, а не ссылочность.
Цитата(vadim007 @ 07.08.15, 8:27) *
Ведь в ячейках таблицы хранятся ссылки на список значений


С каких это пор ? Хорошо, вариант такой: имеется колонка с типом значения "ТаблицаЗначений" и если мы не сделаем либо УстановитьЗначение(), либо Выгрузить(), так как с ситуацией со списком, работать не будет.
Похоже может возникнуть спор... Нужна демонстрационная обрабока с варриантами, но к сожалению на сегодня критично нужно закончить работу, обязательно сделаю и выложу дабы не городить огород. Мне кажется что данная ситуация это какой-то баг, хотя зірка може помилятися 19000000.gif

Цитата(Домовик @ 07.08.15, 9:01) *
у меня и этот ниже кусок работает


У Вас работают все варрианты или только тот который Вы привели ?


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Домовик Подменю пользователя
сообщение 07.08.15, 9:59
Сообщение #11

Ветеран
Иконка группы
Группа: Местный
Сообщений: 975
Из: Киев
Спасибо сказали: 168 раз
Рейтинг: 0

а что значит все варианты?

вот код, кот. пробовался. то что в комментариях - это второй вариант, он тоже рабочий.
когда не использовать СоздатьОъект() в первом куске, то последняя строка отлична. А первые три- одинаково меняются. Ссылка одна.



формиров. таблицы
[/code]для инд=1 по 3 цикл
              тз.НоваяСтрока();
             //список=создатьОБъект("СписокЗначений");
              список.ДобавитьЗначение("1","1");
             список.ДобавитьЗначение("11","11");
              список.ДобавитьЗначение("111","111");
              список.ДобавитьЗначение("1111","1111");        
             тз.Параметры=создатьОбъект("СписокЗначений");  
             список.Выгрузить(тз.Параметры);
             //тз.УстановитьЗначение(Инд,"Параметры",список);
             конецЦикла;
          тз.НоваяСтрока();
         тз.УстановитьЗначение(4,"Параметры",список1);




изменение в списках знач. таблицы:
для Инд=1 по 4 цикл 
         //текСписок=тз.ПолучитьЗначение(Инд,"Параметры");
         //текСписок.УстановитьЗначение(2,    число(текСписок.ПолучитьЗначение(2))*инд);
         лпЗначение = ТЗ.ПолучитьЗначение(Инд,"Параметры");
        лпЗначение.Установить("11",5*Инд);     
     КонецЦикла;


Сообщение отредактировал Домовик - 07.08.15, 10:00

miha74 Подменю пользователя
сообщение 14.08.15, 9:59
Сообщение #12

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 153
Спасибо сказали: 81 раз
Рейтинг: 0

Советую при отладке всяческих отчетов, обработок и т.д. смотреть содержимое СписковЗначений и ТаблицЗначений с помощью универсальной обработки Show.ert (надыбал давно где-то в инете, уже нигде не скачать...). Процедуру Показать() вставляете где-то в начало своей отлаживаемой обработки(отчета), а дальше по ходу своего кода где надо посмотреть содержимое сз или тз вставляете "Показать(тз)". Show.ert должна быть в папке ExtForms каталога базы.
//***************************************************************************
Процедура Показать(Значение, Заголовок = "")
    Если ФС.СуществуетФайл(КаталогИБ()+"ExtForms\Show.ert") = 0 Тогда  
        Сообщить("Не найден внешний отчет: """+КаталогИБ()+"ExtForms\Show.ert""", "!");
    Иначе
        глФлагРасшифровки = 1;
        глОбновить = 0;
        глРасшифровка = СоздатьОбъект("СписокЗначений");
        глРасшифровка.Установить("Значение", Значение);
        глРасшифровка.Установить("Заголовок", Заголовок);
        ОткрытьФорму("Отчет#",, КаталогИБ()+"ExtForms\Show.ert");
        глФлагРасшифровки = 0;
        глРасшифровка = 0;
        глОбновить = 0;
    КонецЕсли;
КонецПроцедуры //Показать()


[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: mai, mister-x, skazan, vadim007, vetc,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 3:48
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!