База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку «Недопустимое значение параметра»? › Ответ в теме: Как исправить ошибку «Недопустимое значение параметра»?
Ошибка возникает именно в этой строке:
|
1 |
ЗаполнитьЗначенияСвойств(СтрокаРасшифровки, ДанныеОбъектРасчетов); |
Сообщение:
|
1 |
Недопустимое значение параметра (параметр номер '1') |
означает, что первый параметр, то есть СтрокаРасшифровки, не является допустимым приемником для заполнения.
Метод ожидает, что первым параметром будет, например:
— строка табличной части;
— строка таблицы значений;
— структура;
— объект с доступными для записи свойствами.
А фактически СтрокаРасшифровки, скорее всего, равна Неопределено, содержит ссылку вместо объекта, является обычным значением или вообще не была создана.
## Наиболее вероятная причина
Перед выполнением строки:
|
1 |
ЗаполнитьЗначенияСвойств(СтрокаРасшифровки, ДанныеОбъектРасчетов); |
не была добавлена строка в табличную часть РасшифровкаПлатежа.
Должно быть примерно так:
|
1 2 3 4 5 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); |
Если строка должна добавляться только при определенном условии:
|
1 2 3 4 5 6 7 8 9 |
Если ДанныеОбъектРасчетов <> Неопределено Тогда СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); КонецЕсли; |
## Что проверить непосредственно перед строкой 322
В процедуре ЗаполнитьРасшифровкуСписания найдите примерно строки 300-322 и проверьте, где присваивается значение переменной:
|
1 |
СтрокаРасшифровки |
Должно присутствовать присваивание одного из видов:
|
1 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); |
или:
|
1 |
СтрокаРасшифровки = ТаблицаЗначений.Добавить(); |
или:
|
1 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа[ИндексСтроки]; |
Если такого присваивания нет, переменная не содержит допустимую строку.
## Временная диагностика
Перед проблемной строкой можно добавить проверку:
|
1 2 3 4 5 6 7 8 9 10 11 |
Если СтрокаРасшифровки = Неопределено Тогда ВызватьИсключение "Не создана строка расшифровки платежа"; КонецЕсли; Если ДанныеОбъектРасчетов = Неопределено Тогда ВызватьИсключение "Не заполнены данные объекта расчетов"; КонецЕсли; ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); |
Это даст более понятную ошибку и подтвердит, какая переменная не заполнена.
Можно также временно записать в журнал регистрации:
|
1 2 3 4 5 6 7 8 |
ЗаписьЖурналаРегистрации( "КлиентБанк.Диагностика", УровеньЖурналаРегистрации.Информация, , , "СтрокаРасшифровки: " + Строка(ТипЗнч(СтрокаРасшифровки)) + Символы.ПС + "ДанныеОбъектРасчетов: " + Строка(ТипЗнч(ДанныеОбъектРасчетов))); |
Но если СтрокаРасшифровки равна Неопределено, ТипЗнч() это покажет не всегда удобно. Надежнее проверять явно:
|
1 2 3 4 5 |
Если СтрокаРасшифровки = Неопределено Тогда ТипСтроки = "Неопределено"; Иначе ТипСтроки = Строка(ТипЗнч(СтрокаРасшифровки)); КонецЕсли; |
## Важный момент: первый параметр является приемником
Правильное использование:
|
1 2 3 4 5 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); |
Неправильные варианты:
|
1 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Ссылка; |
|
1 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Количество(); |
|
1 |
СтрокаРасшифровки = Неопределено; |
|
1 |
СтрокаРасшифровки = ДокументОбъект.Ссылка; |
Ссылка на документ не является строкой табличной части, которую можно заполнять свойствами.
## Возможная ошибка после предыдущего исправления
В предыдущем сообщении у вас была ошибка с переменной:
|
1 |
ПараметрыДобавленияСтроки |
Если вы вручную добавляли или переносили фрагменты кода, возможно, нарушилась последовательность создания строки расшифровки.
Например, мог получиться такой код:
|
1 2 3 4 5 6 7 8 9 |
Если Условие Тогда ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); КонецЕсли; |
Это неправильно. Сначала нужно создать строку, затем заполнить ее:
|
1 2 3 4 5 6 7 8 9 |
Если Условие Тогда СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); КонецЕсли; |
## Если строка должна переиспользоваться
Иногда строка расшифровки создается только один раз, а затем заполняется в цикле. В этом случае нужно проверить логику:
|
1 2 3 4 5 6 7 8 9 |
Если ДокументОбъект.РасшифровкаПлатежа.Количество() = 0 Тогда СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); Иначе СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа[0]; КонецЕсли; ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); |
Однако если каждое назначение платежа должно быть отдельной строкой, правильнее добавлять новую строку на каждой итерации:
|
1 2 3 4 5 6 7 8 9 |
Для Каждого ДанныеОбъектРасчетов Из ДанныеРасчетов Цикл СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); КонецЦикла; |
## Проверьте второй параметр
В данном сообщении ошибка указывает на первый параметр, но после его исправления может обнаружиться проблема с ДанныеОбъектРасчетов.
Перед заполнением можно проверить его тип:
|
1 2 3 |
Если ДанныеОбъектРасчетов = Неопределено Тогда Возврат; КонецЕсли; |
Если это структура, заполнение допустимо:
|
1 2 3 |
ДанныеОбъектРасчетов = Новый Структура; ДанныеОбъектРасчетов.Вставить("СтатьяДДС", СтатьяДДС); ДанныеОбъектРасчетов.Вставить("Сумма", Сумма); |
Если это строка таблицы значений, также допустимо:
|
1 |
ДанныеОбъектРасчетов = ТаблицаРасчетов[Индекс]; |
Но если там находится, например, число, ссылка или строка текста, использовать ее в качестве второго параметра нельзя:
|
1 2 3 |
ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, 1000); |
## Рекомендуемый вариант исправления
В процедуре ЗаполнитьРасшифровкуСписания блок должен иметь общий смысл примерно такой:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Если ДанныеОбъектРасчетов <> Неопределено Тогда СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); // Дополнительное заполнение реквизитов строки // СтрокаРасшифровки.СтатьяДвиженияДенежныхСредств = ...; // СтрокаРасшифровки.Сумма = ...; КонецЕсли; |
Если строка уже создается выше, тогда добавлять вторую строку не нужно. Нужно только убедиться, что присваивание выполняется до ЗаполнитьЗначенияСвойств:
|
1 2 3 4 5 6 7 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); Если ЗначениеЗаполнено(ДанныеОбъектРасчетов) Тогда ЗаполнитьЗначенияСвойств( СтрокаРасшифровки, ДанныеОбъектРасчетов); КонецЕсли; |
## Отдельно о расширении
В стеке видно два модуля:
|
1 |
{ЗаполнениеКассовыхБанковскихДок ОбщийМодуль.КлиентБанкСервер.Модуль} |
и:
|
1 |
{ОбщийМодуль.КлиентБанкСервер.Модуль} |
Это похоже на то, что используется расширение конфигурации ЗаполнениеКассовыхБанковскихДок, в котором есть собственная версия общего модуля КлиентБанкСервер.
Поэтому нужно проверить не только основной общий модуль, но и расширение:
|
1 2 3 4 5 |
Конфигурация Расширения конфигурации ЗаполнениеКассовыхБанковскихДок Общие модули КлиентБанкСервер |
Вероятные причины:
1. Расширение рассчитано на другую версию конфигурации.
2. В расширении изменена процедура ЗаполнитьРасшифровкуСписания.
3. После обновления типовой конфигурации расширение осталось от старого релиза.
4. При объединении был потерян участок, создающий СтрокаРасшифровки.
5. В расширении используется несовместимая версия процедуры ЗаполнитьРеквизитыСписания.
Правильное решение, если ошибка появилась после обновления, это сравнить процедуру ЗаполнитьРасшифровкуСписания из расширения с версией для текущего релиза конфигурации. Простое добавление Новый Структура или обход ошибки через Попытка...Исключение здесь нежелательно, поскольку проблема находится в создании строки расшифровки.
В первую очередь проверьте, что до строки 322 выполняется:
|
1 |
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить(); |
Если этого присваивания нет либо оно находится после строки 322, это и есть причина текущей ошибки.