Имя: Пароль:
1C
1C 7.7
v7: Код не уникален....
,
0 AlexxJ
 
20.09.11
23:53
Уважаемые гуру подскажите почему код:
Функция ДайРОдителяМАТ(ОлеРод,Вид)
   СпрМ=СоздатьОбъект("Справочник."+Вид);
   //СпрМ=СоздатьОбъект("Справочник.Контрагенты");
   Если СпрМ.НайтиПоНаименованию(ОлеРод.Наименование,0,1)=1 Тогда
       Если СпрМ.ЭтоГруппа()=1 Тогда
           Возврат СпрМ.ТекущийЭлемент();
       КонецЕсли;
   КонецЕсли;
   СпрМ.НоваяГруппа();
   СпрМ.УстановитьНовыйКод("Гр");
   СпрМ.Наименование=ОлеРод.Наименование;
   СпрМ.Записать();
   Если ОлеРод.Родитель.ВЫбран()=1 Тогда
       СпрМ.Родитель=ДайРОдителяМАТ(ОлеРод.Родитель,Вид);
   КонецЕсли;
   //    Сообщить("Записана новая группа "+СпрМ.Наименование);
   Трассировка("Записана Группа "+СпрМ.Вид()+" "+СпрМ.Наименование);
   СпрМ.Записать();
   Возврат СпрМ.ТекущийЭлемент();
КонецФункции

на строчке    СпрМ.Записать();
Вызывает исключение?
1 zak555
 
20.09.11
23:56
если в ОлеРод элемент, то зачем смотреть наименование ?
2 AlexxJ
 
21.09.11
00:23
забыл добавить... это перенос справочника через оле... и ОлеРод это ссылка на олемент в базе присоедененной через Оле-соеденение
3 AlexxJ
 
21.09.11
00:24
и да ошибка выходат на строчке СпрМ.Записать(); после трассировки
4 AlexxJ
 
21.09.11
00:25
СпрМ - локальная переменная
5 sapphire
 
21.09.11
00:27
(3) Ты дурак, или прикидываешься?
Абсолютно правильно тебе система говорит.
ИМХО, я бы кодировал по внутренним идентификаторам в БД.
Або они стопудово уникальны.
6 AlexxJ
 
21.09.11
00:28
(3) обоснуй
7 AlexxJ
 
21.09.11
00:40
(5) как ты предлагаеш организовывать поиск по внутреннему идентификатору....?
8 AlexxJ
 
21.09.11
00:40
(5) в прочем смысл твоей фразы полный бред
9 sapphire
 
21.09.11
00:42
(7) Ты знаешь как клюшки хранят ссылки?
(8) Это твой код ошибочен, ибо мозг включать лень - легче на форуме спросить.
10 AlexxJ
 
21.09.11
00:43
(9) согласен мозг уже тупит.... хотел услышать мнение общества... а тут только оскобления и ни грамма конструктивной информации
11 AlexxJ
 
21.09.11
00:44
и.... эээ....  что есть клюшки? простите мою неграмотность
12 sapphire
 
21.09.11
00:44
(8) К тому же, а с чего это наименование вдруг стало уникальным?
13 AlexxJ
 
21.09.11
00:46
(12) похоже не только я туплю. Вопрос не про нименование. А про то что почему, после вызова метода СпрМ.УстановитьНовыйКод("Гр"); возвращается ошибка "код не уникальный"
14 sapphire
 
21.09.11
00:51
(10) Смотри: клюшки=1С 77, далее, уникальность, в принципе, в рамках 77 лучше рассматривать на уровне внутренних идетификаторов, это поле "ИД" в физических таблицах, для импорта разового, имеет смысл создать рекизит ИД77 и искать по нему, реквизит же можно получить используя ЗначениеВСтрокуВнутр, переводя число через недокументированныую функцию 77 перобразования числа из 10 в 36 кажись можно получить идентификатор. Всё. Важно, ИМХО, понимать,как в той, или иной системе, храниться иныормация або проблем потом будет меньше. Так что, код в (0) изначально ошибочен ибо построен на предположении, что наименование уникально, что сама по себе платформа 77 не гарантирует, стало быть надо опираться на то, что стопудово будет обозначать одназначно требуемый объект. Как-то так. Извини, не хотел обидеть.
15 NS
 
21.09.11
00:52
(13) уникальность в пределах подчинения в твоем справочнике.
16 sapphire
 
21.09.11
00:52
(13) Банально, системе не хватает либо длины кода, либо код - число.
17 NS
 
21.09.11
00:53
(14) Не хочу обидеть, но у него один и тот-же элемент справочника, с одним и тем-же кодом записывается два раза, и ошибку выдает только на второй записи.
18 sapphire
 
21.09.11
00:54
(15) То же верно.
19 NS
 
21.09.11
00:54
(16)
   СпрМ.Записать(); //заметьте, записали успешно.
   Если ОлеРод.Родитель.ВЫбран()=1 Тогда
       СпрМ.Родитель=ДайРОдителяМАТ(ОлеРод.Родитель,Вид);
   КонецЕсли;
   //    Сообщить("Записана новая группа "+СпрМ.Наименование);

   Трассировка("Записана Группа "+СпрМ.Вид()+" "+СпрМ.Наименование);
   СпрМ.Записать(); // а вот тут выдало ошибку.

(18) В этой ветке что-то еще было верно?
20 sapphire
 
21.09.11
00:54
(17) Если искать по реквизиту, то ошибки не будет.
21 sapphire
 
21.09.11
00:56
(17) Прямым запросом проще, ИМХО :)))
Чать не снеговикъ
22 NS
 
21.09.11
00:56
(20) У него ошибка не из-за наименования, и бывают системы где уникальность по наименованиям. Либо это вообще разовый перенос, либо если дубли наименований, то нужно свернуть в одну позицию.

У него только одна ошибка - он присваивает код до присваивания родителя.
23 sapphire
 
21.09.11
01:01
(22) По-опыту, скажу, что ошибка в подходе, увы, а разовый он, или нет, не играет никакой роли, увы. Это массовые грабли, проверенные, к тому же временем.
24 sapphire
 
21.09.11
01:03
(22) Ты прав, я не спорю, важно другое, помимо самого кода понмать зачем ты это делаешь и как часто это будешь делать в дальнейшем. Сам ведь знаешь, что нет ничего постояннее нежели временное решение.
25 NS
 
21.09.11
01:07
(24) Разовый перенос при переходе с одной конфигурации на другую - как был разовым, так разовым и останется.
26 AlexxJ
 
21.09.11
01:10
Итак начам отвачать по порядку.
С ИД и доп реквизиту(ИД77) все понятно, НО это не избавляет меня от необходимости создания новой группы и как следствие формирования нового кода группы(ядумаю проблема именно там и она банальна).
То что наименование группы не уникально не имеет никакого значения. В худшем случае элемент будет помещен не в ту группу... так, что это тоже не критично.
Длинна кода и число-текст уже подогнаны и идентичны.
(17) отличное замечание.. это то и удивляет. причем переменной с именем "Спрм" больше НЕТ. ни глобальных, ни локальных, НО этафункция вызывается рекурсивно.... и раньше с подобными функциями проблем не было
Да это справочник материалы в конфигурации Предприятие-Услуги-Бухгалтерия.... оппа
спс за замечание но у него действительно установлен признак уникальности в пределах подчинения.... возможно причина в этом.... позже отпишусь P.S. хотя он никому ни подчинен
27 AlexxJ
 
21.09.11
01:10
сорри за орфографию
28 sapphire
 
21.09.11
01:15
(25)По-любому, сам подход ошибочен.
Видал я это, и поверь, не единожды, на примере многих баз.
Обмен должен вестись по абсолютно уникальным полям, каковыми являются ключи. Для 1С, это, в первую очередь, внутренние идентификаторы, и не важно, в 77, в 80, в 81, в 82...
Куда бы ты не переносил. Имея однозначное соответствие объект-объект ты получишь правильное отображение данных.

Так, например, используя реквизит ИДТИС можно соуществлять многопоточную загрузку в Бух.
29 AlexxJ
 
21.09.11
01:16
хм.. интересно, а зачем сделан контроль уникальности в пределах подчинения...? Смысл?
30 sapphire
 
21.09.11
01:18
(26) Если код = строка, то вам ничто не мешает в качестве кода указывать внтреннний идентификатор, согласитесь.
31 AlexxJ
 
21.09.11
01:18
(28) согласен... но в данном случае это ни имеет никакого занчения. Обмен односторонний. Межде 2мя базами. Коды ручками не изменяютсяю И заводятся только в одной базе
32 sapphire
 
21.09.11
01:20
(31)Послушайте, не имеет знаения никакого, важно понимать, кто есть источник и что уникально, если код заводится только в одной системе, то желательно и код, и сам идентификатор иметь такой же как и в источнике. Это моё, сугубо личное мнение.
33 AlexxJ
 
21.09.11
01:22
(32) так оно и есть... единственное допущение сделал при создинии групп, поэтому и ввел превикс
34 sapphire
 
21.09.11
01:41
(33) Подумайте, Сергей Вам изложил совершенно верно суть Вашей ошибке в коде, я же высказал своё мнение, что подход Ваш мне кажется не совсем верным и старался объяснить почему. Если я Вас обидел чем-либо, примите мои искренние извинения.

С уважением, Евгений.
35 NS
 
21.09.11
01:47
(33) Евгений прав, если уж и синхронизируете, то по коду но никак не по наименованию.
36 NS
 
21.09.11
01:48
(33) В пределах подчинения - как раз родитель и имеется в виду. То есть ошибка именно из-за этого - сначала присвойте родителя, а потом генерируйте код.
37 AlexxJ
 
21.09.11
01:51
Спасибо за ответ... было интересно по дискудировать. Проблема была в  серии кодов. По поводу синхронизации согласен с вами, но не всегда есть такая возможность..
38 sapphire
 
21.09.11
01:52
(37) в 77 такая возможность есть всегда.
39 NS
 
21.09.11
01:54
Есть всегда. Ввести доп. реквизит (код в главной базе), и если у вас соотвествуют наименования, то синхронизировать это реквизит по ним, если новая база - то сразу по-человечески перенести с синхронизацией по этому реквизиту. Иначе потом будет геммор. Бывают случаи когда недопустимо изменение типовой, но тогда можно синхронизировать на внешнем файле, либо просто по коду.

Если бьются материалы в обоих базах, то в приемнике для собственных материалов сделать другой префикс.
40 sapphire
 
21.09.11
01:55
(37) Я Вам настоятельно рекомендую немножко почитать про НСИ (Нормативно-Справочная инофрмация) и мастер-данные.
Поверьте, и позновательно, и полезно и не пожелеете затраченного времени, ИМХО.
41 AlexxJ
 
21.09.11
01:55
в данном случае важна минимальная доработка типовой БД
42 sapphire
 
21.09.11
01:56
(41) Разово добавить и удалить реквизит Вам никто не мешает, верно?
43 NS
 
21.09.11
01:58
(41) Но есть же код. Наименование для этих целей подходит намного хуже. Если например потом будете вводить внутренне штрих-кодирование на базе кода - тогда сразу прочувствуете плюс. И наименование могут подправить, и вся синхронизация слетит.
44 AlexxJ
 
21.09.11
01:58
(41) как сказать... занимаюсь дорабаткой не только я
45 AlexxJ
 
21.09.11
01:59
(43) сего не будет
46 AlexxJ
 
21.09.11
02:00
в любом случае ткая задача не ставилась... ставилась задача...."как можно дешевле"
47 sapphire
 
21.09.11
02:04
Я Вас не понимаю, коллеги, ибо идентификатор в рамках таблицы уникален всегда, а вот код, наоименование, имеют право задвоится при обемен через УРИБ или УРБД, как Вам больше нравится, но идентификатор никогда не задвоится. Хотите верьте. Хотите -нет.
48 sapphire
 
21.09.11
02:04
*ведроид глючит*
49 NS
 
21.09.11
02:12
(47) Если запретить ручное изменение кода - то он тоже никогда не задвоится. И он тоже уникален.
50 NS
 
21.09.11
02:13
у внутреннего идентификатора есть одна проблема - штатными средствами его получать достаточно долго. И его уникальность не лучше уникальности кода.
51 sapphire
 
21.09.11
02:14
(49) Теоретически, в случае распределнной БД али конфигурации вполне возможно.
Но, обмен встанет коли идентификатор будет тот же, а место создания только центр.
52 NS
 
21.09.11
02:16
(51) Никто не мешает к коду добавить место создания, и опять получаем уникальность.
53 sapphire
 
21.09.11
02:19
(52) Именно. Поздравляю!
Вы выиграли грабли. Пример:
Профукали вовремя выгрузку из ТиС в Бух (вполне реальная ситуация, компания Анарион, 2003 год, осень). Объем выгрузки велик (длительность около 2 суток). Вариантов, кроме как распределить Бухию нет. Получаешь... Именно завдоение кода из-за префикса источника!
54 sapphire
 
21.09.11
02:22
(52) Мало того, ИД - разные, Коды - разные, Наименование одно и то же. Как это Вам понравится?
55 NS
 
21.09.11
02:25
(53) Не совсем понял.
56 NS
 
21.09.11
02:26
(54) Задвоение кодов. Коды разные. Это как?
Так разные или одинаковые?
57 sapphire
 
21.09.11
02:29
(55) Ну представь, профукали время, диапазон выгрузить разный в нескольких сессиях, как нечего делать, правила конвертации стандартные. Но, в разное время, поскольку разные базы и правила обмена никто не менял, задваиваются, как документы, так и элементы справочников из=за распределенности принимающих баз.
58 sapphire
 
21.09.11
02:31
(56) Разные, базы дочерние добавляют не только префиус ИД-шнику, но и коду ибо типовая Бухия была.
59 NS
 
21.09.11
02:32
(58) Ну и в чем проблема? И внутренний индефикатор так-же разный. В чем разница?
60 sapphire
 
21.09.11
02:32
см (52) внимательно :))
61 sapphire
 
21.09.11
02:34
(59) В том что ид состоит из 2х частей - слева 6 - это Ид в рамках базы, справа 3 - это Ид источника, значит, коли источник один нужно произвести апдейт таблиц и всё.
62 NS
 
21.09.11
02:43
(61) Моя твоя не понимай. Чтоб понять что источник один - не нужен внутренний код.
63 sapphire
 
21.09.11
02:46
(62) Верно, но мы были тогда такие же умные. Как ТС.
Без обид.
64 sapphire
 
21.09.11
02:48
(62) Вспомнилось:
"Когда деревья, и столы, были большими" (с)
65 AlexxJ
 
22.09.11
00:08
И так... по теме.
sapphire ты говориш дельные идеи... НО они не согласуются с реалиями жизни... по поводу реквизита... аля ИД я воспользовался твоим предложением.
итак... вопрос стоял не в том как оптимально построить алгоритм. А в том почему эта ошибка возникает. Дело было в уникальности кодов.(в пределах подчинения).
Так что тему можно закрывать.
P.S. Опыта у меня по более твоего....(это сапфиру).... NS спасибо за помощь... я уже говорил что утплю.. к вечеру
66 AlexxJ
 
22.09.11
00:09
З.З. Ы стаж у меня более 10лет
67 Эльниньо
 
22.09.11
10:02
(65) Больше не утпли (а как это делается?).
68 ЧеловекДуши
 
22.09.11
10:14
(65)Ты читать не умеешь?
Все по человечески, код не уникален ;)
т.е. реквизит КОД, у группы или элемента, уже используется.
Для групп лучше использовать "свой" префикс, т.е. непохожий на префикс элементов.
69 NS
 
22.09.11
12:08
(68) Прочитай ветку. С самого начала.
70 Эльниньо
 
22.09.11
13:13
Уникальность кодов в пределах подчинения - зло.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший