Всем привет, сразу прошу меня не расстреливать.
Выдается такая ошибка:

{Документ.ПеремещениеМатериалов.Форма.ФормаДокумента.Форма(4)}: Ошибка при вызове метода контекста (ПеремещМат)
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ОстЦенХранилище,ДанныеФормыЭлементКоллекции);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
 форма: Элемент
 имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'

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

В модуле формы

```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент,ОстЦенХранилище,СтрокаТабличнойЧасти, ДанныеФормыЭлементКоллекции,ТЗ,Запрос )
    СтрокаТабличнойЧасти = Элементы.ПМ.ТекущиеДанные;
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ОстЦенХранилище,ДанныеФормыЭлементКоллекции);
    ОстЦенХранилище.Получить();
    Выборка=Запрос.Выполнить().Выбрать();
    Для каждого ТекущаяСтрока Из ТЗ Цикл
    Если СтрокаТабличнойЧасти.Номенклатура = ТЗ.Номенклатура Тогда
    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = ТЗ.ЦенаЗаЕденицу И
    СтрокаТабличнойЧасти.ОстатокНаСкладе = ТЗ.ОстатокНаСкладе
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```

В общем модуле

```1c
    &НаСервере
    Процедура ПеремещМат (СтрокаТабличнойЧасти,ОстЦенХранилище,ДанныеФормыЭлементКоллекции) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
    | ЦеныСрезПоследних.Цена КАК ЦенаЗаЕденицу,
    | СУММА(ОстаткиМатериаловОстатки.КоличествоОстаток) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, ) КАК ЦеныСрезПоследних
    | ПО (ИСТИНА)
    |ГДЕ
    | ОстаткиМатериаловОстатки.Материал = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | ЦеныСрезПоследних.Номенклатура,
    | ЦеныСрезПоследних.Цена";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    РезультатЗапроса = Запрос.Выполнить();
    ТЗ=РезультатЗапроса.Выгрузить();
    ОстЦенХранилище = ПоместитьВоВременноеХранилище(ТЗ);
    КонецПроцедуры
```
---
&НаСервереБезКонтекста изменить на &НаСервере - тогда заработает. Может быть...
Нельзя совмещать &НаСервереБезКонтекста и передачу данных формы в процедуру, потому что при вызове &НаСервереБезКонтекста передача формы на сервер (ну, упрощенно...) не происходит, и данных формы на сервере тоже нет

А вообще, код жуткий... Ну зачем чесать левой пяткой за правым ухом? Установку цены номенклатуры при изменении уже тыщу раз делали кому не лень:

```1c
    Процедура ПеремещМат (СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | &Номенклатура КАК Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0) КАК ЦенаЗаЕденицу,
    | СУММА(isnull(ОстаткиМатериаловОстатки.КоличествоОстаток, 0)) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК ЦеныСрезПоследних
    | ПО ОстаткиМатериаловОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | &Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0)";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("Номенклатура", ДанныеФормыЭлементКоллекции.Номенклатура);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Если Выборка.Следующий() Тогда
    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = Выборка.ЦенаЗаЕденицу;
    СтрокаТабличнойЧасти.ОстатокНаСкладе = Выборка.ОстатокНаСкладе
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```

Хотя и это не идеально... Например, когда остатков в регистре нет - будет плохо
---
```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент )
    СтрокаТабличнойЧасти = Элементы.ПМ.ТекущиеДанные;
    ПараметрыСтроки = Новый Структура("Номенклатура",СтрокаТабличноцЧасти.Номенклатура);
    СтруктураВозврата = ПеремещДок.ПеремещМат(ПараметрыСтроки );

    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = СтруктураВозврата .ЦенаЗаЕденицу ;
    СтрокаТабличнойЧасти.ОстатокНаСкладе = СтруктураВозврата .ОстатокНаСкладе;
    КонецПроцедуры;
```

В модуле

```1c
    Процедура ПеремещМат (Параметры) Экспорт
    СтруктураВозврата = Новый Структура( "ЦенаЗаЕденицу , ОстатокНаСкладе",0,0);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | &Номенклатура КАК Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0) КАК ЦенаЗаЕденицу,
    | СУММА(isnull(ОстаткиМатериаловОстатки.КоличествоОстаток, 0)) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК ЦеныСрезПоследних
    | ПО ОстаткиМатериаловОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | &Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0)";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("Номенклатура", Параметры.Номенклатура);
    Выборка= Запрос.Выполнить().Выбрать();

    Если Выборка.Следующий() Тогда
    ЗаполнитьЗначенияСвойств(СтруктураВозврата,Выборка)
    КонецЕсли;
    Возврат СтруктураВозврата;

    КонецПроцедуры
```
---
На
(1) &НаКлиенте
и
(1) Выборка=Запрос.Выполнить().Выбрать();
Для каждого ТекущаяСтрока Из ТЗ Цикл

вместе не живут. На клиенте не существует ни выборки из запроса, ни таблицы значений. Так что совершенно логично, что ошибка выдается.
Изменение ТЧ номенклатуры надо на сервере проводить.
---
Сделал так:

```1c
    &НаСервереБезКонтекста
    Процедура ПеремещМат (СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
    | ЦеныСрезПоследних.Цена КАК ЦенаЗаЕденицу,
    | СУММА(ОстаткиМатериаловОстатки.КоличествоОстаток) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, ) КАК ЦеныСрезПоследних
    | ПО (ИСТИНА)
    |ГДЕ
    | ОстаткиМатериаловОстатки.Материал = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | ЦеныСрезПоследних.Номенклатура,
    | ЦеныСрезПоследних.Цена";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Для каждого ТекущаяСтрока Из Выборка Цикл
    Если СтрокаТабличнойЧасти.Номенклатура = Выборка.Номенклатура Тогда
    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = Выборка.ЦенаЗаЕденицу И
    СтрокаТабличнойЧасти.ОстатокНаСкладе = Выборка.ОстатокНаСкладе
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```

```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент,СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции)
    СтрокаТабличнойЧасти = Элементы.ПМ.ТекущиеДанные;
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции);
    КонецПроцедуры
```

Теперь выдало такую ошибку:

{Документ.ПеремещениеМатериалов.Форма.ФормаДокумента.Форма(4)}: Метод объекта не обнаружен (ПеремещМат)
  ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции);
---
&НаСервереБезКонтекста изменить на &НаСервере - тогда заработает. Может быть...
Нельзя совмещать &НаСервереБезКонтекста и передачу данных формы в процедуру, потому что при вызове &НаСервереБезКонтекста передача формы на сервер (ну, упрощенно...) не происходит, и данных формы на сервере тоже нет

А вообще, код жуткий... Ну зачем чесать левой пяткой за правым ухом? Установку цены номенклатуры при изменении уже тыщу раз делали кому не лень:

```1c
    Процедура ПеремещМат (СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | &Номенклатура КАК Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0) КАК ЦенаЗаЕденицу,
    | СУММА(isnull(ОстаткиМатериаловОстатки.КоличествоОстаток, 0)) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК ЦеныСрезПоследних
    | ПО ОстаткиМатериаловОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | &Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0)";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("Номенклатура", ДанныеФормыЭлементКоллекции.Номенклатура);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Если Выборка.Следующий() Тогда
    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = Выборка.ЦенаЗаЕденицу;
    СтрокаТабличнойЧасти.ОстатокНаСкладе = Выборка.ОстатокНаСкладе
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```

Хотя и это не идеально... Например, когда остатков в регистре нет - будет плохо
---
Изменил, снова выдаёт ошибку первую

ошибка{Документ.ПеремещениеМатериалов.Форма.ФормаДокумента.Форма(4)}: Ошибка при вызове метода контекста (ПеремещМат)
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
 форма: Элемент
 имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
---
Я тоже не заметил. Описание
```1c
    Процедура ПеремещМат (СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции) Экспорт
```
 надо изменить на:
```1c
    &НаСервере
    Процедура ПеремещМат (СтрокаТабличнойЧасти) Экспорт
```

Вызов
```1c
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ДанныеФормыЭлементКоллекции);
```

на
```1c
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти);
```

Данные формы вообще не нужны

В самое процедуре:

```1c
    Запрос.УстановитьПараметр("Номенклатура", ДанныеФормыЭлементКоллекции.Номенклатура);
```

заменить на

```1c
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
```
---
сделал так, та же ошибка
---
Строку нельзя передавать, тек как это данныеФормы..они на сервер не пердаются...
---
В случае &НаСервереБезКонтекста - согласен, а если &НаСервере - то еще как передаются
---
Пример в студию...где у вас текстрока на сервер передается, не идентификатор а именно тек строка....
---
Всё равно выдаёт ту же ошибку, по поводу кода - мне без разницы, как он сейчас выглядит, главное что бы работал и данные в табличную часть вписались, я в этом разобраться не могу, почему эта ошибка постоянно вылазит, к тому же, когда это сделаю дальше, всё равно и код и запрос переделывать надо будет
---
Нельзя с клиента на сервер передавать ДанныеФормы, а тут передаются ТекущиеДанные. Нужно создать структуру и скопировать туда текущие данные и её уже передавать в качестве параметра "СтрокаТабличнойЧасти".
Типа:
СтрокаТабличнойЧасти = Новый Структура("ИмяКолонки1, ИмяКолонки2, ...);
ЗаполнитьЗначенияСвойств(СтрокаТабличнойЧасти, Элементы.ПМ.ТекущиеДанные);
---
Почему такое ощущение, что где-то в середине кода вас стукнули и начисто выбили воспоминание о написанном? Получаете ТЗ из хранилища, а потом бац! - Запрос.Выполнить....
---
Запутался однако, вы лучше подскажите, что и как, а не ругайте, я 1с только изучаю, некоторые моменты мне не понятны, стараюсь конечно разбираться но не всегда выходит
---
Тут 1С вообще не при чем и никто не ругается. Просто наличие форумов сильно понизило приоритет операции "подумать".

    СтрокаТабличнойЧасти = Элементы.ПМ.ТекущиеДанные;
    ПеремещДок.ПеремещМат(СтрокаТабличнойЧасти,ОстЦенХранилище,ДанныеФормыЭлементКоллекции);
    ОстЦенХранилище.Получить(); //получили из временного хранилища таблицу. Куда получили? В воздух? Зачем получили, если потом нигде не используем?
    Выборка=Запрос.Выполнить().Выбрать(); // И внезапно - запрос. Откуда он здесь взялся? Зачем он вообще, если в процедуре, вызванной выше, мы уже все запросили?
---
это от безысходности, есть идея решения проблемы с ошибкой, то подскажите, если нет, то не мешайте, то что вы написали исправлено и убрано уже, а проблема осталась
---
А ты не стесняйся регулярно выкладывать исправленный вариант, сложно в голове держать, что там от первоначального кода-то осталось.
---
Да практически всё тоже самое
---
```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент )
    СтрокаТабличнойЧасти = Элементы.ПМ.ТекущиеДанные;
    ПараметрыСтроки = Новый Структура("Номенклатура",СтрокаТабличноцЧасти.Номенклатура);
    СтруктураВозврата = ПеремещДок.ПеремещМат(ПараметрыСтроки );

    СтрокаТабличнойЧасти.ЦенаЗаЕденицу = СтруктураВозврата .ЦенаЗаЕденицу ;
    СтрокаТабличнойЧасти.ОстатокНаСкладе = СтруктураВозврата .ОстатокНаСкладе;
    КонецПроцедуры;
```

В модуле

```1c
    Процедура ПеремещМат (Параметры) Экспорт
    СтруктураВозврата = Новый Структура( "ЦенаЗаЕденицу , ОстатокНаСкладе",0,0);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | &Номенклатура КАК Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0) КАК ЦенаЗаЕденицу,
    | СУММА(isnull(ОстаткиМатериаловОстатки.КоличествоОстаток, 0)) КАК ОстатокНаСкладе
    |ИЗ
    | РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ОстаткиМатериаловОстатки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК ЦеныСрезПоследних
    | ПО ОстаткиМатериаловОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    | &Номенклатура,
    | isnull(ЦеныСрезПоследних.Цена, 0)";

    Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("Номенклатура", Параметры.Номенклатура);
    Выборка= Запрос.Выполнить().Выбрать();

    Если Выборка.Следующий() Тогда
    ЗаполнитьЗначенияСвойств(СтруктураВозврата,Выборка)
    КонецЕсли;
    Возврат СтруктураВозврата;

    КонецПроцедуры
```
---
СтрокаТабличнойЧасти.ЦенаЗаЕденицу = СтруктураВозврата .ЦенаЗаЕденицу ;
             СтрокаТабличнойЧасти.ОстатокНаСкладе = СтруктураВозврата .ОстатокНаСкладе;

Благодарю за помощь, это помогло, только из процедуры на функцию поменял и всё, ну и запрос немного переделал