|
v7: Пастбище динозавров: Поставщик данных | ☑ | ||
---|---|---|---|---|
0
Андрей_Андреич
naïve
04.12.20
✎
06:05
|
Решил освоить - помогите сделать это максимально эффективно, не наступая на пройденные другими грабли. Пока на примере справочника.
1. Если в формах списка справочника удалить табличную часть справочника и воткнуть табличную часть Поставщика - будет ли это правильным решением (кто его знает - вдруг платформа все равно будет справочник дергать, раз объявлено, что это форма списка) 2. В форме подбора у меня выводятся остатки из различных регистров. Как правильнее - присоединить запрос (добавить соединение данных) или выполнять запрос при выводе строки и затем заполнять вычисляемые колонки? |
|||
1
hhhh
04.12.20
✎
06:15
|
(0) это точно семерка?
|
|||
2
Андрей_Андреич
naïve
04.12.20
✎
06:18
|
(1) Это 7.7 + компонента 1С++ + написанные на ней классы.
|
|||
3
ДенисЧ
04.12.20
✎
07:19
|
(0) 1. а что, он у тебя сильно дёргается?
2. Запрос в цикле, что может быть хуже? |
|||
4
Sserj
04.12.20
✎
07:26
|
(0) По поводу 2 на мой взгляд правильней выгребать остатки из регистров в ИндексированнуюТаблицу с индексом по элементу и при выводе строки брать из нее данные. Если нужно то эти остатки по таймеру обновлять.
|
|||
5
Андрей_Андреич
naïve
04.12.20
✎
07:39
|
(3) Я не проверял. Похоже возражений нет?
Про запрос в цикле. У меня сейчас в форме списка первой колонкой текстовое поле с формулой ПолучитьОстатки() - эта функция выполняет параметризованный запрос и рассчитывает значения для остальных колонок. Вроде пашет лет 15 беспроблемно. Но тогда по другому было никак - вот и спрашиваю как правильно. (4) А как узнавать,когда надо обновлять? Поставщик генерит событие при обновлении? |
|||
6
Sserj
04.12.20
✎
07:47
|
(5) А никак не узнавать, просто по таймеру перезаполнять ИТЗ и вызывать у табличного поля ПерерисоватьСтроки.
Оно обновляется не дергая поставщика, но при этом отрабатывается ПриВыводеСтроки. |
|||
7
ADirks
04.12.20
✎
08:04
|
Остатки лучше в запросе собирать, на ТА - это не сильно напрягает сервер, зато удобнее.
|
|||
8
Андрей_Андреич
naïve
04.12.20
✎
08:16
|
(7) То есть присоединить запрос (добавить соединение данных)? Ок
Кстати обнаружил - не работает поиск по коду при наборе в колонке. Код текстовый. По другим текстовым полям работает |
|||
9
Mikeware
04.12.20
✎
08:28
|
(0)
1. даже если и дернет разок - хотя какой элемент формы и зачем будет дергать данные? 2. зависит от формы, и соединения. если в подборе даннне ы таблице - то соединение, а если встал на строку - а в реквизитах формы вываливюется дополнительные данные - то доп.данные получать отдельно. (1) абсолютно точно |
|||
10
ADirks
04.12.20
✎
13:47
|
(8) возможно, надо вместо Алиас.Code написать LTrim(Алиас.Code)
|
|||
11
alyuev
04.12.20
✎
16:04
|
"Поставщик данных" - это класс? Который http://catalog.mista.ru/public/67841/?
|
|||
12
Mikeware
04.12.20
✎
18:40
|
(11) да
|
|||
13
Андрей_Андреич
naïve
06.12.20
✎
06:34
|
(10) Не понял. Я использую готовый класс. То есть или не та версия или ошибка в классе. Ну или я тупой, что вполне вероятно.
|
|||
14
Mikeware
06.12.20
✎
11:13
|
(13) любой из этих трех вариантов не мешает попробовать...
|
|||
15
Cthulhu
06.12.20
✎
19:15
|
оффтопик(ли?)
"когда динозавры вымирают - остаются крысы" (с) не моё |
|||
16
Андрей_Андреич
naïve
09.12.20
✎
06:51
|
(15) Спасибо, добрый человек. Это у Райкина миниатюра была. Вроде не крысы, а тараканы.
С соединением разобрался. Теперь дальше. Реквизиты на форме выводятся, по-видимому, в процедуре ПриАктивизацииСтроки. Часть колонок табличной части надо вычислять ПриВыводеСтроки. Подскажите, как добавить эту вычислямую колонку? |
|||
17
Sserj
09.12.20
✎
06:56
|
(16) Дэк просто добавь колонку без пути к данным.
Т.е. поле Данные не указывай при создании колонки. Она будет пустая и делай ПриВыводеСтроки с ней что хочешь. |
|||
18
Андрей_Андреич
naïve
09.12.20
✎
07:04
|
(17) Да уже много вариантов перепробовал. Только что сработал "ПоставщикДанных.ТабличноеПоле.Колонки.Добавить". Сейчас попробую заполнять. Или есть более простой вариант? Не люблю много точек :)
Еще вопросик - если колонка невидимая, то обрабатывать ее ПриВыводеСтроки необязательно? Вроде при изменении видимости все перерисуется по новой? |
|||
19
Sserj
09.12.20
✎
07:17
|
(18)
1. Ну более простой: Колонки = ПоставщикДанных.ТабличноеПоле.Колонки; Колонка = Колонки.Добавить(); :) 2. Честно не помню таких тонкостей. (16) А иногда соединение не выгодно делать. К примеру если тебе нужно показывать последнюю цену на дату то выгодней сделать колонку с подзапросом. Тогда вычисления будут только для строк которые уже непосредственно попадают в табличное поле а не расчет среза последних для всех. К примеру вывод последней цены для номенклатуры из ТиС (SQL): select товары.id as [Товар $Справочник.Номенклатура] , coalesce(cast($ПоследнееЗначение.Цены.Цена(цены.id, :датаЦены) as numeric(10,2), 0) as [Цена $Число] from $Справочник.Номенклатура as товары with (nolock) left join $Справочник.Цены as цены with (nolock) on цены.parentext = товары.id where $цены.ТипЦены = :НужныйТипЦен Запрос не точный, просто по памяти написал, главное смысл. ПоставщикДанных сначала отберет нужное ему количество строк и только для них будет расчет цен. |
|||
20
Sserj
09.12.20
✎
07:21
|
+(19) Хотя косяк, тут только с типом цены товары выберутся. Условие нужно бы заменить на APPLY
select товары.id as [Товар $Справочник.Номенклатура] , coalesce(cast($ПоследнееЗначение.Цены.Цена(цены.цена, :датаЦены) as numeric(10,2), 0) as [Цена $Число] from $Справочник.Номенклатура as товары with (nolock) outer apply ( select спрЦены.id as [Цена] from $Справочник.Цены as спрЦены with (nolock) where спрЦены.parentext = товары.id and $цены.ТипЦены = :НужныйТипЦен ) as цены |
|||
21
Андрей_Андреич
naïve
09.12.20
✎
07:30
|
(19) Понятно, благодарю. Ну и сразу следующий вопрос - реализовано ли дерево групп и как? Имеется в виду как в типовой семерке два взаимодействующих объекта на форме.
|
|||
22
alyuev
09.12.20
✎
15:21
|
(8) Для быстрого поиска по коду я уже делал как-то правку: http://www.1cpp.ru/forum/YaBB.pl?num=1285520767/627#627
|
|||
23
alyuev
09.12.20
✎
15:23
|
Перенесу оттуда текст моего сообщения:
Нужно заменить в функции БыстрыйПоискПоПодстроке() класса ПоставщикДанных.Справочник для условия: Если Врег(ИмяКолонки) = "КОД" Тогда на нижеследующий код: Если МетаСправочник.ТипКода="Числовой" Тогда ТекстЗапросаПоиска = ТекстЗапросаПоиска + " |"+КлючевоеСлово+" ТекущийОбъект.code = '"+Формат(Значение,"Ч"+МетаСправочник.ДлинаКода+" ")+"' |"; Иначе ТекстЗапросаПоиска = ТекстЗапросаПоиска + " |"+КлючевоеСлово+" substr"+?(ЭтоSQL = 1,"ing","")+"(ТекущийОбъект.code,1,"+СтрДлина(СокрЛП(Значение))+") "+?(ЭтоSQL = 0,"collate _1C ","")+"= '"+Нрег(СокрЛП(Значение))+"' |"; КонецЕсли; Здесь использую СокрЛП(Значение) потому как ранее вызывалась функция ПодготовитьЗначениеПоиска() и в ней текстовое Значение форматируется в полную строку с длиной кода, т.е. ввели "8" - получили "8 ". А оно нам не надо... |
|||
24
koala45
09.12.20
✎
15:44
|
Но тогда по другому было никак - вот и спрашиваю как правильно.
|
|||
25
Андрей_Андреич
naïve
10.12.20
✎
05:22
|
(23) Спасибо, поправил - заработало. Как бы до автора донести чтобы внес исправления?
|
|||
26
Андрей_Андреич
naïve
10.12.20
✎
08:20
|
(25) + код все-таки привычней по первым символам, а не по вхождению. Впрочем, это уже несложно доделать будет при необходимости
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |