Ошибка при вызове процедуры выполняемой на сервере
Всем большой привет, я начинающий программист 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
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
Показать{Документ.СписаниеДС.Форма.ФормаДокумента.Форма(52)}: ЗаполнитьОстаткиНаСервере(Стр);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
&НаСервере
Процедура ЗаполнитьОстаткиНаСервере(Стр)
Запрос = Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| ОстаткиДенежныхСредствОстаткиИОбороты.СчетКонтрагента КАК СчетКонтрагента,
| ОстаткиДенежныхСредствОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
|ИЗ
| РегистрНакопления.ОстаткиДенежныхСредств.ОстаткиИОбороты КАК ОстаткиДенежныхСредствОстаткиИОбороты
|ГДЕ
| ОстаткиДенежныхСредствОстаткиИОбороты.СчетКонтрагента = &СчетКонтрагента";
Запрос.УстановитьПараметр("СчетКонтрагента",Стр.СчетКонтрагента);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Стр.СуммаСписаний = ВыборкаДетальныеЗаписи.СуммаКонечныйОстаток
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
Стр = Элементы.Списание.ТекущиеДанные;
//ЗаполнитьОстаткиНаСервере(СтрокаТабличнойЧасти);
Для Каждого Стр Из Объект.Списание Цикл
ЗаполнитьОстаткиНаСервере(Стр);
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Попытка передачи мутабельного значения
- Теория поиска ошибок :)
- Безопасная работа с транзакциями во встроенном языке
- Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений
- Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"
Найденные решения
(6) Как это примерно должно выглядеть при нормальной реализации.
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
ТекДанные = Элементы.Списание.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекДанные.СуммаСписаний = ПолучитьСуммуОстаткаПоСчету(ТекДанные.СчетКонтрагента);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСуммуОстаткаПоСчету(Знач СчетКонтрагента)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
Запрос.УстановитьПараметр("СчетКонтрагента",СчетКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
СуммаОстатка = 0;
Если Выборка.Следующий() Тогда
СуммаОстатка = Выборка.СуммаОстаток;
КонецЕсли;
Возврат СуммаОстатка;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) До вашего ответа я почитал еще информацию, теперь пытаюсь передавать через таблицу значений, но выходит пока туго. Смысл в том, что нельзя передавать те данные, которые я передавал на сервер и обратно соответственно.
Также РеквизитФормыВЗначение как-то можно применить, но все никак не доходит.
Я пока что учусь, поэтому считаю, что допускать ошибки это наоборот хорошо)
Также РеквизитФормыВЗначение как-то можно применить, но все никак не доходит.
Я пока что учусь, поэтому считаю, что допускать ошибки это наоборот хорошо)
(4) В общем реализовал необходимый мне функционал.
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
ИндексСтроки = Элементы.Списание.ТекущаяСтрока;
//Преобразуем данные текущей строки в структуру
ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();
//Получим интересующие нас значения
ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки);
//Изменим значения реквизитов текущей строки
ЗаполнитьЗначенияСвойств(Объект.Списание[ИндексСтроки], ДанныеТекущейСтроки, "СуммаСписаний");
КонецПроцедуры
&НаКлиенте
Функция ПреобразоватьДанныеТекущейСтрокиВСтруктуру() Экспорт
Результат = Новый Структура("СчетКонтрагента, СуммаСписаний");
ТекущиеДанные = Элементы.Списание.ТекущиеДанные;
Если Не ТекущиеДанные = Неопределено Тогда
ЗаполнитьЗначенияСвойств(Результат, ТекущиеДанные);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Процедура ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
Запрос.УстановитьПараметр("СчетКонтрагента",ДанныеТекущейСтроки.СчетКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеТекущейСтроки.СуммаСписаний = Выборка.СуммаОстаток;
КонецЦикла;
КонецПроцедуры
ПоказатьПрикрепленные файлы:

(6) Как это примерно должно выглядеть при нормальной реализации.
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
ТекДанные = Элементы.Списание.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекДанные.СуммаСписаний = ПолучитьСуммуОстаткаПоСчету(ТекДанные.СчетКонтрагента);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСуммуОстаткаПоСчету(Знач СчетКонтрагента)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиДенежныхСредствОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиДенежныхСредств.Остатки(, СчетКонтрагента = &СчетКонтрагента) КАК ОстаткиДенежныхСредствОстатки";
Запрос.УстановитьПараметр("СчетКонтрагента",СчетКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
СуммаОстатка = 0;
Если Выборка.Следующий() Тогда
СуммаОстатка = Выборка.СуммаОстаток;
КонецЕсли;
Возврат СуммаОстатка;
КонецФункции
Показать
(9) Очень интересное решение, а главное правильное.
Не могли бы вы мне написать в чем проблема моей реализации и почему ваша верная, я в этом не сомневаюсь и использую именно ваш способ.
А также, если не трудно не могли бы вы посоветовать, что лучше всего почитать, чтобы понять как правильно реализовывать подобные механизмы и не только, огромное вам спасибо.
Не могли бы вы мне написать в чем проблема моей реализации и почему ваша верная, я в этом не сомневаюсь и использую именно ваш способ.
А также, если не трудно не могли бы вы посоветовать, что лучше всего почитать, чтобы понять как правильно реализовывать подобные механизмы и не только, огромное вам спасибо.
(10)
1) Вы делаете лишние действия, которые не нужны.
Для получения остатка на сервере в вашей процедуре нужен только счет. Его можно получить в текущих данных, и передать его на сервер, для этого не надо ничего дополнительно преобразовывать.
2) Использование идентификатора строки как индекса:
Как вам уже сказали, идентификатор строки это не индекс, могут быть ошибки. Простой пример - добавьте пару строк в таблицу, удалите их все, добавьте еще пару строк, попробуйте выполнить ваш код - будет ошибка.
По поводу что почитать - таких тем много даже на этом сайте.
https://forum.infostart.ru/forum9/topic222360/
Основы конечно - Радченко М.Г.
в чем проблема моей реализации
1) Вы делаете лишние действия, которые не нужны.
//Преобразуем данные текущей строки в структуру
ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();
Для получения остатка на сервере в вашей процедуре нужен только счет. Его можно получить в текущих данных, и передать его на сервер, для этого не надо ничего дополнительно преобразовывать.
2) Использование идентификатора строки как индекса:
ИндексСтроки = Элементы.Списание.ТекущаяСтрока;
//Изменим значения реквизитов текущей строки
ЗаполнитьЗначенияСвойств(Объект.Списание[ИндексСтроки], ДанныеТекущейСтроки, "СуммаСписаний");
Как вам уже сказали, идентификатор строки это не индекс, могут быть ошибки. Простой пример - добавьте пару строк в таблицу, удалите их все, добавьте еще пару строк, попробуйте выполнить ваш код - будет ошибка.
По поводу что почитать - таких тем много даже на этом сайте.
Основы конечно - Радченко М.Г.
лучше на какие-нибудь курсы программирования сходить. Есть некие азы, основы, которые все же надо понимать, прежде чем что-то программировать. Что такое процедура, что такое параметры и т.п. Заодно и про базы данных что-нибудь узнать, это будет следующая проблема.
(12) ну может где-то здесь
https://vc.ru/books/123994-top-10-knig-po-programmirovaniyu-dlya-nachinayushchih-ot-profi-svoego-dela
я так давно это все проходил, наверное несколько устарел...
я так давно это все проходил, наверное несколько устарел...
(6) Не буду критиковать этот код. Не благодарное это дело
Скажу только, что вместо того, чтобы просто посчитать "2+2=4"
можно, например, посчитать следующее выражение "sqrt(4/8*16-28/7) + sin(Pi/6)/2*2^3 = 4"
В Вашем коде примерно так и сделано
Не оставляйте его в таком виде. Все можно сделать намного проще
Это будет отличный 1-й опыт программирования
Скажу только, что вместо того, чтобы просто посчитать "2+2=4"
можно, например, посчитать следующее выражение "sqrt(4/8*16-28/7) + sin(Pi/6)/2*2^3 = 4"
В Вашем коде примерно так и сделано
Не оставляйте его в таком виде. Все можно сделать намного проще
Это будет отличный 1-й опыт программирования
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот