обмен бонусами между магазинами Розница 2.2

1. osavv 18.01.19 08:21 Сейчас в теме
Скажите, пожалуйста, как передаются бонусы между магазинами в типовом функционале Розницы ред.2.2.
по схеме ПУ1 (периферийный узел) -ЦУ (центральный узел) -ПУ2, т.е. через обычную синхронизацию данных
или возможен обмен только бонусами

иными словами: есть ли вероятность списать бонусы в одном магазине и через несколько минут те же бонусы списать в другом магазине?
По теме из базы знаний
Найденные решения
2. TODD22 18 18.01.19 08:34 Сейчас в теме
(1)
иными словами: есть ли вероятность списать бонусы в одном магазине и через несколько минут те же бонусы списать в другом магазине?

В рознице есть бонусный сервер. Нужно поднять вэб сервер, опубликовать сервис, настроить подключение в узлах. Тогда списание бонусов будет в режиме "онлайн".
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. TODD22 18 18.01.19 08:34 Сейчас в теме
(1)
иными словами: есть ли вероятность списать бонусы в одном магазине и через несколько минут те же бонусы списать в другом магазине?

В рознице есть бонусный сервер. Нужно поднять вэб сервер, опубликовать сервис, настроить подключение в узлах. Тогда списание бонусов будет в режиме "онлайн".
4. osavv 18.01.19 09:24 Сейчас в теме
Замечательно, большое спасибо!
а при обмене бонусами база магазина не блокируется?, т.е. в базу можно будет писать данные?
3. osavv 18.01.19 09:11 Сейчас в теме
Замечательно, большое спасибо!
а при обмене бонусами база магазина не блокируется?, т.е. в базу можно будет писать данные?
5. monolog 18.01.19 10:08 Сейчас в теме
(3) Если даже и блокируется, то совсем на доли секунды, так как объем информации для чтения/записи не значительный.
Не думаю что попадете на блокировку при продаже
6. osavv 18.01.19 10:19 Сейчас в теме
(5)это хорошо
можно еще вопрос не совсем по этой теме?
сейчас при синхронизации данных, т.е. полной выгрузке данных из ПУ в ЦУ, база ПУ блокируется
возможен ли полный обмен данными без блокировки базы в рамках типовой конфигурации?
7. monolog 18.01.19 10:24 Сейчас в теме
(6) Рекомендую в данном случае делать обмен только при начале работы магазина и сразу после закрытия смены. Понимаю что есть случаи когда идет переоценка и тд... Но работать во время обмена крайне не рекомендую
8. TODD22 18 18.01.19 10:36 Сейчас в теме
(6)всегда будет блокироваться. Можно дописать через расширения кнопочку что бы пользователь сам нажимал когда например надо сделать переоценку и что бы автоматически утром и после закрытия запускался обмен.
9. osavv 18.01.19 11:06 Сейчас в теме
(8) большое спасибо всем!

жаль, что в новой редакции блокировка при обмене все таки осталась

в старой редакции я обошла блокировку заменив команду ЗаписатьИзменения на ВыбратьИзменения
по команде ВыбратьИзменения данные передаются без конфигурации и файл обмена значительно больше, но зато кассиры могут спокойно торговать, пока загружаются данные
а когда надо передать конфигурацию использую команду ЗаписатьИзменения

придется и в новой редакции делать так же

может мой вариант обхода блокировок кому-то поможет
10. TODD22 18 18.01.19 18:45 Сейчас в теме
(9)Блокировка ставится не при загрузке данных из центрального узла, а при выгрузке данных в центральный узел. Для обеспечения целостности передаваемых данных блокируется таблица.
11. osavv 19.01.19 06:24 Сейчас в теме
(10) эту команду я использую при выгрузке данных из ЦУ в ПУ и из ПУ в ЦУ
таким образом обмен у нас работает уже несколько лет и передаваемые данные от этого не страдают
12. independ 1520 19.01.19 08:35 Сейчас в теме
(11) Нашел единственный вызов
В Обработке КонвертацияОбъектовРаспределенныхИнформационныхБаз, модуль объекта процедура
Процедура ЗаписатьИзмененияВФайлСообщенияОбмена(Отказ, ЗаписьXML)
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, КоличествоЭлементовВТранзакции);

Т.е. здесь можно сделать замену? И даже наверно вынести это в расширение, которое отключать при обновлении?
14. osavv 19.01.19 15:29 Сейчас в теме
(12) похоже, что здесь; думаю и в расширение можно вынести
как именно сделать вызов в расширении своей процедуры сказать не могу - не смотрела еще этот блок в новой конфигурации

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

в старой редакции (ред. 1 под 8.1) я сделала так:


Функция ВыгрузитьИнформациюВМагазин(......)
.......

Попытка
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(КатВремФайловЗап + ИмяФайлаXml);
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, мУзелМагазина);

Если ОтправлятьКонфигурацию Тогда
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0);

#Если Клиент Тогда
Состояние("" + мУзелМагазина + ", запись файла");
#КонецЕсли
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Иначе
Для Н = 1 По 2 Цикл
ЕстьДанныеДляПередачи = Ложь;
Выборка = ПланыОбмена.ВыбратьИзменения(мУзелМагазина, мУзелМагазина.НомерОтправленного + 1);
Пока Выборка.Следующий() Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
ЭлементДанных = Выборка.Получить();
ТипЭлемента = ТипЗнч(ЭлементДанных);

// проверка необходимости передачи данных
ОтправкаЭлемента = Неопределено;
ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, мУзелМагазина);
// ПланыОбмена.ПоМагазину.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, мУзелМагазина);
Если ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать и
ОтправкаЭлемента <> ОтправкаЭлементаДанных.Удалить Тогда
// Запись изменений данных
#Если Клиент Тогда
Состояние("" + мУзелМагазина + ", запись в файл: " + ЭлементДанных);
#КонецЕсли
ЗаписатьXML(ЗаписьСообщения.ЗаписьXML, ЭлементДанных);
ЕстьДанныеДляПередачи = Истина;
КонецЕсли;
КонецЦикла;

Если ЕстьДанныеДляПередачи Тогда
Прервать;
ИначеЕсли Н = 1 Тогда
// так сделаем для того, чтобы в файле что-то было, иначе узел-приемник его не примет
ПланыОбмена.ЗарегистрироватьИзменения(мУзелМагазина.Ссылка, мУзелМагазина.Магазины[0].Магазин);
КонецЕсли;
КонецЦикла;

#Если Клиент Тогда
Состояние("" + мУзелМагазина + ", запись файла");
#КонецЕсли
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
КонецЕсли;
Исключение
#Если Клиент Тогда
Сообщить("" + ТекущаяДата() + "Ошибка при выгрузке данных " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
#КонецЕсли
Если мФайлПротокола <> Неопределено Тогда
мФайлПротокола.ЗаписатьСтроку("" + ТекущаяДата() + " Ошибка при выгрузке данных " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецЕсли;
ЗаписьXML.Закрыть();
Отказ = Истина;
КонецПопытки;
........

КонецФункции

функция ЗагрузитьИнформациюИзМагазина(.....)
.......
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(мКатВремФайловВосст + мИмяФайлаXml);
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
// значит файл обмена передан без конфигурации
ЗаписатьЭлементДанныхВБазу(ЧтениеXML, мУзел, Ложь);
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
ЗаписатьЭлементДанныхВБазу(ЧтениеXML, мУзел, Ложь);
КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();

ПланыОбмена.УдалитьРегистрациюИзменений(мУзел, мНомерПринятого);
Иначе
ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, 0);//ПрочитатьИзмененияПоПлануОбмена(ЧтениеСообщения);
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
КонецЕсли;

// ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, 0); // *** Наш блок *** изменнено Журавлевым Д.В. / ПрочитатьИзмененияПоПлануОбмена(ЧтениеСообщения); // *** Наш блок *** изменено Савватеевой О.В. / ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, 0);
мИнформацияПринята = Истина;
Исключение
мОшибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Если Найти(мОшибка, "для которого зарегистрированы изменения конфигурации") Тогда
Если мФайлПротокола <> Неопределено Тогда
мФайлПротокола.ЗаписатьСтроку("" + ТекущаяДата() + " Для узла " + мУзел.Код + " зарегистрированы изменения конфигурации.");
КонецЕсли;
#Если Клиент Тогда
Сообщить("Для узла зарегистрированы изменения конфигурации.");
#КонецЕсли
мОшибка = "";
мЗарегистрированыИзменения = Истина;
КонецЕсли;
ЧтениеСообщения.ПрерватьЧтение();
ЧтениеXML.Закрыть();
КонецПопытки;
.......
КонецФункции


Процедура ЗаписатьЭлементДанныхВБазу(ЧтениеXML, мУзел, ПолучаемОтГлавного)
ЭлементДанных = ПрочитатьXML(ЧтениеXML);
.......
КонецПроцедуры
13. TODD22 18 19.01.19 12:58 Сейчас в теме
(11)Никак ваш метод не обходит блокировки.
https://www.youtube.com/watch?v=E6wy_UItkdw
15. osavv 19.01.19 15:39 Сейчас в теме
(13) да, совсем от блокировок избавится не удалось, но они возникают настолько редко, что можно сказать - их нет
блокировка возникала тогда, когда пользователи пытались записать объект, который в данный момент записывался в файл обмена

при типовом методе выгрузки данных во время обмена в базу почти ничего невозможно было записать,
при выгрузке данных моим методом - пользователи работают практически спокойно
16. TODD22 18 19.01.19 18:02 Сейчас в теме
(15)
при выгрузке данных моим методом - пользователи работают практически спокойно

И чем ваш метод отличается, если он использует тот же метод который устанавливает блокировку? У вас те же самые блокировки.
17. osavv 21.01.19 04:56 Сейчас в теме
(16) если бы блокировки были бы теми же самыми, то работать пользователям во время обмена данными было бы так же невозможно, а они работают

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

в моем методе блокируется только тот объект, который в данный момент записывается в файл
и вероятность того, что пользователь в этот момент будет его изменять очень мала, поэтому блокировки редки
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот