ошибка при использовании функции ПредопределенноеЗначение |
Я |
01.03.19 — 10:05
Переношу обработку из УТ 11.1 в УТ 11.4
Перестал работать код
ТипыНоменклатуры.Добавить(ПредопределенноеЗначение(«Перечисления.ТипыНоменклатуры.Товар»));
Ошибка:
{ВнешняяОбработка.УстановкаЦенНоменклатуры.Форма.Форма.Форма(2833)}: Ошибка при вызове метода контекста (ПредопределенноеЗначение)
ТипыНоменклатуры.Добавить(ПредопределенноеЗначение(«Перечисления.ТипыНоменклатуры.Товар»));
по причине:
Предопределенное значение «Перечисления.ТипыНоменклатуры.Товар» не найдено.
1 — 01.03.19 — 10:16
ПеречислениЕ?
2 — 01.03.19 — 10:19
(1)+1 а уверен что раньше работало? 
3 — 01.03.19 — 10:33
(1) Да!
Два дня назад городил огород чтобы получить пустую ссылку по имеющемуся типу, про ПредопределенноеЗначение не вспомнил((
4 — 01.03.19 — 10:41
не могло раньше работать, ну никак
5 — 01.03.19 — 10:44
(3)ОписаниеТипов.ПривестиЗначение
6 — 01.03.19 — 10:46
(5) Это я рассматривал, но что-то не взлетело
так предлагаешь ОписаниеТипов.ПривестиЗначение(Неопределено)?
7 — 01.03.19 — 10:54
Если не передавать значение то возвращается значение по умолчанию данного типа. Для справочника например это будет пустая ссылка
8 — 01.03.19 — 11:06
(7) Да, норм.
А я для теста засунул конструкцию типа
(Новый ОписаниеТипов(«СправочникСсылка.Банки»)).ПривестиЗначение()
в табло, получил ошибку и пошел другим путём.
9 — 01.03.19 — 13:01
(1) (2) Уверен, да и через пробел само все пишется, так что ошибки в написание нет.
Сделал в общем так:
ПолучитьПеречисл()
&НаСервере
Функция ПолучитьПеречисл()
Возврат Перечисления.ТипыНоменклатуры.Товар;
КонецФункции
10 — 01.03.19 — 13:07
(9) очень некрасиво сделал. с клиента сервер вызывать из за этого. а если это в цикле, то вообще ужас
11 — 01.03.19 — 13:08
(10) что поделать, переписывать что то там кардинально из-за этого не целесообразно. Но это и не в цикле
12 — 01.03.19 — 13:19
(9)»так что ошибки в написание нет»
Хм, а СП утверждает, что есть:
Синтаксис:
ПредопределенноеЗначение(<ИмяПредопределенногоЗначения>)
Параметры:
<ИмяПредопределенногоЗначения> (обязательный)
Тип: Строка.
Содержит полный путь до предопределенного значения, включая имя самого значения. Например, «ПланСчетов.Основной.Счет41».
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
<Тип предопределенного значения>.<Имя объекта метаданных>.<Значение>.
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Документ (Document) — только пустая ссылка;
Перечисление (Enum);
БизнесПроцесс (BusinessProcess) — только пустая ссылка и получение точек бизнес процесса;
Задача (Task) — только пустая ссылка.
13 — 01.03.19 — 13:22
будтл бы предопределенное значение на сервер не ходит?
14 — 01.03.19 — 13:23
(13)Один раз же, потом кэш.
15 — 01.03.19 — 13:24
(9)Молодец, надо быть уверенным в себе, исправляют и проверяют только трусы
16 — 01.03.19 — 13:42
(12) ну я же говорю система через ctrl+пробел дописывает как надо. Через точку все видит.
(15) это не критично, поэтому не понимаю зачем мне логику какую то менять.
Но вот код:
&НаКлиенте
Процедура ПодборВычеркнуть(Команда)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить(«Заголовок», НСтр(«ru = ‘Подбор вычеркнуть'»));
ПараметрыФормы.Вставить(«ЗаголовокКнопкиПеренести», НСтр(«ru = ‘Вычеркнуть из списока'»));
ПараметрыФормы.Вставить(«УникальныйИдентификатор», ЭтаФорма.УникальныйИдентификатор);
ПараметрыФормы.Вставить(«РежимВыбора», Истина);
ТипыНоменклатуры = Новый Массив();
ТипыНоменклатуры.Добавить(ПолучитьТипТовар());
ОтборПоТипуНоменклатуры = Новый ФиксированныйМассив(ТипыНоменклатуры);
ПараметрыФормы.Вставить(«ОтборПоТипуНоменклатуры», ОтборПоТипуНоменклатуры);
ОткрытьФорму(«Обработка.ПодборТоваровПоОтбору.Форма», ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Куда же мне убрать лишний вызов сервера?
Единственное могу поставить &НаСервереБезКонтекста
17 — 01.03.19 — 13:46
«ну я же говорю система через ctrl+пробел дописывает как надо. Через точку все видит»
правильно, система не может ошибаться, это же 1С, самая надежная система в мире.
18 — 01.03.19 — 13:50
(16)А скрин можно? И платформу. У меня на 8.3.10.2580 всё согласно СП, просто академический интерес.
Wefast
19 — 01.03.19 — 14:13
(18) начал делать скрины восстанавливая тот код и все работает.
В (0) и правда опечатка
Неловко, что так упорно сопротивлялся, извините.
Поверил на слово, что раньше работало.
Уверен, что проверял что через пробел все заполняется. Может не сохранил после проверки.
Может не увидел разницы когда заново строчку написал. Хз короче куда смотрел.
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;

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

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

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

Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
0
Как получить ПредопределенноеЗначение?
Чтобы обратиться к предопределенному значению перечисления на клиенте нужно использовать метод глобального контекста ПредопределенноеЗначение (PredefinedValue)
Синтаксис:
Код 1C v 8.2 УП
ПредопределенноеЗначение(<ИмяПредопределенногоЗначения>)
Параметры: <ИмяПредопределенногоЗначения> (обязательный)
Тип: Строка. Содержит полный путь до предопределенного значения, включая имя самого значения. Например, «ПланСчетов.Основной.Счет41».
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
<Тип предопределенного значения>.<Имя объекта метаданных>.<Значение>
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Перечисление (Enum);
БизнесПроцесс (BusinessProcess)
В качестве <Имя объекта метаданных> указывается имя объекта метаданных, как оно задано в конфигураторе.
Для перечислений, определенных в конфигурации, <Значение> указывается как имя соответствующего объекта метаданных типа ЗначениеПеречисления. Для всех остальных типов предопределенных значений <Значение> указывается как имя предопределенного элемента данных, как оно указано в конфигураторе, или ПустаяСсылка для указания пустой ссылки.
Для точек маршрутов бизнес-процессов имя предопределенного значения имеет вид:
БизнесПроцесс.<Имя объекта метаданных>.ТочкаМаршрута.<Имя точки маршрута>
Также метод может быть использован для получения значения системного перечисления. В этом случае параметр формируется как:
<ИмяСистемногоПеречисления>.<ИмяЗначенияСистемногоПеречисления>
Описание: Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Вызов метода выполняет обращение к серверу.
Код 1C v 8.2 УП
&Наклиенте
Процедура ГрафикРемонтовСпособВыполненияПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.ГрафикРемонтов.ТекущиеДанные;
Если СтрокаТабличнойЧасти.СпособВыполнения = ПредопределенноеЗначение("Перечисление.СпособыВыполненияРемонтныхРабот.Подрядный") Тогда
Элементы.ГрафикРемонтовИсполнитель.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
иначе
Элементы.ГрафикРемонтовИсполнитель.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизации");
КонецЕсли;
КонецПроцедуры
Программируя функционал в платформе 8.2 Управляемые Формы нужно четко понимать где он будет исполняться (на сервере или клиенте). Многие привычные методы теперь не работают так как раньше. И элементарная проверка заполнения реквизита на предопределенное значение на клиенте будет иметь следующий вид:
Код 1C v 8.х
&НаКлиенте
Процедура ПриИзменениеСтатусаЗаказа()
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Завершен") Тогда
ЗакрытьЗаказ();
КонецЕсли;
КонецПроцедуры
Вот так работать не будет:
Код 1C v 8.х
// НЕ РАБОТАЕТ
&НаКлиенте
Процедура ПриИзменениеСтатусаЗаказа()
Если Объект.Статус = Перечисления.СтатусыЗаказов.Завершен Тогда
ЗакрытьЗаказ();
КонецЕсли;
КонецПроцедуры
Возвращает ссылку на предопределенный элемент данных (справочника, плана видов характеристик, перечисления и т.п.) и точек маршрута бизнес-процессов, а также значения системных перечислений.
Синтаксис
Функция ПредопределенноеЗначение() имеет следующий синтаксис:
ПредопределенноеЗначение(ПутьКДанным)
А также альтернативный англоязычный синтаксис:
PredefinedValue(Path)
Параметры
Описание параметров функции ПредопределенноеЗначение():
| Имя параметра* | Тип | Описание |
|---|---|---|
| ПутьКДанным | Строка | Содержит полный путь до предопределенного значения, включая имя прототипа данных (Справочник, Документ и т.п.), имя объекта метаданных и имя самого значения. Например:
Для пустых ссылок на объекты:
Для системных перечислений:
|
| *Жирным шрифтом выделены обязательные параметры |
Описание
Функция ПредопределенноеЗначение() возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Внимание! Данный метод доступен для версии платформы 1С:Предприятие 8.2.9 и выше
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Внимание!! Если вызов метода происходит в контексте клиента, выполняется обращение к серверу. Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы.
Пример использования
Пример кода с использованием функции ПредопределенноеЗначение():
&НаКлиенте Процедура ПередЗаписью(Отказ) Если Объект.ВидНоменклатуры = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка") Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры
Поделиться страницей в соц.сетях
Метки: Метки 1С:Предприятие 8.2.9+
Показывать по
10
20
40
сообщений
Новая тема
Ответить
enches
Дата регистрации: 24.01.2014
Сообщений: 9
«Здравствуйте!<br>Необходимо в ПФР сделать корректировку за 1 квартал 2013 г. При записи документа происходит следующая ошибка:<br> <br>{Обработка.ПодготовкаДанныхПФР2010.МодульОбъекта(1259)}: Ошибка при вызове метода контекста (Записать)<br> ЭлементСоответствия.Значение.Записать(?(ЭлементСоответствия.Значение.Проведен,РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));<br>по причине:<br>Не удалось провести «Опись сведений АДВ-6-2 (до 2010 года — Ведомость уплаты АДВ-11) 00000000002 от 27.02.2014 0:00:00″!<br> <br>У пользователя полные права. Подскажите, пожалуйста, что лучше сделать?»
Тэра
Дата регистрации: 25.12.2008
Сообщений: 22390
релиз? И при записи какого документа это происходит?
enches
Дата регистрации: 24.01.2014
Сообщений: 9
Зарплата и Управление Персоналом, редакция 2.5 (2.5.78.1)<br>документ Опись сведений АДВ-6-2 (до 2010 года — Ведомость уплаты АДВ-11)
Sh_S
Дата регистрации: 02.03.2007
Сообщений: 7730
ну так а пачки, входящие в состав описи, проведены?
enches
Дата регистрации: 24.01.2014
Сообщений: 9
пачка не проводилась одна
enches
Дата регистрации: 24.01.2014
Сообщений: 9
Большое спасибо за советы!<br> <br>Проблема решена. А проблема была в следующем: в отправленной в пфр исходной описи пользователь смог исправить период, который был указан неверно, на верный период, а потом пытался создать корректировку с правильным периодом работы, т.е. с тем же периодом, который указан в исходных сведениях. В результате изменили период в исходных сведениях на тот период, который был указан при отправке в пфр (неверный), потом в корректировке поставили верный период.
Показывать по
10
20
40
сообщений
Читают тему:

