К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Переход ТиС 9 - УТ 10

Гость
0 - 05.08.2012 - 19:47
Штатным методом не получается - не загружаются в УТ поступление тмц, комплектация, оприходование и списание. Все заявки (неподтвержденые и обычные) загрузились как просто заявки на склад.
В файл обмена выгружаются все документы. А вот УТ их режет. В чём может быть причина? Что посмотреть/сравнить?
Подскажите, пожалуйста, кто сталкивался. )



Гость
81 - 09.08.2012 - 10:05
(75) "При использовании СКД глубоко фиолетово какую таблицу юзать в запросе - регистр или документ. Лишь бы в индексы попасть." Не верится. Виртуальные таблицы фактически обращаются в таблицам итогов, разве нет?
Гость
82 - 09.08.2012 - 10:21
В отчете ЗаказТовараУПоставщиков запрос

ВЫБРАТЬ
Продажи.Товар КАК Товар,
Продажи.Количество КАК Количество_Продано,
Продажи.Сумма КАК Сумма_Продано,
ЕСТЬNULL(регОстатки.КоличествоОстаток, 0) КАК Количество_Остаток,
ПРЕДСТАВЛЕНИЕССЫЛКИ(Продажи.Товар) КАК ТоварПредставление,
Продажи.Товар.Наименование КАК ТоварНаименование
ИЗ
(ВЫБРАТЬ
Продажи.Товар КАК Товар,
СУММА(Продажи.Количество) КАК Количество,
СУММА(Продажи.Сумма) КАК Сумма,
Продажи.Склад КАК Склад
ИЗ
(ВЫБРАТЬ
регПродажи.Товар КАК Товар,
регПродажи.КоличествоОборот КАК Количество,
регПродажи.СуммаСоСкидкойОборот КАК Сумма,
регПродажи.ДокументПродажи.Склад КАК Склад
ИЗ
РегистрНакопления.Продажи.Обороты(, , , ) КАК регПродажи
ГДЕ
регПродажи.ДокументПродажи.Склад = &Склад

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
регОстатки.Товар,
регОстатки.Количество,
регОстатки.Количество * регОстатки.ЦенаРеализации,
регОстатки.Склад
ИЗ
РегистрНакопления.ОстаткиТоваров КАК регОстатки
ГДЕ
ТИПЗНАЧЕНИЯ(регОстатки.Регистратор) = ТИП(Документ.РасходнаяНакладная)
И регОстатки.Склад = &Склад) КАК Продажи

СГРУППИРОВАТЬ ПО
Продажи.Товар,
Продажи.Склад) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрТовары
ПО (спрТовары.Ссылка = Продажи.Товар)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК регОстатки
ПО (регОстатки.Товар = Продажи.Товар)
ГДЕ
спрТовары.фНеЗаказываем = ЛОЖЬ


Я, конечно, выберу время и перецарапаю базу в скуль. И гляну план запроса. Но, честно говоря - запрос-то элементарный..
Гость
83 - 09.08.2012 - 10:22
79-Reaper >тех. журнал у 8.2.15 умеет даже для файловой версии собирать планы выполнения запросов.
Поставил себе галочку. Спасибо за информацию.
Гость
84 - 09.08.2012 - 10:23
79-Reaper > Про регистр Продажи спорить не буду. Буду думать и экспериментировать.
Хотя, честно говоря, не хотелось бы, что бы в него расходная что-то писала...
Гость
85 - 09.08.2012 - 10:26
81-Пудель >Виртуальные таблицы фактически обращаются в таблицам итогов, разве нет?
Не совсем понял вопрос. Виртуальные таблицы, разумеется, обращаются к реальным таблицам (итогов и движений), так как "виртуальная таблица" - это всего лишь запрос.
86 - 09.08.2012 - 10:30
Цитата:
Сообщение от Sadovnikov Посмотреть сообщение
это всего лишь запрос.
запрос к таблице с большим числом индексов, специально настроенных под этот запрос. Разницу видишь?
Гость
87 - 09.08.2012 - 10:36
86-bma1 > Нет, не вижу. Так как в исходной посылке было "лишь бы в индексы попасть".
Гость
88 - 09.08.2012 - 10:48
Через какой драйвер у тебя заведены сканера? COM или эмуляция клавиатуры?
Гость
89 - 09.08.2012 - 10:50
(84) Запили в него еще пару ресурсов "Количество по расходным" и "Сумма по расходным", если так логика устроена жестко.
Гость
90 - 09.08.2012 - 10:57
88-Reaper > Еще хлеще... Эмуляция СОМ-порта на USB.
89-Reaper > Нафиг-нафиг. Итоги вспухнут и время записи увеличится.
Гость
91 - 09.08.2012 - 11:04
(85) ну вот значит и не всё равно, по документам или по регистрам собирать данные.
(82) Ужас :)
1. Вот это плохой фрагмент, должен сильно тормозить:
"ВЫБРАТЬ
регОстатки.Товар,
регОстатки.Количество,
регОстатки.Количество * регОстатки.ЦенаРеализации,
регОстатки.Склад
ИЗ
РегистрНакопления.ОстаткиТоваров КАК регОстатки
ГДЕ
ТИПЗНАЧЕНИЯ(регОстатки.Регистратор) = ТИП(Документ.РасходнаяНакладная)
И регОстатки.Склад = &Склад"

здесь плохо всё :)
2. "ГДЕ
регПродажи.ДокументПродажи.Склад = &Склад"
Вот это условие пихать в виртуальную таблицу конечно, а не снаружи накладывать. Параметр условие в виртуальной таблице не просто так введён, разница очень большая.
3. "ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрТовары
ПО (спрТовары.Ссылка = Продажи.Товар)" вот это не нужно. Если не устраивает вторая точка Продажи.Товар.фНеЗаказываем , то лучше предварительно подготовить список подходящих и не подходящих товаров, временной например таблицей.
И это условие обязательно накладывать внутри виртуальных таблиц, опять же.
Если не верится - проверять низкоуровневый запрос формирования виртуальной таблицы.
Гость
92 - 09.08.2012 - 11:09
91-Пудель > ну вот значит и не всё равно, по документам или по регистрам собирать данные.
Абсолютно все равно. И то и другое - таблица. Главное - попасть в индекс. И, если есть, более свернутые данные - пользоваться именно ими.

По поводу запроса. Извини, но ты фигню полнейшую написал...
Гость
93 - 09.08.2012 - 11:10
(90) Да ничего там не вспухнет у оборотного регистра.
(91) А ты представь что с этим запросом может СКД наколбасить...
Гость
94 - 09.08.2012 - 11:13
93-Reaper > Как это не вспухнет? Итоги-то оно куда-то записывать должно. И предварительно считать их.
Около 3-х тысяч активных SKU помножим на 3 склада, 2 ресурса...
Гость
95 - 09.08.2012 - 11:16
(92) :) ну мучайтесь дальше
Гость
96 - 09.08.2012 - 11:17
95-Пудель > Ты непрозрачно намекаешь, что 1С-кий оптимизатор - еще хуже, чем я о нем думаю?
Гость
97 - 09.08.2012 - 11:20
Он не хуже, он другой :). Дело в том, что наложение условия внутри виртуальной таблицы и снаружи в ряде случаев отличается и по результатам, яркий пример - срез последних регистра сведений.
Но в данном конкретном случае внешнее условие отличается от условия в параметре виртуальной таблицы только тем, что будет сильно тормозить.
Гость
98 - 09.08.2012 - 11:25
(94) Ты попробуй ;)
Гость
99 - 09.08.2012 - 11:44
Допекли :)
Перекинул базу в скуль.
Перестаньте наговаривать на 1С-кий оптимизатор. Всё нормально с ним. Он по честному нифига не делает с запросом. По крайней мере, в данном случае.

ТИПЗНАЧЕНИЯ(регОстатки.Регистратор) = ТИП(Документ.РасходнаяНакладная)
И регОстатки.Склад = &Склад"
здесь плохо всё :)

Всё нормально здесь. Имеем, как минимум, попадание в индекс _AccumRg115_ByRecorder_RN. Единственно, что, возможно, требуется сделать - проиндексировать измерение Склад. Но имея всего 3 склада, получим на столько фиговую селективность, что лучше этого не делать.

Вот это условие пихать в виртуальную таблицу конечно
Монопенисуально. 1С-кий оптимизатор плевал на это, а скулевый прекрасно разобрался.

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

Работая через вторую точку как раз получим левый джоин. Что я явно прописал в запросе и четко вижу, что будет выполняться.
Вариант со временной таблицей - более худший из-за большего расхода ресурсов.
Гость
100 - 09.08.2012 - 11:45
Что бы не быть голословным и на предмет пнуть меня, если я что-то просмотрел, вот:

SELECT
T1.Q_003_F_000RRef,
T1.Q_003_F_001_,
T1.Q_003_F_002_,
ISNULL(CAST(T8.Fld117Balance_ AS NUMERIC(27, 3)),@P1),
T1.Q_003_F_000RRef,
T10._Description,
T10._Description
FROM (
SELECT
T2.Q_001_F_000RRef AS Q_003_F_000RRef,
CAST(SUM(T2.Q_001_F_001_) AS NUMERIC(38, 8)) AS Q_003_F_001_,
CAST(SUM(T2.Q_001_F_002_) AS NUMERIC(38, 8)) AS Q_003_F_002_,
T2.Q_001_F_003RRef AS Q_003_F_003RRef
FROM
(
SELECT
T3.Fld161RRef AS Q_001_F_000RRef,
T3.Fld164Turnover_ AS Q_001_F_001_,
CAST(T3.Fld166Turnover_ AS NUMERIC(30, 5)) AS Q_001_F_002_,
T5._Fld412RRef AS Q_001_F_003RRef
FROM (
SELECT
T4._Fld161RRef AS Fld161RRef,
T4._Fld162RRef AS Fld162RRef,
CAST(SUM(T4._Fld166) AS NUMERIC(33, 8)) AS Fld166Turnover_,
CAST(SUM(T4._Fld164) AS NUMERIC(32, 8)) AS Fld164Turnover_
FROM
_AccumRgTn168 T4 WITH(NOLOCK)
GROUP BY
T4._Fld161RRef,
T4._Fld162RRef
HAVING
(CAST(SUM(T4._Fld166) AS NUMERIC(33, 8))) <> @P1 OR (CAST(SUM(T4._Fld164) AS NUMERIC(32, 8))) <> @P1
) T3
LEFT OUTER JOIN _Document78 T5 WITH(NOLOCK) ON T3.Fld162RRef = T5._IDRRef
WHERE
(T5._Fld412RRef = @P2)

UNION ALL

SELECT
T6._Fld116RRef AS Fld116RRef,
CAST(T6._Fld117 AS NUMERIC(27, 3)) AS Fld117_,
(T6._Fld117 * T6._Fld248),
T6._Fld422RRef AS Fld422RRef
FROM
_AccumRg115 T6 WITH(NOLOCK)
WHERE
(T6._RecorderTRef = @P3) AND (T6._Fld422RRef = @P2)
) T2
GROUP BY
T2.Q_001_F_000RRef,
T2.Q_001_F_003RRef
) T1
LEFT OUTER JOIN _Reference7 T7 WITH(NOLOCK) ON (T7._IDRRef = T1.Q_003_F_000RRef)
LEFT OUTER JOIN (
SELECT
T9._Fld116RRef AS Fld116RRef,
CAST(SUM(T9._Fld117) AS NUMERIC(32, 8)) AS Fld117Balance_
FROM
_AccumRgT119 T9 WITH(NOLOCK)
WHERE
T9._Period = @P4 AND ((T9._Fld422RRef = @P2))
GROUP BY
T9._Fld116RRef
HAVING (CAST(SUM(T9._Fld117) AS NUMERIC(32, 8))) <> @P1
) T8 ON (T8.Fld116RRef = T1.Q_003_F_000RRef)
LEFT OUTER JOIN _Reference7 T10 WITH(NOLOCK)ON T1.Q_003_F_000RRef = T10._IDRRef
WHERE
(T7._Fld277 = @P5)
Гость
101 - 09.08.2012 - 11:49
Тебе план запроса или приемлемую работу в файловом варианте?
Гость
102 - 09.08.2012 - 11:52
А вот что 1С-ка вытворяет дальше - это уму не растяжимо... Башку за такое отрывать надо.
Гора:
exec sp_executesql N'INSERT INTO #tt1 (_INVALUELISTRRef) VALUES(@P1)',N'@P1 varbinary(16)',0xBB73001E101F8C0511E0DB5E8F22AB10
Для конечного:
SELECT
T1._IDRRef,
T1._IDRRef,
T1._Description,
T1._ParentIDRRef,
T1._Description
FROM _Reference7 T1 WITH(NOLOCK)
WHERE T1._IDRRef IN
(SELECT
T2._INVALUELISTRRef AS INVALUELISTRRef
FROM #tt1 T2 WITH(NOLOCK)
WHERE T2._INVALUELISTRRef IS NOT NULL)
Гость
103 - 09.08.2012 - 11:52
Я имел в виду переделать и сравнить, вообще-то, а не анализировать то, что получается по исходному варианту.
Гость
104 - 09.08.2012 - 12:02
101-Reaper > Э... А в контексте 1С есть разница? Хотя... Это де 1С, че я фигню говорю.
103-Пудель > Ради интереса чуть позже попробую. Если, вдруг, в твоем варианте будут улучшения в плане скорости - потеряю веру в человечество и убьюсь веником.
Гость
105 - 09.08.2012 - 12:02
Совсем печально... Садовников полез своими руками клюшечника и скульщика в восьмерку...
Видимо, ув.Садовников не в курсе про таблицы агрегатов и те извращения, что делает "оптимизатор" (хотя можно ли ЭТО так называть) при расчете всяких виртуальных таблиц.
ПЫСЫ: Условие ТипЗначения(Регистратра) = "что то там" в любом случае херит всю концепцию регистров-агрегатов. За такое надо бить лицо!!!
Гость
106 - 09.08.2012 - 12:03
105-Lexusss > Восьмерка опровергла все законы реляционных баз данных?

Условие ТипЗначения(Регистратра) = "что то там" в любом случае херит всю концепцию регистров-агрегатов.
Расшифруй чуть более подробно? Мне правда интересно.
Гость
107 - 09.08.2012 - 12:11
и те извращения, что делает "оптимизатор"
Я, конечно, всегда понимал, что хороший семерочник - это тот, кто хорошо знает теорию БД, язык 1С и умеет всем этим пользоваться, а хороший восьмерочник - это тот, кто знает как можно больше косяков платформы. Но что б на столько...
Гость
108 - 09.08.2012 - 12:16
(106) Ты, видимо, живешь в прекрасном мире третьей нормальной формы?
В реальности гораздо приятнее иметь таблицу-агрегат с подбитыми помесячными итоговыми цифрами с выручкой по конкретной номенклатуре, нежели бегать каждый раз к 1000 реализациям оной в базе. Пусть будем тратить время на ее актуализации и рисковать блокировками, но профит покруче!
Соответственно, для получения данных этого запроса в любой типовой 1С и любой другой из плотно видимых мной ERP (SAP, NAV, вроде в DAX та же петрушка) для получения выручки мы идем не в таблицу движений, а к некоторой таблице агрегатов (вроде lookup-таблицы). Причем поддержание этой таблицы выполняет сама платформа за счет тригеров вообще без нашего участия. Я даже спрашивал у моего преподавателя по программированию в NAV, в каких физических таблицах и как организовано хранение агрегатов. На что получил простой ответ - ХЗН, это никому не надо. :)))
(107) Извращение <> косяку. Просто зачастую смотреть на результат трансляции какого либо механизма 1С на уровень SQL весьма познавательно. Но такие вещи иногда увидишь - диву даешься. Та же самая обработка "В ИЕРАРХИИ" или RLS на запись по табличной части... Эпичнейшие вещи!!!
Гость
109 - 09.08.2012 - 12:21
108+ Причем в NAV, насколько я понял, даже не по всем измерениям существуют агрегаты. А считаются лишь по какой то статистически важной части по некоторым периодам.
Зато прикольный механизм получается на уровне платформы: карточка контрагента, а в ней поле суммы продажи с проваливанием напрямую в таблицу детализации по номенклатуре. 1Сникам приходится все это тупо кодить :)
Гость
110 - 09.08.2012 - 12:23
108-Lexusss >
1. Не соглашусь. Каждый случай надо рассматривать индивидуально. И легко можно получить такое, что в итоге пробежаться по движениям - существенно выгоднее в итоге, чем держать готовые цифре. В комплексе надо рассматривать ситуацию. А ответ "ХЗН" очень сильно уронил в моих глазах того самого преподавателя. Не профессионал он.
2. Извращение <> косяку - если это извращение не описано в документации, идущей с программным продуктам, то это - косяк. И никак иначе... Не стоит оправдывать необразованность писателей платформы...
Гость
111 - 09.08.2012 - 12:25
109-Lexusss > Не стоит NAV приводить в пример какой-то хорошей реализации. При всей моей нелюбви к 1С - 1С-ка, как платформа, все-таки покруче будет.
Ради прикола глянь, в каком виде в NAV хранится номер строки документа. По моему, 18 знаков после запятой - это некоторый перебор, на который не стоит равняться...
P.S. Смотрел лет 8 назад. Может, сейчас и изменилось.
Гость
112 - 09.08.2012 - 13:01
(110) 1. Полностью согласен.
Вот держать продажи в ERP в готовой таблице - практически всегда приятнее пробежки. Потому как смотрит отчет руководство, а для самого пупер-супер генерального шефа время столь дорого, что ждать генерации отчета 30 секунд совершенно не приемлимо. С другой стороны, конечно, может быть терминал для кассового фронта, где эта выручка с детализацией до номенклатуры - ну совсем не нужна!!!
2. В документации лишь написано, что это работает. И оно действительно работает. Но вот за счет каких внутренних механизмов - это как раз и определяет уровень системного спецп.
(111) Нууууу... GUID для ссылки - тоже не самая оптимальная вещь. Так что не надо позря гнать на NAV. :)))))))
Один черт у сапов такие же агрегаты. Да ты сам сколько копал 7.7: таблица остатков по регистрам или корреспонденция проводок в бухитогах - это такие же агрегаты, прямо топчущие 3ю нормальную форму!
ПЫСЫ: На теории БД ЕМНИП мы как раз и смотрели крайности, при которых полезно проводить нормализацию БД, а когда ее игнорить.
Гость
113 - 09.08.2012 - 13:09
112-Lexusss > Так. Я уже не понял - за что спорим? :)
Что не в определенных случая требуется денормализация? Даже спорить не буду, ибо согласен.
Что в любом случае надо задачу всю видеть в комплексе, а потом думать над структурой и алгоритмами? Таки и здесь согласен :)
Гость
114 - 09.08.2012 - 14:10
(113) Я высказал свое мнение исходя из того запроса, что ты показал: формируем что то в заказ-поставщику, имея на руках регистр продаж. Но при этом лезем еще и в таблицу движений товаров с дикими отборами! Итого: имеем нечто наподобии MRP, где данные извлекаются каким то жутким образом. Может быть, конечно, ты собрал статистику по БД, доказывающую что так будет оптимальнее. Но видя другие "творчества" в этом запросе, верится в это с трудом...
1. Вложенный запрос с объединением. SQL в этом случае не разворачивает внутренние сканы с внешними для оптимального использования индексов и минимизации количества слияния таблиц. Гораздо лучше это иметь в готовой таблице без объединения.
2. ЛЕВОЕ СОЕДИНЕНИЕ с справочником номенклатуры, и последующим жестким наложением условия ГДЕ на присоединяемую таблицу. Может, конечно, оптимизатор это и транслирует во внутреннее соединение, но это о многом говорит.
3. Наложение условие на номенклатуру в конце, а не во вложенном запросе. Вот здесь действительно надо угадать. Есть, конечно, шанс, что ты так обманываешь оптимизатор SQL от использования составных индексов, но верится с трудом...
4. Наложение условия на склад вне вирт таблицы Продажи.Обороты. В данном случае, без условия на период, это дейстивительно не важно. Но добавь сюда отбор по периоду - и это действительно станет архиважным! Вместо простого обращения к таблице оборотов будет сформировано еще прицепление к таблице движений, где вложенный отбор по складу играет очень положительное дело.
4...
Можно еще придираться к мелочам. Но такой запрос мой строгий фейс контроль гарантированно не прошел бы. Чистый неуд с небольшими шансами на пересдаче.
Гость
115 - 09.08.2012 - 14:16
114-Lexusss > Чуток поспорю по пунктам.
1. Со вложенными запросами с объединением скуль прекрасно справляется, включая распараллеливание.
2. Транслирует именно в INNER JOIN и даже не парится - проверено. А мне так запрос читать удобнее.
3. Тоже проверено на базах большого объема, что скулю так проще. У него больше вариантов для построения плана запроса, чем если бы я ему жестко указал. А он, зараза, в этом случае существенно умнее меня.
Так что, про неуд ты погорячился :)
Гость
116 - 09.08.2012 - 14:21
82-Sadovnikov >

РегистрНакопления.Продажи.Обороты(, , , ) КАК регПродажи

Не пробовал изменить на запрос просто к физ.таблице?
Ну и как максимум - добавить измерение "Склад".
Гость
117 - 09.08.2012 - 14:26
ой, мама... слона-то я и не заметил
ты отбор накладываешь в самом конце
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК регОстатки
ПО (регОстатки.Товар = Продажи.Товар)

вот это действительно, ужас
Гость
118 - 09.08.2012 - 14:32
1. Какой скуль? У меня план запроса всегда строился четко - сначала вложенный, потом слияние с внешними таблицами. Где то мелкософты даже писали, что такого нормальное поведение оптимизатора и по другому не будет. У меня в основном SQL 2005.
2. Для абсолютного большинства человечества (включая и меня) - так НЕ ПОНЯТНЕЕ. Программист, пишущий для себя, а не по общепринятому стандарту для наследников, - это очень большой минус к разработчику.
3. Черт, даже интересно посмотреть на план выполнения запроса, написано строго против всех рекомендаций 1С и хрени, что мы изучали на теории БД. Неужто в T4 действительно впихнет слияние с T7 для отбора по Fld277. Или там настолько скучная статистика по этому полю?
Гость
119 - 09.08.2012 - 14:34
(116,117) Мальчик, хватит нести чушь и иди в школу! Тут взрослые дядьки ругаются.
Гость
120 - 09.08.2012 - 14:35
116-android > Не пробовал изменить на запрос просто к физ.таблице?
А смысл? Тот же шарик, вид сбоку получим. Скуль все равно только один раз группировать будет. Хотя, если честно, уже не вспомню, почему по таблице не сделал.

117-android > Где именно ты здесь отбор увидел?


К списку вопросов






Copyright ©, Все права защищены