Имя: Пароль:
1C
 
V8: обойти табличную часть и заполнить в ней цены без запроса
,
0 andrewrocker
 
04.06.17
07:56
Коллеги,

Чувствую, что запрос использовать в цикле где 100500 строк неверно. Не могу понять, как правильно написать код.

Процедура КоманднаяПанельТоварыЗаполнитьЗакупочныеЦены(Кнопка)

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

Ругается на

"{Документ.ИнвентаризацияТоваровНаСкладе.Форма.ФормаДокумента.Форма(1006)}: Поле объекта не обнаружено (Номенклатура)
        СписокЦенЗакупки.Отбор.Номенклатура.Установить(Справочники.Номенклатура.НайтиПоНаименованию(Строка.Номенклатура));
"

Что я делаю не так?
1 mehfk
 
04.06.17
08:01
Весь код в топку.
2 anatoly
 
04.06.17
08:01
правильно ругается.
руки за такой код отрывать надо.
3 andrewrocker
 
04.06.17
08:04
(1) это весь код процедуры
4 andrewrocker
 
04.06.17
08:05
(2) как сделать нормально?
СписокЦенЗакупки = РегистрыСведений.ЦеныНоменклатуры.Выбрать(,ДокументОбъект,"Отбор")

Начал городить цирк, потому, что не получается, как задать отбор?
5 andrewrocker
 
04.06.17
08:11
эксперты с мисты говорят - код ересь и ни одной рекомендации как сделать хорошо.

люблю мисту
6 Неверный Параметр И
 
04.06.17
08:18
(5) Учитывая уровень знаний типа:

Строка.ЦенаЗакупочные = СтрокаРегистраСведений;

Это бесполезно.

А начнёшь рекомендовать тебе книги - ты обидишься и будешь кричать.
7 organizm
 
04.06.17
08:28
выбери номенклатуру таб. части в массив, передай в запрос, обойди таб.часть и подставь из выборки запроса.
8 organizm
 
04.06.17
08:30
ты делаешь не так: 1) запрос к БД в цикле не есть ГУД; 2) в числовое значение цены в строку надо подставлять числовое значение из выборки цены ))).
9 andrewrocker
 
04.06.17
08:34
(7) можно пример? я понял идею - она мне нравится.
10 totparen
 
04.06.17
08:35
(0) Жесть.
Тамбовский волк тебе коллега!
11 andrewrocker
 
04.06.17
08:38
(9) не понимаю разобраться какой строка табличной части к какому результату выборке присваивается.

такое чувство, что в выборке нужно искать эту строчку табличной части. но как?
12 Мимохожий Однако
 
04.06.17
08:39
(0) Создай таблицу значений  и загрузи в набор записей. Не придётся обращаться к базе в каждой записи несколько раз.
13 andrewrocker
 
04.06.17
08:42
(10) друг мой, я могу обойтись запросом. Но я не хочу - я хочу найти оптимальный путь, а невозможно через учебу, поэтому мои вопросы могут выглядеть неочень здорово, но это не значит, что я не смогу научится.

у меня есть желание разобраться с утра в воскресенье. Поэтому прошу быть снисходительнее и предложить свой вариант решения.
14 totparen
 
04.06.17
08:42
Писать код/запросы не буду, только смысл:

Пакетный запрос.
Первый пакет, виртуальная таблица - Номенклатура и цены, только то что в документе.

Второй пакет - вся табличная часть документа, с левым соединением временной таблицы.

Далее результат запроса загрузить в таб. часть.
15 andrewrocker
 
04.06.17
08:42
(12) мне трудно понять это без примера. Для меня набор записей - темная матерная речь. По примеру бы разобраться.
16 totparen
 
04.06.17
08:46
(14), в смысле не виртуальная, а временная.
17 organizm
 
04.06.17
08:53
(11)
Выборка.Сбросить();
Если Выборка.НайтиСледующий(Новый Структура("Номенклатура", СтрокаТабЧасти.Номенклатура)) Тогда
СтрокаТабЧасти.Цена = Выборка.Цена;
КонецЕсли;

так устроит ? поищи в типовых примеров на "НайтиСледующий"
18 Мимохожий Однако
 
04.06.17
09:27
из СП:))
(15) РегистрСведенийМенеджер.<Имя регистра сведений>.СоздатьНаборЗаписей (InformationRegisterManager.<Имя регистра сведений>.CreateRecordSet)
РегистрСведенийМенеджер.<Имя регистра сведений> (InformationRegisterManager.<Имя регистра сведений>)
СоздатьНаборЗаписей (CreateRecordSet)
Синтаксис:

СоздатьНаборЗаписей()
Возвращаемое значение:

Тип: РегистрСведенийНаборЗаписей.<Имя регистра сведений>.

Описание:

Создает набор записей регистра сведений. Набор записей создается пустым.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Набор записей создается пустым.
Пример:

КурсыВалют  = РегистрыСведений.КурсыВалют;
НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();


--------------------------------------------------------------------------------

     Методическая информация
....
В твоём коде этот набор не нужен. Что касается использования  запроса. Даже есть у тебя в коде "не будет запроса", то всё равно программа использует запросы.
..
1. Найди запросом все цены для номенклатуры из табличной части. Для этого выгрузи из ТЧ колонку Номенклатура  и передай как параметр. Результат запроса выгрузи в ТЗ
2. Перебирай строки своей ТЧ и ищи цену номенклатуры из ТЗ.
...
Кошернее - соединить ТЧ с запросом по ценам, получить ТЗ и загрузить в ТЧ сразу
19 anatoly
 
04.06.17
09:28
(13) т.е. ты считаешь что цикл оптимальнее запроса??
Реально жесть!
Забудь про 1С. не твое.
20 organizm
 
04.06.17
09:35
(19) ну уж что так сразу. Все мы начинали с ошибок.
(18) зачем результат запроса в ТЗ (это стиль 7.7) выгружать, лишний объект, лишний объем памяти.
21 Мимохожий Однако
 
04.06.17
09:47
(20)Согласен. Выгрузка в ТЗ, это скорее для исследования. (Рудименты 77)
22 organizm
 
04.06.17
09:55
(21) для исследования - отладчик.
23 Неверный Параметр И
 
04.06.17
11:02
(21) Скорость поиска в выборке и в индексированной ТЗ сравнивал?