Осуществление движения через запрос

Новая тема
Показывать по 10 20 40 сообщений
Возникла такая проблема: Нужно, чтобы движения по регистрам было реализовано не перебором табличной части, а выполнением единственного запроса.

Есть регистр накопления "Остатки Товаров". Измерения: СкладКомпании, Номенклатура. Ресурсы: Остаток.
Есть документ, через который осуществляется движение.

С вариантом перебора табличной части всё просто, но как сделать запросом понять не могу, так как только начал осваивать 1С.
А зачем?
Чтобы повысть быстродействие. Задача такая поставлена, но в иннете примеров я найти пока не смог.
Покажите результат замера производительности текущего алгоритма. По нему подскажу где можно оптимизировать код.
Тут просто задача стоит: "Движения по регистрам должны быть реализованные не перебором табличной части, а выполнением единственного запроса". Когда я спросил: "Зачем так маяться?", мне обьяснили, что при большом кол-ве данных программа, в которой есть табличная часть, будет перебирать большое кол-во значений, и в следствии чего программа будет дольше соображать. В самом модуле документа табличных частей быть не должно, а должны быть только запросы ( в том числе могут быть и по табличным частям).
"Подойдет?
Движения.ОстаткиНаСкладе.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументПоОстаткамТовары.Номенклатура,
| СУММА(ДокументПоОстаткамТовары.Остаток) КАК Остаток,
| ДокументПоОстаткамТовары.Ссылка.Дата КАК Период,
| ДокументПоОстаткамТовары.Ссылка.СкладКомпании
|ИЗ
| Документ.ДокументПоОстаткам.Товары КАК ДокументПоОстаткамТовары
|ГДЕ
| ДокументПоОстаткамТовары.Ссылка = &ТекущийДокумент
| И ДокументПоОстаткамТовары.Остаток <> 0
| И ДокументПоОстаткамТовары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|
|СГРУППИРОВАТЬ ПО
| ДокументПоОстаткамТовары.Ссылка.СкладКомпании,
| ДокументПоОстаткамТовары.Номенклатура,
| ДокументПоОстаткамТовары.Ссылка.Дата";Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);Результат = Запрос.Выполнить().Выбрать();Пока Результат.Следующий() Цикл
Движение = Движения.ОстаткиНаСкладе.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
КонецЦикла;



На форме реквизит склад в шапке, в тч только номенклатура и остаток."
Bloodwiser, огромное вам спасибо! Смог разобраться и переписать под свою конфигурацию. Есть такая проблема, что движение осуществилось, но при просмотра регистра все поля пустые, но думаю смогу разобраться. Ещё раз огромное спасибо!
Названия измерений/ресурсов регистра не совпадают с названиями в запросе. В синтаксис помошнике смотреть "ЗаполнитьЗначенияСвойств"
"Нашел такую проблему. Во время движения, если выбирать значения из табличной части, то всё нормально и движение в регистр осуществляется.
Пример:

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


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

Пример:


Движения.ВзаиморасчетыСКотрагентами.Записывать = Истина;
Движения.ОстаткиДенежныхСредств.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
   "ВЫБРАТЬ
   | ПКО.Дата КАК Период,
   | ПКО.Контрагент КАК Контрагент,
   | ПКО.Касса КАК Кассы,
   | ПКО.Сумма КАК Сумма,
   | ПКО.Сумма КАК Долг
   |ИЗ
   | Документ.ПКО КАК ПКО
   |ГДЕ
   | ПКО.Ссылка = &Ссылка";

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


Как можно решить данную проблему?"
И где во 2-м примере Результат.Следующий()?
Читают тему
(гостей: 1)

Быстрый переход