|
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) Скорость поиска в выборке и в индексированной ТЗ сравнивал?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |