Как правильно ПолучитьПоследнее из регистра сведений |
Я |
25.06.15 — 11:59
Такую ошибку выдал мне, при выборе номенклатуры в режиме предприятия. Понимаю, что вопрос неправильно задан, мало информации…
{ОбщийМодуль.РаботаСоСправочниками.Модуль(6)}: Ошибка при вызове метода контекста (ПолучитьПоследнее)
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
1 — 25.06.15 — 12:00
>Понимаю, что вопрос неправильно задан, мало информации…
Верно понимаешь.
Вопрос то в чем?
2 — 25.06.15 — 12:04
кривой отбор, что не ясно
3 — 25.06.15 — 12:05
Если ты программист, то смотри синтаксис по методу ПолучитьПоследнее() и проверяй, соответственно, в отладчике что у тебя попадает в в параметр «Отбор».
4 — 25.06.15 — 12:06
(2) не кривой, а вообще не отбор…
5 — 25.06.15 — 12:28
(4) Не факт. Если в отборе присутствуют поля не соответствующие измерениям будет такая же картина.
6 — 25.06.15 — 12:29
(4) это тоже туда инкапсулируется
7 — 25.06.15 — 12:32
(5) еще вариант: в отборе должно быть только одно измерение, а у автора несколько.
8 — 25.06.15 — 12:39
запросом делай
9 — 25.06.15 — 12:48
(0) ежели это в типовой конфигурации — вопрос к разработчикам, ежели сам наваял — сам понимаешь
10 — 26.06.15 — 12:37
мм…
Ну вот код
Функция РозничнаяЦена (АктуальнаяДата, ЭлементНоменклатуры) Экспорт
// Создать воспомогательный объект «Отбор»
Отбор = Новый Структура («Номенклатура», ЭлементНоменклатуры);
// Получить актуальны значения ресурсов регистра.
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
Вот ошибка из консоли, которую выдаёт, когда меняешь номенклатуру, должно подставить цену из регистра сведений, при выборе номенклатуры. Вроде…
{ОбщийМодуль.РаботаСоСправочниками.Модуль(6)}: Ошибка при вызове метода контекста (ПолучитьПоследнее)
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
Недопустимое значение параметра (параметр номер ‘2’)
11 — 26.06.15 — 12:41
(10) «ЭлементНоменклатуры» это что?
12 — 26.06.15 — 12:56
(11) не знаю.. нету такой переменной в форме документа откуда запрашивает эту функцию. Эта функция в глоб.модулях. Конфигурация учебная, могу расшарить.
13 — 26.06.15 — 12:57
возможно, нужна не структура, а фиксированная структура…
14 — 26.06.15 — 13:00
(0) Код похож на пример из книжки Радченко «Практическое пособие разработчика»
15 — 26.06.15 — 13:02
Традиционно: встань в конфигураторе на ошибку, запусти отладчик, посмотри, какое значение в ЭлементНоменклатуры
16 — 26.06.15 — 13:03
(0) Все по книжке делал? Все галки там у модуля проставил?
В модул формы при изменении номенклатуры так?
// Получить текущую строку табличной части.
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
// Установить цену.
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
17 — 26.06.15 — 13:05
(14) Да, именно оно, по 8.3
18 — 26.06.15 — 13:06
(15) Тыкаюсь. Забыл как вызвать это окно в отладчике….
19 — 26.06.15 — 13:07
(16) Да, вот так
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
// Установить цену.
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
20 — 26.06.15 — 13:10
(18) Shift+F9
21 — 26.06.15 — 13:13
+ (20) либо в Конфигураторе меню Отладка — Вычислить выражение
22 — 26.06.15 — 13:15
ЭлементНоменклатуры – ссылка на элемент справочника Номен-
клатура, для которого мы хотим получить розничную цену.
я не знаю каким образом эта ссылка задана, я не писал таокго в коде и в свойствах тоже нигде не прописывал… не понятно..
23 — 26.06.15 — 13:18
ошибка не здесь: Функция РозничнаяЦена покажи как вызываешь.
24 — 26.06.15 — 13:19
(23)
&НаКлиенте
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
// Получить текущую строку табличной части.
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
// Установить цену.
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
// Пересчитать сумму строки.
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
25 — 26.06.15 — 13:25
26 — 26.06.15 — 13:31
Отбор = Новый Структура («Измерение1», ЭлементНоменклатуры);
27 — 26.06.15 — 14:08
(26) Что это значит?
28 — 26.06.15 — 14:11
(27) это значит, что измерение у тебя не «Номенклатура»
29 — 28.06.15 — 13:32
(28) Ну не знаю.. всё равно не понятно
Функция РозничнаяЦена (АктуальнаяДата, ЭлементНоменклатуры) Экспорт
// Создать воспомогательный объект «Отбор»
Отбор = Новый Структура («Номенклатура», ЭлементНоменклатуры);
// Получить актуальны значения ресурсов регистра.
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
30 — 28.06.15 — 14:16
(29)Если не можешь, ну запросом тогда.
Если конечно ты и про запросы ветку не поднимешь…
31 — 28.06.15 — 15:43
(29) В регистре сведений Цены у тебя нет поля Номенклатура. Посмотри внимательнее на этот регистр.
32 — 28.06.15 — 17:01
(31) Я не дал название измерению Номенклатура в регистре сведений, забыл просто. Спасибо, исправил свою ошибку, всё заработало))
33 — 28.06.15 — 17:06
Гениально….
Loki Evil
34 — 28.06.15 — 18:21
Могу посоветовать не использовать объектную модель для чтения данных воооооообще, а использовать запросы и особенно конструктор запросов — никаких таких проблем бы не возникло, сразу же бы увидели в конструкторе, что с таблицей регистра беда.
Скорость работы запросов на уровне, а за счет более тонкой фильтрации данных часто удается отобрать лучше и в итоге работает намного быстрее. Это не говоря о запросах по нескольким таблицам.
sergson |
|
||
---|---|---|---|
|
Ошибка {Документ.РеализацияТоваровИУслуг.Форма.ФормаДокумента.Форма(23)}: Ошибка при вызове метода контекста (ПолучитьПоследнее) ЦенаТовара = РегистрыСведений.Цены.ПолучитьПоследнее(,Отбор); по причине: Недопустимое значение параметра (параметр номер ‘2’) Код 1C v 8.х
|
Yandex |
|
||
---|---|---|---|
|
IBReiter |
|
||
---|---|---|---|
|
Вам нужно проверить, что в отбор попадает. И сверить имена измерений регистра и полей отбора структуры |
E_Migachev |
|
||
---|---|---|---|
|
Вот Как получить последнее значение регистра сведений? В целом у тебя вроде все правильно, передаешь структуру — может ей не нравится тип цен, попробуй без него |
sergson |
|
||
---|---|---|---|
|
Пробывал без ТипЦен или без Номенклатура ошибка та же |
IBReiter |
|
||
---|---|---|---|
|
Отбор — это: «Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение». Возвращаемое значение: «Структура, содержащую значения ресурсов». Вы пытаетесь передать значения ресурсов, чтобы получить измерение, а нужно делать наоборот. Вам нужно, чтобы номенклатура и типцен были измерениями, а цена — ресурс. Это будет правильно и Ваш алгоритм будет работать |
all4cf |
|
||
---|---|---|---|
|
Как-то регистр наоборот, конфа самописная? |
sergson |
|
||
---|---|---|---|
|
sergson |
|
||
---|---|---|---|
|
Большое спасибо все заработало, помогло сообщение — Отбор — это: «Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение».Возвращаемое значение: «Структура, содержащую значения ресурсов».Вы пытаетесь передать значения ресурсов, чтобы получить измерение, а нужно делать наоборот.
Вам нужно, чтобы номенклатура и типцен были измерениями, а цена — ресурс. Это будет правильно и Ваш алгоритм будет работать |
Подсказка:Вы можете добавить любую страничку в Социальные закладки щелкнув по значку соцсетей (в вверху) |
Tais80
Новенький |
Доброго всем суток! Вот решилась на ответственный шаг изучения программирования 1С бухгалтерии. Мне как новичку предложили учитЬся по книге М.Г.Радченко 1С Предприятие 8.1. СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные; СтрокаТабличнойЧасти.Цена = РозничнаяЦена(Дата,Элемент.Значение); РассчитатьСумму(СтрокаТабличнойЧасти); А вот ошибка {Document.ОказаниеУслуг.Form.ФормаДокумента(72,49)}: Переменная не определена (Элемент) А вот код функции РозничнаяЦена, которую я использую в общем модуле. Функция РозничнаяЦена (АктуальнаяДата, ЭлементНоменклатуры)Экспорт Все смотрю, что сделала не так? Где мне нужно определить этот Элемент? Буду очень признательна за ответ. |
||
|
Tais80
Новенький |
Все получилось! Элемент это и есть Control !!! |
||
|
SHveД
Интересующийся |
Тоже беда в этом же разделе книги, Регистр Сведений, уже задавал по этому поводу вопрос, спасибо, помогли, переделал все с нуля, так другая ошибка выскакивает: Ошибка при вызове метода контекста (ПолучитьПоследнее):Недопустимое значение параметра(параметр номер 2) {ОбщийМодуль.РаботаСоСправочниками(7)}: Ошибка при вызове метода контекста (ПолучитьПоследнее): Недопустимое значение параметра (параметр номер ‘2’) Все строчки общего Модуля: Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт // Создать вспомогательный объект Отбор // Получить актуальные значения ресурсов регистра Возврат ЗначенияРесурсов.Цена; КонецФункции Помогите иначе у меня будут проблемы. |
||
|
Kivals |
1. ЭлементНоменклатуры — точно заполнен? |
||
|
SHveД
Интересующийся |
+++1. ЭлементНоменклатуры — точно заполнен? 1.Да, там находится название тризистора, ведь суть решения с использованием периодического регистра сведений, по изменению в документе Оказание Услуги даты, кофигурация берет данные внесеные в Регистр Сведений и меняет цену в документе Оказание Услуги данного транзистора, но выдает ошибку. П.С. подскажите как здесь вложить скрин экрана. что б не описывать все словами, лучше один раз увидет -чем |
||
|
Sel
Злобный
|
SHveД, перед отправкой поста нажми кнопку «Предпросмотр», потом- «Дополнительные опции», появится возможность добавить вложение, прикрепишь свой скрин. |
||
Слово не воробей. Всё не воробей, кроме воробья. |
Kivals |
Жду скринов… |
||
|
SHveД
Интересующийся |
Сорри, был в отъезде… вот скрины Процедура ПереченьНоменклатурыНомеклатураПриИзменении(Элемент) // Установить цену // Пересчитать сумму строки |
SHveД
Интересующийся |
ИзвИняюсь, не зна,л что скрины не выкладывает,а делает ссылку на них, названия бы точней оформил |
||
|
Kivals |
Offtopic: SHveД, чтобы выложить скрин — можно «подсмотреть» его адрес в отправленном посте, а потом отредактировать пост, вставив [IMG]http://здесь подсмотренная ссылка[/IMG] |
||
|
Kivals |
М-да — ничего не прояснилось |
||
|
SHveД
Интересующийся |
Вот он, в архиве |
||
|
Kivals |
Все очень просто: у тебя измерение в регистре сведений называется «Номеклатура» вместо «Номенклатура» |
||
|
SHveД
Интересующийся |
Offtopic: Да блин… есть смайл бьюсь головой об стену и разбиваю её на хрен за не надобностью, уже второй раз делаю в этом ошибку (!) , большое тебе спасибо за оказаную помощь и очередное напоминание что я безнадежен во внимательности |
||
|
Создал регистр сведений «Цены» чтобы управлять ценами через него.
Изменяю цены, потом захожу в Заказ-Наряд , создаю его с той услугой которой поставил цены , но он выдает ошибку!
Помогите пожалуйста, не могу понять где проблема
1C | ||
|
Общий модуль «РаботаСоСправочниками»
1C | ||
|
Документ ЗаказНаряд , процедура которая отвечает за то, чтобы он выводил цену указанное в регистре сведений
1C | ||
|
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Приглашаем на
бесплатный вебинар!
06 июня в 11:00 мск
1 час
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.