План обмена *.НачатьЗапись |
Я |
03.06.13 — 14:37
Всем привет. Проблема с вылетании ошибки:
«{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(10634)}: Ошибка при вызове метода контекста (НачатьЗапись): Неизвестный получатель»
Пояснение. 1С УПП. Настраиваю односторонний обмен выгрузки данных. Использую ПланОбмена как регистратор изменений для выгрузки измененных документов (конкретных).
Ошибка вылазит на следующем коде:
[1c] ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
// Создаем новое сообщение
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);
[/1c]
Параметры НачатьЗапись(ЗаписьXML, УзелОбмена) элементарные — Запись, которая создается в коде перед методом, а также мой УзелОбмена (единственный в базе, больше не создано). Узел отладчиком я проверил — цепляет верно. Но ошибка выдается, причем не понятно что за получатель. У меня односторонний обмен, там получатель не узел, а файл выгрузки.
1 — 03.06.13 — 14:38
*представленный код находится в модуле объекта УниверсальныйОбменДанными.
2 — 03.06.13 — 14:39
+ (1) помогите, пожалуйста, с решением проблемы.
3 — 03.06.13 — 14:48
» (НачатьЗапись): Неизвестный получатель» »
С сервером дружить надо, налей ему 100 грамм в системный блок, сразу зауважает и узнавать начнет.
4 — 03.06.13 — 14:52
(0)>> там получатель не узел, а файл выгрузки.
вытащи запросом таблицу регистрации плана обмена и посмотри для чего узел нужен. не бывает обмена без узла, а вот без файла запросто.
5 — 03.06.13 — 14:54
(4) так у меня узел корректно подцепляется.
6 — 03.06.13 — 14:55
Получатель — файл выгрузки ?????
7 — 03.06.13 — 14:58
(6) Получаетля я вообще не вижу! Покажите мне в предоставленном коде, где он?
У
[1с]ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);[/1с] лишь 2 параметра, один определяется перед этой строкой без указания чего-либо, а второй — мой узел.
У Узла нет Получателя:
УзелОбмена УИБ82 ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка
ВерсияДанных «AAAAAAAZUc0=» Строка
Код «000000001» Строка
Наименование «УИБ82» Строка
НомерОтправленного 0 Число
НомерПринятого 0 Число
ПометкаУдаления Ложь Булево
Ссылка УИБ82 ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка
8 — 03.06.13 — 15:00
(7) ну не может твой узел быть получателем. Не парь нам мозг. Создай второй узел, и на него отправляй.
9 — 03.06.13 — 15:00
(7) да при чем тут реквизиты то? это свойство каждого элемента, включенного в план обмена
10 — 03.06.13 — 15:09
(8) где вообще указывается получатель?
Мой код следующий:
Номер = ПолучитьНомерПоследнегоПринятого(); НомерПоследнегоПринятогоПакетаВБП82 = ?(Номер= 0 ИЛИ Номер= 9999999999, 0, Номер-1); Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать(); УзелОбмена = ПланыОбмена.ОбменЛогистика8_БИБ82_СохраннаяРасписка.НайтиПоНаименованию("УИБ82"); Если НомерПоследнегоПринятогоПакетаВБП82 > 0 Тогда ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерПоследнегоПринятогоПакетаВБП82); ОбъектУзелОбмена = УзелОбмена.ПолучитьОбъект(); ОбъектУзелОбмена.НомерПринятого = НомерПоследнегоПринятогоПакетаВБП82; ОбъектУзелОбмена.Записать(); КонецЕсли; //Добиваем номер пакета не значащими нулями СтрокаНомера = Строка(УзелОбмена.НомерОтправленного + 1); //Убираем лишние символы из строки номера пакета СтрокаНомера = СтрЗаменить(СтрокаНомера, Символ(160), ""); ДлинаКодаТек = СтрДлина(СтрокаНомера); Для к=1 по (ДлинаКодаПакета-ДлинаКодаТек) Цикл СтрокаНомера = "0"+ СтрокаНомера; КонецЦикла; Обработка.ИмяФайлаОбмена = ПутьОбмена + СтрЗаменить(МаскаФайловВыгрузки,"*",СтрокаНомера); Обработка.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена; Обработка.ЗагрузитьПравилаОбмена(Обработка.ИмяФайлаПравилОбмена); УстановитьУзелОбменаУСтрокДерева(Обработка.ТаблицаПравилВыгрузки.Строки, УзелОбмена.Ссылка); Обработка.ВыполнитьВыгрузку(); ОбъектУзелОбмена.НомерОтправленного = УзелОбмена.НомерОтправленного + 1; ОбъектУзелОбмена.Записать();
На строке «Обработка.ВыполнитьВыгрузку();» программа уходит в модуль стандартной обработки.
11 — 03.06.13 — 15:10
все изменения система не просто так регистрирует а для конкретного узла получателя, и отдельно контролирует удаление из таблицы регистраций для тех узлов кто получил. Создай переферийный узел получатель.
12 — 03.06.13 — 15:13
(10)вот тут
УзелОбмена = ПланыОбмена.ОбменЛогистика8_БИБ82_СохраннаяРасписка.НайтиПоНаименованию(«УИБ82»);
вместо УИБ82 должен быть код второго переферийного узла
13 — 03.06.13 — 15:15
+ и у плана обмена должна стоять галка «Распределенная ИБ» что то вроде такого.
14 — 03.06.13 — 15:17
(13) не, эта галка влияет будет ли ездить конфа. к регистрации элементов отношения не имеет
15 — 03.06.13 — 15:20
(12) Спасибо, по крайней мере ошибка ушла. Буду дальше разбираться с этим планом обмена.
Maxus43
16 — 03.06.13 — 15:36
(15) для начала разберись что это вобще такое. Получате, отправители, узлы… Метод заменил отправителя и заработало — совсем экстремальный
Всем привет. Проблема с вылетании ошибки: «{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(10634)}: Ошибка при вызове метода контекста (НачатьЗапись): Неизвестный получатель» Пояснение. 1С УПП. Настраиваю односторонний обмен выгрузки данных. Использую ПланОбмена как регистратор изменений для выгрузки измененных документов (конкретных). Ошибка вылазит на следующем коде: Параметры НачатьЗапись(ЗаписьXML, УзелОбмена) элементарные — Запись, которая создается в коде перед методом, а также мой УзелОбмена (единственный в базе, больше не создано). Узел отладчиком я проверил — цепляет верно. Но ошибка выдается, причем не понятно что за получатель. У меня односторонний обмен, там получатель не узел, а файл выгрузки.
*представленный код находится в модуле объекта УниверсальныйОбменДанными.
+ помогите, пожалуйста, с решением проблемы.
» (НачатьЗапись): Неизвестный получатель» » С сервером дружить надо, налей ему 100 грамм в системный блок, сразу зауважает и узнавать начнет.
>> там получатель не узел, а файл выгрузки. вытащи запросом таблицу регистрации плана обмена и посмотри для чего узел нужен. не бывает обмена без узла, а вот без файла запросто.
так у меня узел корректно подцепляется.
Получатель — файл выгрузки ?????
Получаетля я вообще не вижу! Покажите мне в предоставленном коде, где он? У лишь 2 параметра, один определяется перед этой строкой без указания чего-либо, а второй — мой узел. У Узла нет Получателя: УзелОбмена УИБ82 ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка ВерсияДанных «AAAAAAAZUc0=» Строка Код «000000001» Строка НомерПринятого 0 Число ПометкаУдаления Ложь Булево Ссылка УИБ82 ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка
ну не может твой узел быть получателем. Не парь нам мозг. Создай второй узел, и на него отправляй.
да при чем тут реквизиты то? это свойство каждого элемента, включенного в план обмена
где вообще указывается получатель? Мой код следующий: На строке «Обработка.ВыполнитьВыгрузку;» программа уходит в модуль стандартной обработки.
все изменения система не просто так регистрирует а для конкретного узла получателя, и отдельно контролирует удаление из таблицы регистраций для тех узлов кто получил. Создай переферийный узел получатель.
вместо УИБ82 должен быть код второго переферийного узла
+ и у плана обмена должна стоять галка «Распределенная ИБ» что то вроде такого.
не, эта галка влияет будет ли ездить конфа. к регистрации элементов отношения не имеет
Спасибо, по крайней мере ошибка ушла. Буду дальше разбираться с этим планом обмена.
для начала разберись что это вобще такое. Получате, отправители, узлы… Метод заменил отправителя и заработало — совсем экстремальный
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
-
Добрый день, подскажите что за ошибка и как от нее избавится, настроен РИБ Управление торговлей 10.3, обмен выгружает в локальный каталог. При повторном выполнении обмена выскакивает такая ошибка:
Ошибка при записи изменений при обмене: Ошибка при вызове метода контекста (НачатьЗапись): Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Запись заблокирована пользователем 'Программист 1С', с компьютера 'PROGRAMMIST_1C', из приложения '1С:Предприятие', соединение '15'. Запись изменений текущей информационной базы в файл обмена завершилась с ошибками!
-
Offline
mialord
Модераторы
Команда форума
Модератор- Регистрация:
- 31 июл 2009
- Сообщения:
- 5.454
- Симпатии:
- 49
- Баллы:
- 54
Т.к. база не на скуле у Вас не транзакаются записи и какой-то объект тупо заблокирован на изменение, соответственно данные могут быть считаны, но не могут быть записаны, это регулярная проблема файловых баз, и баз на постгри.
-
База у меня на SQL, и вот такая вот беда, а ошибка вылетает вот в этой строке
Если ЭтоРИБ Тогда // Создаем новое сообщение ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); [/color]ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);[color=#CC0000] // для РИБ изменения в информационной базе ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных); // Завершаем запись сообщения ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = Истина; Иначе ЭтотУзелОбмена = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект(); глТекущийУзел = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект(); // план обмена самостоятельно читает изменения от узла СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = ЭтотУзелОбмена.ВыгрузитьИзмененияДанныхДляУзла(УзелОбмена, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных, ЗаписьXML); КонецЕсли;
в общем модуле «ПроцедурыОбменаДанными» в «Процедура ЗаписатьСообщенияСИзмененеиямиДляУзла(СтруктураНастроекОбменаДанными, Знач ИмяФайлаОбменаДанными)»
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.