Интерактивно не записывает элемент (1С SQL)

  1. 10 г. назад

    Предполагая, что форум - всё же программистский или около того :-)
    Возникла проблема.
    1С 7.7.027 SQL-версия. MS SQL Server 2005. Всё прекрасно, всё работает. Но в один прекрасный момент выяснилось, что некоторые элементы справочников - не записываются интерактивно. Пользователь на форме может менять реквизиты хоть до посинения. Потом - "ОК". Открывает элемент снова (или смотрит в форме списка) - и, как говорили древние шумеры, авотхервам, значения реквизитов - старые.
    Причём программно (спр = СоздатьОбъект("Справочник.Номенклатура"); спр.НайтиЭлемент(КтоНужен);спр.Наименование="ййй!";спр.Записать();) - прекрасно работает.
    И интерактивно-то - работает! То есть, если в ПриЗакрытии (а там - значение уже записано, видно при просмотре SQL-таблиц) посмотреть значения ТекущийЭлемент().ИзмененныйРеквизит - всё просто замечательно. Но как форма закроется - бдымц! Значения возвращаются на круги своя.
    Хорошо. Лезем в SQL profiler, смотрим, что там выполняется.
    Запись элемента производится в неявной транзакции. И вот эта неявная транзакция при интерактивном закрытии - откатывается. А при программном - коммитится.
    Разница состоит лишь в том, что при интерактивной записи выполняется _1sp_SC84_ByID - которая ничему навредить не может, ибо это просто select ... where.
    Понятно, что дело - не в 1С. И не в её "хранимках" - поскольку та же самая интерактивная запись у всех прекрасно работает.

    Вопрос: куда копать?

  2. как сдружили скуль2005 с 7.7?

    Ответы: (3)
  3. и ещё вопрос: такая связка недавно крутится, или уже давно? раньше отрабатывало?

    Ответы: (3)
  4. (1) "Как обычно" (но не "секретным релизом"). Сауроновский патч.

    (2) Крутится уже лет 5 как минимум.
    Раньше всё прекрасно работало, проблема была обнаружена в предновогоднюю неделю (в связи с "перелопачиванием" справочника).

  5. я бы всё-таки посоветовал секретный релиз http://infostart.ru/public/82018/
    причём последнюю версию Solution7
    с ним, по статистике, траблов намного меньше

    Ответы: (6)
  6. а на скуле режим совместимости 2000 стоит?

    Ответы: (6)
  7. (4) Я бы тоже посоветовал "секретный релиз" (и уже даже его посоветовал). Но у этой конторы есть некие административные проблемы (я там появляюсь как приглашённый консультант, и сам ничего менять не могу).

    (5) Стоит.

  8. (в порядке бреда) collation какой стоит?

    Ответы: (11)
  9. проблема воспроизводится у всех и в 100% случаях, или является плавающей?

  10. и воспроизводится ли проблема в монопольном режиме?

    Ответы: (11)
  11. DBCC CHECKDB делалось?

    Ответы: (12) (13)
  12. (7) Кириллица общая CI_AS

    Нет, тут место ошибки выявлено - при записи начинается неявная транзакция, в ней - select'ы и update (через sp_executesql), в конце - проверка: если @@TRANCOUNT>0, то коммит. В противном случае неявная транзакция завершается - и происходит откат. Так вот этот TRANCOUNT оказывается почему-то 0.

    (9) Да.

    Причём программная запись - проходит на "ура!". Отличие программной от интерактивной записи - в вызове _1sp_SC84_ByID (при интерактивной записи). Который - просто select.

  13. (10) Делалось. Ошибок нет.
    MD тестился - ошибок практически нет.

  14. +(10) "Практически нет" - есть "грязь" в конце справочника Контрагенты. Посмотрел своими глазами - ни на что не должна влиять.

  15. а проблема, я так понимаю, со всеми справочниками, не только с номенклатурой?

    Ответы: (15)
  16. (14) Пока что обнаружена _только_ на Номенклатура. Да и то - _не на всех_ элементах.
    Индексы в порядке. IDы и коды - в порядке.

  17. Rie IDы и коды - в порядке.

    именно в скуле проверял?

  18. На копии базы - проблема воспроизводится.

    Ответы: (18)
  19. (17) копия выгрузкой-загрузкой в конфигураторе создавалась, или средствами скуля переливалось?

    Ответы: (19)
  20. (18) копирование - средствами SQL: backup + restore с изменёнными путями/именами (я как-то выкладывал обработку, которая это проделывает, могу выслать, чтобы было ясно, что делается).

    Ответы: (22)
  21. вообще, конечно, локализация проблемы на одном справочнике наводит на мысль о проблеме с данными

  22. Ну, о том, что ТИИ ничего не даёт - и говорить уж не буду.

  23. (19) а если выгрузкой попробовать? или слишком большая база?

    Ответы: (23)
  24. (22) База слишком уж велика, чтобы выгрузкой.

  25. Что касается данных - прогнал несколько запросов в поисках возможных "ляпов". Результат - отрицательный, всё верно.

    И - что важно, на мой взгляд - программно запись идёт без проблем. Проблемы - только при интерактивной записи.

  26. Rie Да и то - _не на всех_ элементах.

    а на этих проблемных элементах воспроизводится в 100% случаях?

    Ответы: (26)
  27. (25) Да.

    Ответы: (27)
  28. +(26) Каких-либо отличий (и в 1С, и в таблицах SQL) этих элементов от прочих не наблюдается.

  29. в сторону триггеров рыл?

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

    причём лучше в монопольном режиме, чтобы ничего не мешалось

    Ответы: (30)
  31. (28) Рыл. Где они там, в 1С-ке? Нету их.

    (29) Сделал. Я уже писал: отличие в том, что при интерактивной записи выполняется _1sp_SC84_ByID, а при программной - _внутри неявной транзакции_ создаётся курсор для обновления формы списка. То есть, вывод - транзакция рушится в _1sp_SC84_ByID. Но там ей просто негде рушиться!

    И, ёрштвоюмедь, попытки воспроизвести эту хрень на других базах - потерпели неудачу. На других базах - всё работает.

    Была мысля, что переполнен журнал транзакций. Взял другую базу. И начал пихать туда элементы и их изменения. Random'ом. Log разросся до посинения. Но - работал.

  32. Rie Где они там, в 1С-ке? Нету их.

    ну, мало ли. может, какая-нибудь жёсткая самописка

    Ответы: (33)
  33. Rie Взял другую базу

    на этой же конфе?

    Ответы: (33)
  34. (31) Модифицированная ТиС. Но не настолько модифицированная :-)

    (32) На ней, родимой (пустая база, загружается изменённая конфигурация, обработка создаёт кучу всего, потом резвимся).

  35. DBCC DBREINDEX?

    Ответы: (35)
  36. (34) _1sp_DBReindex
    Делает то же самое по сути. Но - потаблично.

    Ответы: (36) (37)
  37. (35) ну, на всякий случай. вдруг поможет.

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

    и посмотреть, воспроизведётся ли

  38. (35) Идея интересная. Но - невоспроизводима ("на основе той же конфиги" - первым делом сама 1С обнаружит, что важные ей справочники не заполнены, и займётся этим грязным делом). И, на мой взгляд, бесполезна (см. ниже).

    Тут мне вообще непонятно - за счёт чего рушится транзакция при интерактивной записи? И не рушится при программной. Отличия - минимальны: интерактивно - перезапрос данных элемента, программно - создание курсора для обновления списка.

    Хотя... Есть другая мысль. Программно открыть форму для проблемного элемента - не открывая список. К сожалению, проверить смогу не сейчас.

  39. Rie Программно открыть форму для проблемного элемента - не открывая список.

    это не должно что-либо изменить

    Rie первым делом сама 1С обнаружит, что важные ей справочники не заполнены, и займётся этим грязным делом)

    да пусть заполняет. потом таблички со справочником номенклатуры перезалей, и всё.

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

    Ответы: (39)
  40. (38) Последний мой совет им был - добавить реквизит в справочник Номенклатура.
    При этом 1С реструктуризует таблицы и хранимки. И если были какие "косяки" - они, по идее, должны быть прибиты.

  41. Побеждено. Что сделано: отключены автоматические сборы статистики (оба). Перезагружен сервер (чтобы изменения вступили в силу).

    Ответы: (41)
  42. (40) это шож, глючила не одинэска, а скуля? странно

    Ответы: (42)
  43. (41) Выходит так...

или зарегистрируйтесь чтобы ответить!