Осуществление движения через запрос
Показывать по
10
20
40
сообщений
- 1
- 2
03.08.2012
16:59
#1
Возникла такая проблема: Нужно, чтобы движения по регистрам было реализовано не перебором табличной части, а выполнением единственного запроса.
Есть регистр накопления "Остатки Товаров". Измерения: СкладКомпании, Номенклатура. Ресурсы: Остаток.
Есть документ, через который осуществляется движение.
С вариантом перебора табличной части всё просто, но как сделать запросом понять не могу, так как только начал осваивать 1С.
Есть регистр накопления "Остатки Товаров". Измерения: СкладКомпании, Номенклатура. Ресурсы: Остаток.
Есть документ, через который осуществляется движение.
С вариантом перебора табличной части всё просто, но как сделать запросом понять не могу, так как только начал осваивать 1С.
03.08.2012
18:56
#3
Чтобы повысть быстродействие. Задача такая поставлена, но в иннете примеров я найти пока не смог.
03.08.2012
20:00
#4
Покажите результат замера производительности текущего алгоритма. По нему подскажу где можно оптимизировать код.
03.08.2012
20:36
#5
Тут просто задача стоит: "Движения по регистрам должны быть реализованные не перебором табличной части, а выполнением единственного запроса". Когда я спросил: "Зачем так маяться?", мне обьяснили, что при большом кол-ве данных программа, в которой есть табличная часть, будет перебирать большое кол-во значений, и в следствии чего программа будет дольше соображать. В самом модуле документа табличных частей быть не должно, а должны быть только запросы ( в том числе могут быть и по табличным частям).
03.08.2012
23:05
#6
"Подойдет?
На форме реквизит склад в шапке, в тч только номенклатура и остаток."
Движения.ОстаткиНаСкладе.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументПоОстаткамТовары.Номенклатура,
| СУММА(ДокументПоОстаткамТовары.Остаток) КАК Остаток,
| ДокументПоОстаткамТовары.Ссылка.Дата КАК Период,
| ДокументПоОстаткамТовары.Ссылка.СкладКомпании
|ИЗ
| Документ.ДокументПоОстаткам.Товары КАК ДокументПоОстаткамТовары
|ГДЕ
| ДокументПоОстаткамТовары.Ссылка = &ТекущийДокумент
| И ДокументПоОстаткамТовары.Остаток <> 0
| И ДокументПоОстаткамТовары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|
|СГРУППИРОВАТЬ ПО
| ДокументПоОстаткамТовары.Ссылка.СкладКомпании,
| ДокументПоОстаткамТовары.Номенклатура,
| ДокументПоОстаткамТовары.Ссылка.Дата";Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);Результат = Запрос.Выполнить().Выбрать();Пока Результат.Следующий() Цикл
Движение = Движения.ОстаткиНаСкладе.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
КонецЦикла;
На форме реквизит склад в шапке, в тч только номенклатура и остаток."
04.08.2012
15:40
#7
Bloodwiser, огромное вам спасибо! Смог разобраться и переписать под свою конфигурацию. Есть такая проблема, что движение осуществилось, но при просмотра регистра все поля пустые, но думаю смогу разобраться. Ещё раз огромное спасибо!
04.08.2012
19:16
#8
Названия измерений/ресурсов регистра не совпадают с названиями в запросе. В синтаксис помошнике смотреть "ЗаполнитьЗначенияСвойств"
05.08.2012
18:49
#9
"Нашел такую проблему. Во время движения, если выбирать значения из табличной части, то всё нормально и движение в регистр осуществляется.
Пример:
Движения.ВзаиморасчетыСКотрагентами.Записывать = Истина;
Движения.ОстаткиТоваров.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровПоступлениеТов.Ссылка.Дата КАК Период,
| ПоступлениеТоваровПоступлениеТов.Ссылка.Склад КАК СкладКомпании,
| ПоступлениеТоваровПоступлениеТов.Номенклатура КАК Номенклатура ,
| ПоступлениеТоваровПоступлениеТов.Количество КАК Остаток,
| ПоступлениеТоваровПоступлениеТов.Цена КАК Себестоимость,
| ПоступлениеТоваровПоступлениеТов.Сумма КАК Сумма,
| ПоступлениеТоваровПоступлениеТов.Ссылка.Контрагент КАК Контрагент
|ИЗ
| Документ.ПоступлениеТоваров.ПоступлениеТов КАК ПоступлениеТоваровПоступлениеТов
|ГДЕ
| ПоступлениеТоваровПоступлениеТов.Ссылка = &ТекущийДокумент";
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
КонецЦикла;
Движение = Движения.ВзаиморасчетыСКотрагентами.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Но если в документе нет табличной части и задействуются только реквизиты, то выдаёт ошибку, что значение период отсутствует.
Пример:
Движения.ВзаиморасчетыСКотрагентами.Записывать = Истина;
Движения.ОстаткиДенежныхСредств.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПКО.Дата КАК Период,
| ПКО.Контрагент КАК Контрагент,
| ПКО.Касса КАК Кассы,
| ПКО.Сумма КАК Сумма,
| ПКО.Сумма КАК Долг
|ИЗ
| Документ.ПКО КАК ПКО
|ГДЕ
| ПКО.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Движение = Движения.ВзаиморасчетыСКотрагентами.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Движение = Движения.ОстаткиДенежныхСредств.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Как можно решить данную проблему?"
Пример:
Движения.ВзаиморасчетыСКотрагентами.Записывать = Истина;
Движения.ОстаткиТоваров.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровПоступлениеТов.Ссылка.Дата КАК Период,
| ПоступлениеТоваровПоступлениеТов.Ссылка.Склад КАК СкладКомпании,
| ПоступлениеТоваровПоступлениеТов.Номенклатура КАК Номенклатура ,
| ПоступлениеТоваровПоступлениеТов.Количество КАК Остаток,
| ПоступлениеТоваровПоступлениеТов.Цена КАК Себестоимость,
| ПоступлениеТоваровПоступлениеТов.Сумма КАК Сумма,
| ПоступлениеТоваровПоступлениеТов.Ссылка.Контрагент КАК Контрагент
|ИЗ
| Документ.ПоступлениеТоваров.ПоступлениеТов КАК ПоступлениеТоваровПоступлениеТов
|ГДЕ
| ПоступлениеТоваровПоступлениеТов.Ссылка = &ТекущийДокумент";
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
КонецЦикла;
Движение = Движения.ВзаиморасчетыСКотрагентами.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Но если в документе нет табличной части и задействуются только реквизиты, то выдаёт ошибку, что значение период отсутствует.
Пример:
Движения.ВзаиморасчетыСКотрагентами.Записывать = Истина;
Движения.ОстаткиДенежныхСредств.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПКО.Дата КАК Период,
| ПКО.Контрагент КАК Контрагент,
| ПКО.Касса КАК Кассы,
| ПКО.Сумма КАК Сумма,
| ПКО.Сумма КАК Долг
|ИЗ
| Документ.ПКО КАК ПКО
|ГДЕ
| ПКО.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Движение = Движения.ВзаиморасчетыСКотрагентами.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Движение = Движения.ОстаткиДенежныхСредств.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Результат);
Как можно решить данную проблему?"
- 1
- 2
Читают тему
(гостей: 1)