Переключение на Главную Страницу Страницы: 1 ... 78 79 [80] 81  ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПоставщикДанных" - обсуждения. Часть 2. (число прочтений - 378140 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1185 - 31. Октября 2017 :: 08:20
Печать  
Получить-то получу. А как "скормить"?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1186 - 01. Ноября 2017 :: 05:07
Печать  
Ну наверное как то так:

Отбор = ПоставщикДанных.ТабличноеПоле.Отбор;
ОтборДок = Отбор.ТекущийДокумент;
ОтборДок.Использование = 1;
ОтборДок.ВидСравнения = "ВСписке";
ОтборДок.Значение = списокДокументов;
ПоставщикДанных.Обновить();
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1187 - 01. Ноября 2017 :: 08:32
Печать  
Идею понял. Спасибо!
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
PitKZL
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 12. Февраля 2010
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1188 - 02. Ноября 2017 :: 12:14
Печать  
Помогите оптимизироать запрос .

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

     ТекстСоединения = "left join
     |      $РегистрОстатки.ПотенциальныеПродажиФакт(,(???????????),(ЗаказПокупателя),(СуммаОплаты,СуммаОтгрузки),(???????????)) as РегОст
     |            on  $ТекущийОбъект.ТекущийДокумент =  РегОст.ЗаказПокупателя
     |";
     Данные.ДобавитьСоединениеДанных("Оплачено",ТекстСоединения);
     ток,0)","Число",15,2,1);
     Данные.НоваяКолонка("Оплачено");
     иОстаток,0)","Число",15,2,1);
     Данные.НоваяКолонка("Отгружено");


Как связать $ТекущийОбъект.ТекущийДокумент и ЗаказПокупателя непосредственно в соединении?


Текст запроса отладки :

select top 20
journ.date_time_iddoc as ПозицияДокумента,
journ.iddoc as ТекущийДокумент,
case when journ.ismark = 1 then 7 else
           case when journ.closed&1 = 1 then 8 else 6 end
     end as Пиктограмма,
ltrim(journ.docno) as НомерДокумента,
left(journ.date_time_iddoc,8) as ДатаДокумента,
journ.closed&1 as Проведен,
case when journ.ismark = 1 then 1 else 0 end as ПометкаУдаления,
journ.dnprefix as ПрефиксНомера,
journ.row_id as НомерСтроки
ЖурналаДокументов,
journ.iddocdef as ВидДокументаСортировка,
journ.docno as НомерДокументаСортировка,
dbo.ConvertTime(substring(journ.date_time_iddoc,9,6)) as ВремяДокумента,
ISNULL(РегОст.СуммаОплатыОстаток,0) as Оплачено,
ISNULL(РегОст.СуммаОтгрузкиОстаток,0) as Отгружено
from _1SJOURN as journ (nolock)
     inner join DH981 as dh981 (n
olock)
     on journ.iddoc = dh981.iddoc and journ.IDDOCDEF = 981      
left join
     (
     SELECT
           ЗаказПокупателя
           ,SUM(СуммаОплатыОстаток) AS СуммаОплатыОстаток
           ,SUM(СуммаОтгрузкиОстаток) AS СуммаОтгрузкиОстаток
           
     FROM
           (SELECT
                 rg_23275.sp23276 AS ЗаказПокупателя
                 ,rg_23275.sp23274 AS СуммаОплатыОстаток
                 ,rg_23275.sp24132 AS СуммаОтгрузкиОстаток
                 
           FROM
                 RG23275 AS rg_23275 (nolock)
           WHERE
                 rg_23275.PERIOD = '20171201
'
           ) AS vt_ra_23275
     GROUP BY
           ЗаказПокупателя
     HAVING (SUM(СуммаОплатыОстаток) <> 0)
     OR (SUM(СуммаОтгрузкиОстаток) <> 0)
     
) as РегОст
           on  journ.IDDOC =  РегОст.ЗаказПокупателя
where (((left(journ.date_time_iddoc,8) between '20171001'
     and '20171102Z')))
order by journ.date_time_iddoc



« Последняя редакция: 02. Ноября 2017 :: 13:39 - PitKZL »  
Наверх
 
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1189 - 03. Ноября 2017 :: 15:43
Печать  
Код
Выбрать все
|$ РегистрОстатки. ПотенциальныеПродажиФакт (,
 (ЗаказПокупателя = $ ТекущийОбъект. ТекущийДокумент), (ЗаказПокупателя),(СуммаОплаты,СуммаОтгрузки),(???????????)) as 

  
Наверх
 
IP записан
 
PitKZL
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 12. Февраля 2010
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1190 - 06. Ноября 2017 :: 06:48
Печать  
Спасибо, но не помогло - выдает ошибку:
State 42000, native 4104, message [Microsoft] [ODBC SQL Server Driver][SQL Server] The multi-part identifier "journ.IDDOC" could not be bound.
  
Наверх
 
IP записан
 
Volodja
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 19. Июля 2019
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1191 - 12. Марта 2020 :: 05:24
Печать  
Подскажите, пожалуйста, как достучаться до настроек отбора?
Например как в 8-ке:
Форма.ЭлементыФормы[ИмяРеквизитаСписка].НастройкаОтбора[Филиал].Доступность = Ложь;

Мне нужно сделать так, чтобы в настройках отбора пользователь не мог сменить филиал.
В 8-ке это делается через ЭлементыФормы.
Как это сделать в поставщикеДанных? Возможно это?
Спасибо.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1192 - 05. Декабря 2021 :: 14:24
Печать  
Кто еще использует ПоставщикДанных.Журнал на 1sqlite попробуйте подменить этот код (+-Djelf там есть).
Вопрос и решение образовалось тут: https://forum.mista.ru/topic.php?id=874367&page=1

Код (C++)
Выбрать все
Функция ПолучитьТекстИсточникаСбора(ЭтоПоиск = 0,ТекстСоединения = "")
	ТекстИсточника = "";

	// текст запроса основного источника данных
	ТекстИсточника = ТекстИсточника + "
	|from ЖурналДокументов as ТекущийОбъект $nolock
	|";

	СоединениеСДокументами = ПроверитьНеобходимостьСоединенияСДокументами(ЭтоПоиск);

	// Добавляем таблицы документов если есть есть такая необходимость
	Если СоединениеСДокументами = 1 Тогда
		Для НомерВида = 0 По ВидыДокументов.Количество()-1 Цикл
			ВидДокумента = ВидыДокументов.Получить(НомерВида);
			ИДОбъекта = МетаДата.ИДДокумента(ВидДокумента);
			ИДОбъекта = ?(ЭтоSQL = 1,ИДОбъекта,"'"+Прав(_IdToStr(ИДОбъекта),4)+"'");
			ТекстИсточника = ТекстИсточника + "	left join Документ." + ВидДокумента + " as Док" + ВидДокумента + " $nolock
			|		on ТекущийОбъект.iddoc = Док"+ВидДокумента+".iddoc
			|";
		КонецЦикла;
	КонецЕсли;

	// Добавим соединения для дополнительных данных
	КоличествоСоединений = СтруктураСоединений.Количество();
	Если КоличествоСоединений > 0 Тогда
		Для НомерСоединения = 0 По КоличествоСоединений - 1 Цикл
			ВекторСоединения = СтруктураСоединений.Получить(НомерСоединения);
			ТекстИсточника = ТекстИсточника + ВекторСоединения.ТекстЗапроса + "
			|";
		КонецЦикла;
	КонецЕсли;

	// Добавим соединения быстрого поиска
	Если ПустоеЗначение(ТекстСоединения) = 0 Тогда
		ТекстИсточника = ТекстИсточника + "	" + ТекстСоединения + "
		|";
	КонецЕсли;

	// Добавим соединения для отбора данных
	СтрокаСоединенияОтборов = Сервис.ПолучитьСтрокуСоединений(СвойствоОтбор);
	Если ПустоеЗначение(СтрокаСоединенияОтборов) = 0 Тогда
		СтрокаСоединенияОтборов = СтрЗаменить(СтрокаСоединенияОтборов,"[ОсновнаяТаблица]","ШапкаДокумента");
		СтрокаСоединенияОтборов = СтрЗаменить(СтрокаСоединенияОтборов,"[ТаблицаЖурнала]","ТекущийОбъект");
		ТекстИсточника = ТекстИсточника + СтрокаСоединенияОтборов + "
		|";
	КонецЕсли;

	КлючевоеСлово = "where";

	// добавляем фильтры по отбору данных
	ТекстОтбора = СформироватьТекстОтбора();
	Если ПустаяСтрока(ТекстОтбора) = 0 Тогда
		ТекстИсточника	= ТекстИсточника + РазделительСтрок + КлючевоеСлово + РазделительСтрок + "	" + ТекстОтбора;
		КлючевоеСлово	= "and";
	КонецЕсли;

	// добавляем фильтр по виду документов
	КоличествоДокументов = ВидыДокументов.Количество();
	Если КоличествоДокументов > 0 Тогда
		ТекстИсточника = ТекстИсточника + "
		//{ -Djelf
		//|"+КлючевоеСлово+" ( ТекущийОбъект.iddocdef ";
		//} -Djelf
		//{ +Djelf
		|"+КлючевоеСлово+" ("+?(КоличествоДокументов>1,"+","")+"ТекущийОбъект.iddocdef ";
		//} +Djelf
			КлючевоеСлово = "and";
	КонецЕсли;

	СтрокаВидыДокументов = "";
	ЗнакСравнения = "";
	Для НомерВида = 0 По КоличествоДокументов-1 Цикл
		ВидДокумента = ВидыДокументов.Получить(НомерВида);
		ИДОбъекта = МетаДата.ИДДокумента(ВидДокумента);
		ИДОбъекта = ?(ЭтоSQL = 1,ИДОбъекта,"'"+Прав(_IdToStr(ИДОбъекта),4)+"'");

		СтрокаВидыДокументов = СтрокаВидыДокументов + ?(НомерВида = 0,"",",") + ИДОбъекта;
	КонецЦикла;

	ТекстИсточника = ТекстИсточника + ?(КоличествоДокументов = 1,"= ","in (") + СтрокаВидыДокументов + ?(КоличествоДокументов = 1,"",")") + ")";

	//{ +Djelf
	Если ЭтоSQL = 0 Тогда
		ТекстИсточника = ТекстИсточника + "and ТекущийОбъект.idjournal = :ЖурналДокументов."+ВидЖурнала;
	КонецЕсли;
	//} +Djelf

	Возврат ТекстИсточника;
КонецФункции
 

  
Наверх
www  
IP записан
 
michael-iv
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 15. Февраля 2022
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1193 - 15. Февраля 2022 :: 21:51
Печать  
Всем Привет.
Ребята, может подскажите - есть ли примеры запросов к "ЖурналРасчетов.Зарплата" ?
Тк.у меня при простом запросе выдает ошибку...
Подскажите плз. что я делаю не так...

Простой запрос:
// подготовим запрос...
ЗапросЗП = СоздатьОбъект("ПрямойЗапрос");
......
ТекстЗапроса = "SELECT
| Объект      AS [Объект]
| FROM :ВидЖурналаРасчетов.Зарплата
|";
-------------------------------------------
Выдает ошибку:
SELECT      Объект AS      [Объект]  FROM '  X8'
(1С++) Ошибка выполнения общего запроса (ПрямойЗапрос). Ошибка:ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such table:   X8
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
  
Наверх
 
IP записан
 
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1194 - 14. Октября 2022 :: 13:43
Печать  
Доброго дня всем, кто еще остался на 7.7, а так же знатокам 1с++ и прекрасного класса "ПоставщикДанных" :)
Столкнулась со странным поведением класса ПоставщикДанных.Справочник во время поиска при установленных отборах: Если на ПоставщикДанных наложить несколько условий отбора (больше 2-х) - то во время поиска, неважно посимвольного по колонке, или по целому слову, происходит сбой в табличном поле и на месте найденного появляется последний элемент в списке справочника. Более того ломается весь список в табличном поле - элементы разбегаются в хаотичном порядке, последний элемент, который "встает" на место найденного по поиску дублируется множество раз . Порядок элементов восстанавливается, если сделать End - Home и все элементы возвращаются на свои места и даже тот элемент который надо найти, перелистыванием находится на своём месте. Слом происходит именно во время поиска.

При чём, слом происходит только если искомый элемент не попадает в "окно" табличного поля, отображаемое на форме. Если элемент "виден" в списке - то поиск его проходит нормально.

Отладка показала, что поиск то работает, и элемент справочника находится, но в момент позиционирования на него
[code]ТабличноеПоле.ТекущаяСтрока = ЗначенияВыборки.ПолучитьЗначение(1,1);[/code]
в табличном поле позиция найденного элемента заменяется последним элементом справочника!

Такое ощущение что ломаются какие то внутренние индексы класса связанные с источником данных?

1сpp 3.2.4.1
1sqlite 1.0.2.6/3.36.0.26 by Djelf
ПоставщикДанных 5.0.5 23.05.2014
ПрямыеЗапросы 1.8.6 22.05.2013

Может кто-то уже сталкивался и знает как исправить?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1195 - 17. Октября 2022 :: 07:54
Печать  
ТП ведет себя подобным образом когда не обеспечена уникальность ключа порядка. Копайте в эту сторону
  

1&&2&&3
Наверх
 
IP записан
 
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1196 - 17. Октября 2022 :: 10:25
Печать  
trad писал(а) 17. Октября 2022 :: 07:54:
ТП ведет себя подобным образом когда не обеспечена уникальность ключа порядка. Копайте в эту сторону

Хм, начала копать.
Поскольку поиск делаю по наименованию - ключом порядка выступает ТекущийОбъект.idx_DESCR
Включила отладку, увидела что при включённых отборах по полям для которых в бд включён отбор по реквизиту - при поиске выбирается индекс с этим реквизитом... - и поиск ломается
Если в отборе поставщика не используются поля с включёнными отборами - используется индекс по наименованию, как и в ключе порядка - и поиск работает как надо.

Ушла думать
  
Наверх
 
IP записан
 
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1197 - 17. Октября 2022 :: 10:56
Печать  
Zhenya писал(а) 17. Октября 2022 :: 10:25:
trad писал(а) 17. Октября 2022 :: 07:54:
ТП ведет себя подобным образом когда не обеспечена уникальность ключа порядка. Копайте в эту сторону

Хм, начала копать.
Поскольку поиск делаю по наименованию - ключом порядка выступает ТекущийОбъект.idx_DESCR
Включила отладку, увидела что при включённых отборах по полям для которых в бд включён отбор по реквизиту - при поиске выбирается индекс с этим реквизитом... - и поиск ломается
Если в отборе поставщика не используются поля с включёнными отборами - используется индекс по наименованию, как и в ключе порядка - и поиск работает как надо.

Ушла думать

Итак да, отключение признака отбор у реквизитов справочника, которые я использую в отборе поставщика данных, проблему решило.
Интересно, а можно как то влиять на выбор индексов в ПрямомЗапросе, которым пользуется ПоставщикДанных?
  
Наверх
 
IP записан
 
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1198 - 19. Октября 2022 :: 09:36
Печать  
Zhenya писал(а) 14. Октября 2022 :: 13:43:
1sqlite 1.0.2.6/3.36.0.26 by Djelf

В общем плюнула я на навороты последней версии 1sqlite by Djelf и восстановила старенькую ещё орефковскую версию 1.0.2.6 от 03.02.2012.
И всё заработало так как и задумывалось автором класса
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПоставщикДанных" - обсуждения. Часть 2.
Ответ #1199 - 19. Октября 2022 :: 12:17
Печать  
Zhenya писал(а) 19. Октября 2022 :: 09:36:
Zhenya писал(а) 14. Октября 2022 :: 13:43:
1sqlite 1.0.2.6/3.36.0.26 by Djelf

В общем плюнула я на навороты последней версии 1sqlite by Djelf и восстановила старенькую ещё орефковскую версию 1.0.2.6 от 03.02.2012.
И всё заработало так как и задумывалось автором класса


Навороты делал не я, их предоставляет библиотека sqlite.

Я выше писал в https://www.1cpp.ru/forum/YaBB.pl?num=1285520767/1192#1192 что надо переделать для документов, для справочников видимо нужно аналогично.
Причина в том что в библиотеке sqlite в сборке от Орефкова индекс по IN вообще не мог использоваться, предположение об его использовании не поступало в расширение виртуальных таблиц 1sqlite для 1с.
Однако, использование индекса по IN приводит к замедлению работы табличного поля из-за того что запрос вынужден выбирать сначала все данные (кусками по индексу в порядке их следования в IN), сортировать полученный результат, и limit/offset работали уже после всей выборки, а не до нее что было бы без индекса по IN, но это никак не должно приводить к таким странным результатам.
Отключить использование индекса просто, нужно перед полем с индексом поставить "+".

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

З.Ы. Скинули добрые люди мне тему https://forum.infostart.ru/forum9/topic288630/ , IN там не используется, индекс там используется правильный, т.е. объяснения нет, да и не воспроизводится на моей базе. Чудесатые чудеса.
Разве что проверить это, результат должен быть пустой
Код (SQL)
Выбрать все
SELECT Контрагенты.idx_DESCR ,count(*)
FROM Справочник_Контрагенты AS Контрагенты
GROUP BY Контрагенты.idx_DESCR
HAVING count(*)>1 

« Последняя редакция: 20. Октября 2022 :: 11:14 - Djelf »  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 78 79 [80] 81 
ОтправитьПечать