Имя: Пароль:
1C
1C 7.7
v7: Исчезают элементы справочника, в dbf появляются дубликаты
0 kayaker
 
26.08.11
11:54
Оболочка 7.70.025. ОС Windows Server 2003 R2 SP2, терминал-сервер. В разделенном режиме 15-20 пользователей, сеансы только терминальные.
Конфигурация самодельная, основана на компоненте Оперативный учет. Вес базы около 600 М.

Проблема: примерно раз в неделю пропадают элементы одного и того же справочника. В документах остаются ссылки «элемент не найден».
Непосредственное удаление объектов в конфигурации запрещено. Контроль уникальности в справочнике включен.

При «Тестировании и исправлении» на этапе проверки логической целостности вижу следующее:
«Проверка уникальности внутреннего идентификатора в справочнике. Модели. Элемент229(FUSION FJL-1211). Вн. идентификатор   95. Исправить вручную
Неразрешенная ссылка. Создан новый элемент. Справочник Модели. Код  2049»

Решаю так.
1) Редактирую dbf со справочником: сортирую по ID, вижу дубль Элемента 229 по полям ID, CODE, DESCR. Вручную меняю их для этого дубля, присваивая заведомо уникальные ID и CODE.
2) Прибиваю индексы.
3) Захожу в базу и помечаю дубль элемента на удаление. Удаляю с контролем ссылок (ссылок на дубль не было ни разу).
4) Запускаю поиск ссылок на автоматически созданный элемент ФС-1. Убеждаюсь в том, что это и есть пропавший элемент справочника. Восстанавливаю значения его реквизитов, перенося их из архивной копии базы.

Я полагаю, что причина сбоев в dbf – в «недоблокировке» таблиц при одновременном доступе пользователей. В конфигурации много пакетных обработок и процедур импорта внешних данных, часто обращающихся к этому справочнику. Они используются в разделенном режиме, так как связаны не с проведением документов, а лишь с их записью.
Раньше эта база работала на менее производительном сервере под Win 2000 Server. Проблема проявлялась примерно раз в два-три дня. Перед новым годом провели свертку базы (объем данных уменьшился примерно на 30%) и перенесли ее на современный сервер. Сейчас проблема проявляется в среднем раз в 10 дней.

Прошу совета, что это может быть, и как это можно попытаться подлечить при помощи кода.
1 kayaker
 
27.08.11
10:24
Догадываюсь, что проблема не нова, поиск по запросу "проверка уникальности внутреннего идентификатора + исправить вручную" возвращает массу ссылок, в том числе и на Волшебный форум. Но что-то пока не могу извлечь из них никакого конструктива. Конфигурация настолько хороша и удобна, что отказываться от нее и воссоздавать с нуля, к примеру, на восьмерке - не хотелось бы. Профи, подскажите хотя бы направление мысли..
2 1Сергей
 
27.08.11
10:27
Вот тут проблема:
>>В конфигурации много пакетных обработок и процедур импорта внешних данных, часто обращающихся к этому справочнику.
3 Chai Nic
 
27.08.11
10:36
Ищи по всей конфигурации по ".Удалить(1)"..
4 andrewks
 
27.08.11
10:38
прямые запросы используются?
5 1Сергей
 
27.08.11
10:38
(4)+100500
6 kayaker
 
27.08.11
10:57
(2) То есть это не бага, а фича? И где компромисс?
(3) Нет Удалить(1), тем более для справочников. А если б даже было, с чего бы ему вызывать затирание строк в таблицах?..
(4) Нет, прямых запросов к таблицам нет. Все запросы - исключительно на языке запросов 1С.

Забыла сказать: используется ВК Formex. Отсюда не может быть наводок?
7 Мимохожий Однако
 
27.08.11
10:59
Если проблема в файловой системе, то иногда помогает копирование файлов в другой каталог.
8 Chai Nic
 
27.08.11
11:04
(6) "А если б даже было, с чего бы ему вызывать затирание строк в таблицах?"
Каких строк? Удаляются записи в справочнике -> возникают висячие ссылки в других объектах. ТиИ вместо висячих ссылок создает "заглушки" с теми же идентификаторами, что и в повисших ссылках.
9 Chai Nic
 
27.08.11
11:05
Ну если в базе всё корректно - то можно предположить диверсию :)
10 kayaker
 
27.08.11
11:16
(7) не помог даже перенос базы на другой сервер..)
(8) "ТиИ вместо висячих ссылок создает "заглушки" с теми же идентификаторами, что и в повисших ссылках". Вот тут я недопонимаю: она создает дубликаты с теми же ID, что у нормальных (не исчезнувших) элементов, и записывает их на место пропавших. Кроме того, она создает ФС с уникальными идентификаторами для "пропаших" элементов. Второе, как я понимаю, нормально. А первое? Это и есть "заглушки"?
11 AlexNew
 
27.08.11
11:21
"Недоблокировка" это хорошо. Спросить то чего хотел? Может обработки посмотреть, хотя тут все и так наизусть знают. Главное, что типовая.
12 kayaker
 
27.08.11
11:28
(11) Хотела спросить у опытных людей 1) что это может быть и 2) можно ли с этим бороться кодом. Конфигурация не типовая ни разу, то есть косяки вполне могут иметь место. Только я пока не представляю, где копать.
13 AlexNew
 
27.08.11
11:31
Хароший вопрос. Пригласите специалиста.
14 AlexNew
 
27.08.11
11:32
(12) С каким кодом? ДНК? Вопрос задай.
15 Chai Nic
 
27.08.11
11:56
(10) "Второе" и "первое" в данном случае - одно и то же блюдо. Заглушки это и есть ФС-ххх.
16 kayaker
 
27.08.11
12:01
(13) я не против пригласить специалиста, поскольку сама скорее бухгалтер, чем разработчик. если есть конкретные предложения - велкам в почту/аську.
(14) переформулирую вопрос: "что может вызывать дублирование элементов справочника путем создания неуникальных идентификаторов и запись их на место других элементов, приводящее к исчезновению последних?"
(15) не совсем, как мне кажется. У "заглушек", которые ФС, идентификаторы как раз уникальны. А вот откуда берутся дубли ID нормальных, существующих элементов?
17 2S
 
27.08.11
12:10
Мадам не путет ID и код элемента?
18 kayaker
 
27.08.11
12:12
(17) не путает. ID и CODE - разные поля dbf. характерно то, что у дубликатов оба этих поля совпадают.
19 2S
 
27.08.11
12:17
имхо, здесь затык "В конфигурации много пакетных обработок и процедур импорта внешних данных, часто обращающихся к этому справочнику"
20 kayaker
 
27.08.11
12:28
(19) возможно. а как может реализоваться этот "затык"? если понять, какого типа событие вызывает сбой, то можно попытаться придумать обходной маневр.
21 AlexNew
 
27.08.11
12:33
(20) Только прямое обращение. Ищи ADDB, т.к. XBase хватает монопольно.
22 AlexNew
 
27.08.11
12:33
(21) ADDB читать как ADODB
23 dmpl
 
27.08.11
12:35
(0) С таким можно столкнуться при использовании транзакций, когда создается элемент, его видят другие, используют, а затем транзакция откатывается. Но в документах других пользователей ссылка-то осталась.
24 AlexNew
 
27.08.11
12:37
(23) Что это было?
25 1Сергей
 
27.08.11
12:43
Скорее всего стоит какая-то приблуда, которая снимает лок с ДБФ-ки при изменении
26 AlexNew
 
27.08.11
12:44
(25) Еще один?
27 1Сергей
 
27.08.11
12:48
(26) видишь ли, если всё делать штатно, то дубли ID не появятся никак.
Ну скажи свою версию
28 AlexNew
 
27.08.11
12:49
(27) Я сказал.
29 andrewks
 
27.08.11
12:53
(23) чё курим?
30 1Сергей
 
27.08.11
12:59
(28) где?
31 andrewks
 
27.08.11
13:12
поскольку вариант с железом отброшен, остаётся два основных варианта:
1. Удалить(1)
2. прямой доступ к dbf-файлам базы нештатными средствами

сделай поиск .Удалить(1) и  .dll .exe по всему коду (конфа + внешние обработки)
32 AlexNew
 
27.08.11
13:13
(30) в (21)
33 kayaker
 
27.08.11
13:14
(23) транзакции не используются
(21) в явном виде прямых обращений к таблицам нет.
(31) единственная нештатная вещь во всей конфигурации - formex.dll Поэтому я сразу и спросила, не может ли она давать подобный эффект.
34 andrewks
 
27.08.11
13:15
(33) ты поиск делала? а по внешним обработкам?
35 AlexNew
 
27.08.11
13:18
(33) Точно барабашки...
36 dmpl
 
27.08.11
13:26
(33) А нет ли у клиентов смеси локальных/сетевых путей? Т.е., у некоторых путь локальный, а у других - сетевой.
37 kayaker
 
27.08.11
13:32
(34) делала.. нашла одну процедуру с Удалить(1), но
там удаляется элемент другого справочника. В этом другом справочнике один из реквизитов - элемент "проблемного" справочника "Модели". Как думаешь, может это место вызывать сбой? Код выложить? Лично мне в это как-то не верится..
(36) нет, у всех локальные, база лежит непосредственно на терминал-сервере
38 andrewks
 
27.08.11
13:36
(36) и чё?
39 andrewks
 
27.08.11
13:37
(37) 1. большой там код? если в скрин помещается, выкладывай
40 kayaker
 
27.08.11
13:47
Процедура УдалитьМодель()
   Если Вопрос("Вы действительно хотите удалить эту модель?",1)=2 Тогда
       Возврат;
   КонецЕсли;
   Поз=СписокМоделей.ТекущаяСтрока();
   Эл=СписокМоделей.ПолучитьЗначение(Поз);
   СпрМод=СоздатьОбъект("Справочник.МоделиП");
   СпрМод.ИспользоватьВладельца(ТекущийЭлемент());
   Если СпрМод.НайтиЭлемент(Эл)=1 Тогда
       Мод=СпрМод.Модель;
       СпрМод.Удалить(1);
       СписокМоделей.УдалитьЗначение(Поз);
       СписокМоделей.ТекущаяСтрока(?(Поз>1,Поз-1,1));
       Если СписокМоделей.РазмерСписка()=0 Тогда
           Форма.МодУдалить.Доступность(0);
       КонецЕсли;
       Форма.Обновить();
   КонецЕсли;
КонецПроцедуры
41 AlexNew
 
27.08.11
13:52
(40) Не то ищешь.
42 kayaker
 
27.08.11
14:05
(41) Методы работы с базами ADOdb? просто не понимаю, откуда им там взяться. Или поясни, пожалуйста, что ты имеешь в виду.
43 Cthulhu
 
27.08.11
14:50
(27): ты удивишься. редактирование "в списке" с установленным отбором - самый простой и  именно штатный способ получения элементов с неуникальными ИД.
44 kayaker
 
27.08.11
15:02
(43) забавно.. мой "проблемный" справочник действительно можно редактировать обоими способами, и отборы в нем используются. Может, попробовать запретить редактирование "в списке" и последить за появлением багов?
45 Torquader
 
28.08.11
19:51
Неуникальные ID получаются, если элемент справочника создан, но в таблицу счётчика (1SUIDCTL) уникального ID не успели записать значение - в итоге получается, что ID достаётся следующему элементу.
Но в этом случае проблем с ссылками на элементы не будет, так как все ссылки на первый элемент автоматом будут указывать на второй, который затёр первый.
Потеря ссылок может происходить, если элемент удалился или был кем-то удалён, а его ID никому не достался.
Второй причиной может быть нарушение индексов, когда в DBF-файле элемент есть, но в CDX-файле он в индексе пропущен. Нужно просто попробовать после пропадания сделать переиндексацию и посмотреть, что получится.
Также кривые ссылки делаются штатно через ЗначениеИзСтрокиВнутр, когда в эту функцию передаётся внутренний индетификатор несуществующего элемента - если потом такое "значение" присвоить полю другого элемента, то получаем несуществующую ссылку.
P.S. ещё стоит посмотреть в сторону "автономные файлы" если работаете по сети - при их включении для 1С "умная" система скачивает на клиента dbf-файл целиком, а потом возвращает его на сервер только после закрытия, то есть завершения сеанса 1С (видел как это "работает" только один раз - проверять, к чему приведёт - времени не было, но сразу было ясно, что база - не жилец).
46 kayaker
 
29.08.11
10:24
(45) Спасибо за советы и наблюдения. В моей базе с одной стороны теряются ссылки, а с другой - появляются дубли нормальных элементов с неуникальными ID. Визуально это проявляется в потерянных ссылках на элемент, который "удалился или был кем-то удалён, а его ID никому не достался". Наличие дублей нормальных элементов выясняется уже в процессе ТиИ. Поэтому переиндексацией после пропадания элемента тут не отделаешься, к сожалению.. Интуитивно я понимаю, что причина сбоев в том, что в таблицу "не успели записать значение", и пытаюсь выяснить, какие же штатные действия с базой могут давать такой эффект. Насчет ЗначениеИзСтрокиВнутр - буду иметь в виду.
47 andrewks
 
29.08.11
10:49
точно у всех юзверей используется один и тот же релиз?

на всякий случай (до кучи) поставь 27-й, лишним не будет
48 kayaker
 
29.08.11
10:54
(47) Все работают в терминальных сеансах, на клиентских компах 1С вообще нет. На сервере стоит только один релиз - 25-й. А в 27-м есть какие-то исправления, касающиеся блокировки таблиц?
49 andrewks
 
29.08.11
11:00
(48) заявлено не было, поэтому и говорю "до кучи"