0
Не ошибка

Клонирование карточек - попадают данные из изначальной карточки

Selivanov Alexandr 6 лет назад обновлен 6 лет назад 32
При Клонировании карточки Номенклатура (Продукты) в новую карточку  попадают данные из изначальной карточки. Например на вкладку Сводка попадают данные из изначальной карточки об: Доходность, сумма всех продаж, проданное кол-во, кол-во клиентов, дата первой продажи, дата последней продажи. Разве так должно быть? может я неправильно понимаю для чего служит Клонирование? В чем разница между Клонированием и Копированием? Когда их можно применять а когда нельзя? 
Где пользователь может получить такую информацию? Или он должен на собственном опыте обнаруживать, что можно а что нельзя?
Готовы ли подробные инструкции по КК торговля?
На рассмотрении
Здравствуйте, Александр!

Данные по доходности и другие аггрегированне характеристики рассчитываются и хранятся в карточках, что бы обеспечить скорость получения данных при выборках.

"Клонирование" - штатная функция платформы и одинаково работает на любых карточках, а именно копирует ВСЕ атрибуты, не зависимо от того, какая логика была заложена в нём, и когда и как он должен рассчитываться.

По этой причине мы не рекомендуем использовать клонирование для сложных объектов с массой подчиненых справочников и расчетных данных, хранящихся в карточке. 
Я не очень тогда понимаю, дле чего Клонирование? в каком случае его можно использовать?
И можно ли в данной ситуации использовать Копирование. 
Функция "Копировать" для номенклатуры и была реализована дял таких задач. 

А клонирование удобно, когда одинаковые значения плоских (одноуровневых) справочников многократно вводятся.
что мн делать с теми карточками, которые у меня уже клонированы? их довольно много. там данные не обновятся? Эти данные попадают еще куда то кроме вкладки Сводка? я заметил, что когда я в режиме Анализ реализации продуктов. то некоторые данные верны. а некоторые нет. Причем если я правильно помню, то там где неверны, именно повторялись данные из другой карточки. А Анализ Реализайии продуктов мне очень нужен и важен, и конечно с верными данными по продажам.
На их основе я делаю заказы на продукцию для склада.
Что сейчас делать?
Самое простое и быстрое решение выполнить скрипт производящий очистку, но дла него важно правильно указать условия выбора записей, где чистить... 

Сможете установить какой-то признак для таких продуктов, что ыб его использовать в скрипте?
Наверное смогу. но чтобы я правильно понял - скрипт удалит все данные и например на вкладке сводка будет пусто,  или восстановит правильные данные?
Если востановит правильные - то можно выполнить скрипт по всей номенклатуре (продукция).

Вообще то конечно правильно было бы скриптом пересчитать данные по Номенклатуре (продукция) если это возможно. Тогда бы у меня формировались отчеты с верными показателями (продажи,себестоимость. прибыльность, кол-во проданной продукции, и т д). а то сейчас просматривая какие либо отчеты я никогда не уверен в том, что они дают мне точную информацию. А это очень плохо, ведь статистика продаж очень важна.
Мысль все показатели пересчитать - замечательная!!!

Самый простой и быстрый способ это сделать запустить выполнение Хранимых вычислений. 

1. Запускаем Конфигуратор.
2. В дереве классов находим "Номенклатура" - встаём на этот класс.
3. В нижней части видим список хранимых вычислений. Нажимаем на любом из них правой кнопкой мыши. Видим контекстное меню.
4. В контекстном меню выбираем Выполнить -> Все вычисления класса
5. Ждем. Радуемся.

ОБЯЗАТЕЛЬНО СДЕЛАТЬ РЕЗЕРЫНУЮ КОПИЮ БАЗЫ !!!
Одним из вариантов отбора данных в такой ситуации может служить "дата создания" или "изменения" - если Вы точно уверены, клонирование в этот преиод было ошибочным.
Для уважаемых мною  разработчиков это, кстати, повод убрать из "Клонирования" автоматически проставленные "галочки"
Дмитрий, Вы про Клонирование или про Копирование? 

Клонирование - функция платформы.
Копирование - конфигурации. Я не думаю, что имеет смысл убирать предустановленные галочки - это время экономит для большинства типовых ситуаций.
Да, Вы правы, немного ошибся - кнопка "Копировать" подразумевалась
Выполнил -> Все вычисления класса. Но большая часть инфо на вкладке Сводка не изменилась. проверил в конфиг, в Номенклатура, какие хранимые вычисления есть в классе Номенклатура. И получается, что на  большую часть инфо со вкладки Сводка, здесь нет Хран вычисл.. Естб Хр Вычисл - доходность - на Сводка оно сейчас верное. А сумма всех продаж, проданное кол-во, кол-во клиентов, дата первой продажи, дата последней продажи - инфо не поменялась, осталась неверной. Но и подобных хранимых вычислений  в Номенклатура нет. Может ту же процедуру - Выполнить -> Все вычисления класса - повторить в каких то других классах?
Выполнил -> Все вычисления класса. Но большая часть инфо на вкладке Сводка не изменилась. проверил в конфиг, в Номенклатура, какие хранимые вычисления есть в классе Номенклатура. И получается, что на большую часть инфо со вкладки Сводка, здесь нет Хран вычисл.. Естб Хр Вычисл - доходность - на Сводка оно сейчас верное. А сумма всех продаж, проданное кол-во, кол-во клиентов, дата первой продажи, дата последней продажи - инфо не поменялась, осталась неверной. Но и подобных хранимых вычислений в Номенклатура нет. Может ту же процедуру - Выполнить -> Все вычисления класса - повторить в каких то других классах?
Разобрались с пересчетом аналитик. Процедура не записывала нулевые значения. Т.е. при клонировании, когда копируются все данные из основной карточки, копировалась и аналитика, процедура же, которая отрабатывалась после этого не обнуляла данные из-за ошибки в ней. Вам нужно открыть SQL Mabagment Studio и прогнать там два следующих скрипта. Не забудьте при выполнении выбрать вашу базу данных 
/****** Object: StoredProcedure [dbo].[AXI_NomenklaturaRecountAnalitikaOne] Script Date: 07/13/2014 20:14:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[AXI_NomenklaturaRecountAnalitikaOne]
as
begin
set nocount on;
/*#Table1 - справочник номенклатуры*/
declare @Table table
(ProductID int
,DateFirstProdazha datetime
,DateLastProdazha datetime
,SummaProdazha decimal(15,2)
,KolProdano decimal(15,2)
,KolKlient int
,KolShet int
,KolPost int
,KolReclamation int
,KolSoputstv int
,KolAnalog int
)


insert into @Table(
ProductID
,DateFirstProdazha
,DateLastProdazha
,SummaProdazha
,KolProdano
,KolKlient
,KolShet
)
select
a131.ObjectID
,MIN(p2277)--дата первой продажи
,MAX(p2277)--дата последней продажи
,SUM(case

when a131.p898 = a230.p2438 then p2461

when a131.P898 = dbo.AXI_BaseCurrency() then a230.p2466

else cast(a230.p2461*a230.p2439/dbo.AXI_SelectExchange(a131.P898,getdate()) AS decimal(15,2))

end)--сумма продано
,SUM(a230.P4175)--количество проданного в осн.ед.изм.
,COUNT(Distinct a229.p2279)--количество контрагентов
,COUNT(distinct a229.ObjectID)--количество счетов
from #Table1 b0
inner join dbo.Attr131 a131 on b0.ObjectID = a131.ObjectID
inner join dbo.Attr230 a230 on a230.P2327 = a131.ObjectID
inner join dbo.Attr229 a229 on a229.ObjectID = a230.P2325
where a229.p2278 in (246)--подписан
group by a131.ObjectID




update b0
set KolPost = (select COUNT(*) from dbo.Attr154 where p908 = b0.ProductID)
,KolReclamation = (select COUNT(*) from dbo.Attr118 where p1404 = b0.ProductID)
,KolSoputstv = (select COUNT(*) from dbo.Attr208 where p1655 = b0.ProductID)
,KolAnalog = (select COUNT(*) from dbo.Attr207 where p1647 = b0.ProductID)
,KolShet = (select COUNT(*) from dbo.Attr130 a130

inner join dbo.Attr129 a129 on a129.ObjectID = a130.P628

where a129.p664 in (17,16)-- ожидает оплаты, оплачен

and a130.P631 = b0.ProductID)
from @Table b0


insert into @Table(

ProductID

,DateFirstProdazha

,DateLastProdazha

,SummaProdazha

,KolProdano

,KolKlient

,KolShet
)
select

ProductID

,DateFirstProdazha

,DateLastProdazha

,0

,0

,0

,0
from @Table b0
Right join #Table1 b1 on b0.ProductID = b1.ObjectID
where b0.ProductID IS NULL


update a131
set
p1855 = DateFirstProdazha--Дата первой продажи
,p1856 = DateLastProdazha--Дата посл. продажи
,p1858 = SummaProdazha--Сумма всех продаж
,p1859 = KolProdano--проданное кол-во
,p1860 = KolKlient--КОличество клиентов
,p1864 = KolShet--Количество счетов
,p1861 = KolPost
,p1863 = KolReclamation
,p1862 = KolAnalog
,p1865 = KolSoputstv
from @Table b0
inner join dbo.Attr131 a131 on a131.ObjectID = b0.ProductID








END

USE [kk_trade]
GO
/****** Object: StoredProcedure [dbo].[AXI_NomenklaturaRecountAnalitikaAll] Script Date: 07/13/2014 21:14:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[AXI_NomenklaturaRecountAnalitikaAll]
as
begin
set nocount on;
/*#Table1 - справочник номенклатуры*/
declare @Table table
(ProductID int
,DateFirstProdazha datetime
,DateLastProdazha datetime
,SummaProdazha decimal(15,2)
,KolProdano decimal(15,2)
,KolKlient int
,KolShet int
,KolPost int
,KolReclamation int
,KolSoputstv int
,KolAnalog int
)


insert into @Table(
ProductID
,DateFirstProdazha
,DateLastProdazha
,SummaProdazha
,KolProdano
,KolKlient
,KolShet
)
select
a131.ObjectID
,MIN(p2277)--дата первой продажи
,MAX(p2277)--дата последней продажи
,SUM(case

when a131.p898 = a230.p2438 then p2461

when a131.P898 = dbo.AXI_BaseCurrency() then a230.p2466

else cast(a230.p2461*a230.p2439/dbo.AXI_SelectExchange(a131.P898,getdate()) AS decimal(15,2))

end)--сумма продано
,SUM(a230.P4175)--количество проданного в осн.ед.изм.
,COUNT(Distinct a229.p2279)--количество контрагентов
,COUNT(distinct a229.ObjectID)--количество счетов
from dbo.Attr131 a131
inner join dbo.Attr230 a230 on a230.P2327 = a131.ObjectID
inner join dbo.Attr229 a229 on a229.ObjectID = a230.P2325
where a229.p2278 in (246)-- подписан
group by a131.ObjectID




update b0
set KolPost = (select COUNT(*) from dbo.Attr154 where p908 = b0.ProductID)
,KolReclamation = (select COUNT(*) from dbo.Attr118 where p1404 = b0.ProductID)
,KolSoputstv = (select COUNT(*) from dbo.Attr208 where p1655 = b0.ProductID)
,KolAnalog = (select COUNT(*) from dbo.Attr207 where p1647 = b0.ProductID)
,KolShet = (select COUNT(*) from dbo.Attr130 a130

inner join dbo.Attr129 a129 on a129.ObjectID = a130.P628

where a129.p664 in (17,16)-- ожидает оплаты, оплачен

and a130.P631 = b0.ProductID)
from @Table b0


insert into @Table(

ProductID

,DateFirstProdazha

,DateLastProdazha

,SummaProdazha

,KolProdano

,KolKlient

,KolShet
)
select

ProductID

,DateFirstProdazha

,DateLastProdazha

,0

,0

,0

,0
from @Table b0
Right join #Table1 b1 on b0.ProductID = b1.ObjectID
where b0.ProductID IS NULL


update a131
set
p1855 = DateFirstProdazha--Дата первой продажи
,p1856 = DateLastProdazha--Дата посл. продажи
,p1858 = SummaProdazha--Сумма всех продаж
,p1859 = KolProdano--проданное кол-во
,p1860 = KolKlient--КОличество клиентов
,p1864 = KolShet--Количество счетов
,p1861 = KolPost
,p1863 = KolReclamation
,p1862 = KolAnalog
,p1865 = KolSoputstv
from @Table b0
inner join dbo.Attr131 a131 on a131.ObjectID = b0.ProductID






END

Здравствуйте. Прогнал оба скрипта. процедура выполнена успешно. В КК в номенклатуре изменений нет. Пересчитал все ХВ в Конфиг. в Номенклатура. В КК в номенклатуре изменений все равно нет. Те же неправильные данные остались. Вроде бы все сделал правильно. Что будем делать?.
Может нужно запустить Обновление базы данных (которое из меню Пуск). В Конфиг я конечно обновлял.
Когда скрипт прогоняли, базу свою выбирали? Вот здесь?
Нужно еще "пересчитать аналитики" по продуктам
Базу выбирал, правда не вверху. а слева сбоку. из списка баз.
Аналитики повсем продуктам пересчитать неполучается выдает ошибку "неверное имя обьекта Тable1'."Но я перечситал по одному продукту, по которому я проверяю данные сейчас, по нему ничео не измениось.
Если я те же два скрипта пррогоню еще раз, так можно? Может я все ткаи что то не так сделал.
Вот теперь становится странно. А какие данные там должны быть? Получается это не чистая, только что клонированная запись?
Чтобы не было непонимания. Данные в сводке считаются по реализациям.
Это запись свежая, от 06-6-2014, в ней сейчас  кол-во проданного товара 1001 шт. А реально реализовано  - 1 шт. т е 1000 шт добавлено из клонированной карточки. так же с кол-вом клиентов их сейчас 2, а реально был один клиент. И еще неверная инфо в Сумма всех продаж.

Проверил на нашей базе, все правильно посчиталось. Можно организовать к вам подключение и посмотреть, что не так?
 Куда нужно подключиться - к СКЛ  или достаточно на комп где есть конф, диз, адм? может удобнее общаться по скайп: Alexandr Selivanov
к SQL нужно будет точно подключаться.
Уточните пожалуйста скайп, очень много там пользователей Alexandr Selivanov
Базу выбирал, правда не вверху. а слева сбоку. из списка баз. 
Аналитики повсем продуктам пересчитать неполучается выдает ошибку "неверное имя обьекта Тable1'."Но я перечситал по одному продукту, по которому я проверяю данные сейчас, по нему ничео не измениось. 
Если я те же два скрипта пррогоню еще раз, так можно? Может я все ткаи что то не так сделал.
скрипты повторно прогонять нет смысла, и обновлять данные тоже.
Для аналитик по всем продуктам поправил, вот еще один скрипт
ALTER procedure [dbo].[AXI_NomenklaturaRecountAnalitikaAll]
as
begin
set nocount on;
/*#Table1 - справочник номенклатуры*/
declare @Table table
(ProductID int
,DateFirstProdazha datetime
,DateLastProdazha datetime
,SummaProdazha decimal(15,2)
,KolProdano decimal(15,2)
,KolKlient int
,KolShet int
,KolPost int
,KolReclamation int
,KolSoputstv int
,KolAnalog int
)

insert into @Table(
ProductID
,DateFirstProdazha
,DateLastProdazha
,SummaProdazha
,KolProdano
,KolKlient
,KolShet
)
select
a131.ObjectID
,MIN(p2277)--дата первой продажи
,MAX(p2277)--дата последней продажи
,SUM(case
when a131.p898 = a230.p2438 then p2461
when a131.P898 = dbo.AXI_BaseCurrency() then a230.p2466
else cast(a230.p2461*a230.p2439/dbo.AXI_SelectExchange(a131.P898,getdate()) AS decimal(15,2))
end)--сумма продано
,SUM(a230.P4175)--количество проданного в осн.ед.изм.
,COUNT(Distinct a229.p2279)--количество контрагентов
,COUNT(distinct a229.ObjectID)--количество счетов
from dbo.Attr131 a131
inner join dbo.Attr230 a230 on a230.P2327 = a131.ObjectID
inner join dbo.Attr229 a229 on a229.ObjectID = a230.P2325
where a229.p2278 in (246)-- подписан
group by a131.ObjectID


update b0
set KolPost = (select COUNT(*) from dbo.Attr154 where p908 = b0.ProductID)
,KolReclamation = (select COUNT(*) from dbo.Attr118 where p1404 = b0.ProductID)
,KolSoputstv = (select COUNT(*) from dbo.Attr208 where p1655 = b0.ProductID)
,KolAnalog = (select COUNT(*) from dbo.Attr207 where p1647 = b0.ProductID)
,KolShet = (select COUNT(*) from dbo.Attr130 a130
inner join dbo.Attr129 a129 on a129.ObjectID = a130.P628
where a129.p664 in (17,16)-- ожидает оплаты, оплачен
and a130.P631 = b0.ProductID)
from @Table b0

insert into @Table(
ProductID
,DateFirstProdazha
,DateLastProdazha
,SummaProdazha
,KolProdano
,KolKlient
,KolShet
)
select
ProductID
,DateFirstProdazha
,DateLastProdazha
,0
,0
,0
,0
from @Table b0
Right join dbo.Attr131 a131 on b0.ProductID = a131.ObjectID
where b0.ProductID IS NULL

update a131
set
p1855 = DateFirstProdazha--Дата первой продажи
,p1856 = DateLastProdazha--Дата посл. продажи
,p1858 = SummaProdazha--Сумма всех продаж
,p1859 = KolProdano--проданное кол-во
,p1860 = KolKlient--КОличество клиентов
,p1864 = KolShet--Количество счетов
,p1861 = KolPost
,p1863 = KolReclamation
,p1862 = KolAnalog
,p1865 = KolSoputstv
from @Table b0
inner join dbo.Attr131 a131 on a131.ObjectID = b0.ProductID



END

Сервис поддержки клиентов работает на платформе UserEcho