Имя: Пароль:
1C
 
Как реализовать квитирование при использовании Планов Обмена
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
А вот тоже еще странно, при загрузке пишу:
                  Попытка
                      Док.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
                      Док.ОбменДанными.Загрузка = Истина;
                      Док.Записать();
                     
                      Док.Записать(РежимЗаписиДокумента.Запись);
                  Исключение
                      Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
                  КонецПопытки;
   
Вижу, как он пишет, что мол Загрузка = истина.
Потом в ИБ-приемнике нахожу этот загруженный документ, меняю в нем комментарий, и нажимаю кнопку записать - чтобы он попал в таблицу изменений. И он попадает, но, поле ОбменДанными.Отправитель у него пустое, и поле ОбменДанными.Загрузка = ложь.
Хотя с другой стороны - раз мы его изменили уже в этой базе, тогда все верно...