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Выбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(ВыбраннаяСтрока.Текст);
КонецПроцедуры
&НаКлиенте
Процедура АтрибутыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьЗначение(ВыбраннаяСтрока.ЗначениеАтрибута);
КонецПроцедуры
Процедура ОчиститьТаблицы() Экспорт
Объект.Дерево.Строки.Очистить();
Объект.Дерево.Колонки.Очистить();
Объект.Атрибуты.Очистить();
КонецПроцедуры
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;

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

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

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

Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Пользователь 173633
Посетитель
Сообщений: 38
Баллов: 6
Авторитет:
1
Рейтинг пользователя:
0
Регистрация: 19.03.2013
#3076
0
07.12.2021 18:29:02
| Цитата | ||
|---|---|---|
написал:
Ну они могут загрузиться как контрагенты, если у контакта нет владельца компании. |
Александр, благодарю за разъяснения! Ручками, конечно, это очень долго. А подскажите, если я удалю их в 1С, прям совсем удалю, то в битриксе они останутся?
Ну и сейчас проверила на тестовом примере, получается, что когда мы в Б24 заводим контакт, не привязанный к компании, при синхронизации в 1С создаётся контрагент, а затем, когда этот контакт привязываем к уже существующей компании, то в 1С создается контактное лицо Контрагента, то есть фактически запись задваивается, то есть в Б24 э то один элемент, а в 1С их два. Подскажите, пожалуйста, это верное поведение синхронизации?
Ну и сразу еще один вопрос. Можно ли как-то настроить, чтобы синхронизировались только Контрагенты = Компании, чтобы вот эти вот контакты и контактные лица не участвовали в синхронизации, нигде не создавались, были просто в битриксе и в 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
Комментарии доступны только авторизированным пользователям