Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Остатки в форме списка справочника (число прочтений - 7506 )
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Остатки в форме списка справочника
29. Ноября 2007 :: 08:29
Печать  
Вводные
Регистр остатки товаров
Измерения
Фирма
Склад
Товар
Ресурсы
Количество
Сумма

Форма списка справочника товаров
Фирма  - Элемент диалога
Склад   - Элемент диалога
Товар   - ТекущийЭлемент()

Код
Выбрать все
Процедура ПриОткрытии() формы списка
	Если Константа.ФлагSQL=1 Тогда
		ДатаОстатков=РабочаяДата();
		RS = СоздатьОбъект("ODBCRecordset");
		ТекстЗапроса = "
		|SELECT
		|  $Рег.Количество as Количество
		|FROM
		|  $РегистрИтоги.ОстаткиТоваров as Рег
		|WHERE
		|  Рег.Period = {d’2006-01-01’} AND
		|  $Рег.Фирма = ? AND
		|  $Рег.Склад = ? AND
		|  $Рег.Товар = ?";
		Сообщить(ТекстЗапроса);
		RS.Подготовить(ТекстЗапроса);
		RS.ПостроитьПараметры();
	КонецЕсли;
КонецПроцедуры 



Код
Выбрать все
Функция Остаток(Спр)
   Если Константа.ФлагSQL=1 Тогда
	RS.УстПараметр(1,Фирма);
	RS.УстПараметр(2,Склад);
	RS.УстПараметр(3,ТекущийЭлемент());
	Количество=RS.ВыполнитьСкалярный();
  КонецЕсли
КонецФункции 



Функция выдаёт ошибку при вызове
Цитата:
Количество=RS.ВыполнитьСкалярный();
{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(311)}: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 7: Incorrect syntax near '’'.


помогите разобраться с граблями, и как грамотно прописать получение остатков на дату актуальности? либо на любую выбранную дату
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #1 - 29. Ноября 2007 :: 08:45
Печать  
а что это у тебя за символ? откуда вял Улыбка нужен '
  
Наверх
ICQ  
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #2 - 29. Ноября 2007 :: 08:55
Печать  
Nick писал(а) 29. Ноября 2007 :: 08:45:
а что это у тебя за символ? откуда вял Улыбка нужен '

Из документации по 1сpp )))

с этим разобрались, вот только ускорения работы я чтото не заметил.
как грамотно организовать получение остатков на ТА с наложением условий на выбранные фирму и склад, а так же в случае если фирма,склад не выбраны (по одиночке либо вместе)?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #3 - 29. Ноября 2007 :: 09:03
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 08:55:
Nick писал(а) 29. Ноября 2007 :: 08:45:
а что это у тебя за символ? откуда вял Улыбка нужен '

Из документации по 1сpp )))

с этим разобрались, вот только ускорения работы я чтото не заметил.
как грамотно организовать получение остатков на ТА с наложением условий на выбранные фирму и склад, а так же в случае если фирма,склад не выбраны (по одиночке либо вместе)?


Фильтр нужно делать в самой ВТ, читай учебник дальше
  
Наверх
ICQ  
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #4 - 29. Ноября 2007 :: 09:28
Печать  
Nick писал(а) 29. Ноября 2007 :: 09:03:
Фильтр нужно делать в самой ВТ, читай учебник дальше


Код
Выбрать все
ДатаОстатков=РабочаяДата();
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|@Товар = ?
|SELECT
|  Рег.КоличествоОстаток as Количество
|FROM
|  $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|                               Фирма = :ВыбФирма AND Склад = :ВыбСклад AND Товар = @Товар,
|                               (Товар), (Количество)) as Рег";
Запрос.УстановитьТекстовыйПараметр("ВыбДата",ПолучитьДатуТА());
Запрос.УстановитьТекстовыйПараметр("Фирма",Фирма);
Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
Запрос.Подготовить(ТекстЗапроса);  
Запрос.ПостроитьПараметры();
Запрос.УстПараметр(1,ТекущийЭлемент());
Количество=Запрос.ВыполнитьСкалярный();
 



Цитата:
Запрос.УстПараметр(1,ТекущийЭлемент());
{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(310)}: Недопустимое значение индекса параметра


За пример работающего куска кода был бы очень благодарен.
P.S. Функция Остаток вызывается в текстовой колонке на форме списка справочника
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #5 - 29. Ноября 2007 :: 09:35
Печать  
Код
Выбрать все
ДатаОстатков=РабочаяДата();
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT
|  Рег.КоличествоОстаток as Количество
|FROM
|  $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|				     Фирма = :ВыбФирма AND Склад = :ВыбСклад AND Товар = :ВыбТовар,
|					(Товар), (Количество)) as Рег";
Запрос.УстановитьТекстовыйПараметр("ВыбДата",ПолучитьДатуТА());
Запрос.УстановитьТекстовыйПараметр("Фирма",Фирма);
Запрос.УстановитьТекстовыйПараметр("ВыбТовар",ТекущийЭлемент() );
Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
Количество=Запрос.ВыполнитьСкалярный(ТекстЗапроса);
 


Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)
  
Наверх
 
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #6 - 29. Ноября 2007 :: 09:55
Печать  
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

попробовал, получается для каждого элемента выполнять запрос, ускорения работы не наблюдается.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #7 - 29. Ноября 2007 :: 10:03
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 09:55:
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

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

Выполняй тогда его для всего справочника по таймеру раз в секунду результат в ТЗ а в форму справочника бери
из этой ТЗ Улыбка
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #8 - 29. Ноября 2007 :: 10:04
Печать  
В общем для таких задач правда смыслу большого нет в использовании прямых запросов
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #9 - 29. Ноября 2007 :: 10:13
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 09:55:
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

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

Ну во первых в  subj у тебя точно также

Во вторых список товаров можно уложить в список
УложитьСписокОбъектов(Список1, "#Времтовары", "Товары");
а в самом запросе
Товар IN ( select Val from #Времтовары)
  
Наверх
 
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #10 - 29. Ноября 2007 :: 10:29
Печать  
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #11 - 29. Ноября 2007 :: 10:44
Печать  
Ну во-первых - зачем ты вот здесь:
Код
Выбрать все
Функция Остаток(Спр)
   Если Константа.ФлагSQL=1 Тогда
	RS.УстПараметр(1,Фирма);
	RS.УстПараметр(2,Склад);
	RS.УстПараметр(3,ТекущийЭлемент());
	Количество=RS.ВыполнитьСкалярный();
  КонецЕсли
КонецФункции  


каждый раз устанавливаешь Фирму и Склад?
меняй параметры при изменении их на форме;
Во вторых:
Замечание: при использовании ВТ в параметризированных запросах нужно поступать немного не так. Ведь не известно, во что он развернется. Поэтому делаем следующим образом:
Код
Выбрать все
ТекстЗапроса = "
|@Товар = ?
|SELECT
|    Рег.КоличествоОстаток as Количество
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|					   Склад = :ВыбСклад AND Товар = @Товар,
|					   (Товар), (Количество)) as Рег"; 


это выдержка из статьи о прямых запросах.
В третьих:
Прочитай про оптимальность построения регистра:
http://www.softpoint.ru/article_id45.htm
И отписаться сюда - какие выводы ты сделал - будет очень приятно.
  
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Остатки в форме списка справочника
Ответ #12 - 29. Ноября 2007 :: 11:28
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 10:29:
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.


Запрос нужно выполнять не для каждого элемента, а для группы(по текущему родителю, если выводится иерархический список). Запоминать остатки в ТЗ, в формуле на форме списка получать остаток из этой ТЗ. ТЗ обновлять при смене родителя, смене фильтров и тп.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #13 - 29. Ноября 2007 :: 11:41
Печать  
alexdd писал(а) 29. Ноября 2007 :: 11:28:
Plumbum писал(а) 29. Ноября 2007 :: 10:29:
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.


Запрос нужно выполнять не для каждого элемента, а для группы(по текущему родителю, если выводится иерархический список). Запоминать остатки в ТЗ, в формуле на форме списка получать остаток из этой ТЗ. ТЗ обновлять при смене родителя, смене фильтров и тп.

Ну вот чего ты человека в ступор вгоняешь?
Запрос выполняется не для всего справочника, а только для той части, которая отображена на экране и столько раз сколько строк отображено на экране....
  
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #14 - 29. Ноября 2007 :: 12:20
Печать  
Nick писал(а) 29. Ноября 2007 :: 10:04:
В общем для таких задач правда смыслу большого нет в использовании прямых запросов

Есть
Юзаю обычный запрос в режиме RPC с двумя ВТ и своей табличкой для вывода свободного остатка - ускорение очевидно
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Остатки в форме списка справочника
Ответ #15 - 29. Ноября 2007 :: 12:22
Печать  
leshik писал(а) 29. Ноября 2007 :: 11:41:

Ну вот чего ты человека в ступор вгоняешь?
Запрос выполняется не для всего справочника, а только для той части, которая отображена на экране и столько раз сколько строк отображено на экране....


я так понял, что функция Остаток() вписана куда-то в формулу на форме списка, тогда запросы будут выполнятся при каждом обновлении формы. Т.е. когда пользователь будет клацать по ячейкам, разворачивать форму, скролить и тд. Зачем с такой частотой выполнять эти запросы? Озадачен Получим визуально "Залипание" кнопок, будет тормозить. Лучше выполнить запрос один раз для текущего родителя, кэшировать таблицу(сделать индексированную, добавить индекс по ТМЦ) и остаток получать уже из тз.
Имхо, конечно, хозяин баринУлыбка
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #16 - 29. Ноября 2007 :: 12:32
Печать  
ты мне только на один вопрос ответь - ты как данные в этой таблице обновлять будешь?
если другой пользователь остаток изменил...
  
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Остатки в форме списка справочника
Ответ #17 - 29. Ноября 2007 :: 15:55
Печать  
leshik писал(а) 29. Ноября 2007 :: 12:32:
ты мне только на один вопрос ответь - ты как данные в этой таблице обновлять будешь?
если другой пользователь остаток изменил...

а смысл это отслеживать в форме подбора? Ужас
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #18 - 29. Ноября 2007 :: 16:36
Печать  
>>а смысл это отслеживать в форме подбора? 
Ну как бы чтобы видеть скоко осталось... и чтобы документы однозначно проводились после окончания подбора
Я вот такое забабахал:
http://www.forum.mista.ru/topic.php?id=301952

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Остатки в форме списка справочника
Ответ #19 - 29. Ноября 2007 :: 17:22
Печать  
после окончания подбора все равно не факт, что проведется однозначноУлыбка(ну например другой пользователь выбрал тот же ТМЦ и провел документ чуть раньше). Зато форма очень тормозная будет. Имхо, при подборе остатки нужны просто информативно, чтобы видеть порядок остатка, обновлять их каждую секунду это лишнее
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #20 - 29. Ноября 2007 :: 18:07
Печать  
Факт, факт  Подмигивание
Одновременно 1С не дает доки проводить... да и SQL выполняет инструкции последовательно
Даже если остаток визуально не изменился (не передернули курсор) - при вводе кол-ва опять же есть вычисление доступного кол-ва
А каждую секунду ничего не пересчитывается - это обычная функция в форме списка (в типовых это сплошь и рядом)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
1cvirus
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 89
Зарегистрирован: 24. Мая 2006
Re: Остатки в форме списка справочника
Ответ #21 - 30. Ноября 2007 :: 08:45
Печать  
на HARE была статья с примером хранения текущих остатков в MySQL и получением их в форме списка - ускорение листания в 3 раза
Способ Время на строку, сек
вычисляемое текстовое поле 0.019
SQL-запрос к БД >0.100
дополнительные реквизиты 0.004
отдельная БД 0.007
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #22 - 30. Ноября 2007 :: 08:51
Печать  
Угу... особенно порадовали отдельные реквизиты...
Люди не только смотрят в справочник но еще проводят много приходов и расходов  Подмигивание
Надо обо всех подумать....
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
1cvirus
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 89
Зарегистрирован: 24. Мая 2006
Re: Остатки в форме списка справочника
Ответ #23 - 30. Ноября 2007 :: 09:11
Печать  
Цитата:
Угу... особенно порадовали отдельные реквизиты...
Люди не только смотрят в справочник но еще проводят много приходов и расходов  Подмигивание
Надо обо всех подумать....

лично я такого не делал
а по поводу проведения приходов-расходов - там тоже много проводят - при любом проведении пишется текущий остаток в MySQL - сколько здесь потеряется времени - незнаю - надо замерять
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать