Форум программистов, компьютерный форум, киберфорум
Наши страницы
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
1

Обмен данными 1С с базой Oracle - глюки

25.10.2012, 12:18. Просмотров 3867. Ответов 20
Метки нет (Все метки)

База 1С 8.2 не важно какая, т.к. обмен идет по дописанным объектам. Платформа 8.2.15.319 на MS SQL сервере 2008. Есть некая база не 1С (приложение на Делфи) на сервере Oracle, к которому подключаемся:
1C
1
OraSession = Новый COMОбъект("OracleInProcServer.XOraSession");
Подключение проходит отлично.
Далее SQL запросами получаем данные и пытаемся обработать и тут начинаются глюки. Допустим храним в базе Oracle УникальныйИдентификатор элемента справочника 1С, из полученной строки ищем ссылку:

1C
1
2
3
4
УИд = OraDynaset.Fields("order_1c_id").Value;
Если значениеЗаполнено(УИд) тогда
   Заявка = Справочники.Заявки.ПолучитьСсылку(Новый УникальныйИдентификатор(УИд));
конецЕсли;
И рандомно получаются такие ситуации, когда мы на явно существующий УИд не получаем ссылку на справочник. При повторном запуске этого же кода, отрабатывает и получает нужное значение.

Помогите, может кто-то встречался с подобной ситуацией, в чем может быть проблема? Со стороны кода не вижу проблем, тем более что ошибка плавающая и на одних и тех же значениях скорее не повторяет себя, хотя может и повторяться.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 12:18
Ответы с готовыми решениями:

Обмен данными 1c с базой Postgresql
Здравствуйте всем! Такой вопрос: В конфигурации УТ (8.2) дописан обмен данными с базой...

Обмен данными м/у УТ И БП
Здравствуйте, уважаемые форумчане. У меня возникла такая проблема: Всегда делали обмен между УТ...

Обмен данными
Привет всем! У меня возникла такая проблема - нет пункта в меню "сервис" - "обмен данными". Версия...

Обмен данными
Прошу помощи тех, кто имеет опыт обмена данными между разными конфигурациями. Есть внешняя...

1С-обмен данными
Здравтсвуйте. Такая ситуация. Нужен обмен между одинаковыми конфигурациями. Причем из одной (общей)...

20
Dethmontt
Модератор
Эксперт 1С
2659 / 2446 / 421
Регистрация: 10.03.2011
Сообщений: 8,756
Записей в блоге: 1
Завершенные тесты: 1
25.10.2012, 12:52 2
Первое что наверное нужно проверить это - Какое значение в переменной УИд когда находит ссылку и когда не находит ссылку...
0
Fenomen
899 / 876 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
25.10.2012, 13:04 3
Действительно странно. Сделайте лог и записывайте все значения УИД и результат поиска ссылки. Возможно все таки проблема не в 1С, а скажем в некорректных УИД.
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
25.10.2012, 13:48 4
совет: сделайте через попытку. Ситуация удаления - штатная.
0
sonatto
62 / 60 / 0
Регистрация: 02.10.2012
Сообщений: 448
25.10.2012, 16:05 5
Цитата Сообщение от biakus Посмотреть сообщение
3 Заявка = Справочники.Заявки.ПолучитьСсылку(Новый УникальныйИдентификатор(УИд));
// в синтаксиспомошнике: Новый СправочникСсылка.<Имя справочника>(<УникальныйИдентификатор>)
//...Если идентификатор не указан, создается пустая ссылка.
посмотрите, что вы кладете на сохранение
в базе Oracle
не могло там че ть потеряться?
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
25.10.2012, 17:45  [ТС] 6
проблема не только со строковыми значениями, но и числовыми и с датами... что возвращает поиск по УИд я знаю, уже выводились кучи сообщений проверочных, правда не в режиме: "загружаем и тут же проверяем", а "загрузили, пользователи пожаловались на единичный случай ошибки, запустили сверку по всему объему информации, куча несоответствий того что должно было загрузиться и что загружено".
Проверяем проверочные сообщения несоответствий непосредственно в тааблицах Оракловой базы - адекватные данные. При копировании соответствующего УИд из таблицы и запуске простейшего поиска отдеьно - работает-находит, и при повторном запуске загружается той же самой обработкой то что нужно... пропуская очередную порцию данных...
Со стороны приложения Оракловой базы так же были коннекты с передачей данных, но не массовые а порядка 20-100 записей за раз. Со слов программиста, осуществляющего обмен с той стороны, так же была пропажа значений, и он действительно сразу проверял "нашли-не нашли", если не нашли, то ставил паузу 5сек и повторял то же самое действие - ошибок стало на порядок меньше.
Из этой ситуации есть вероятность, что СОМ-коннектор Оракла дает явные сбои, т.к. обмены данных 1С по СОМ-соединениям с другими приложениями никогда не давали промахов.
Рассчитывала, что кто-то встречался с подобным и знает пути устранения подобных глюков.

Добавлено через 24 минуты
Поясняю еще конкретней, чтобы не было сомнений:
- в справочнике много реквизитов разных типов, они могут быть как заполненные, так и не заполненные.
- грузится очень много записей сразу - порядка миллиона
- обработка по загрузке или проверке всех реквизитов всего объема информации занимает не менее 5 часов
- имеет место быть не просто пустые значения, а неправильные О_о

Из вы изложенного: даже если грузить допустим кусками по 10тыс. записей, то каждый пустой реквизит проверять по два раза "а вдруг там есть на самом деле значение", формируя при этом динамически для этого реквизита этой записи мини-запросик для повторного получения данных - думаю как-то маразматично О_о и не решает последний вопрос
0
Dethmontt
Модератор
Эксперт 1С
2659 / 2446 / 421
Регистрация: 10.03.2011
Сообщений: 8,756
Записей в блоге: 1
Завершенные тесты: 1
26.10.2012, 00:48 7
Без детального анализа тут вряд ли обойтись - случай единичный...
Вариантов проблемы не одни (некоторые из них)* и винить COM-коннектор как мне кажется рановато, нужно найти закономерность
1. Не корректно написанный запрос к БД Оракл - который в разных условиях возвращает разный результат... (У 1С 7.7 есть такая проблема - один и тот же запрос в MS SQL 2000 и MS SQL2005 возвращает разный результат в одной и той же БД)
2. Не корректная типизация - конвертация типов при загрузке (В каком то случае тип преобразовывается в нужный в каком то Нет)
3. Да что угодно.....................
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
26.10.2012, 09:13  [ТС] 8
Цитата Сообщение от Dethmontt
1. Не корректно написанный запрос к БД Оракл
интересненько, а как оценить правильность? и что значит разные условия?
Цитата Сообщение от Dethmontt
2. Не корректная типизация - конвертация типов при загрузке (В каком то случае тип преобразовывается в нужный в каком то Нет)
УИд в Оракле хранится как строка, простейший тип, поэтому на нем и был приведен пример, не понимаю какая беда с типизацией может произойти со строковым значением

Принимаю во внимание первый пункт, готова подробно разбираться по наводкам. Справочник мне закачивать далеко не один и данных там не мерено. Используемые запросы содержат как правило порядка 3х таблиц, может более, соединены левым соединением по одному полю, может добавлено одно условие для ограничения выборки - довольно простые на мой взгляд, без вложенных запросов и т.п.
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
26.10.2012, 12:43 9
Цитата Сообщение от biakus Посмотреть сообщение
мы на явно существующий УИд не получаем ссылку на справочник
Мы так и не определили симптомы:
1. Как УИ существует в оракуле (тут д.б. всё в порядке - стринг он и в Африке... Единственно - подмена символов типа CHR(149), режимы поддержки, согласования базы оракл или запроса к данным).
2. Как УИ существует (существует ли) в 1с.
Всё в Ваших руках: список траблов и проверка в отладке - это вполне реализуемо.
PS. У меня две версии:
1. удалённые пользователем объекты
2. Битый Оракулом какой-то символ.
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
26.10.2012, 13:09  [ТС] 10
Уважаемый, duk337, еще раз повторяю: когда наталкиваюсь на ошибку, я вижу в каком объекте, нахожу что именно не совпадает, и обязательно проверяю УИ в Оракле - там объект какой нужно, с нужным УИ, но при первичной загрузке загрузил другое значение в 1С, откуда он его взял - очень хотелось бы узнать, если запустить перезапись этого конкретного багового объекта с тем же самым первичным запросом к базе Оракла, то закачает в 99% правильный объект. База Оракла не меняется - заморожена. В базе 1С не могут пользователи менять те значения, которые я сейчас обсуждаю.
По каким причинам может возникать подмена символов при одном выполнении запроса и не происходить этой подмены при вторичном, третичном выполнении этого же самого запроса, на этих же самых данных?

Добавлено через 6 минут
УИ в базе существует, и на это идет проверка обязательная, ничего так просто пользователи у нас в жизни не удалят - уж поверьте система серьезнее некуда, всё обрублено намертво.
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
26.10.2012, 14:06 11
Цитата Сообщение от biakus Посмотреть сообщение
загрузил другое значение в 1С
Цитата Сообщение от biakus Посмотреть сообщение
там объект какой нужно, с нужным УИ
Хорошо. Мы ищем причину. А я пока не знаю, на что ругаться, поскольку предпосылок мало.
Итак:
Один и тот же набор символов (УИ). Легитимен, поскольку 99% случаев дают правильный результат поиска объекта в 1с по идентификатору. т.е. разные окончания строк в базах оракл и скуль нас не парят.
Изредка в 1с попадает битая строка. Ну что тут... микротрещины в маме, кривая память? Аппаратные симптомы, не так ли?
Либо 1с глючит просто так для смеху, например, эмулирует сбой по индексу. Лекарство: переиндексировать. Ну это тоже для смеху, плюс прочий ремонт базы.
Далее ритуальные пляски и эзотерика:
Забэкапить и отресторить в новую базу (сменить поверхность носителя, сменить аппаратную среду).
Выгрузить в плоскую базу. Провести всяческий ремонт. Пробовать многократно.

И опишите, если не сложно, как Вы визуально идентифицируйте объект в 1с, синхронизируя его с УИ. Т.е. я предполагаю, что получаете функцией в отладчике при останове?
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
26.10.2012, 14:44  [ТС] 12
даже не знаю как ответить... отвечу на то что поняла
При закачке миллионного справочника я не в состоянии знать что в 278645-ом объекте он мне выдаст неправильное значение, с чем его сравнивать чтобы удостовериться на этапе закачки что оно верное - я не знаю. Постфактум проводится сравнение того что закачалось и что в исходной базе - находим различия, выдаем сообщения "в таком то объекте, такой то-то реквизит не правильный, должен быть такой", заходим в соответствующую таблицу Оракла и видим - действительно в 1С одно значение, а тут другое. Для проверки какой УИ кроется за полученным ссылочным значение нарисовала простейшую кнопку. Проверка выборочная, в основном проверяет что код 1С адекватен в типизации полученных значений, т.е. по моей логике просто значения приходят с запросом не верные.
Переиндексации и прочему ремонту наша база не подлежит
Предположим (для смеху) что 1С эмулирует сбой по индексу и именно по этому не может адекватно найти нужную ссылку по правильно полученномй из Оракла УИ, тогда чем объяснить неправильную закачку других реквизитов типа число и просто строка комментария, которые пишутся в базу как пришли из запроса, разве что для строк СокрЛП()?
разные окончания строк в базах оракл и скуль
- не понятно
Изредка в 1с попадает битая строка
- интересно в каком виде битый УИ бывает, что по нему еще можно получить значение близкое к истине, но не то самое
Выгрузить в плоскую базу.
- файловую? извините, не знакома с подобным термином
Пробовать многократно.
- на данный момент у меня только этот инструмент с постепенным снижением доли ошибок на каждом шаге, но есть объект более сложный, который править таким образом в некоторых случаях невозможно, поэтому чем меньше ошибок я получу в каждой итерации, тем безопаснее(!) мои догрузки в отношении этого объекта.
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
26.10.2012, 15:42 13
Цитата Сообщение от biakus Посмотреть сообщение
такой то-то реквизит не правильный
Т.е. все ссылки вообще интерпретируются в оракле строку? Давайте смоделируем алгоритм.
Нашли объект, в нём ссылочный атрибут. Нашли его, в нём тоже... Рекурсия проглядывается, где уместно особое мастерство программиста, поскольку путаница между уровнями рекурсии возможна легко. Как тут скажешь... Но система должна быть.
Может, статистика сбоев по уровням вложенности проглядывается? Например, Контрагент правильно, Договор правильно, а третьим у нас Валюта. Где совпадает - как бы нормально, а где нет - баг. Программу надо глядеть, однако, ко всему прочему.
Цитата Сообщение от biakus Посмотреть сообщение
файловую?
да

Цитата Сообщение от biakus Посмотреть сообщение
интересно в каком виде битый УИ бывает, что по нему еще можно получить значение близкое к истине
В жизни всё бывает, хотя тут Вы правы - излишний романтизм. Просто в начале было озвучено
Цитата Сообщение от biakus Посмотреть сообщение
не получаем ссылку на справочник
Цитата Сообщение от biakus Посмотреть сообщение
разные окончания строк в базах оракл и скуль
- не понятно
Стринг переменной длины завершается спецсимволом.

Цитата Сообщение от biakus Посмотреть сообщение
т.е. по моей логике просто значения приходят с запросом не верные
Вот и хочется убедиться, так ли это. Если исключить кодировку и железо, то данные правильные, а обработка неправильная. А может, запрос построен так, что готовит иерархию ссылок по своему алгоритму. Тогда запрос смотреть... Но это высший пилотаж оптимизации...

Пока мы пришли к тому, что путаются ссылки не первого уровня. Так?
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
26.10.2012, 22:02  [ТС] 14
Может, статистика сбоев по уровням вложенности проглядывается?
А может, запрос построен так, что готовит иерархию ссылок по своему алгоритму
- к сожалению сбои на первом уровне, сложные вложенности отсутствуют, рекурсия не требуется, в том то и проблема что при всей прозрачности вопроса ошибки имеют место быть и причину не понять пока.
Как пример: есть некий справочник Заявка, в котором ТЧ с Номенклатурой (услуги), к ней числовые значения количества и даты, на которые запланировано выполнение работ, и даты выполнения работ. Надо подкачать ТЧ в существующую заявку. Как видите сложной иерархии не наблюдается: по УИ находим заявку, получаем ТЧ, по УИ ищем Номенклатуру и добавляем необходимое для этой заявки количество строчек.

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

Стринг переменной длины завершается спецсимволом.
- бесконечные строки только мало интересующие нас примечания, все что закачивается из Оракла имеет конкретный ограниченный тип, перечисления - расшифровываются так как оговаривалось при разработке, УИ - строки конкретной длины, даты есть даты, числа есть числа, все пустые значения перебираются и на null и на 0 и на пустые строки - на всякий случай на все сразу.

Из упоминания про файловую базу мысль только если создать нулевую базу, создать в конфигурации подобные необходимым объекты, качнуть данные из Оракла туда, а потом в реалку перекачка 1С to 1С. Но думаю в данном случае ошибки отлавливать в итоге будет еще сложнее, да и теряем время на всю эту дополнительную подготовку и дополнительные обработки перекачки, а времени к сожалению нету, всё должно работать "вчера".

Добавлено через 36 минут
до запроса не жадная, примерно такого вида, думаю сообразите что к чему без лишних слов:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
ТекстЗапроса = "SELECT 
|      d.order_1c_id,                   -- УИдЗаявки
|      b.services_id_1c,                -- УИдНоменклатуры
|      a.edit_date_beg,                 -- Плановая дата
|      a.services_0,                    -- Плановое количество
|      a.finish_date,                   -- Фактическая дата
|      a.services_f                     -- Фактическое количество
|  FROM p14_1_d_order_estimates_dt a
|      LEFT JOIN p14_1_d_order_estimates b
|         ON a.estimates_id = b.estimates_id
|      LEFT JOIN p14_d_orders d
|         ON b.order_id = d.order_id
| WHERE d.order_1c_id = '"+УИдЗаявки+"'";
условие "WHERE", если ограничиваю выборку предварительным запросом 1С - использую для перезакачки неверных кусков
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
27.10.2012, 13:25 15
Цитата Сообщение от biakus Посмотреть сообщение
Надо подкачать ТЧ в существующую заявку.
Заявка - 1й уровень, номенклатура второй. Единицы измерения ещё нет - и то слава богу.
Рискну озвучить симптом: номенклатура находится правильная, но попадает не в тот документ.
Надо одинэсный код смотреть. Частый трабл: в таблице с двумя ключами надо отследить смену того и другого. В этом случае как раз подобные сбои: ситуация с документом без тч - и съехало. или тч без документа. Короче возможно - и именно так, как происходит, поскольку трабл сказывается не на текущем, а на следующем объекте. И поймать в отладчике сложно: голова начинает болеть раньше

Добавлено через 5 минут
а тут ещё третья таблица с "гарниром" заявки. Представьте, что программисту приходится синхронизировать данные по
1C
1
2
3
4
|      a.edit_date_beg,                 -- Плановая дата
|      a.services_0,                    -- Плановое количество
|      a.finish_date,                   -- Фактическая дата
|      a.services_f                     -- Фактическое количество
тоже очень и очень вероятна путаница, причём именно рандомная
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
27.10.2012, 14:01  [ТС] 16
Цитата Сообщение от duk337 Посмотреть сообщение
Рискну озвучить симптом: номенклатура находится правильная, но попадает не в тот документ.
ТЧ была пустая и закачивалась с нуля в существующие уже заявки, запрос был отсортирован по УИ заявки, т.е. алгоритм:
цикл по строкам результата запроса из Оракла
смотрим смену УИ заявки, пока не сменился добавляем строки
если сменился, то записываем текЗаявку, и переходим к заполнению следующей...

Я не для каждой строчки подтаскиваю заявку, и потом номенклатуру, а записываю целиком заявку, как минимум чтобы не тратить время на запись объекта (это дольше, чем проверки). Поэтому мне как-то кажется что внутри одной заявки иметь все строки верные, а одну-две неверные как-то подозрительно. Причем напоминаю что допустим Номенклатура по списку верная, а вот фактические даты у пары строчек не подгрузились. Смотрим даты в Оракле - вполне адекватные корректные даты... развожу руками, что могло помешать. Пугает нестабильность ошибок, которые я не могу однозначно подогнать под одну гребенку.
С "гарниром" заявки я тоже вожусь, но с ним бы не было таких проблем, если выровнять первые два уровня (как вы их поделили).
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
28.10.2012, 13:44 17
Цитата Сообщение от biakus Посмотреть сообщение
цикл по строкам результата запроса из Оракла
смотрим смену УИ заявки, пока не сменился добавляем строки
если сменился, то записываем текЗаявку, и переходим к заполнению следующей...
Известный алгоритм. Так что глюки штатные. Лечение:
1. Закачать оракловые данные в таблицу 1с аналогичной структуры, например, табличная часть элемента справочника, без всяких обработок.
2. ЗАПРОСОМ 1с получить готовую иерархию документов.
Плюсы: два этапа, которые можно в опытной закачке разделить и посмотреть любые данные, тем более что в случае со справочником они сохранятся. Опция ИТОГИ даст Вам дерево, а не плоскость. Кроме того возможны наиболее надёжные способы с двумя таблицами: одна свёрнута по документам, вторая фильтруется по значению в строке первой.
1
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
28.10.2012, 14:55  [ТС] 18
Цитата Сообщение от duk337 Посмотреть сообщение
1. Закачать оракловые данные в таблицу 1с аналогичной структуры, например, табличная часть элемента справочника, без всяких обработок.
2. ЗАПРОСОМ 1с получить готовую иерархию документов.
ммм, что-то вроде создать левый регистр сведений допустим, качнуть туда все как вытащила запросом оракла, а потом уже разбираться внутри 1С что куда распихать, если промежуточная проверка универсальным отчетиком по всем измерения даст достаточно точно сходящиеся данные с подобными выдержками из Оракла? - если так то звучит красиво, лишило бы меня многих проблем чуть ранее, но правильность данных скорее оценивают пользователи тупо натыкаясь в процессе работы, в данном случае я сожалею что я качаю не бухгалтерские проводки, которые хорошо проверяются суммами по счетам
спасибо, я подумаю над этим...
0
duk337
2950 / 1762 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
28.10.2012, 15:01 19
лучше левый справочник с таб.частью (частями). Каждый элемент - одна закачка. Потом все можно гнать через один предопределённый элемент.

Добавлено через 2 минуты
В структуре на ссылки по два реквизита: один оракловый ключ, второй - 1совская ссылка. И отчет не нужен: Вторым этапом заполняются ссылки и визуально всё видно. Третий этап тупой перенос.
0
biakus
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 11
29.10.2012, 09:39  [ТС] 20
duk337, большое спасибо, конечно два реквизита - это логично, но адекватность видимого - это не про нас)) кто и как будет оценивать сходится или нет? по отчету я хоть общие цифры сверю, а поштучно только пользователи уже конкретные их родные объекты будут проверять в процессе работы
ну думаю на этом вопрос можно закрыть

P.S. мне вот постфактум добрые оракловые наши разработчики готовы создать общую таблицу для выгрузки с их стороны, остается вопрос: где ж они такие услужливые были раньше
0
29.10.2012, 09:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2012, 09:39

Обмен данными
Всем доброго времени суток! У меня такая ситуация: Учет в ЗУП ведется в демонстрационной базе...

Обмен данными 7.7
Данная обработка обеспечивает перенос документов и справочников между идентичными конфигурациями...

Обмен данными в 8.1
Добрый день. Можно ли организовать обмен (или хотябы загрузка\выгрузка по требованию) между двумя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru