Ошибка при вызове метода контекста начатьзапись

План обмена *.НачатьЗапись

План обмена *.НачатьЗапись

Я
   Csar

03.06.13 — 14:37

Всем привет. Проблема с вылетании ошибки:

«{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(10634)}: Ошибка при вызове метода контекста (НачатьЗапись): Неизвестный получатель»

Пояснение. 1С УПП. Настраиваю односторонний обмен выгрузки данных. Использую ПланОбмена как регистратор изменений для выгрузки измененных документов (конкретных).

Ошибка вылазит на следующем коде:

[1c]    ЗаписьXML = Новый ЗаписьXML();

   ЗаписьXML.УстановитьСтроку();

   
   // Создаем новое сообщение

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

       
   ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);

[/1c]

Параметры НачатьЗапись(ЗаписьXML, УзелОбмена) элементарные — Запись, которая создается в коде перед методом, а также мой УзелОбмена (единственный в базе, больше не создано). Узел отладчиком я проверил — цепляет верно. Но ошибка выдается, причем не понятно что за получатель. У меня односторонний обмен, там получатель не узел, а файл  выгрузки.

   Csar

1 — 03.06.13 — 14:38

*представленный код находится в модуле объекта УниверсальныйОбменДанными.

   Csar

2 — 03.06.13 — 14:39

+ (1) помогите, пожалуйста, с решением проблемы.

   Повелитель

3 — 03.06.13 — 14:48

» (НачатьЗапись): Неизвестный получатель» »

С сервером дружить надо, налей ему 100 грамм в системный блок, сразу зауважает и узнавать начнет.

   AaNnDdRrEeYy

4 — 03.06.13 — 14:52

(0)>> там получатель не узел, а файл  выгрузки.

вытащи запросом таблицу регистрации плана обмена и посмотри для чего узел нужен. не бывает обмена без узла, а вот без файла запросто.

   Csar

5 — 03.06.13 — 14:54

(4) так у меня узел корректно подцепляется.

   acsent

6 — 03.06.13 — 14:55

Получатель — файл  выгрузки ?????

   Csar

7 — 03.06.13 — 14:58

(6) Получаетля я вообще не вижу! Покажите мне в предоставленном коде, где он?

У

[1с]ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);[/1с] лишь 2 параметра, один определяется перед этой строкой без указания чего-либо, а второй — мой узел.

У Узла нет Получателя:

УзелОбмена    УИБ82    ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка

ВерсияДанных    «AAAAAAAZUc0=»    Строка

Код    «000000001»    Строка

Наименование    «УИБ82»    Строка

НомерОтправленного    0    Число

НомерПринятого    0    Число

ПометкаУдаления    Ложь    Булево

Ссылка    УИБ82    ПланОбменаСсылка.ОбменЛогистика8_БИБ82_СохраннаяРасписка

   hhhh

8 — 03.06.13 — 15:00

(7) ну не может твой узел быть получателем. Не парь нам мозг. Создай второй узел, и на него отправляй.

   Maxus43

9 — 03.06.13 — 15:00

(7) да при чем тут реквизиты то? это свойство каждого элемента, включенного в план обмена

   Csar

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;
    ОбъектУзелОбмена.Записать();

На строке «Обработка.ВыполнитьВыгрузку();» программа уходит в модуль стандартной обработки.

   AaNnDdRrEeYy

11 — 03.06.13 — 15:10

все изменения система не просто так регистрирует а для конкретного узла получателя, и отдельно контролирует удаление из таблицы регистраций для тех узлов кто получил. Создай переферийный узел получатель.

   AaNnDdRrEeYy

12 — 03.06.13 — 15:13

(10)вот тут

УзелОбмена = ПланыОбмена.ОбменЛогистика8_БИБ82_СохраннаяРасписка.НайтиПоНаименованию(«УИБ82»);

вместо УИБ82 должен быть код второго переферийного узла

   AaNnDdRrEeYy

13 — 03.06.13 — 15:15

+ и у плана обмена должна стоять галка «Распределенная ИБ» что то вроде такого.

   Maxus43

14 — 03.06.13 — 15:17

(13) не, эта галка влияет будет ли ездить конфа. к регистрации элементов отношения не имеет

   Csar

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

Комментарии доступны только авторизированным пользователям

  1. Добрый день, подскажите что за ошибка и как от нее избавится, настроен РИБ Управление торговлей 10.3, обмен выгружает в локальный каталог. При повторном выполнении обмена выскакивает такая ошибка:

    Ошибка при записи изменений при обмене:  Ошибка при вызове метода контекста (НачатьЗапись): Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено.
    Запись заблокирована пользователем 'Программист 1С', с компьютера 'PROGRAMMIST_1C', из приложения '1С:Предприятие', соединение '15'.
    Запись изменений текущей информационной базы в файл обмена завершилась с ошибками!
    

  2. mialord

    Offline

    mialord
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.454
    Симпатии:
    49
    Баллы:
    54

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

  3. База у меня на SQL, и вот такая вот беда, а ошибка вылетает вот в этой строке

    Если ЭтоРИБ Тогда
    
    // Создаем новое сообщение
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    [/color]ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);[color=#CC0000]
    
    // для РИБ изменения в информационной базе
    ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных);
    
    // Завершаем запись сообщения
    ЗаписьСообщения.ЗакончитьЗапись();
    
    ЗаписьXML.Закрыть();
    
    СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = Истина;
    Иначе
    
    ЭтотУзелОбмена = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект();
    глТекущийУзел = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект();			
    // план обмена самостоятельно читает изменения от узла
    СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = ЭтотУзелОбмена.ВыгрузитьИзмененияДанныхДляУзла(УзелОбмена, 
    СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных, ЗаписьXML);
    
    КонецЕсли;
    
    

    в общем модуле «ПроцедурыОбменаДанными» в «Процедура ЗаписатьСообщенияСИзмененеиямиДляУзла(СтруктураНастроекОбменаДанными, Знач ИмяФайлаОбменаДанными)»


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Понравилась статья? Поделить с друзьями:
  • Ошибка преднатяжителя ремня безопасности
  • Ошибка при вызове метода контекста найтистроки
  • Ошибка при вызове ifcplugin create ошибка конфигурации error code 2 version undefined
  • Ошибка при включении синхронизации параметров проверка подлинности не пройдена
  • Ошибка при вызове метода контекста найтипореквизиту неверно указан реквизит