Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 14:15

Текущие данные таблицы недоступны на сервере

Автор kaidj, 22 ноя 2015, 12:59

0 Пользователей и 1 гость просматривают эту тему.

kaidj

Доброго времени суток уважаемые гуру!!! Такая проблема:
Имеется табличная часть "Товары" Формы Документа "Продажа"
Её реквизиты:
- Номенклатура (СправочникСсылка.Номенклатура)
- Упаковка (СправочникСсылка.Упаковка)
- Количество (Число)
- ЦенаУпаковки (Число)
- Цена (Число)
Имеется справочник Упаковка
Имеется справочник Номенклатура с табличной частью "ЦенаЗаУпаковку"
реквизиты ТЧ:
- Упаковка (СправочникСсылка.Упаковка)
- Цена (Число)

Нужно при заполнении "Номенклатура", "Упаковка", "Количество" что бы автоматически заполнялись реквизиты:
- "ЦенаУпаковки" (из Справочник.Упаковка ТЧ ЦенаЗаУпаковку реквизит "Цена")
- "Цена" (умножить автоматически заполненый реквизит "ЦенаУпаковки" на заполненый реквизит "Количество")
в общем я под эту задачу наваял такой "код"


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

в итоге выдает ошибку:

{Документ.Продажа.Форма.ФормаДокумента.Форма(43)}: Ошибка при получении значения атрибута контекста (ТекущиеДанные)      ТекущаяСтрока = Элементы.Товары.ТекущиеДанные.Упаковка;по причине:Текущие данные таблицы недоступны на сервереТекущие данные таблицы недоступны на сервере

Psm_2015

1) перед функцией поставить директиву компиляции &наСервереБезКонтекста.
2) первую строчку из функции убрать, номенклатура в параметрах передается.
3) что за "Объем" в выборке? вроде в запросе такого нет.

4) исправить то что выше и сказать на что ругается дальше =)

дфтын

о. тока хотел начертать...
Добавлено: 22 ноя 2015, 21:12


Но самое интересное это передача файлов туда сюда!
Помог? Нажми - Спасибо :)
skype: Soprov1C

cska-fanat-kz

ваще жесть!

1. для поиска цены упаковки надо в функцию отправить не только номенклатуру, но и упаковку. а не получать ее (упаковку) внутри функции!
2. WTF???
Цитата: kaidj от 22 ноя 2015, 12:59Запрос.Текст = "ВЫБРАТЬ
                     |      Номенклатура.ЦенаЗаУпаковку.(
                     |            Цена
                     |      )
                     |ИЗ
                     |      Справочник.Номенклатура КАК Номенклатура
                     |ГДЕ
                     |    Номенклатура.Ссылка = &Номенклатура
                     |И Номенклатура.ЦенаЗаУпаковку.Ссылка = &ТекущаяСтрока";
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Sinsinmin

А что в запросе можно функцию сразу писать?)))

Типа ПолучитьДанные(Док.Код) как Данные

" Номенклатура.ЦенаЗаУпаковку.(
                     |            Цена
                     |      )" Что это?)):lol:

kaidj

Цитата: Sinsinmin от 23 ноя 2015, 08:40
А что в запросе можно функцию сразу писать?)))

Типа ПолучитьДанные(Док.Код) как Данные

" Номенклатура.ЦенаЗаУпаковку.(
                     |            Цена
                     |      )" Что это?)):lol:

скобки появились в конструкторе запроса (цена - это реквизит табличной части справочника)
Добавлено: 23 ноя 2015, 10:13


ну в общем как то так:

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


ошибки в этом случае не выдает, но и не заполняет элемент строки "ЦенаУпаковки"
Добавлено: 23 ноя 2015, 11:04


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


ОШИБКА: {Документ.Продажа.Форма.ФормаДокумента.Форма(59)}: Поле объекта не обнаружено (Цена)
              Возврат Выборка.Цена;

vitasw

"ВЫБРАТЬ
                     |      Номенклатура.ЦенаЗаУпаковку.Цена КАК Цена

kaidj

Цитата: vitasw от 23 ноя 2015, 11:14
"ВЫБРАТЬ
                     |      Номенклатура.ЦенаЗаУпаковку.Цена КАК Цена

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

cska-fanat-kz

ЛЮДИ!!! Опомнитесь!!! :xfbnsdfb:

kaidj, думайте, о том ЧТО вы делаете и ДЛЯ ЧЕГО!!!
програмировать - это не просто наваял запрос и гуляй Вася!

вот же...
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
      СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
      СтрокаТЧ.ЦенаУпаковки = ПолучитьЦенуУпаковки(СтрокаТЧ.Номенклатура, СтрокаТЧ.Упаковка); //научитесь сразу давать методам логичные названия!
      СтрокаТЧ.Цена = СтрокаТЧ.ЦенаУпаковки * СтрокаТЧ.Количество;
КонецПроцедуры

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

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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


как-то так. не проверял.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

vitasw

Очень замечательно, что вы научились копипастить ошибки. А попробовать самому подумать/разобраться?
Результатом выполнения этого запроса = вложенный запрос, что естественно вызывает ошибку? Какую из ста тыщ пятьсот строк в таблице цен номенклатуры вы хотите получить?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск