Меню

Ошибка при вызове метода контекста удалитьрегистрациюизменений

   vicof

3 — 29.10.13 — 12:40

ПланыОбменаМенеджер (ExchangePlansManager)

УдалитьРегистрациюИзменений (DeleteChangeRecords)

Синтаксис:

УдалитьРегистрациюИзменений(<Узлы>, <Данные>)

Параметры:

<Узлы> (обязательный)

Тип: ПланОбменаСсылка.<Имя плана обмена>; Массив.

Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для каких узлов удаляются записи регистрации изменений.

<Данные> (необязательный)

Тип: Метаданные, Неопределено; УдалениеОбъекта; Число; <Данные>.

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

Если указан объект метаданных, то записи регистрации изменений будут удалены для всех элементов данных, относящихся к указанному объекту метаданных. Объект метаданных должен входить в состав планов обмена всех узлов, указанных в первом параметре.

Если указан УдалениеОбъекта, то удаление записи регистрации изменений выполняется для объекта базы данных, на который «указывает» ссылка, содержащаяся в объекте УдалениеОбъекта.

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

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

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

Значение по умолчанию: Неопределено

Описание:

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

Доступность:

Сервер, толстый клиент, внешнее соединение.

Пример:

// Пример 1

Спр = Справочники.Валюты.НайтиПоКоду(«810»);

Узел = ПланыОбмена.ПО1.НайтиПоКоду(«Офис»);

ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Спр);

// Пример 2

// Загрузка из файла

// Производим попытку открытия файла

ЧтениеXML = Новый ЧтениеXML;

Попытка

    ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

    Возврат;

КонецПопытки;

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

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

    // Сообщение предназначено не для этого узла

    ВызватьИсключение «Неверный узел»;

КонецЕсли;

// Удаляем регистрацию изменений для узла отправителя сообщения

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

   Sasha_H

7 — 29.10.13 — 12:47

(6) дополнение

Удаляют с регистрации обычно то что есть там используя обход результатом запроса или через ВыбратьИзменения, а не просто в лоб УдалитьРегистрацию.

Там есть нюансы с новыми элементами и что ты написал в (0) то что второй элемент это Тип ну дык он и не записан будет содержать Тип Ссылку.

Взял пример из книги «Профессиональная разработка в системе 1С 8», стр 584. «Удаление регистрации изменений по узлу»: При выполнении кода выскакивает ошибка: {ВнешняяОбработка.ВнешняяОбработка2}: Ошибка при вызове метода контекста (УдалитьРегистрациюИзменений): Недопустимое значение параметра (параметр номер ‘2’)    ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена); по причине: Недопустимое значение параметра (параметр номер ‘2’) Второй параметр не передаю. Что не так, не пойму.

Чему равен «Узел»? СП: Если указано Неопределено или не указан, то в качестве первого параметра может быть указан только одиночный узел.

Такой код сработал, но надо удалить все изменения.

В цикле по всем узлам и для каждого ПланыОбмена.УдалитьРегистрациюИзменений(Узел);

{ВнешняяОбработка.ВнешняяОбработка2}: Ошибка при вызове метода контекста (УдалитьРегистрациюИзменений): Недопустимое значение параметра (параметр номер ‘2’)        ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Ссылка); по причине: Недопустимое значение параметра (параметр номер ‘2’) Вот код:

Должен работать! И без ошибок! Вот более полный код :))

{ВнешняяОбработка.ВнешняяОбработка2}: Ошибка при вызове метода контекста (УдалитьРегистрациюИзменений): Недопустимое значение параметра (параметр номер ‘2’)            ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Ссылка); по причине: Недопустимое значение параметра (параметр номер ‘2’) У кого еще есть варианты )

Тупит платформа 🙁 Специально для тупых — дай ей второй параметр :)) …(Выборка.Ссылка, Неопределено);

{ВнешняяОбработка.ВнешняяОбработка2}: Ошибка при вызове метода контекста (УдалитьРегистрациюИзменений): Недопустимое значение параметра (параметр номер ‘2’)

Вот уж действительно гы-гы-гы. Ставьте точку останова — хватит над здравым смыслом шутить… и смотрите в мониторе что из себя представляет Выборка.Ссылка — может быть у Вас в базе узлы «пустые» внесены?

Специально сделал копию и запустил алгоритм. Отработало без ошибок. Проверил обменом — пусто. Действительно, — регистрацию снесло всю напрочь.

Отладчик: Выборка.Ссылка тип ПланОбменаСсылка.Главный Код                  «2        »   Строка Наименование        «Перефирия»    Строка НомерОтправленного  30             Число НомерПринятого      0              Число ПометкаУдаления     Ложь           Булево Вроде все в норме.

Эээ… У меня РИБ-база… уж третий год работает на разных релизах…

У меня не РИБ, просто настроил планы обмена. Интересно может в этом проблема.

Не-а, — это роли не играет. Планы обмена что РИБ, что не РИБ — свойства и методы одинаковые, — кроме СоздатьНачальныйОбраз… Всё, — продуктивных мыслей нет… Может выйти из программы и конфигуратора и зайти вновь?

Даже комп перезагрузил. Видимо буду стирать как в

Сейчас на партнерский выложу, интерестно что скажут.

Тэги:

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

В платформе 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С.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка открытия последовательного порта com7 port busy
  • Ошибка открытия последовательного порта com5 port busy ардуино