8.х Поступление и регистр сведении

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Pro_user 200, 8 июл 2014.

  1. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

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

    В итоге когда я провожу(записываю) поступление то мне выдаёт ошибку

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


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

    Что мне делать ,что в коде неправильно помогите 2 дня мучаюсь
  2. XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Попробуйте на сервере делать только запрос и возвращать результат запроса и уже на клиенте этот результат обрабатывать. Хотя есть сомнения, что можно с сервера какие-то данные возвращать не клиента, но это не точно.
  3. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    Возврат Стр;

    вот это зачем ?
  4. XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    И вообще, может функция возвращать три значения?
  5. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    А почему бы и нет ? Разве массив не может иметь три значения ? Или, например, структура ?
  6. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    Саш мы про это :

    Возврат ТоварБезЦены;
    Возврат НоменклатураИнфо;
    Возврат Установка;
    :)))
    --- Объединение сообщений, 9 июл 2014 ---
    она тупо вывалится на первом возврате ..проигнорируя последующие
  7. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Аааа, тогда сорь:)
  8. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Ну в этом случае функция всегда вернет первое значение.
  9. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    код, конечно, жуть :)
    ошибка тут
    Код:
    Если Выборка.Количество() = 0 Тогда
      ТоварБезЦены = истина;
      Возврат Стр;
      НоменклатураИнфо = НоменклатураИнфо + Стр.Номенклатура;
      Продолжить;
    КонецЕсли;
    
    вы пытаетесь вернуть строку коллекции строк (табличной части документа) на клиент - так делать нельзя.

    ваша последовательность действий
    1. сделать безконтекстную функцию, которая вернет список товаров, для которых цена не установлена
    2. если список пустой - все ок, если нет, то
    3. Спрашиваем разрешения создать документ
    4. Вызываем серверную процедуру, которая создаст документ (ничего не возвращая.

Поделиться этой страницей