8.х ЗУП Проблемы обмена

Тема в разделе ""1С:Зарплата и управление персоналом ЗУП"", создана пользователем lanka, 13 фев 2008.

  1. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Пользуемся конфигурацией Управление торговлей", редакция 10.2 (10.2.11.3), на платформе 1С:Предприятие 8.0 (8.0.16.2). Организовали распределёнку. Настроили автоматический обмен между главной и периферийной базой.
    Постоянно возникают проблемы при обмене, часть изменений теряется куда-то. Такое чувство, что эти изменения очищаются в какой-то момент.. Помогает только перезапись объекта, при этом изменения вновь регистрируются и при обмене попадают куда надо.. В чём может быть косяк? :unsure:
  2. AlexanderAA
    Offline

    AlexanderAA

    Регистрация:
    13 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Скорее всего у Вас теряются изменения в периферийной базе после переноса в неё изменений конфигурации из главной базы. Это наблюдалось мной и на последней версии платформы 8.1.10.50. Разумеется, такого быть не должно и это ошибка платформы.

    И кстати, опишите подробно: как именно у Вас производится обмен (интерактивно или с помощью написанной процедуры, дайте посмотреть код если он есть).
  3. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Данные теряются, к сожалению, не только при переносе изменений конфигурации. :(

    Обмен настроен так: есть батничек, который запускает периодически 1с и передает ей параметр запуска. Процедура ПриНачалеРаботыСистемы() обрабатывает этот параметр:

    Код:
    Если ПараметрЗапуска<> "" тогда
    Попытка 
    ВыполнитьКомандыЗапуска(ПараметрЗапуска);
    Исключение
    Сообщить(ОписаниеОшибки());
    Конецпопытки;    
    ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
    
    
    Код:
    Процедура ВыполнитьКомандыЗапуска(параметр) Экспорт
    ЭтотУзел = ПланыОбмена.Филиалы.ЭтотУзел().ПолучитьОбъект();
    Поток = Новый ЧтениеXML;
    Поток.УстановитьСтроку(Параметр);
    Поток.Прочитать();  // command шапка 
    КаталогОбмена =  ПрочитатьЗначение(Поток);
    Пока Поток.Прочитать() Цикл    
    Если Поток.ТипУзла=ТипУзлаXML.НачалоЭлемента И Поток.Имя="Node" Тогда
    Поток.Прочитать();
    УзелПриемникКод=Поток.Значение;
    Поток.Прочитать();// закрыли node
    УзелПриемник = ПланыОбмена.Филиалы.НайтиПоКоду(СОКРЛП(УзелПриемникКод));    
    Если НЕ УзелПриемник.Пустая() Тогда
    ЭтотУзел.ПрочитатьИзменения(КаталогОбмена,УзелПриемник); 
    ЭтотУзел.ЗаписатьИзменения(КаталогОбмена,УзелПриемник);
    КонецЕсли;    
    ИначеЕсли Поток.ТипУзла=ТипУзлаXML.КонецЭлемента И Поток.Имя="Nodes"  Тогда
    Прервать;                
    КонецЕсли;
    КонецЦикла;
    Поток.Прочитать();  // command закрыли
    КонецПроцедуры    
    
    
    
    
    Ну и процедуры модуля плана обмена, осуществляющие чтение и запись:
    Код:
    Процедура ЗаписатьИзменения(КаталогОбмена,УзелПриемник) Экспорт
    Попытка
    ПолноеИмя = ПолучитьИмяФайлаОбмена(ПланыОбмена.Филиалы.ЭтотУзел().Код,УзелПриемник.Код,КаталогОбмена); 
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ПолноеИмя);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелПриемник);
    ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения,1000);
    ЗаписьСообщения.ЗакончитьЗапись();
    ЗаписьXML.Закрыть();
    Исключение
    КонецПопытки;
    КонецПроцедуры    
    
    Процедура ПрочитатьИзменения(КаталогОбмена,УзелПриемник) Экспорт
    Попытка
    ПолноеИмя = ПолучитьИмяФайлаОбмена(УзелПриемник.Код,ПланыОбмена.Филиалы.ЭтотУзел().Код,КаталогОбмена); 
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ПолноеИмя);
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения,1000);
    ЧтениеСообщения.ЗакончитьЧтение();
    ЧтениеXMl.Закрыть();
    Исключение
    Конецпопытки;
    КонецПроцедуры    
    
    
    
    
    Еще для полной ясности функция, которая получает имя файла обмена:
    Код:
    Функция ПолучитьИмяФайлаОбмена(КодУзелИсточник,КодУзелПриемник,КаталогОбмена) 
    Возврат КаталогОбмена+"Message_"+СокрЛП(КодУзелИсточник)+"_"+СокрЛП(КодУзелПриемник)+".xml";
    КонецФункции
    
    
    
    Обмен с филиалом происходит через общий сетевой ресурс.
  4. AlexanderAA
    Offline

    AlexanderAA

    Регистрация:
    13 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Во-первых я бы в двух местах Вашего кода заменил параметр 1000 на 0 вот здесь:

    ...
    ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 1000);
    ...

    ...
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, 1000);
    ...

    Что такое 1000. Это сколько элементов обрабатывать за одну транзакцию. Если мы поставим 1000, тогда для первых 1000 элементов - одна транзакция, для вторых 1000 - другая и так далее. Если на каком-то из этих элементов возникает ошибка - неизвестно будет - какая транзакция успела завершится, а какая не успела - вот Вам и источник потери данных. Какие-то данные успели записаться, а какие-то не успели.

    Если мы поставим 0 - тогда абсолютно все элементы будут обрабатываться в рамках только одной транзакции. Если произойдёт ошибка - произойдёт откат всей этой транзакции, как будто ничего не происходило. Таким образом, мы сохраним целостность данных.
  5. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Был такой вариант. Поставила 1000 элеменов в одной транзакции, как советует большая умная книжка "Профессиональная разработка в системе 1с: Предприятие 8". Там говорится о преимуществах и недостатках выгрузки и загрузки в одну транзакцию и предлагается искать компромисс между параллельностью работы пользователей и согласованностью выгружаемых данных.
    Просто обмен у нас происходит каждый час, а база и так подвисает из-за интенсивной работы пользователей.
    У меня вопрос такой возникает: а если одна из нескольких транзакций завершилась неудачей, сообщение в итоге считается прочитанным?
  6. AlexanderAA
    Offline

    AlexanderAA

    Регистрация:
    13 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    В том то и дело, что ДА, считается прочитанным!

    Я бы слепо не верил рекомендациям, а протестировал бы на деле с параметром 0. Может не всё так будет и страшно, зато сохранится целостность, что важнее. Ведь сейчас у Вас проблемы с целостностью, что гораздо хуже, чем возможные проблемы с параллельностью, которые ещё нужно выявить, чтобы понять насколько это неприемлемо, по сравнению с потерей данных.

    Ещё обратите внимание на требования к аппаратным ресурсам.

    Давайте проанализируем: как и на чём у Вас установлена основная и подчинённая база? Какой вариант работы обеих (файловый или через СУБД)? Сколько пользователей одновременно работают с каждой?
  7. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Главная база работает в клиент-серверном варианте. Одновременно около 40 пользователей. Периферийная база в файловом варианте, около 5 пользователей.
  8. AlexanderAA
    Offline

    AlexanderAA

    Регистрация:
    13 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Нужна более подробная информация: конфигурация сервера, используемая база данных и т.п.
  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Я бы еще спросил какое количество документов идет за этот час между обменами и вообще - что происходит с базой? Изменяются ли документы за пред период, имеется ли возможность фильтровать данные или нужны полные данные, пробовали ли уменьшить период обмена до 15 минут...
  10. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Поставила обмен в одну транзакцию, вроде бы пока ничего не теряется. Надеюсь проблема решена :unsure:
  11. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Рано радовалась, так и теряются данные :unsure:
  12. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Данные теряются из-за неправильного чтения изменений.
    Это проблема работы пользователей.

    Например: имеется некий дщокумент, его изменили в базе А, и в это же время изменили в базе Б - угадайте, что получится после одновременной отправке и чтении изменений... А еще хуже - когда начинают ворочать документы задним числом и обмен делается редко - это вообще труба.

    Поэтому ставьте обмен как можно чаще...
  13. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    К сожалению, если бы все решалось пользователями - было бы прекрасно, но ошибки обмена проявляются не только из-за работы пользователей. Данные теряются и когда все корректно.
  14. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Данная ситуация отрабатывается правильно. Настроено, что при одновременном изменении документа в центральной и филиальской базе принимаются изменения филиала.
  15. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Была замечена следующая ситуация: в центральной базе номер отправленного сообщения оказался меньше номера принятого сообщения в филиальной базе. Как такое может быть? Еще бывает сообщение записывается не полностью, скорее всего из-за блокировок, т.е. оно выкладывается оборванным... Может ли случиться такая ситуация, что при выгрузке сообщение записалось не полностью, номер отправленного сообщения не изменился и это оборванное сообщение удалось прочитать в периферийной базе?
  16. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    lanka,
    оборванное сообщение читается, как ни странно (хотя стандарт XML предполагает закрытие всех тэгов)
    Поэтому, например, может быть ситуация, когда места под сохранения файла не хватило (неполная выгрузка) - но файл появился (например, размером 1 мегабайт, когда должен быть 2 мегабайта) - но сообщение будет читаться за полное!
  17. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Спасибо за разъяснение! Как посоветуете быть? Как определить в момент выгрузки, что сообщение записалось не полностью? Или как это определить в момент загрузки?
  18. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Проверить можно просто запустив проверку закрытия тэгов.
    В сети можно найти бесплатные парсеры для этого, ну, или написать самой.
  19. TopicStarter Overlay
    lanka
    Offline

    lanka

    Регистрация:
    14 ноя 2006
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Что-то порылась в инете - ничего не нашла... Неужели ни у кого нет такой проблемы..
    Сама не знаю, как написать такую проверку :(
  20. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Ну, у меня была такая проблема :) Решил просто квотированием места на винте под это дело :)
    А обработку сейчас некогда просто написать... Попробуйте погуглить на тему проверки тэгов. А еще лучше, - найти форум по XML и попросить дать анализатор....

Поделиться этой страницей