Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Коллеги ! Нужна помощь. Прошу помочь. (http://forums.kuban.ru/f1040/kollegi_nuzhna_pomosh-_proshu_pomoch--5399117.html)

VASH 15.02.2014 07:38

Коллеги ! Нужна помощь. Прошу помочь.
 
Итак, ТиС 7.7. В справочник цветов была написана обработка импорта. Произошел косяк, и теперь постоянно "код не уникален". Поудаляв левые записи, при попытке перенумеровать все равно ошибка.

ПыСы: Я админ, с соседней ветки, но вот пришлось решать этот косяк, помогите коллеги !

real 15.02.2014 09:21

И зачем полез спрашивается???
У справочника отключить проверку уникальности, перенумеровать справочник, включить проверку уникальности.

VASH 15.02.2014 09:55

[quote=real;34156925] И зачем полез спрашивается??? У справочника отключить проверку уникальности, перенумеровать справочник, включить проверку уникальности. [/quote] Не лез, как обычно сменились сотрудники, новый накосячил... Толком не знаем пока. Помоги, можно пошагово ?Спс!

VZ 15.02.2014 09:56

Перенумеровать надоть. Учитывая порядок нумерации. Последний может быть "в целом по справочнику" или "в пределах подчинения" (т.е., в пределах группы).
Надо учесть, что "код" записи - всегда есть строка. Даже если в конфигураторе он обозначен как "число" - это только "представление": число преобразуется в строку без лидирующих нулей.
Поэтому правила перенумерации несколько разные:
Для кода типа "число": берем какое-то большое число, например 1000000. И проходим по всему справочнику, присваивая новые коды 1000001, 1000002, 1000003, и т.д. (т.е. 1000000+N). Таким образом, обеспечиваем уникальность при переприсвоении кода (иначе не запишем).
Для кода типа "Строка" поступаем так: выдумываем "префикс" - можно взять буковку, например "_" (подчеркивание). И определяем длину кода (произвольно, но так, чтоб на все записи хватило, и на будущее осталось). С учетом разрешенной длины в конфигурации.
Например, задумали код видом "00000123" (длина 8 символов).
Тогда, проходя по справочнику, перенумеровываем так:
N=0;
......
N = N+1;
<Справочник>.Код = Прав("_00000000"+Строка(N),9);

Потом, при повторном обходе, убираем "префикс "_":
НовКод=сред(старыйКод,2);

Нюанс: при присвоении нового кода "автоматически" каким либо модулем (когда код не назначается принудительно, а поручается программе) алгоритм движка следующий: берется самое большое значение длины кода (т.е., из кодов "000ххх" и "0000000уууу" выбирается последнее), отбирается числовая часть, увеличивается на единицу, и преобразуется опять в строку с лидирующими нулями (и префиксом, если он есть).
Все это делается быстро, ибо располагаются по индексу коды так:
0001
0002
0999
0000001
0000002
А01
А02
Ж0000001
Ж0000002
К0001
К0002
Воот ;) В придуманном мною наборе движок возбмет для образца последний элемент из списка "К0002". Первый новый код будет "К0003", затем "К0004", и т.д.
А когда заведет "К9999" длина-то (5 символов), и исчерпается, и взяв разрешенные 4 символа (1 занят под префикс) получим "К0001". А он уже есть, и мы лицезрим предупреждение "Код не уникален".
Вот так.

VZ 15.02.2014 09:58

1-real > Не надо лезть без нужды в конфигуратор. Это не кошерно ;)

Ткачик 15.02.2014 10:04

+(4) Пральна! В данном случае - и вовсе незачем, UChoice.ert еще никто не отменял.

VASH 15.02.2014 10:15

(5) после процедур там ошибка остается, пробовал. Ненавижу когда что то не получается.

VZ 15.02.2014 10:18

5-Ткачик > :) UChoice.ert - это хорошо, только автор не поймет проблему возникновения прерывания по неуникальному индексу.
И не предпримет нужные административные меры (линейкой по пальцам излишне "креативным") :)

Ткачик 15.02.2014 10:22

(6) Применять UChoice надо [b]два раза[/b]. Как минимум. Почему - читать (3) до просветления.

VZ 15.02.2014 10:26

6-VASH > Собсно, ты можешь открыть свой справочник в wDBFview.exe, назначив индексом поле KODE, и полюбоваться сортировкой. Что у тебя там "креативные" бушки ввели - неизвестно. Может, какую-нить хрень в середину кода.
А может, символ "/". Вообще-то, движок вроде должен перехватывать и не пущать, но неуверен. А у юзера "креативности" хватит.

VASH 15.02.2014 10:49

(9) Спасибо, попробую. Я программер с фокса дос, дбэфки родные, но вот 1с пока страшненько.

VZ 15.02.2014 11:13

10-VASH > Ничего страшного :) От фокса дбф-ки отличаются отсутствием мемо-полей. Строение - тоже самое. Индекс строится иначе.
Поля: ID - служебный (индексируемый), служит основой для построения ссылки;
PARENTID - то же самое, но указывает на родителя (группу);
CODE - понятно из названия. индексируемый. Виден юзеру;
DESCR - Наименование, индексируемый, виден юзеру;
и т.д.
Удаленные - для фокса это помеченные на удаление (первый байт записи). В wDBFview виден как "точка". В 1С воспринимается как "свободное для записи место". А признаком "помечен на удаление" является поле ISMARK. Таким образом 1С решили проблему с внутренней дефрагментизацией, и внутри таблицы не образуется "дырки" (вернее, образуются, но тут же затягиваются свежими записями. Ибо при записи нового элемента движок вначале ищет поля deleted. И только не найдя такового, образует новую запись. Инкриментируя ID.

VZ 15.02.2014 11:36

+(11) Кстати. Особо тяжелый случай - это "дублирование" ID. Возникает (если (суммировать все причины) редко: при работе с поврежденными индексами. Когда юзеры плюют на предупреждение движка.
Простейший рецепт профилактики: ночью/под утро удаляем скриптом файлы*.CDX, и вызываем конфигуратор в "пакетном режиме" для индексирования. Можно и с проверкой - комп не потеет, лишь бы время хватило. Лог на рабочий стол. И юзеры никогда утром не увидят приглашение войти монопольно для переиндексации.

vah1 15.02.2014 12:59

(0) выгрузку/загрузку сначала попробуй
вам админам обязательно надо через задний проход влезть

vah1 15.02.2014 13:01

+ потом тестирование и исправление посмотреть, может там на новые элементы справочника и ссылок-то нет

reanimator 15.02.2014 13:40

Пригласить спеца уже не модно?

vah1 15.02.2014 14:06

15-reanimator > там в сабже, между строк - уже пригласили

vah1 15.02.2014 14:08

+ хотя и не факт что он виноват, если тупо "переименовывать" элементы спр могут все кому не лень

VZ 15.02.2014 14:12

13-vah1 > И чем это выгрузка/загрузка поможет, интересно?
"[em]может там на новые элементы справочника и ссылок-то нет[/em]" - свежая мысль. Винда научилась делать половину записи?

Замечание для автора к (3):
Когда правим [b]коды[/b], начинаем так:
[em]спрЦветов = СоздатьОбъект("Справочник.Цветы");
спрЦветы.[b]ПорядокНаименований[/b]();[/em]
....
Когда правим [b]наименования[/b], начинаем так:
[em]спрЦветов = СоздатьОбъект("Справочник.Цветы");
спрЦветы.[b]ПорядокКодов[/b]();[/em]
....
Индексы, однако.

vah1 15.02.2014 14:28

18-VZ > не поможет, тогда и поглядим
справочник можно по ходу прикокнуть, и в пустой внешней выгрузкой из нормального бэкапа подлить, пару-тройку доков подправить руки не отвалятся, зато пустые ссылки можно визуально найти

vah1 15.02.2014 14:40

18-VZ > про индексы ты правильно сказал, там хз что может твориться если админ в дбф фало залез - выгрузка поможет
(0) не слушай никого, задача уровня Тестирование ИБ в конфигураторе

vah1 15.02.2014 14:44

18-VZ > про индексы правильно сказал, там хз что может твориться, если в дбф фало слазить - выгрузка поможет
(0) не слушай никого, задача уровня Тестирование ИБ в конфигураторе

VASH 16.02.2014 08:49

Народ, ничего не помогло. Попробовал вот такое решение : 1. Отключил контроль уникальности. 2.Перенумеровал. 3. Включил контроль. 4 Провел тестирование и переиндексацию.

Это имеет право на жизнь ?

VZ 16.02.2014 09:19

22-VASH > Имеет, если работает ;)

USSR 16.02.2014 10:43

Вы сейчас насоветуете сгоряча перенумеровать, а там может быть вполне искренне используется НайтиПоКоду()
Автору - за 3 минуты написать обработку по поиску неуникального кода или короткого

VZ 16.02.2014 11:13

24-USSR > Тому, кто пишет НайтиПоКоду(), не делая усилий по параметризации этого кода в опциях настройки, уже ничего не поможет ;)
А метода (22) вполне законна, ибо при неизбежной переиндексации уникальность кодов проверяется автоматически. Только некошерна, ибо ничто не препятствует получить результат без хирургического вмешательства.

qweqwe123123 16.02.2014 23:08

мужики я пассажир, взлетели, но пилот накосячил, помогите долететь до Токио, срочно надо! на панели красная кнопка мигает!!

qweqwe123123 16.02.2014 23:13

на кнопке русским языком написано "undefined target". я пока два раза нажал - вроде помогает. тряхнуло пару раз и вроде чего то ненужное отвалилось. я правильно жму?

qweqwe123123 16.02.2014 23:20

похоже у оленеводов 2 пожара внизу, видимо наткнулись на нефть и газ и рвануло... ну тупыыыеее - знать надо где костры разжигать

qweqwe123123 16.02.2014 23:26

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

qweqwe123123 16.02.2014 23:31

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

думаю надо ещё какие-нить кнопки нажать... а то экшена не хватает. подскажите конкретно!

vodoley_ol 17.02.2014 10:23

(22) если это не помогло тогда нужно читать код обработки. складывается такое впечатление что справочник цветов ни причем, а проблема в том что обработка создает новый другой справочник или вообще документ. а так пригласите специалиста


Текущее время: 18:37. Часовой пояс GMT +3.