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

Обновлено: 30.06.2024


Что это такое? Куда копать? Гугл и Миста внятного ответа на вопрос не дали. Нумерация узлов в порядке.

  • Вопрос задан более трёх лет назад
  • 10653 просмотра

Оценить 2 комментария

Какие версии конфигураций(полностью)? Изменения в конфигурациях были, или всё типовое?

УТ 10.3.13.2, БП 2.0.22.2

Изменения были, какие именно — информацией не обладаю.

1. БП предприятия не может прочитать файл обмена той версии УТ, которая у вас есть. Почитать о совместимости версий УТ<->БП.
2. Одна из конфигураций не типовая и идет попытка прочитать/записать тот реквизит, описания которого нет в шаблоне обмена.
3. Абсурдное — неверный путь до файла обмена. Попробуйте подклчюиться через COM.

ну и вообще хотелось бы гораздо больших подробностей, а не потока сознания.

3. отметаем сразу.

А какие ещё подробности вам нужны? Исходные я все привёл. УТ 10.3, БП 2.0.

ну если УТ 10.3, БП 2.0 Вы считаете как минимум полностью указанными версиями, то назрел еще один вопрос — по какой причине отказываетесь прибегнуть к услугам грамотных специалистов? У меня встречный вопрос — что вам помешало ответить на мой вопрос про подробности нормально, без ненужных подколок? Я не телепат и не могу однозначно определить, что лично вы подразумеваете под словом «подробности». прошу прощения, иногда я очень не люблю не профессионалов.
Привык к тому, что обычно при постановке таких вопросов рассказывают о точных версиях ПО. Файловые или скульные варианты баз. В какой именно последовательности был настроен обмен. Типовые правила обмена или подправленные.
Обмен запускается через обработку «монитор обмена» или напрямую из списка планов обмена (что кстати очень не хорошо). Односторонний или двухсторонний.
Неоднократно были случаи когда люди просто настраивали обмены через «операции — планы обменов». Вы, я надеюсь, не так делали?
Читали ли вы в документации к конфигурации о совместимости версий?
Тем более что если обмен первый — то он проводится еще на стадии настройки плана обмена и первая порция обмена данными — это еще даже не пакет с данными, а пакет с настройками. УТ 10.3.13.2, БП 2.0.22.2
Обе файловые.
Правила обмена были взяты из обмена между УТ и БП 1.6, правились при помощи конф. «Конвертация данных» 2.1.4.1, в частности, были отключены и помечены на удаление ПКО, приёмники которых отсутствуют в БП 2.0.
Обмен запускается через Сервис — Прочие обмены данными — Все настройки обменов данными — (выбираем элемент) — кнопка «Выполнить обмен». Соответственно, в УТ стоит галочка «Выгрузить», в БП — «Загрузить».
О совместимости версий не читал, т.к. даже не представляю, где это можно посмотреть. Поиск этой информации займёт нерациональное количество времени (да-да, я уже чувствую мощную волну праведного гнева от вас). *гневно постучал ногами в пол и злобно повращал глазами*
В таком случае ничего хорошего и не ждите. БП 2.0 и БП 1.6 в плане структуры метаданных различаются разительно.
Попробуйте поискать правила именно для Ваших версий. В противном случае ничего хорошего ждать не придется. Вопрос в следующем: что происходит при вызове метода НачатьЧтение? Он пытается распарсить весь файл данных целиком? Это первый обмен? Или ошибка возникла уже в процессе работы?

1. Выгрузка не от того образа.
2. Выгрузка была с ошибками, но вам об этом не сказали.

НачатьЧтение функция, которая парсит xml файл выгрузки, обычно первое что он проверяет это узел.

Лучше конечно посмотреть по отладчику.

1. Что значит «не от того образа»? Я собственноручно выгрузил файл из УТ, тут же его пытаюсь загрузить в БП (тестирую).

Отладчик показывает вылет на строке вызова функции НачатьЧтение.
Синтакс-помощник говорит нам буквально следующее:

Передаваемый в функцию объект ЧтениеXML на этот момент имеет свойство ТипУзла = Ничего, это нормально?

Перехват исключений в коде

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

2. Тем не менее, необходимость перехвата исключений в коде все же возникает. Например, для того чтобы уточнить текст ошибки, дополнив его прикладной, понятной конечному пользователю, информацией. Однако при этом необходимо фиксировать причину ошибки в журнале регистрации для того, чтобы системный администратор имел возможность выполнить диагностику проблемы и при необходимости передать информацию об ошибке в службу технической поддержки.

3. Частные случаи некорректного использования и перехвата исключений.

Область применения (уточнение): управляемое приложение, обычное приложение.

3.1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:

&НаСервере
Процедура ВыполнитьОперацию()
// код, приводящий к вызову исключения
.
КонецПроцедуры

то неправильно маскировать от пользователя и администратора исходную проблему:

// на клиенте
Попытка
ВыполнитьОперацию();
Исключение
ПоказатьПредупреждение(,НСтр("ru = 'Операция не может быть выполнена.'"));
КонецПопытки;

&НаСервере
Процедура ВыполнитьОперацию()
Попытка
// код, приводящий к вызову исключения
.
Исключение
// Запись события в журнал регистрации для системного администратора.
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры

и тогда на клиенте:

Не следует использовать функцию ОписаниеОшибки , т.к. она неинформативна для разработчика, потому что не возвращает стек в тексте ошибки.

3.2. Не следует анализировать текст исключений с целью интерпретации причины ошибки. Текст исключения может меняться в зависимости от локализации. В условиях отсутствия штатных средств (например, типизированных исключений), следует выдавать пользователю тексты исключений «как есть». Для понятности, его можно дополнить пояснением возможных причин.
Например:

В тех случаях, когда анализ типов исключений критически важен для корректной работы бизнес-логики, следует отказаться от исключений и использовать коды ошибок (коды возврата). При этом недопустимо использовать числовые коды ошибок, т.к. код становится нечитаемым:

КодОшибки = ЗагрузитьФайлИзИнтернета(. );
Если КодОшибки = 12345 Тогда
.
ИначеЕсли .

правильно применять строковые литералы (например, "Успешно", "НетМестаНаДиске", "Отменено" и т.п.):

РезультатЗагрузки = ЗагрузитьФайлИзИнтернета(. );
Если РезультатЗагрузки = "Успешно" Тогда
.
ИначеЕсли .

Строковые литералы кодов ошибок не локализуются.

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

3.3. Если имеется некоторая клиентская бизнес-логика (код выполняется полностью на клиенте):

&НаКлиенте
Процедура СоздатьФайлНаДиске()
// код, приводящий к вызову исключения
.
КонецПроцедуры

то рекомендуется делать дополнительный серверный вызов для протоколирования неудачного результата операции в журнал регистрации:

&НаСервереБезКонтекста
Процедура ЗаписатьОшибкуРаботыСФайлами(. )
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки);
КонецПроцедуры

3.4. Недопустимо перехватывать любые исключения, бесследно для системного администратора:

Попытка
// код, приводящий к вызову исключения
.
Исключение // перехват любых исключений
КонецПопытки;

Как правило, подобная конструкция скрывает реальную проблему, которую впоследствии невозможно диагностировать.
Правильно:

Попытка
// код, приводящий к вызову исключения
.
Исключение
// Пояснение причин перехвата всех исключений "незаметно" от пользователя.
// .
// И запись события в журнал регистрации для системного администратора.
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Но если пользователь не может отработать останавливающее предупреждение в рамках выполняемой операции или ошибочная ситуация носит исключительный характер и делает бессмысленными все остальные проверки, которые выводят другие останавливающие предупреждения, то следует вызывать исключение.

Процедура ПередЗаписью(Отказ)
Если Не ЗарегистрироватьИзмененияНаУзлахПлановОбмена() Тогда
ВызватьИсключение НСтр("ru = 'Не удалось зарегистрировать изменения на узлах планов обмена. Обратитесь к администратору.'");
КонецЕсли;
.
КонецПроцедуры

Подробнее см. пп. 1.1 и 1.3 стандарта Информирование пользователя.

3.6. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:

  • использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
  • если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
  • пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.

Попытка
КонтекстЭДОСервер.ПолучитьМакет("КомпонентаОбмена");
ПутьВК = КонтекстЭДОСервер.ПутьКОбъекту + ".Макет.КомпонентаОбмена";
Исключение
КонецПопытки;

МакетКомпонентыОбмена = КонтекстЭДОСервер.Метаданные().Макеты.Найти("КомпонентаОбмена");
Если МакетКомпонентыОбмена <> Неопределено Тогда
ПутьКМакету = КомпонентаОбмена.ПолноеИмя()
КонецЕсли;

3.7. Порядок обработки исключений при использовании транзакций описан в стандарте Транзакции: правила использования.

3.8. Неправильно использовать исключения для приведения значения к типу. Для таких операций необходимо использовать возможности объекта ОписаниеТипов .

Попытка
КоличествоДнейРазрешения = Число(Значение);
Исключение
КоличествоДнейРазрешения = 0; // значение по умолчанию
КонецПопытки;

ОписаниеТипа = Новый ОписаниеТипов("Число");
КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(Значение);

(44) Сейчас отлаживаю эту процедуру, по нажатию кнопке. Ошибки в ней.

Вот. Все работает. Но иногда идет эта ошибка и все, на таких же данны!

вангую, есть попытка в функции РазложитьСтрокуВМассивПодстрок()

(48) я так и останавливаюсь на строке 2000 с лишним

(51)(52) Да можно многого добавить, но я же смотрю в отладчике, в функцию передаются верные данные, а идет ошибка.

Добавлю конечно проверки.

а ну и тестирование исправление, кэш и прочая фигня
(54) Даже для пустой базы? Я туда ни разу ещё не загрузил эти элементы номенклатуры.
(55) не знаю. у меня правило, если происходит неведомая херня, нужно сначала делать это, а потом только лезть за бубном
(57) ну тогда вперед к админам за снастью если своей нет и вызывать помощника.
Кэш почищу сейчас догрузится.
Стоит галка останавливаться по ошибке.
Ошибка видимо возникает при записи элемента.
Я смотрю что там в нем, вижу проблему в единицах измерения и родителе.
Но из за чего не пойму.
(61) платформенная проверка какая то.
Сделай обменДанными.загрузка = истина.
Потом глазами увидишь
Стоит галка при отладке останавливаться по ошибке. Вот на ней и вылетает.
У тебя ошибка не в найти по наименованию, а некорректная обработка исключения ранее
Или ошибка заполнения обязательных на уровне платформы полей: наименование, владелец (если справочник подчинённый) и тд
(71) У меня же нет попытки исключения?
Да ранее я вижу что в родителе и единицах измерения.
Но туда идут нормальные данные. Буду разбираться.
Видимо энергия ушла.
(72) Единицу измерения обязательно заполнять, выдавать ошибку стоит.
(74) технически это отказ=истина в процедуре ПроверкаЗаполнения, но не исключение

сейчас вот с этим буду бороться что это пока не знаю

(79) наверно в поле группа фигачишь элемент. Такое 1с не прощает.
(83) в общем пройдись по справочнику номенклатуры где-то есть одинаковое наименование у элемента и группы. Или если самому лень, посади за проверку девочку-восьмиклассницу, пусть проштудирует справочник от и до.

(81) Не должно такого быть.

(84) Гружу структуру из другой базы. Я пока не могу записать ни одного элемента. Так как грузится в транзакции.

Мне не лень. Я пытаюсь разобраться. Но такого не могло в принципе быть. Надеюсь докапаться до проблемы.

boobzx --> boobzx



Просмотр профиля

База1 - Филиал. Там я создаю план обмена. Потом захожу в отладчик и в плане обмена завожу два элемента: на скрине ниже:


А сам план обмена имеет имя ОбменСЦО (обмен с центральным офисом). Состав его, я определяю, как, все справочники и 1 документ, который нужно перенести (Авторегистрация у них везде стоит "разрешить"). Далее в этом плане обмене я перехожу на вкладку прочие. И там модуль объекта и ввожу такой код.

После этого, я создаю обработку с кнопкой выгрузить. Так в этой обработке по кнопке события

Далее переходим по процедуре, которая находится также в модуле объекта Плана обмена.

Все, после всех этих махинации, документ выгрузился.

Далее беру копию своей базы.. Называем ее ЦентральныйОфис. И делаю те же самые махинации Только Завожу другой План обмена - называется обмен с филиалами. Завожу в нем те же 2 элемента как на первой картинке. только элементы меняю местами. и в обработке завожу кнопку с кодом которая обращается как и в первом случае в модуль объекта плана обмена только на чтение XML файла:

И вот тут самое главное когда нажимаю считать файл то доходя до этого момент он не находи файл.

Хочу спросить..ЧТО НЕ ТАК Я ДЕЛАЮ. почему не находится файл.

Ладно. далее я его переименовывают и когда он доходит до этого момента

В общем куда копать даже не знаю.

Vofka --> Vofka



Просмотр профиля

Читайте также: