|
|
|
Как реализовать квитирование при использовании Планов Обмена | ☑ | ||
|---|---|---|---|---|
|
0
Колумбарий
01.12.05
✎
19:04
|
Есть Две Конфы, не одинаковые. Под Одной конфой работает три базы, под другой - одна.
Документы определенного вида из Первой конфы выгружаю, и загружаю как документы другого вида во Вторую конфу. Нужно передать квитанцию о том что они пришли - как. Второй вопрос - Документы другого вида во второй конфе добавлены в состав планов обмена. При загрузке, когда они создаются, они же добавятся в таблицу регистрации изменений, или нет? |
|||
|
1
France
01.12.05
✎
19:06
|
первый вопрос:
что мешает сделать выгрузку из второй в первую?... |
|||
|
2
Колумбарий
01.12.05
✎
19:12
|
France, не, ничего не мешает. Просто не пойму когда это делать - либо в момент загрузки сразу писать хмл-файл с квитанциями, либо сначала записать, загруженные документы добавятся в таблицу регистрации изменений, и потом их выгрузить?
|
|||
|
3
Колумбарий
01.12.05
✎
19:21
|
Франс, вот ты бы как, например, делал?
|
|||
|
4
France
01.12.05
✎
19:22
|
я бы, например, после загрузки и сохранения отправил бы уведомление..
"Сообщение такое то получил". |
|||
|
5
Колумбарий
01.12.05
✎
19:30
|
Ага, а в первой базе, когда она получает уведомление "Сообщение такое-то получил" документы, выгруженные перед этим будут удалены из таблицы регистрации изменений?
|
|||
|
6
France
01.12.05
✎
19:35
|
(5) "не в бровь, а в глаз" - так кажись говорит?))
да, так оно и будет.. |
|||
|
7
Колумбарий
02.12.05
✎
11:56
|
На ИТСе, в статье "Использование инфраструктуры сообщений. Квитирование", вот что говорится в параграфе "Односторонний обмен":
В качестве различных схем одностороннего обмена данными можно предложить следующие варианты: * Отсуствие регистрации изменений данных в ИБ, выступающей в роли узла-приемника - сообщение обмена содержит квитанцию о доставке. === там ниже еще два варианта, но я захотел остановиться на этом. Примеров кода там нет, поэтому данный отрывок я воспринял таким образом: // Процедура получения сообщения обмена данными // Получает сообщение с новыми данными для этого узла и загружает данные // Процедура ПрочитатьСообщениеСИзменениями(Форма=0) Экспорт // Тарам-парам, код поскиплен // // ЧтениеXML.Закрыть();//закрываю чтение ХМЛ, все данные переданные в ИБ-приемник - уже загрузили //ОткрытьЗначение(ДеревоХМЛ); //УдалитьФайлы(ИмяФайла); Сообщить("-------- Конец загрузки------------"); //а теперь попытаемся выгрузить квитанцию Сообщить("-------- Квитанция в узел " + Строка(ЭтотОбъект) + " ------------"); Каталог = КаталогВременныхФайлов(); // Формируем имя временного файла ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(ПланыОбмена.Минибанк.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml"; // Создаем объект записи XML ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); ЗаписьXML.ЗаписатьОбъявлениеXML(); // Создаем новое сообщение ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);//и тут у меня ошибка вот такого рода: {ПланОбмена.Минибанк(285)}: Ошибка при вызове метода контекста (НачатьЗапись): Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Запись заблокирована пользователем 'Имя пользователя', с компьютера 'Имя компа', из приложения '1С:Предприятие', соединение '3'. ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка); по причине: Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Запись заблокирована пользователем 'Имя пользователя', с компьютера 'Имя компа', из приложения '1С:Предприятие', соединение '3'. Это как понимать, и можно ли каким-то образом обойти? |
|||
|
8
колодина
02.12.05
✎
12:00
|
мне тоже интересна эта тема. вопрос - может быть можно наладить автоматическое квитирование?
|
|||
|
9
колодина
02.12.05
✎
12:42
|
подниму эту ветку - мне интересна тема.
|
|||
|
10
Колумбарий
02.12.05
✎
13:05
|
о! получилось... Просто код по выгрузке квитанции вынес в отдельную процедуру:
Процедура ВыгрузитьКвитанцию() Экспорт Сообщить("-------- Квитанция в узел " + Строка(ЭтотОбъект) + " ------------"); Каталог = КаталогВременныхФайлов(); // Формируем имя временного файла ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(ПланыОбмена.Минибанк.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml"; // Создаем объект записи XML ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); ЗаписьXML.ЗаписатьОбъявлениеXML(); // Создаем новое сообщение ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка); Сообщить(" Номер сообщения: " + ЗаписьСообщения.НомерСообщения); // Завершаем запись сообщения ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); Сообщить("-------- Конец квитанции------------"); КонецПроцедуры И вызываю ее сразу после загрузки: Пока ВыборкаУзлов.Следующий() Цикл // Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел). Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Минибанк.ЭтотУзел() Тогда УзелОбъект = ВыборкаУзлов.ПолучитьОбъект(); // Получить сообщение. УзелОбъект.ПрочитатьСообщениеСИзменениями(Форма); //отсылаем квитанцию УзелОбъект.ВыгрузитьКвитанцию(); // Сформировать сообщение. //УзелОбъект.ЗаписатьСообщениеСИзменениями(Форма); КонецЕсли; КонецЦикла; |
|||
|
11
Колумбарий
02.12.05
✎
13:07
|
и выходит вот такой симпатичный хмл-файлик:
<?xml version="1.0" ?> - <v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages"> - <v8msg:Header> <v8msg:ExchangePlan>Минибанк</v8msg:ExchangePlan> <v8msg:To>ИБ-отправитель</v8msg:To> <v8msg:From>ИБ-приемник</v8msg:From> <v8msg:MessageNo>2</v8msg:MessageNo> <v8msg:ReceivedNo>0</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body /> </v8msg:Message> Сейчас только посотрю, как на него реагирует первая база. |
|||
|
12
колодина
02.12.05
✎
13:11
|
а автоматом никак нельзя настроить? чтобы не формировать квитанции самому?
|
|||
|
13
Колумбарий
02.12.05
✎
13:20
|
12, а как? конкретно какого-то метода нету, по-моему. Тут-же понты кода. Даже если бы это было автоматически, все равно надо было бы вызывать какой-то метод. Вот ты его пишешь один раз и потом вызываешь.
|
|||
|
14
Колумбарий
02.12.05
✎
13:53
|
Что-то ничего не понимаю - в базе отправителе прочитал квитанцию, вот таким кодом:
Процедура ПолучитьКвитанцию() Экспорт Сообщить("-------- Квитанция в узел " + Строка(ЭтотОбъект) + " ------------"); Каталог = КаталогВременныхФайлов(); // Формируем имя файла ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Минибанк.ЭтотУзел().Код) + ".xml"; Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда Возврат; КонецЕсли; // Производим попытку открытия файла ЧтениеXML = Новый ЧтениеXML; Попытка ЧтениеXML.ОткрытьФайл(ИмяФайла); Исключение Возврат; КонецПопытки; // Загрузка из найденного файла ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); Если ЧтениеСообщения.Отправитель <> Ссылка Тогда // Сообщение предназначено не для этого узла ВызватьИсключение "Неверный узел"; КонецЕсли; // Удаляем регистрацию изменений для узла отправителя сообщения ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);//<<< ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла); Сообщить("-------- Конец квитанции------------"); КонецПроцедуры По идее, строка, помеченная "//<<<" должна удалить из таблицы регистрации изменений все документы, отправленные предыдущим сообщением, но я нажимаю кнопку - и они опять все выгружаются, хотя с ними за этот период ничего не происходило... Как же так? |
|||
|
15
колодина
02.12.05
✎
14:02
|
похоже на itland надо идти с этим вопросом. меня он тоже интересует, однако помочь пока ничем не могу, рассчитываю у вас поучиться. задайте вопрос на итланде, пожалуйста.
|
|||
|
16
Колумбарий
02.12.05
✎
14:40
|
В общем, не понятно.
При формировании квитанции он пишет, что номер принятого сообщения = 0, хотя только что загрузил 24-е сообщение. А когда я пишу, что ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка); ЗаписьСообщения.НомерПринятого = Форма.НомерПринятого; Он вопит, что {ПланОбмена.Минибанк(290)}: Поле объекта недоступно для записи (НомерПринятого) ЗаписьСообщения.НомерПринятого = Форма.НомерПринятого; В чемдело, кто-нибудь в курсе? |
|||
|
17
Колумбарий
02.12.05
✎
15:08
|
||||
|
18
Колумбарий
02.12.05
✎
17:46
|
Блин, связь с тем сайтом пропала.
Вот, оказалось, что Нужен оператор ЧтениеСообщения.ЗакончитьЧтение(); Но я его не использую, потому что до этого в цикле перебираю весь ХМЛ и чтаю его полностью, до конца, поэтому, как я понимаю, когда код доходит до вызова этого метода, 1С сообщает о "неверном формате хмл сообщения" Решили, что нужно в узел насильно писать ЭтотОбъект.НомерПринятого = ЧтениеСообщения.НомерСообщения;//вот так // ЭтотОбъект.Записать(); в этом коде записывать нельзя ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); Вот вызывающий код: УзелОбъект.ПрочитатьСообщениеСИзменениями(Форма); УзелОбъект.Записать();//на всякий случай УзелОбъект.ВыгрузитьКвитанцию(Форма); Вот еще процедурка: Процедура ВыгрузитьКвитанцию(Форма=0) Экспорт Сообщить("-------- Квитанция в узел " + Строка(ЭтотОбъект) + " ------------"); Каталог = КаталогВременныхФайлов(); // Формируем имя временного файла ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(ПланыОбмена.Минибанк.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml"; // Создаем объект записи XML ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); ЗаписьXML.ЗаписатьОбъявлениеXML(); // Создаем новое сообщение ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);//вот тут смотю в отладчик Сообщить(" Номер сообщения: " + ЗаписьСообщения.НомерСообщения); // Завершаем запись сообщения ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); Сообщить("-------- Конец квитанции------------"); КонецПроцедуры В отладчике смотрю значение свойства ЭтотОбъект.НомерПринятого - он равен двузначному числу, а ЗаписьСообщения.НомерПринятого = 0, хоть ты тресни. И это свойтсво только для чтения, вот в чем засада, ну! |
|||
|
19
vvv29
02.12.05
✎
22:40
|
(18)Поправь на нужное число в ручную, попробуй примет ли вообще
|
|||
|
20
Колумбарий
05.12.05
✎
11:45
|
2(19) В Объекте ЗаписьХМЛ этот реквизит только для чтения. А открывать потом этот файл как текстовый, и исправлять - не хочу. Решил по другому:
========= Все, нашел, дело оказалось вот в таких строчках: Попытка Док.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Док.ОбменДанными.Загрузка = Истина; Док.Записать(); Исключение КонецПопытки После этого, когда выгружаю квитанцию, выгружает правильный номер принятого. Что там 1С себе внутри думает - фиг его знает, потому что в принципе, когджа идет запись квитанции, данные я не перебираю. То есть в принципе, могу только один документ записать? ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайла); ЗаписьXML.ЗаписатьОбъявлениеXML(); // Создаем новое сообщение ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка); Сообщить(" Номер сообщения: " + ЗаписьСообщения.НомерСообщения); ЗаписьСообщения.ЗакончитьЗапись();//теперь правильный номер принятого ЗаписьXML.Закрыть(); |
|||
|
21
Колумбарий
05.12.05
✎
14:21
|
А вот тоже еще странно, при загрузке пишу:
Попытка Док.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Док.ОбменДанными.Загрузка = Истина; Док.Записать(); Док.Записать(РежимЗаписиДокумента.Запись); Исключение Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное); КонецПопытки; Вижу, как он пишет, что мол Загрузка = истина. Потом в ИБ-приемнике нахожу этот загруженный документ, меняю в нем комментарий, и нажимаю кнопку записать - чтобы он попал в таблицу изменений. И он попадает, но, поле ОбменДанными.Отправитель у него пустое, и поле ОбменДанными.Загрузка = ложь. Хотя с другой стороны - раз мы его изменили уже в этой базе, тогда все верно... |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |