Имя: Пароль:
1C
1C 7.7
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) + код все-таки привычней по первым символам, а не по вхождению. Впрочем, это уже несложно доделать будет при необходимости
2 + 2 = 3.9999999999999999999999999999999...