Как правильно ПолучитьПоследнее из регистра сведений |
Я |
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
Могу посоветовать не использовать объектную модель для чтения данных воооооообще, а использовать запросы и особенно конструктор запросов — никаких таких проблем бы не возникло, сразу же бы увидели в конструкторе, что с таблицей регистра беда.
Скорость работы запросов на уровне, а за счет более тонкой фильтрации данных часто удается отобрать лучше и в итоге работает намного быстрее. Это не говоря о запросах по нескольким таблицам.
Ошибка при вызове метода контекста(?)
Автор Damates, 18 дек 2012, 20:30
0 Пользователей и 1 гость просматривают эту тему.
Есть такой код:
НайтиТО=Справочники.Тарифы.НайтиПоНаименованию(«ТО»);//находит
ЗначениеТО=РегистрыСведений.Тарифы.ПолучитьПоследнее(КонПериода,НайтиТО);
Сообщить(ЗначениеТО.Ресурс1);//ресурс в регистре сведений
Выдает ошибку:
{Справочник.Лицевые.Форма.ФормаСписка.Форма(79)}: Ошибка при вызове метода контекста (ПолучитьПоследнее)
ЗначениеТО=РегистрыСведений.Тарифы.ПолучитьПоследнее(КонПериода,НайтиТО);
по причине:
Несоответствие типов (параметр номер ‘2’)
Измерение в регистре сведений берется из справочника Тарифы. В чем проблема? Подскажите , пожалуйста!
Второй параметр должен быть: (И снова приходиться цитировать СП… =( , ну неужели клавиша F1 на клавиатуре заблокирована)
ПолучитьПоследнее (GetLast)
Синтаксис:
ПолучитьПоследнее(<КонецПериода>, <Отбор>)
Параметры:
<КонецПериода> (необязательный)
Тип: Дата; МоментВремени; Граница.
Определяет момент времени, по который необходимо получить значения ресурсов. Может задаваться значениями типа Дата, МоментВремени или Граница. Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра.
<Отбор> (необязательный)
Тип: Структура.
Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Спасибо! Все понял Сделал так:
НайтиТО=Справочники.Тарифы.НайтиПоНаименованию(«ТО»);
//Сообщить(НайтиТО);
Тариф = Новый Структура;
Тариф.Вставить(«Тариф», НайтиТО);
ЗначениеТО=РегистрыСведений.Тарифы.ПолучитьПоследнее(КонПериода,Тариф);
Сообщить(ЗначениеТО.Ресурс1);
Фишка: Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение.
|
medved62 19 / 0 / 0 Регистрация: 08.10.2013 Сообщений: 27 |
||||
|
1 |
||||
Ошибка при выполнении21.05.2014, 23:37. Показов 2298. Ответов 3 Метки нет (Все метки)
Новичок в изучении 1С Ошибка:
__________________
0 |
|
2954 / 1766 / 82 Регистрация: 03.11.2011 Сообщений: 8,280 |
|
|
22.05.2014, 00:02 |
2 |
|
отбор кривой. Отладчиком попользуйтесь.
0 |
|
19 / 0 / 0 Регистрация: 08.10.2013 Сообщений: 27 |
|
|
26.05.2014, 19:42 [ТС] |
3 |
|
Пользуюсь отладчиком, так как не силен в 1С , конфа самописная, а форму как посмотреть, если клиент то автоматически
0 |
|
2954 / 1766 / 82 Регистрация: 03.11.2011 Сообщений: 8,280 |
|
|
26.05.2014, 21:05 |
4 |
|
Пользуюсь отладчиком ну так и посмотрите, что из себя представляет Отбор
так как не силен в 1С ну раз пользуетесь отладчиком — напрягитесь, погуглите по разделу — есть в темах ссылки на мануалы
а форму как посмотреть, если клиент то автоматически есть ещё режим: управляемый, обычный. Смотреть в конфигураторе, ПКМ на форме — документа, например — Свойства, там тип формы. В каком объекте при каком событии возникла ошибка?
0 |
| sergson |
|
||
|---|---|---|---|
|
|
Ошибка {Документ.РеализацияТоваровИУслуг.Форма.ФормаДокумента.Форма(23)}: Ошибка при вызове метода контекста (ПолучитьПоследнее) ЦенаТовара = РегистрыСведений.Цены.ПолучитьПоследнее(,Отбор); по причине: Недопустимое значение параметра (параметр номер ‘2’) Код 1C v 8.х
|
| Yandex |
|
||
|---|---|---|---|
|
|
| IBReiter |
|
||
|---|---|---|---|
|
|
Вам нужно проверить, что в отбор попадает. И сверить имена измерений регистра и полей отбора структуры |
| E_Migachev |
|
||
|---|---|---|---|
|
|
Вот Как получить последнее значение регистра сведений? В целом у тебя вроде все правильно, передаешь структуру — может ей не нравится тип цен, попробуй без него |
| sergson |
|
||
|---|---|---|---|
|
|
Пробывал без ТипЦен или без Номенклатура ошибка та же
|
| IBReiter |
|
||
|---|---|---|---|
|
|
Отбор — это: «Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение». Возвращаемое значение: «Структура, содержащую значения ресурсов». Вы пытаетесь передать значения ресурсов, чтобы получить измерение, а нужно делать наоборот. Вам нужно, чтобы номенклатура и типцен были измерениями, а цена — ресурс. Это будет правильно и Ваш алгоритм будет работать |
| all4cf |
|
||
|---|---|---|---|
|
|
Как-то регистр наоборот, конфа самописная? |
| sergson |
|
||
|---|---|---|---|
|
|
| sergson |
|
||
|---|---|---|---|
|
|
Большое спасибо все заработало, помогло сообщение — Отбор — это: «Структура, содержащая отбор по измерениям регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение».Возвращаемое значение: «Структура, содержащую значения ресурсов».Вы пытаетесь передать значения ресурсов, чтобы получить измерение, а нужно делать наоборот.
Вам нужно, чтобы номенклатура и типцен были измерениями, а цена — ресурс. Это будет правильно и Ваш алгоритм будет работать |
| Подсказка: Для выделения Кода используйте (в редакторе). |
А что значит «использован неправильный подход к именованию реквизитов» ?
Я изменил код, чтоб точно присвоить ТекТовар типа СправочникСсылка.Номенклатура:
Процедура ДопЭлементыНаименованиеПриИзменении(Элемент)
ТекСтрока = ЭлементыФормы.ДопЭлементы.ТекущиеДанные;
ТекТоварНаим = ТекСтрока.Наименование;
ТекТовар = Справочники.Номенклатура.НайтиПоНаименованию(ТекТоварНаим);
ЦенаТовара = РегистрыСведений.Цены.ПолучитьПоследнее(ТекТовар);
ТекСтрока.Цена = ЦенаТовара;
КонецПроцедуры
Выдаёт ошибку: Ошибка при вызове метода контекста (ПолучитьПоследнее): Несоответствие типов (параметр номер «»1″»)
ЦенаТовара = РегистрыСведений.Цены.ПолучитьПоследнее(ТекТовар);
Что не так? 
Добавлено через 49 минут и 3 секунды:
Всё прочитал. Разобрался. Всё получилось. Всем спабо.
Необходимо было сделать так:
Процедура ДопЭлементыНаименованиеПриИзменении(Элемент)
ТекСтрока = ЭлементыФормы.ДопЭлементы.ТекущиеДанные;
ТекТовар = ТекСтрока.Наименование;
Отбор = Новый Структура(«Товар»,ТекТовар);
ЦенаТовара = РегистрыСведений.Цены.ПолучитьПоследнее(,Отбор);
ТекСтрока.Цена = ЦенаТовара.Цена;
КонецПроцедуры
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;

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

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

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

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


