Ошибка при вызове процедуры выполняемой на сервере

1. TheOldGuard 12 15.02.22 22:18 Сейчас в теме
Всем большой привет, я начинающий программист 1С.
Пытаюсь реализовать заполнение остатков в таблице документа СписаниеДС (Списание денежных средств) из виртуальной таблицы регистра накопления ОстаткиДенежныхСредствОстаткиИОбороты.
Команду размещаю в форме, при выполнении и вызове процедуры на сервере выдает ошибку:
Ошибка при вызове метода контекста (ЗаполнитьОстаткиНаСервере)
{Документ.СписаниеДС.Форма.ФормаДокумента.Форма(52)}: ЗаполнитьОстаткиНаСервере(Стр);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'

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

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

&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
	Стр = Элементы.Списание.ТекущиеДанные;
	//ЗаполнитьОстаткиНаСервере(СтрокаТабличнойЧасти);
	Для Каждого Стр Из Объект.Списание Цикл
		ЗаполнитьОстаткиНаСервере(Стр);
	КонецЦикла;
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
9. Sashares 33 16.02.22 14:48 Сейчас в теме
(6) Как это примерно должно выглядеть при нормальной реализации.

&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
    ТекДанные = Элементы.Списание.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ТекДанные.СуммаСписаний = ПолучитьСуммуОстаткаПоСчету(ТекДанные.СчетКонтрагента);

КонецПроцедуры


&НаСервереБезКонтекста
Функция ПолучитьСуммуОстаткаПоСчету(Знач СчетКонтрагента)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
                   |ИЗ
                   |    РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
    Запрос.УстановитьПараметр("СчетКонтрагента",СчетКонтрагента);
    
    Выборка = Запрос.Выполнить().Выбрать();
    СуммаОстатка = 0;
    Если Выборка.Следующий() Тогда
        СуммаОстатка  = Выборка.СуммаОстаток;
    КонецЕсли;
    Возврат СуммаОстатка;
КонецФункции
Показать
TheOldGuard; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1203706 15 16.02.22 00:10 Сейчас в теме
(1) это какая-то неведомая хрень..
Выкинуть всё срочно в топку.

Тут даже советовать лень, начиная с нелепой передачи строки табличной части на клиенте, до получения с этой строки объекта на сервере и нелепого текста запроса..
Тут всё только в топку.
3. TheOldGuard 12 16.02.22 00:13 Сейчас в теме
(2) До вашего ответа я почитал еще информацию, теперь пытаюсь передавать через таблицу значений, но выходит пока туго. Смысл в том, что нельзя передавать те данные, которые я передавал на сервер и обратно соответственно.
Также РеквизитФормыВЗначение как-то можно применить, но все никак не доходит.
Я пока что учусь, поэтому считаю, что допускать ошибки это наоборот хорошо)
4. 1395969 71 16.02.22 01:23 Сейчас в теме
Ничего из Клиента на Сервер передавать не нужно
Все делай только на Сервере
Из Клиента только вызывай Серверную процедуру. без параметров
Swetlana; Sashares; +2 Ответить
6. TheOldGuard 12 16.02.22 10:18 Сейчас в теме
(4) В общем реализовал необходимый мне функционал.
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
	ИндексСтроки = Элементы.Списание.ТекущаяСтрока;
	
	//Преобразуем данные текущей строки в структуру
	ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();
	
	//Получим интересующие нас значения
	ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки);
	
	//Изменим значения реквизитов текущей строки
	ЗаполнитьЗначенияСвойств(Объект.Списание[ИндексСтроки], ДанныеТекущейСтроки, "СуммаСписаний");
КонецПроцедуры

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

&НаСервереБезКонтекста
Процедура ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
	               |ИЗ
	               |	РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
	Запрос.УстановитьПараметр("СчетКонтрагента",ДанныеТекущейСтроки.СчетКонтрагента);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		ДанныеТекущейСтроки.СуммаСписаний = Выборка.СуммаОстаток;
	КонецЦикла;
КонецПроцедуры
Показать
Прикрепленные файлы:
8. SlavaKron 16.02.22 11:36 Сейчас в теме
(6)
ИндексСтроки = Элементы.Списание.ТекущаяСтрока
...
ЗаполнитьЗначенияСвойств(Объект.Списание[ИндексСтроки], ДанныеТекущейСтроки, "СуммаСписаний");
Это не индекс строки, а идентификатор. Ошибки будут.
TheOldGuard; +1 Ответить
9. Sashares 33 16.02.22 14:48 Сейчас в теме
(6) Как это примерно должно выглядеть при нормальной реализации.

&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
    ТекДанные = Элементы.Списание.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ТекДанные.СуммаСписаний = ПолучитьСуммуОстаткаПоСчету(ТекДанные.СчетКонтрагента);

КонецПроцедуры


&НаСервереБезКонтекста
Функция ПолучитьСуммуОстаткаПоСчету(Знач СчетКонтрагента)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
                   |ИЗ
                   |    РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
    Запрос.УстановитьПараметр("СчетКонтрагента",СчетКонтрагента);
    
    Выборка = Запрос.Выполнить().Выбрать();
    СуммаОстатка = 0;
    Если Выборка.Следующий() Тогда
        СуммаОстатка  = Выборка.СуммаОстаток;
    КонецЕсли;
    Возврат СуммаОстатка;
КонецФункции
Показать
TheOldGuard; +1 Ответить
10. TheOldGuard 12 17.02.22 18:05 Сейчас в теме
(9) Очень интересное решение, а главное правильное.
Не могли бы вы мне написать в чем проблема моей реализации и почему ваша верная, я в этом не сомневаюсь и использую именно ваш способ.
А также, если не трудно не могли бы вы посоветовать, что лучше всего почитать, чтобы понять как правильно реализовывать подобные механизмы и не только, огромное вам спасибо.
15. Sashares 33 17.02.22 22:21 Сейчас в теме
(10)
в чем проблема моей реализации

1) Вы делаете лишние действия, которые не нужны.

  //Преобразуем данные текущей строки в структуру
    ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();


Для получения остатка на сервере в вашей процедуре нужен только счет. Его можно получить в текущих данных, и передать его на сервер, для этого не надо ничего дополнительно преобразовывать.

2) Использование идентификатора строки как индекса:
ИндексСтроки = Элементы.Списание.ТекущаяСтрока;

    //Изменим значения реквизитов текущей строки
    ЗаполнитьЗначенияСвойств(Объект.Списание[ИндексСтроки], ДанныеТекущейСтроки, "СуммаСписаний");


Как вам уже сказали, идентификатор строки это не индекс, могут быть ошибки. Простой пример - добавьте пару строк в таблицу, удалите их все, добавьте еще пару строк, попробуйте выполнить ваш код - будет ошибка.

По поводу что почитать - таких тем много даже на этом сайте.
https://forum.infostart.ru/forum9/topic222360/

Основы конечно - Радченко М.Г.
TheOldGuard; +1 Ответить
5. starjevschik 16.02.22 08:12 Сейчас в теме
лучше на какие-нибудь курсы программирования сходить. Есть некие азы, основы, которые все же надо понимать, прежде чем что-то программировать. Что такое процедура, что такое параметры и т.п. Заодно и про базы данных что-нибудь узнать, это будет следующая проблема.
12. TheOldGuard 12 17.02.22 18:12 Сейчас в теме
(5) Добрый вечер, быть может вы знаете какие-то записанные лекции или электронный теоретический материал? Буду рад, если поделитесь знаниями!
13. starjevschik 17.02.22 18:48 Сейчас в теме
(12) ну может где-то здесь
https://vc.ru/books/123994-top-10-knig-po-programmirovaniyu-dlya-nachinayushchih-ot-profi-svoego-dela
я так давно это все проходил, наверное несколько устарел...
TheOldGuard; +1 Ответить
14. TheOldGuard 12 17.02.22 19:38 Сейчас в теме
(13) Я почитаю, думаю будет очень полезно, спасибо за помощь!
7. 1395969 71 16.02.22 11:34 Сейчас в теме
(6) Не буду критиковать этот код. Не благодарное это дело
Скажу только, что вместо того, чтобы просто посчитать "2+2=4"
можно, например, посчитать следующее выражение "sqrt(4/8*16-28/7) + sin(Pi/6)/2*2^3 = 4"
В Вашем коде примерно так и сделано
Не оставляйте его в таком виде. Все можно сделать намного проще
Это будет отличный 1-й опыт программирования
11. TheOldGuard 12 17.02.22 18:07 Сейчас в теме
(7) Виктор, добрый вечер, спасибо за уделенное внимание моей реализации. Очень хотел бы узнать, что стоит прочитать, чтобы не допускать такие и подобные ошибки в будущем, а также, что-то от себя. Огромное вам спасибо!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот