Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Пастбище динозавров: Поставщик данных

v7: Пастбище динозавров: Поставщик данных
Я
   Андрей_Андреич
 
04.12.20 - 06:05
Решил освоить - помогите сделать это максимально эффективно, не наступая на пройденные другими грабли. Пока на примере справочника.
1. Если в формах списка справочника удалить табличную часть справочника и воткнуть табличную часть Поставщика - будет ли это правильным решением (кто его знает - вдруг платформа все равно будет справочник дергать, раз объявлено, что это форма списка)
2. В форме подбора у меня выводятся остатки из различных регистров. Как правильнее - присоединить запрос (добавить соединение данных) или выполнять запрос при выводе строки и затем заполнять вычисляемые колонки?
 
 Партнерская программа EFSOL Oblako
   hhhh
 
1 - 04.12.20 - 06:15
(0) это точно семерка?
   Андрей_Андреич
 
2 - 04.12.20 - 06:18
(1) Это 7.7 + компонента 1С++ + написанные на ней классы.
   ДенисЧ
 
3 - 04.12.20 - 07:19
(0) 1. а что, он у тебя сильно дёргается?
2. Запрос в цикле, что может быть хуже?
   Sserj
 
4 - 04.12.20 - 07:26
(0) По поводу 2 на мой взгляд правильней выгребать остатки из регистров в ИндексированнуюТаблицу с индексом по элементу и при выводе строки брать из нее данные. Если нужно то эти остатки по таймеру обновлять.
   Андрей_Андреич
 
5 - 04.12.20 - 07:39
(3) Я не проверял. Похоже возражений нет?
Про запрос в цикле. У меня сейчас в форме списка первой колонкой текстовое поле с формулой ПолучитьОстатки() - эта функция выполняет параметризованный запрос и рассчитывает значения для остальных колонок. Вроде пашет лет 15 беспроблемно. Но тогда по другому было никак - вот и спрашиваю как правильно.
(4) А как узнавать,когда надо обновлять? Поставщик генерит событие при обновлении?
   Sserj
 
6 - 04.12.20 - 07:47
(5) А никак не узнавать, просто по таймеру перезаполнять ИТЗ и вызывать у табличного поля ПерерисоватьСтроки.
Оно обновляется не дергая поставщика, но при этом отрабатывается ПриВыводеСтроки.
   ADirks
 
7 - 04.12.20 - 08:04
Остатки лучше в запросе собирать, на ТА - это не сильно напрягает сервер, зато удобнее.
   Андрей_Андреич
 
8 - 04.12.20 - 08:16
(7) То есть присоединить запрос (добавить соединение данных)? Ок
Кстати обнаружил - не работает поиск по коду при наборе в колонке. Код текстовый. По другим текстовым полям работает
   Mikeware
 
9 - 04.12.20 - 08:28
(0)
1. даже если и дернет разок - хотя какой элемент формы и зачем будет дергать данные?
2. зависит от формы, и соединения. если в подборе даннне ы таблице - то соединение, а если встал на строку - а в реквизитах формы вываливюется дополнительные данные - то доп.данные получать отдельно.
(1) абсолютно точно
   ADirks
 
10 - 04.12.20 - 13:47
(8) возможно, надо вместо Алиас.Code написать  LTrim(Алиас.Code)
   alyuev
 
11 - 04.12.20 - 16:04
"Поставщик данных" - это класс? Который http://catalog.mista.ru/public/67841/?
   Mikeware
 
12 - 04.12.20 - 18:40
(11) да
   Андрей_Андреич
 
13 - 06.12.20 - 06:34
(10) Не понял. Я использую готовый класс. То есть или не та версия или ошибка в классе. Ну или я тупой, что вполне вероятно.
   Mikeware
 
14 - 06.12.20 - 11:13
(13) любой из этих трех вариантов не мешает попробовать...
   Cthulhu
 
15 - 06.12.20 - 19:15
оффтопик(ли?)
"когда динозавры вымирают - остаются крысы" (с) не моё
   Андрей_Андреич
 
16 - 09.12.20 - 06:51
(15) Спасибо, добрый человек. Это у Райкина миниатюра была. Вроде не крысы, а тараканы.
С соединением разобрался. Теперь дальше.
Реквизиты на форме выводятся, по-видимому, в процедуре ПриАктивизацииСтроки.
Часть колонок табличной части надо вычислять ПриВыводеСтроки.
Подскажите,  как добавить эту вычислямую колонку?
   Sserj
 
17 - 09.12.20 - 06:56
(16) Дэк просто добавь колонку без пути к данным.
Т.е. поле Данные не указывай при создании колонки. Она будет пустая и делай ПриВыводеСтроки с ней что хочешь.
   Андрей_Андреич
 
18 - 09.12.20 - 07:04
(17) Да уже много вариантов перепробовал. Только что сработал "ПоставщикДанных.ТабличноеПоле.Колонки.Добавить". Сейчас попробую заполнять. Или есть более простой вариант? Не люблю много точек :)
Еще вопросик - если колонка невидимая, то обрабатывать ее ПриВыводеСтроки необязательно? Вроде при изменении видимости все перерисуется по новой?
   Sserj
 
19 - 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
  $цены.ТипЦены = :НужныйТипЦен

Запрос не точный, просто по памяти написал, главное смысл. ПоставщикДанных сначала отберет нужное ему количество строк и только для них будет расчет цен.
   Sserj
 
20 - 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 - 09.12.20 - 07:30
(19) Понятно, благодарю. Ну и сразу следующий вопрос - реализовано ли дерево групп и как? Имеется в виду как в типовой семерке два взаимодействующих объекта на форме.
   alyuev
 
22 - 09.12.20 - 15:21
(8) Для быстрого поиска по коду я уже делал как-то правку: http://www.1cpp.ru/forum/YaBB.pl?num=1285520767/627#627
   alyuev
 
23 - 09.12.20 - 15:23
Перенесу оттуда текст моего сообщения:

Нужно заменить в функции БыстрыйПоискПоПодстроке() класса ПоставщикДанных.Справочник для условия:
    Если Врег(ИмяКолонки) = "КОД" Тогда
 
на нижеследующий код:

    Если МетаСправочник.ТипКода="Числовой" Тогда
        ТекстЗапросаПоиска = ТекстЗапросаПоиска + "
        |"+КлючевоеСлово+" ТекущийОбъект.code = '"+Формат(Значение,"Ч"+МетаСправочник.ДлинаКода+" ")+"'
        |";
    Иначе
        ТекстЗапросаПоиска = ТекстЗапросаПоиска + "
        |"+КлючевоеСлово+" substr"+?(ЭтоSQL = 1,"ing","")+"(ТекущийОбъект.code,1,"+СтрДлина(СокрЛП(Значение))+") "+?(ЭтоSQL = 0,"collate _1C ","")+"= '"+Нрег(СокрЛП(Значение))+"'
        |";
    КонецЕсли;
 

Здесь использую СокрЛП(Значение) потому как ранее вызывалась функция ПодготовитьЗначениеПоиска() и в ней текстовое Значение форматируется в полную строку с длиной кода, т.е. ввели "8" - получили "8    ". А оно нам не надо...
   koala45
 
24 - 09.12.20 - 15:44
Но тогда по другому было никак - вот и спрашиваю как правильно.
   Андрей_Андреич
 
25 - 10.12.20 - 05:22
(23) Спасибо, поправил - заработало. Как бы до автора донести чтобы внес исправления?
   Андрей_Андреич
 
26 - 10.12.20 - 08:20
(25) + код все-таки привычней по первым символам, а не по вхождению. Впрочем, это уже несложно доделать будет при необходимости


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.