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

0

Марочка98

02.07.18

10:29

Здравствуйте, помогите пожалуйста с проблемой.

У меня внешняя обработка, загрузка xml файла в дерево значений, и выдает ошибку {Обработка.Обработка1.Форма.Форма.Форма(37)}: Ошибка при вызове метода контекста (УстановитьСтроку)

   Чтение.УстановитьСтроку(ТекстXML);

по причине:

Несоответствие типов (параметр номер ‘1’)

Что нужно сделать?? Я начинающий программист в 1с, и поэтому не очень сильна  в этом.

Вот полностью мой код модуля.

&НаКлиенте

Процедура Файл(Команда)

   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

   Диалог.Заголовок = «Выбор документа»;

   Диалог.Фильтр = «Документы XML (*.xml, *.xdr, *.xsd, *.xsl)|*.xml;*.xdr;*.xsd;*.xsl|Все файлы|*.*|»;

   Если Диалог.Выбрать() Тогда

      ТекстXML.Прочитать(Диалог.ПолноеИмяФайла);

      Документ  = ТекстXML.ПолучитьТекст();

      Заголовок = «Просмотр XML-документа: » + Диалог.ПолноеИмяФайла;

      

   КонецЕсли;

                  
КонецПроцедуры

&НаКлиенте

Процедура КнИмпорт(Команда)

Если НЕ ПустаяСтрока(ТекстXML) Тогда

            Дерево = Импорт1();

            
            

      Если Объект.Дерево.Строки.Количество() > 0 Тогда

         ЭлементДерево = ТекстXML.Объект.Дерево;

         ЭлементДерево.СоздатьКолонки();

         ЭлементДерево.Колонки.Удалить(ЭлементДерево.Колонки[«Атрибуты»]);

        
      КонецЕсли;

   КонецЕсли;

КонецПроцедуры

&НаСервере

Функция Импорт1() Экспорт

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

   Чтение.УстановитьСтроку(ТекстXML);

   ДеревоЗначений = Новый ДеревоЗначений();

   ДеревоЗначений.Колонки.Добавить(«Элемент»);

   ДеревоЗначений.Колонки.Добавить(«Текст»);

   ДеревоЗначений.Колонки.Добавить(«Атрибуты»);

   Корень = ДеревоЗначений.Строки.Добавить();

   Корень.Элемент = Чтение.Имя;

   Рекурсия(Корень, Чтение);

   Возврат ДеревоЗначений;

КонецФункции

Процедура Рекурсия(СтрокаДерева, Чтение)

   Если Чтение.КоличествоАтрибутов() > 0 Тогда

      АтрибутыСоответствие = Новый Соответствие();

      Пока Чтение.ПрочитатьАтрибут() Цикл

         АтрибутыСоответствие.Вставить(Чтение.Имя, Чтение.Значение);

      КонецЦикла;

      СтрокаДерева.Атрибуты = АтрибутыСоответствие;

   КонецЕсли;

   //Состояние(Чтение.Имя);

   Пока Чтение.Прочитать() Цикл

      Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

         Прервать;

      ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда

         СтрокаДерева.Текст = Чтение.Значение;

      ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

         Дочерний = СтрокаДерева.Строки.Добавить();

         Дочерний.Элемент = Чтение.Имя;

         Рекурсия(Дочерний, Чтение);

      КонецЕсли;

         КонецЦикла;

КонецПроцедуры

&НаКлиенте

Процедура Дерево1ПриАктивизацииСтроки(Элемент)

   Объект.Атрибуты.Очистить();

   Данные = Элемент.ТекущиеДанные;

   Если Данные <> Неопределено Тогда

      АтрибутыДерева = Данные.Атрибуты;

      Если ТипЗнч(АтрибутыДерева) = Тип(«Соответствие») Тогда

         Для каждого АтрибутДерева из АтрибутыДерева Цикл

            СтрокаТаблицы                  = Объект.Атрибуты.Добавить();

            СтрокаТаблицы.Атрибут          = АтрибутДерева.Ключ;

            СтрокаТаблицы.ЗначениеАтрибута = АтрибутДерева.Значение;

         КонецЦикла;

      КонецЕсли;

   КонецЕсли;

КонецПроцедуры

&НаКлиенте

Процедура Дерево1Выбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

   ОткрытьЗначение(ВыбраннаяСтрока.Текст);

КонецПроцедуры

&НаКлиенте

Процедура АтрибутыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

      ОткрытьЗначение(ВыбраннаяСтрока.ЗначениеАтрибута);

      
КонецПроцедуры

Процедура ОчиститьТаблицы() Экспорт

   Объект.Дерево.Строки.Очистить();

   Объект.Дерево.Колонки.Очистить();

   Объект.Атрибуты.Очистить();

КонецПроцедуры

2

Марочка98

02.07.18

11:23

(1) я правильно понимаю что в табло надо смотреть?

4

catena

02.07.18

11:36

Вот в этом куске ТекстXML для этой функции — вообще не знакомая личность. Их надо познакомить. Например, через параметр функции.

Функция Импорт1() Экспорт

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

   Чтение.УстановитьСтроку(ТекстXML);

8

Serg_1960

02.07.18

11:53

Поподробнее? :) Я выше ссылку давал — у автора есть видео о глобальных и локальных переменных; о параметрах функций и процедур…

9

Serg_1960

модератор

02.07.18

11:57

(офф) Марочка98 , заполните личную карточку (как минимум, поправьте графу «Пол») — с мужским полом как-то неудобно сочетаются «женские» окончания слов :)

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

Ошибка при вызове метода контекста (УстановитьСтроку)

Я
   13spartak13

24.01.19 — 11:29

Есть вот такой код:

        xmlSMS = Новый ЗаписьXML();

    xmlSMS.УстановитьСтроку(«UTF-8»);

    xmlSMS.ЗаписатьОбъявлениеXML();

Ставлю в обработку на кнопку все работает, ставлю в общий модуль, добавляю регламентное заданиевыдает:Ошибка при вызове метода контекста (УстановитьСтроку)

Там и там выполняю НаСервере

   ДенисЧ

1 — 24.01.19 — 11:31

Местами последние строки поменяй.

Да и вообще — «UTF-8» — невалидная строка для XML

   13spartak13

2 — 24.01.19 — 11:34

Без нее не обойтись, СМС рассылка, попробую поменять, должно помочь?

   13spartak13

3 — 24.01.19 — 11:36

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

  

13spartak13

4 — 25.01.19 — 08:02

(1) Поменял местами выдает ошибку: Ошибка при вызове метода контекста (ЗаписатьОбъявлениеXML()

TurboConf — расширение возможностей Конфигуратора 1С

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

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

Содержание

Поле объекта не обнаружено

1С ошибка Поле объекта не обнаружено

Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.

Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.

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

  • Удалили табличную часть, к которой обращаемся в коде?
  • Переименовали реквизит, а в коде не исправили?
  • Заменили значение со ссылки на неопределено?

Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!

Как исправить? Исходя из природы ошибки – переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.

Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:

Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;

Индекс находится за границами массива

1С ошибка Индекс находится за пределами массива

Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.

  • Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
  • Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
  • Ошибочное увеличение счетчика в цикле “Для”

 Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла

Обращение к процедуре как к функции

ОШибка

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

Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.

А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.

Рассмотрим два примера:

1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.

2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.

Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.

Процедура не может возвращать значение

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

В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.

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

Процедура ПроцедураНеМожетВозвращатьЗначение(Команда)
Возврат "Ошибка";
КонецПроцедуры

Как исправить? Платформа сама подсказывает, в каком месте кода ошибка. Нужно изменить текст модуля – либо удалить параметр у ключевого слова Возврат, либо убрать его вовсе, либо изменить процедуру на функцию – зависит от того, какая логика у вашей процедуры, и как вы предполагаете ее использовать.

Переменная не определена

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

  • Опечатка в имени переменной
  • Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
  • Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
  • Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.

Как исправить?

Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.

Значение не является значением объектного типа

Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”

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

Разберем более сложный пример:

&НаСервере
Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь)
Сообщить(Справочники.Сотрудники.ПустаяСсылка());
КонецПроцедуры

Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.

Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.

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

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

Обнаружены ошибки в 1С Синтаксическая ошибка

В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.

Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.

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

  1. Записать
  2. Прочитать
  3. Выполнить
  4. Создать
  5. ПроверитьВывод

Разберем эту ошибку на примере метода Выполнить объекта Запрос:

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И");
Запрос.Выполнить();

В тексте запроса допущена ошибка –  после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.

Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.

Тип не может быть выбран в запросе в 1С 8.3 (8.2)

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

С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.

Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке “Тип не может быть выбран в запросе”.

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

Неверно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");

Верно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));

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

Использование в 1С модальных окон в данном режиме запрещено

Ошибка Использование в 1С модальных окон в данном режиме запрещено​

Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”

Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.

Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂

Быстрый способ – переключить режим использования модальности в положение “Использовать”.

Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог  – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.

Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.

1С 8.3 и 8.2: Запись с такими ключевыми полями существует!

Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).

Суть ошибки следующая – регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей – а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.

Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.

В типовых конфигурациях часто эту ошибку можно воспроизвести, если в пользовательском режиме создать два документа “Установка цен номенклатуры” с одной и той же номенклатурой и за один и тот же день. Попытка провести второй документ приведет к ошибке.

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

Поле объекта недоступно для записи в 1С

Ошибка Поле объекта недоступно для записи в 1С​

Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.

Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.

Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:

Элемент = Справочники.Сотрудники.НайтиПоКоду("12345");
Элемент.Наименование = "Новое наименование";

Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().

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

Ссылка на обработку

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

Заключение

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

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

Здравствуйте. Необходимо было изобразить игру Сапёр в 1С, по заданию из задачника Чистова. Код ниже.

По итогу столкнулся с проблемой: <Обработка.сапер.Форма.Форма.Форма(35)>: Ошибка при вызове метода контекста (Добавить)
Группа = ЭтаФорма.Элементы.Добавить(«Ряд «+Х,Тип(«ГруппаФормы»),Элементы.ИгровоеПоле);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
Недопустимое значение параметра (параметр номер ‘1’)

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка при вызове метода контекста
Здравствуйте. У меня возникла проблема (с крупным содержимым). Я пыталась сделать автоматическое.

Ошибка при вызове метода контекста
Помогите. 1с 8.3 УТ 10.3т Задача: Выгрузить реализацию из БП 2.0 и загрузить приходный ордер.

Недопустимое значение параметров элементы добавитьОшибка при вызове метода контекста(Послать)
Всем привет. Чето ни как не разберусь, пробую отправить электронку выдает «Ошибка при вызове метода.

Ошибка при вызове метода контекста (Записать)
Есть кусок кода(стандартная обработка загрузки товара из документа Excel) СтрНоменклатура =.

Решение

Добавлено через 1 минуту

И везде, идентификатор не может содержать пробелов

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Открытие формы (Ошибка при вызове метода контекста)
открываю форму методом открытьФорму(«имяФормы.через точку.из подсказки.все правильно») но не.

Недопустимое значение параметров элементы добавитьОшибка при вызове метода контекста (Добавить)
Помогите разобраться почему не работает!? Код программы: Функция.

Источник

Недопустимое значение параметра (параметр номер ‘1’)

Добрый день.Замучался немного с планировщиком.такой вопрос появилась ошибка
Ошибка при вызове метода контекста (Добавить)
НовыйМастер = ИзмерениеМастера.Элементы.Добавить(выб.Мастер);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

&НаКлиенте
Процедура Отобразить(Команда)
Планировщик.ТекущиеПериодыОтображения.Очистить();
//Планировщик.ТекущиеПериодыОтображения.Добавить(ПериодОтображенияНачало, ПериодОтображенияКонец);
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоДня(Текущаядата()), КонецДня(Текущаядата()));
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 24;
Планировщик.ОтображатьПеренесенныеЗаголовки = Истина;
Планировщик.ОтступСНачалаПереносаШкалыВремени=8;
Планировщик.ОтступСКонцаПереносаШкалыВремени=3;

// Инициализируем измерения планировщика
ИзмеренияПланировщика = Планировщик.Измерения;
ИзмеренияПланировщика.Очистить();

Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Заявка.Ссылка КАК Ссылка,
| Заявка.Мастер КАК Мастер,
| Заявка.ДатаНачала КАК ДатаНачала,
| Заявка.ДатаОкончания КАК ДатаОкончания
|ИЗ
| Документ.Заявка КАК Заявка
|ГДЕ
| ЗаявкаНаРемонтСокр.Дата МЕЖДУ &ДатаНачало И &ДатаКонец»;

Запрос.УстановитьПараметр(«ДатаНачало»,НачалоГода(Текущаядата()));
Запрос.УстановитьПараметр(«ДатаКонец», КонецДня(Текущаядата()));
выб = Запрос.Выполнить().Выбрать();

Пока выб.Следующий() Цикл
// Заполнение измерений продавцы
НовыйМастер = ИзмерениеМастера.Элементы.Добавить(выб.Мастер);
НовыйМастер.Текст = выб.Мастер.Наименование;

Источник

v8.2: Программное создание таблицы в управляемой форме

Мне необходимо программным образом в справочник Пользователи( в управляемую форму списка) добавить таблицу, отображающую регистр сведений «Контактная информация». Проблема в том, что не получается у этой таблицы объявить поля(колонки), если таблица представляет собой динамический список.

Создание реквизита
реквизиты = Новый Массив;
реквизиты.Добавить(Новый РеквизитФормы(«Поле», Новый ОписаниеТипов («ДинамическийСписок»),,»Поле таблицы»));
ЭтаФорма.ИзменитьРеквизиты(реквизиты);
ЭтаФорма.Поле.ОсновнаяТаблица=»РегистрСведений.КонтактнаяИнформация»;

создание элемента
Элемент = Элементы.Добавить(«Поле», Тип(«ТаблицаФормы»), ЭтаФорма);
Элемент.ПутьКДанным = «Поле»;
Элемент.Видимость = Истина;

При попытке создать элемент, являющийся колонкой таблицы, выдается ошибка:
<Справочник.Пользователи.Форма.ФормаСписка.Форма(211)>: Ошибка при вызове метода контекста (Добавить): Недопустимое значение параметров
Элемент1 = Элементы.Добавить(«Представление»,Тип(«Строка»),Элемент);
по причине:
Недопустимое значение параметров

Ниже код, где возникает ошибка:
Элемент1 = Элементы.Добавить(«Представление»,Тип(«Строка»),Элемент); ошибка возникает здесь!
Элемент1.Вид = ВидПоляФормы.ПолеВвода;
Элемент1.ПутьКДанным = «Поле.Представление»;

Может, кто-нибудь сталкивался с подобной ситуацией? Помогите 🙂

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

Источник

Вывод дерева значений на управляемую форму

<Форма.Форма.Форма(88)>: Ошибка при вызове метода контекста (Добавить)
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»), ЭлементДерево);
по причине: Недопустимое значение параметров

ВыборкаПериод = ВыполнениеЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Дерево»,
Новый ОписаниеТипов(«ДеревоЗначений»)));
Для Каждого Колонка Из ВыборкаПериод.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «Дерево»));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ВыборкаПериод, «Дерево»);

// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить(«Дерево», Тип(«ТаблицаФормы»));
ЭлементДерево.ПутьКДанным = «Дерево»;
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

Для Каждого Колонка Из ВыборкаПериод.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»), ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «Дерево.» + Колонка.Имя;
КонецЦикла;

Источник

Форум (регистрация не требуется)

Программный изменение формы списка, Динамический список

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

p.s. Просьба задавать вопросы только по программированию. На вопросы по типовым конфигурациям обычно не отвечаю по двум причинам
1. В последнее время редко с ними работаю.
2. Чтобы ответить на вопрос требуется: установить соответствующую базу нужного релиза, смоделировать ситуацию, и только после этого возможно залезть в конфигуратор и разобраться что не так (к сожалению, у меня нет столько времени).

Программный изменение формы списка, Динамический список

Здравствуйте Сергей!
Вывожу программно новый реквизит на управляемую форму списка.
Меняю произвольный запрос из динамического списка(Добавляю в него выбор нужного мне поля).
Хочу вывести новое поле в колонке таблицы.
На строчке кода Элемент.ПутьКДанным = «Список.ВнешнийКод» выдает ошибку, и ругается на неправильный путь.
Как быть? Добавить реквизит в динамический список тоже нельзя.
Код: выделить все ЭтаФормаПерем.Список.ТекстЗапроса = СтрЗаменить(ЭтаФормаПерем.Список.ТекстЗапроса,»СправочникКонтрагенты.Ссылка,»,»СправочникКонтрагенты.Ссылка, СправочникКонтрагенты.ВнешнийКод КАК ВнешнийКод»);

Re: Программный изменение формы списка, Динамический список

НовЭлемент = ЭтаФормаПерем.Элементы.Добавить(«ПолеВнешнийКод»,Тип(«ПолеФормы»),ЭтаФормаПерем.Элементы.Список);
НовЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовЭлемент.ПутьКДанным = «Список.ВнешнийКод»;

и у поля ВнешнийКод необходимо в реквизитах формы поставить галочку «использовать всегда»

Мне до конца не ясна задача, для чего вам все это потребовалось

Более простой вариант: вытащить все колонки и программно регулировать видимость колонок.

Re: Программный изменение формы списка, Динамический список

Re: Программный изменение формы списка, Динамический список

и у поля ВнешнийКод необходимо в реквизитах формы поставить галочку «использовать всегда»

Все делается таким образом, для того чтобы не вмешиваться в форму.
весь код пишется в общем модуле и не затрагивает форму.
Цель обновление без проблем.

Re: Программный изменение формы списка, Динамический список

Re: Программный изменение формы списка, Динамический список

Re: Программный изменение формы списка, Динамический список

У меня все работает:
ЭтаФорма.Список.ТекстЗапроса = СтрЗаменить(ЭтаФорма.Список.ТекстЗапроса,»СправочникКонтрагенты.Ссылка,»,»СправочникКонтрагенты.Ссылка, СправочникКонтрагенты.ВнешнийКод КАК ВнешнийКод,»);
НовЭлемент = ЭтаФорма.Элементы.Добавить(«ПолеВнешнийКод»,Тип(«ПолеФормы»),ЭтаФорма.Элементы.Список);
НовЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовЭлемент.ПутьКДанным = «Список.ВнешнийКод»;

(Это при условии, что в динамическом списке установлен флаг «произвольный запрос», к сожалению под рукой у меня нет свежей БП 3.0, в старой БП 3.0 этот флаг не установлен)

Re: Программный изменение формы списка, Динамический список

Код: выделить все Форма.Список.ТекстЗапроса = СтрЗаменить(Форма.Список.ТекстЗапроса, «СостоянияЭД.СостояниеВерсииЭД», «,ДокументЗаказКлиента.ФАЙТ_ДополнительныйНомер КАК ДополнительныйНомер»);
Форма.Список.УстановитьОбязательноеИспользование(«ДополнительныйНомер», Истина);
Элемент = Форма.Элементы.Добавить(«ПолеДополнительныйНомер», Тип(«ПолеФормы»), Форма.Элементы.Список);
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным = «Список.ДополнительныйНомер»;

Re: Программный изменение формы списка, Динамический список

Re: Программный изменение формы списка, Динамический список

Источник

Содержание

  1. Решение проблемы
  2. Исправляем ситуацию
  3. Контекстные правила и методы
  4. Несоблюдение правил и методов программного контекста
  5. Ошибки команд
  6. Как узнать правильный метод?
  7. Что полезно знать об ошибках

Любой программист 1С встречался с таким сообщением, как «Ошибка при вызове метода контекста (Выполнить)». Обычно эта ошибка не вызывает затруднения у опытного программиста. Почему она возникает? Рассмотрим ниже.

Как в любом языке программирования, в платформе 1С есть предопределенные методы, которые облегчают жизнь разработчикам. Но выполнение этих команд требует правильного соблюдения синтаксиса языка программирования.

Самые распространенные ошибки при вызове типовых методов:

  • Записать
  • Создать
  • Подключиться
  • Connect
  • ПроверитьВывод
  • PreviewFile1C
  • Прочитать
  • Выполнить
  • ВыполнитьПакет
  • ПрочитатьИзменения

Рассмотрим пример. Мы программно создали запрос (справочник по запросам), передав в параметры «текст» вот такой фрагмент:

Получите 267 видеоуроков по 1С бесплатно:

В конструкции «ГДЕ» мы преднамеренно ошиблись, поставив «И», но не прописав еще одно условие. Совершенно логично, что 1С не сможет справиться с таким запросом и выдаст ошибку:

<МодульСеанса(21)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

Рассмотрим еще один пример:

Перенесем ошибочный код в обработчик «ПередЗаписью» справочника «Версии программ» и попробуем записать справочник программно. Видим ошибку:

<МодульСеанса(8)>: Ошибка при вызове метода контекста (Записать)
Выборка.ПолучитьОбъект().Записать();
по причине:
Ошибка при выполнении обработчика — ‘ПередЗаписью’
по причине:
<Справочник.ВерсииПрограмм.МодульОбъекта(20)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

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

Решение проблемы

Для решения проблемы достаточно понять, в чем именно заключается ошибка. В 99% случаев проблема решается банальным чтением справки и анализом проблемы.

Для того чтобы узнать, как пользоваться тем или иным методом, достаточно установить курсор на интересующей Вас функции и нажать «Ctrl + F1». Платформа 1С выдаст Вам контекстную подсказку по требуемому методу:

Проверьте параметры, передаваемые в функцию, и правильность её использования.

Другие статьи по 1С:

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

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

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

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

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

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

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

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

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

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

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

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

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

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

Понимание принципов функционирования метода контекста поможет избежать ошибок при работе в 1С.

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

Любой программный продукт архитектурно состоит из модулей (module, англ.), частей. Модульные части программы 1С и их местоположение показаны на рисунке:

Программные модули, в свою очередь, состоят из разделов:

Контекст (context, англ.) — это одно из важнейших понятий в программировании. В 1С под ним понимается окружение модуля и его разделов, — какие именно переменные, свойства, объекты, метод (method) и события могут быть ему доступны в каждой конкретной точке. В разных точках context, как правило, уже другой.

Разработчик (доработчик) должен понимать — какие контекстные свойства имеет точка и какой method является доступным для использования в ней.

В восьмёрке выделены контекстные виды:

  • В любой точке конфигурации доступен Глобальный context. Отдельная ветка синтаксис-помощника показывает доступные для вызова функции:
  • Локальный context (более низкого уровня) доступен в точках каждой модульной части;
  • Ещё ниже уровень — локальный context процедуры и так далее.

Базовыми являются основные четыре правила для доступа процедур, переменных, и ф-ций в модулях:

  • В общих модульных частях не будут доступными для экспорта переменные, процедуры и ф-ции модульных приложений;
  • В модульных приложениях есть доступ для экспорта процедур и ф-ций общих модулей;
  • Для общих мод. частей открыт доступ к экспорту процедур и ф-ций прочих общих модулей;
  • Для модульных прикладных объектов и для модульных форм являются доступными переменные, функции и процедуры модулей приложений для экспорта и общих модулей.

Если какой-либо форме присвоен основной реквизит, то в контексте этой формы будут содержаться свойство и method, отвечающие этому основному реквизиту. К примеру, в модуле формы для элемента справочника Номенклатура доступен method и свойства объекта СправочникОбъект.Номенклатура.

Иллюстрация приведённых правил на схеме:

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

Несоблюдение правил и методов программного контекста

Все программисты встречались с уведомлением об ошибке 1С при вызове метода контекста. Рассмотрим такой пример:

Ошибки команд

При создании запроса в справочнике в его параметре «текст» был внесён фрагмент:

В конструкции «ГДЕ» было внесено «И», но само условие осталось непрописанным.

Реакция программы была такой:

<МОДСеанса(21)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();

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

Для того чтобы получить подсказку платформы 1С о том, как использовать какой-либо method, поставьте курсор на нужную функцию и нажмите «Ctrl + F1». При возникновении ошибок нужно проверить параметры, которые передаются в функцию, а также правильность использования функции.

Что полезно знать об ошибках

Напоследок проведём общий анализ ошибок в 1С. Любая из них может быть причиной тех, которым посвящена тема статьи:

  • Нарушение как логической, так физической целостности информационной базы;
  • Ошибки пользователей при обращении с платформой;
  • Ошибочно введённый разработчиком (доработчиком) код;
  • Человеческий фактор — например, забывчивость;
  • Чрезвычайные ситуации (отсутствие света, метель, дождь, град, ураган, наводнение).

Провести анализ ошибки:

  • Сравнить релизы платформы и конфигурации;
  • Прочитать полный текст сообщения до конца, некоторое время подумать и понять то, что написала машина. Очень часто люди не читают такие сообщения целиком. Но бывает, что именно в конце его содержатся рекомендации к её устранению;
  • Проанализировать насколько давней она является и обстоятельства её появления;
  • Можно ли её воспроизвести;
  • Невоспроизводимые ранее не встречавшиеся ошибки, как правило, не исправляются;
  • Повторяется ли ошибка с другого компьютера или другим пользователем. В этом случае рассмотреть очистку кэша, настройку прав, очистку пользовательских настроек.

Дополнительно о причинах ошибок:

  • Часть ошибок — это результат использования нелицензионного программного обеспечения (и windows тоже);
  • Повреждённая платформа — это самый распространённый пример. Всего один патч способен взломать версию платформы. После чего можно не обнаружить базу (или лицензию);
  • При первичном столкновении с ошибкой стоит поискать решение в поисковике — возможно решение её уже кем-то найдено;
  • Следите за актуальностью релиза конфигурации (особенно если из них сдаётся регламентированная отчётность);
  • Актуальность релиза платформы — для каждой конфигурации рекомендован свой релиз;
    Все события, происходящие в 1С, протоколируются в технологическом журнале!
  • Перед началом каких-то действий с базой необходимо делать архивную копию!

Теперь вы знаете что такое context, почему возникают связанные с ним ошибки, как анализировать ошибки в 1С и как их решать.

Содержание

  1. Решение проблемы
  2. Исправляем ситуацию
  3. Контекстные правила и методы
  4. Несоблюдение правил и методов программного контекста
  5. Ошибки команд
  6. Как узнать правильный метод?
  7. Что полезно знать об ошибках

Любой программист 1С встречался с таким сообщением, как «Ошибка при вызове метода контекста (Выполнить)». Обычно эта ошибка не вызывает затруднения у опытного программиста. Почему она возникает? Рассмотрим ниже.

Как в любом языке программирования, в платформе 1С есть предопределенные методы, которые облегчают жизнь разработчикам. Но выполнение этих команд требует правильного соблюдения синтаксиса языка программирования.

Самые распространенные ошибки при вызове типовых методов:

  • Записать
  • Создать
  • Подключиться
  • Connect
  • ПроверитьВывод
  • PreviewFile1C
  • Прочитать
  • Выполнить
  • ВыполнитьПакет
  • ПрочитатьИзменения

Рассмотрим пример. Мы программно создали запрос (справочник по запросам), передав в параметры «текст» вот такой фрагмент:

Получите 267 видеоуроков по 1С бесплатно:

В конструкции «ГДЕ» мы преднамеренно ошиблись, поставив «И», но не прописав еще одно условие. Совершенно логично, что 1С не сможет справиться с таким запросом и выдаст ошибку:

<МодульСеанса(21)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

Рассмотрим еще один пример:

Перенесем ошибочный код в обработчик «ПередЗаписью» справочника «Версии программ» и попробуем записать справочник программно. Видим ошибку:

<МодульСеанса(8)>: Ошибка при вызове метода контекста (Записать)
Выборка.ПолучитьОбъект().Записать();
по причине:
Ошибка при выполнении обработчика — ‘ПередЗаписью’
по причине:
<Справочник.ВерсииПрограмм.МодульОбъекта(20)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

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

Решение проблемы

Для решения проблемы достаточно понять, в чем именно заключается ошибка. В 99% случаев проблема решается банальным чтением справки и анализом проблемы.

Для того чтобы узнать, как пользоваться тем или иным методом, достаточно установить курсор на интересующей Вас функции и нажать «Ctrl + F1». Платформа 1С выдаст Вам контекстную подсказку по требуемому методу:

Проверьте параметры, передаваемые в функцию, и правильность её использования.

Другие статьи по 1С:

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

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

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

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

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

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

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

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

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

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

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

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

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

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

Понимание принципов функционирования метода контекста поможет избежать ошибок при работе в 1С.

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

Любой программный продукт архитектурно состоит из модулей (module, англ.), частей. Модульные части программы 1С и их местоположение показаны на рисунке:

Программные модули, в свою очередь, состоят из разделов:

Контекст (context, англ.) — это одно из важнейших понятий в программировании. В 1С под ним понимается окружение модуля и его разделов, — какие именно переменные, свойства, объекты, метод (method) и события могут быть ему доступны в каждой конкретной точке. В разных точках context, как правило, уже другой.

Разработчик (доработчик) должен понимать — какие контекстные свойства имеет точка и какой method является доступным для использования в ней.

В восьмёрке выделены контекстные виды:

  • В любой точке конфигурации доступен Глобальный context. Отдельная ветка синтаксис-помощника показывает доступные для вызова функции:
  • Локальный context (более низкого уровня) доступен в точках каждой модульной части;
  • Ещё ниже уровень — локальный context процедуры и так далее.

Базовыми являются основные четыре правила для доступа процедур, переменных, и ф-ций в модулях:

  • В общих модульных частях не будут доступными для экспорта переменные, процедуры и ф-ции модульных приложений;
  • В модульных приложениях есть доступ для экспорта процедур и ф-ций общих модулей;
  • Для общих мод. частей открыт доступ к экспорту процедур и ф-ций прочих общих модулей;
  • Для модульных прикладных объектов и для модульных форм являются доступными переменные, функции и процедуры модулей приложений для экспорта и общих модулей.

Если какой-либо форме присвоен основной реквизит, то в контексте этой формы будут содержаться свойство и method, отвечающие этому основному реквизиту. К примеру, в модуле формы для элемента справочника Номенклатура доступен method и свойства объекта СправочникОбъект.Номенклатура.

Иллюстрация приведённых правил на схеме:

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

Несоблюдение правил и методов программного контекста

Все программисты встречались с уведомлением об ошибке 1С при вызове метода контекста. Рассмотрим такой пример:

Ошибки команд

При создании запроса в справочнике в его параметре «текст» был внесён фрагмент:

В конструкции «ГДЕ» было внесено «И», но само условие осталось непрописанным.

Реакция программы была такой:

<МОДСеанса(21)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();

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

Для того чтобы получить подсказку платформы 1С о том, как использовать какой-либо method, поставьте курсор на нужную функцию и нажмите «Ctrl + F1». При возникновении ошибок нужно проверить параметры, которые передаются в функцию, а также правильность использования функции.

Что полезно знать об ошибках

Напоследок проведём общий анализ ошибок в 1С. Любая из них может быть причиной тех, которым посвящена тема статьи:

  • Нарушение как логической, так физической целостности информационной базы;
  • Ошибки пользователей при обращении с платформой;
  • Ошибочно введённый разработчиком (доработчиком) код;
  • Человеческий фактор — например, забывчивость;
  • Чрезвычайные ситуации (отсутствие света, метель, дождь, град, ураган, наводнение).

Провести анализ ошибки:

  • Сравнить релизы платформы и конфигурации;
  • Прочитать полный текст сообщения до конца, некоторое время подумать и понять то, что написала машина. Очень часто люди не читают такие сообщения целиком. Но бывает, что именно в конце его содержатся рекомендации к её устранению;
  • Проанализировать насколько давней она является и обстоятельства её появления;
  • Можно ли её воспроизвести;
  • Невоспроизводимые ранее не встречавшиеся ошибки, как правило, не исправляются;
  • Повторяется ли ошибка с другого компьютера или другим пользователем. В этом случае рассмотреть очистку кэша, настройку прав, очистку пользовательских настроек.

Дополнительно о причинах ошибок:

  • Часть ошибок — это результат использования нелицензионного программного обеспечения (и windows тоже);
  • Повреждённая платформа — это самый распространённый пример. Всего один патч способен взломать версию платформы. После чего можно не обнаружить базу (или лицензию);
  • При первичном столкновении с ошибкой стоит поискать решение в поисковике — возможно решение её уже кем-то найдено;
  • Следите за актуальностью релиза конфигурации (особенно если из них сдаётся регламентированная отчётность);
  • Актуальность релиза платформы — для каждой конфигурации рекомендован свой релиз;
    Все события, происходящие в 1С, протоколируются в технологическом журнале!
  • Перед началом каких-то действий с базой необходимо делать архивную копию!

Теперь вы знаете что такое context, почему возникают связанные с ним ошибки, как анализировать ошибки в 1С и как их решать.

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

ошибка то где ? скорее всего надо данные формы в значение получить, потом обратно в данные формы

Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущаяСтрока);

Поправка, там вроде индекс надо передавать: Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущаяСтрока-1);

ошибка:{Документ.ПродажаТоваров.Форма.ФормаДокумента.Форма}: Ошибка при вызове метода контекста (Удалить)    ТабЧасть.Удалить(ТекСтрока); по причине: Недопустимое значение параметра (параметр номер ‘1’)

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

Если -1 делаю он пытается удалить 0 строку и тоже ошибку пишет

Ну вот… придется запускать комп с 1с….

что, Чебурашка, не спится? (с) :)

тоже ошибка {Документ.ПродажаТоваров.Форма.ФормаДокумента.Форма}: Ошибка при вызове метода контекста (Получить)    Запись = Объект.Товары.Получить(ИндексСтроки); по причине: Недопустимое значение параметра (параметр номер ‘1’)

блин… я фигею… как сложно удалить строчку

ИндексСтроки должно быть число. Попробуй прописать

Объект.ТабличнаяЧасть1.Удалить(Объект.ТабличнаяЧасть1[Элементы.ТабличнаяЧасть1.ТекущаяСтрока]);

Стормозил, там же данныеФормыКоллекция, и передавать надо элемент коллекции.

Совсем не смешно. Что сложного то?

Спасибо большое за помощь

можно и по индексу Объект.Товары.Удалить(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);

В УФ? Ну попробуй… Думаешь я не проверил?

Я тебе даже алгоритм теста скажу: Нужна ТЧ с реквизитом число или строка. Делаешь 3 строки и обязательно в реквизит пишешь номер строки. Потом по твоему алгоритму попробуй грохнуть строки. Посмотри что получится. Особенно приятно грохать первую строку… Или второй раз вторую…

ТекущаяСтрока <> ТекущиеДанные.НомерСтроки

Гарантируешь что номер строки всегда на клиенте доступен будет?

Я понимаю что можно извернуться как угодно и грохнуть строку. Не забывайте что это УФ.

Проверяю: в настройках формы нет элементов с «галкой использовать всегда»/прав на чтение номера строки/установлена функциональная опция/пользователь отключил видимость колонки и сочетание всего этого => не отображается «НомерСтроки» и на клиенте нет этого реквизита. Система падает с ошибкой «четотам не найден».

«Я понимаю что можно извернуться как угодно и НЕ грохнуть строку»

«Сударь» методист по системе 1С:Предприятие в целом и по управляемым формам в частности. Тема у нас «Изучаю», учить надо как правильно, а не как быстро. :) В реальности конечно все иначе, а жаль.

Индекс почему-то нигде нет в предыдущих постах

Точно! Можно индекс еще получить! Из коллекции данных формы, передав туда элемент коллекции! В чем смысл?

просто необходимость в в практике не нужна, даже если убрать «галкой использовать всегда», то номерстроки доступен, а установка ФО на колонку номер строки — это что-то …

(я счаз не придираюсь, так разговор подержать) а если юзер скроет при этом номер строки? Ну мешает он ему! А это золотой и капризный клиент…

+32 кстати УФ обычно менеджеры среднего звена сами настраивают…

если просто скроет из «Изменить форму» — то все равно доступен  ТекущиеДанные.НомерСтроки

Индекс  НайтиПоИдентификатору  ТекущаяСтрока

Неверно, Нужно передавать «ДанныеФОрмыЭлементКоллекции» в метод «Индекс». и если у реквизита будет снят флаг «ИспользоватьВсегда» то реквизита на стороне клиента не будет.

Все что я написал в доступно на сервере.

Сначала в СП загляните, потом комментируйте: Синтаксис: Индекс(<Элемент>) Параметры: Тип: ДанныеФормыЭлементКоллекции. Элемент коллекции, индекс которого требуется получить. Возвращаемое значение: Тип: Число. Описание: Получает индекс элемента коллекции. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент. ДанныеФормыКоллекция.Удалить (FormDataCollection.Delete) ДанныеФормыКоллекция (FormDataCollection) Удалить (Delete) Вариант синтаксиса: По индексу Синтаксис: Удалить(<Индекс>) Параметры: Тип: Число. Индекс элемента в коллекции. Вариант синтаксиса: По элементу Синтаксис: Удалить(<Элемент>) Параметры: Тип: ДанныеФормыЭлементКоллекции. Удаляемый элемент. Описание: Удаляет элемент из коллекции. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент.

И что траффик гонять? Контекст передавать? А если строк дофига? А если тяжелые данные на форме? Интерактивно удалять строки надо только, _исключительно_ на  клиенте.

раскидав вроде получаете правильно. У меня работает. На клиенте получаем индекс и передаем для удаления на сервер

не поверишь — доступно, даже со снятой галкой …

Удачи! GPRS модем в руки с тонким клиентом и удаляйте строки! Я посмотрю через сколько дней Ваш заказчик вернет обработку.

Это глюк :) Не должно быть доступно.

Хотя вот галку снять можно с номера строки… А как оно синхронизировать строки между клиентом и сервером будет? По какому ключу? Надо в парсер залезть..

имея индекс мы не можем внеконтекстно удалить строку(или не знаю =) ? не помню просто. Остальное типовое

Уточню и галка снята и на форме не отображается и все равно программно доступно? Да?

Внеконтекстно мы ничего с объектом сделать не могем.

Вообще то все зависит от задачи. Если удалять строку интерактивно, то на клиенте, а если из документов то на сервере.

Конечно. Я сейчас рассуждаю в контексте поставленной задачи.

Ну либо глюк, либо . Надо проверять… В общем делайте как я написал и будет счастье при условии что все глюки в платформе починят :) Проверю сегодня на низком уровне что передается гарантированно на клиент из формы с ТЧ.

Самому интересно, но это будет только к вечеру.

у сэра есть доступ к коду матрицы?!!!

В СП  метод Индекс есть в тонком клиенте, значит передается.

Да не, есть просто снифер html траффика. Там все видно если шифрование не ставить. Метод «Индекс» есть у любой коллекции у которой определен итератор. В том числе и для коллекций УФ. Про «Передается» не понял, что передается?

Спор про что ? Как удалить строку ТЧ в УФ через индекс ? У текущий строки индекс есть ? Значит удалить строку через индекс не проблема.

Кто спорит? Чтобы удалить строку через индекс его надо получить. Чтобы получить интекс удаляемого элемента коллекции надо его получить. При этом можно удалить строку указав просто удаляемый элемент коллеции. Вопрос: нафига это делать через получение индекса? Вариант без индекса: Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока]) Вариант с индексом Объект.ТЧ.Удалить(Объект.ТЧ.Индекс(Элементы.ТЧ.ТекущаяСтрока)) Второй вопрос: Это то о чем Вы пишете?

Началось с того что я предложил удалять через индекс, хотя правильнее передавать Элемерт коллекции, продолжилось с по По второму вопросу: Вариант без индекса: Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока]) А Вы о чем ?

Ох… Перечитайте ветку. Я все уже сказал. СОВСЕМ ВСЕ и повторять не буду. В ветке отпишусь после экспериментов с данными сеанса передаваемых при открытии формы.

М.Радченко об этом скажите

Это Радченко предлагает делать 2 вызова сервера там, где можно обойтись одним и удалять строки при изменении реквизитов? Что-то я сомневаюсь.

Ну основной кусок процедуры взят у ТС, вопрос то был про ошибку удаления.

ну если сделать так: ИдентификаторСтроки = Элементы.ПереченьНоменклатуры.ТекущаяСтрока; все отрабатывает на клиенте.

ну про ошибку писали уже, если кратко: набей 3 строки, удали их, сделай ещё 1 строку для неё значение Элементы.ПереченьНоменклатуры.ТекущаяСтрока будет равно 4. Хотя визуально будет только она одна

ну у меня почти то-же, только вместо ИдентификаторСтроки = Элемент.ТекущаяСтрока; пишу: где там 2 обращения к серверу?

Пля, товарищи, ну вы читать умеете? 2 обращения к серверу в . В , блеать, 2 обращения к серверу.

не вижу 2 обращений, поэтому и спрашиваю где они там? Читать не умеете, не вижу где их 2!

Плохо смотришь. СтрокаТЧ.ЕдиницаИзмерения = ПолучениеОсновнойЕдиницыИзмерения(СтрокаТЧ.Номенклатура); <- 1 На клиенте поциент этих данных не получит, как ни бейся. Я еще и готов на пиво поспорить, что там контекстные вызовы идут.

Под сотню постов — удаляем строку. Жесть какая то, товарищи.

стоп! но это-же не из на который вы указывали, а из ! Тот код вообще не самый компот!

В это тоже есть. И именно про эти строки я и говорил

Недоступно. Проверил. Собственно просто отладчиком. Следовательно ориентироваться на данные строки при ее удалении мы не можем, так как при стечении обстоятельств этих данных может не быть. Хотя вряд ли кто то номер строки из формы уберет, да еще и в конфигураторе снимет галку «Использовать всегда».

Причем тут номер строки ? Речь шла про индекс строки, а не про номер.

Понятно что получать индекс как советуют некоторые ИндексСтроки = НомерСтроки-1; как минимум некорректно.

Это не по вашу тему… По вашу тему комментарий: Чтобы получить индекс элемента коллекции нужно получить элемент коллекции. При этом имея элемент коллекции мы и так его можем удалить. Нафига получать индекс?

Согласен. Поэтому подводя итоги темы. единственный правильный вариант удаления текущей строки из ТЧ УФ формы это Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока-1])

Или же кто не хочет связываться с индексами Объект.ТЧ.Удалить(Объект.ТЧ.ТекущиДанные)

в коде орфографическая ошибка, да и если её пофиксить — не будет как надо! ну проведите тест из а потом расскажите как оно отрабатывает.

Какая орфографическая ошибка ? — ТекущиДанные понимать как ТекущиеДанные это опечатка. Конечно же будет так: Соттветственно с индексами строк лучше не связываться.    Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущиеДанные.НомерСтроки-1); Правильный вариант соответсвено будет: Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущиеДанные);

Специально дописал в контекст автора, чтобы закрыть тему окончательно:

Может до сотни дотянем? :) Как еще можно грохнуть ТЧ. Предлагайте правильные варианты. :)

Хороши вопросы по 8.2 сегодня. Прямо вспоминаю начало 2005-ого года ;) зы: до ста осталось 9…

Дык политику то отключили..

тест указанный в попробуйте, а потом говорите что это правильно! Вариант с текущей строкой его просто не проходит! а каким снифером пользуетесь? Ваш снифер умеет ловить трафик когда всё выполняется в пределах 1 компа?

Тэги: 1С 8

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

02.07.2018, 11:35


#1

Марочка98 вне форума


Гость форума


По умолчанию Несоответствие типов (параметр номер ‘1’)

Здравствуйте, помогите пожалуйста с проблемой.
У меня внешняя обработка, загрузка xml файла в дерево значений, и выдает ошибку {Обработка.Обработка1.Форма .Форма.Форма(37)}: Ошибка при вызове метода контекста (УстановитьСтроку)
Чтение.УстановитьСтроку(Те кстXML);
по причине:
Несоответствие типов (параметр номер ‘1’)
Что нужно сделать?? Я начинающий программист в 1с, и поэтому не очень сильна в этом.

Вот полностью мой код модуля.

&НаКлиенте
Процедура Файл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДи� �логаВыбораФайла.Открытие);
Диалог.Заголовок = «Выбор документа»;
Диалог.Фильтр = «Документы XML (*.xml, *.xdr, *.xsd, *.xsl)|*.xml;*.xdr;*.xsd;*.xsl|Все файлы|*.*|»;
Если Диалог.Выбрать() Тогда
ТекстXML.Прочитать(Диалог.По лноеИмяФайла);
Документ = ТекстXML.ПолучитьТекст();
Заголовок = «Просмотр XML-документа: » + Диалог.ПолноеИмяФайла;

КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КнИмпорт(Команда)
Если НЕ ПустаяСтрока(ТекстXML) Тогда
Дерево = Импорт1();

Если Объект.Дерево.Строки.Колич� �ство() > 0 Тогда
ЭлементДерево = ТекстXML.Объект.Дерево;
ЭлементДерево.СоздатьКоло� �ки();
ЭлементДерево.Колонки.Удал ить(ЭлементДерево.Колонки[«Атрибуты»]);

КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция Импорт1() Экспорт
Чтение = Новый ЧтениеXML();
Чтение.УстановитьСтроку(Те кстXML);
ДеревоЗначений = Новый ДеревоЗначений();

ДеревоЗначений.Колонки.Доб авить(«Элемент»);
ДеревоЗначений.Колонки.Доб авить(«Текст»);
ДеревоЗначений.Колонки.Доб авить(«Атрибуты»);
Корень = ДеревоЗначений.Строки.Доба вить();
Корень.Элемент = Чтение.Имя;
Рекурсия(Корень, Чтение);
Возврат ДеревоЗначений;
КонецФункции
Процедура Рекурсия(СтрокаДерева, Чтение)
Если Чтение.КоличествоАтрибуто� �() > 0 Тогда
АтрибутыСоответствие = Новый Соответствие();
Пока Чтение.ПрочитатьАтрибут() Цикл
АтрибутыСоответствие.Вста� �ить(Чтение.Имя, Чтение.Значение);
КонецЦикла;
СтрокаДерева.Атрибуты = АтрибутыСоответствие;
КонецЕсли;
//Состояние(Чтение.Имя);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Прервать;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
СтрокаДерева.Текст = Чтение.Значение;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Дочерний = СтрокаДерева.Строки.Добави ть();
Дочерний.Элемент = Чтение.Имя;
Рекурсия(Дочерний, Чтение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Дерево1ПриАктивизацииСтро� �и(Элемент)
Объект.Атрибуты.Очистить();
Данные = Элемент.ТекущиеДанные;
Если Данные <> Неопределено Тогда
АтрибутыДерева = Данные.Атрибуты;
Если ТипЗнч(АтрибутыДерева) = Тип(«Соответствие») Тогда
Для каждого АтрибутДерева из АтрибутыДерева Цикл
СтрокаТаблицы = Объект.Атрибуты.Добавить();
СтрокаТаблицы.Атрибут = АтрибутДерева.Ключ;
СтрокаТаблицы.ЗначениеАтр� �бута = АтрибутДерева.Значение;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Дерево1Выбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(Выбранная� �трока.Текст);
КонецПроцедуры

&НаКлиенте
Процедура АтрибутыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(Выбранная� �трока.ЗначениеАтрибута);

КонецПроцедуры

Процедура ОчиститьТаблицы() Экспорт
Объект.Дерево.Строки.Очист� �ть();
Объект.Дерево.Колонки.Очис� �ить();
Объект.Атрибуты.Очистить();
КонецПроцедуры


11.07.2018, 05:59


#2

FraerFFSG вне форума


Пришел за помощью


По умолчанию Re: Несоответствие типов (параметр номер ‘1’)

Цитата Сообщение от Марочка98
Посмотреть сообщение

Здравствуйте, помогите пожалуйста с проблемой.
У меня внешняя обработка, загрузка xml файла в дерево значений, и выдает ошибку {Обработка.Обработка1.Форма .Форма.Форма(37)}: Ошибка при вызове метода контекста (УстановитьСтроку)
Чтение.УстановитьСтроку(Те кстXML);
по причине:
Несоответствие типов (параметр номер ‘1’)
Что нужно сделать?? Я начинающий программист в 1с, и поэтому не очень сильна в этом.

Вот полностью мой код модуля.

&НаКлиенте
Процедура Файл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДи� �логаВыбораФайла.Открытие);
Диалог.Заголовок = «Выбор документа»;
Диалог.Фильтр = «Документы XML (*.xml, *.xdr, *.xsd, *.xsl)|*.xml;*.xdr;*.xsd;*.xsl|Все файлы|*.*|»;
Если Диалог.Выбрать() Тогда
ТекстXML.Прочитать(Диалог.По лноеИмяФайла);
Документ = ТекстXML.ПолучитьТекст();
Заголовок = «Просмотр XML-документа: » + Диалог.ПолноеИмяФайла;

КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КнИмпорт(Команда)
Если НЕ ПустаяСтрока(ТекстXML) Тогда
Дерево = Импорт1();

Если Объект.Дерево.Строки.Колич� �ство() > 0 Тогда
ЭлементДерево = ТекстXML.Объект.Дерево;
ЭлементДерево.СоздатьКоло� �ки();
ЭлементДерево.Колонки.Удал ить(ЭлементДерево.Колонки[«Атрибуты»]);

КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция Импорт1() Экспорт
Чтение = Новый ЧтениеXML();
Чтение.УстановитьСтроку(Те кстXML);
ДеревоЗначений = Новый ДеревоЗначений();

ДеревоЗначений.Колонки.Доб авить(«Элемент»);
ДеревоЗначений.Колонки.Доб авить(«Текст»);
ДеревоЗначений.Колонки.Доб авить(«Атрибуты»);
Корень = ДеревоЗначений.Строки.Доба вить();
Корень.Элемент = Чтение.Имя;
Рекурсия(Корень, Чтение);
Возврат ДеревоЗначений;
КонецФункции
Процедура Рекурсия(СтрокаДерева, Чтение)
Если Чтение.КоличествоАтрибуто� �() > 0 Тогда
АтрибутыСоответствие = Новый Соответствие();
Пока Чтение.ПрочитатьАтрибут() Цикл
АтрибутыСоответствие.Вста� �ить(Чтение.Имя, Чтение.Значение);
КонецЦикла;
СтрокаДерева.Атрибуты = АтрибутыСоответствие;
КонецЕсли;
//Состояние(Чтение.Имя);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Прервать;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
СтрокаДерева.Текст = Чтение.Значение;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Дочерний = СтрокаДерева.Строки.Добави ть();
Дочерний.Элемент = Чтение.Имя;
Рекурсия(Дочерний, Чтение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Дерево1ПриАктивизацииСтро� �и(Элемент)
Объект.Атрибуты.Очистить();
Данные = Элемент.ТекущиеДанные;
Если Данные <> Неопределено Тогда
АтрибутыДерева = Данные.Атрибуты;
Если ТипЗнч(АтрибутыДерева) = Тип(«Соответствие») Тогда
Для каждого АтрибутДерева из АтрибутыДерева Цикл
СтрокаТаблицы = Объект.Атрибуты.Добавить();
СтрокаТаблицы.Атрибут = АтрибутДерева.Ключ;
СтрокаТаблицы.ЗначениеАтр� �бута = АтрибутДерева.Значение;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Дерево1Выбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(Выбранная� �трока.Текст);
КонецПроцедуры

&НаКлиенте
Процедура АтрибутыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(Выбранная� �трока.ЗначениеАтрибута);

КонецПроцедуры

Процедура ОчиститьТаблицы() Экспорт
Объект.Дерево.Строки.Очист� �ть();
Объект.Дерево.Колонки.Очис� �ить();
Объект.Атрибуты.Очистить();
КонецПроцедуры

Поставить бряку на
Чтение.УстановитьСтроку(Те кстXML);

И посмотреть Shift+F9 выделив Те кстXML — Что же скрывается под этой переменной.


  • Главная
  •  / 
  • Статьи
  •  / 
  • Программирование на 1С:Предприятие
  •  / 
  • Не установлен приемник XML

Текст ошибки:

{Форма.Форма.Форма(2254)}: Ошибка при вызове метода контекста (ЗаписатьXML)
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
по причине:
Ошибка при записи XDTO


по причине:
Не установлен приемник XML

Проблема решается добавлением команды «УстановитьСтроку».

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

Возврат ЗаписьXML.Закрыть();

Указанный код работает без ошибок.

Возврат к списку

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста показать
  • Ошибка при вызове метода контекста числопрописью
  • Ошибка при вызове метода контекста подключитьобработчикожидания
  • Ошибка при вызове метода контекста подключиться почта
  • Ошибка при вызове метода контекста подключитьвнешнююкомпоненту