Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
20 Окт 2017, 21:03
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Подставление цены номенклатуры из регистра накопления.  (Прочитано 675 раз)

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

Оффлайн Денис Степанищев

  • *
  • Сообщений: 20
  • РЕПУТАЦИЯ: 1
  • КПД: 5%
  • Регистрация: 2016-04-19
  • Сайт: 
Только начинаю познавать азы прогр-я 1с.
Необходимо продать товар по его средней себестоимости.

&НаКлиенте
Процедура СписокНоменклатурыНаименованиеПриИзменении(Элемент)
Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
//Стр.Цена = ПолучитьЦену(Стр.Наименование);
Стр.Сумма = Стр.ОбщееКоличество * Стр.Цена;
ААА = ПолучитьЦеныТоваровИзРегистра();

////доделать тут заполнение
Пока ААА.Следующий() Цикл
Если Стр.Наименование = ААА.Наименование Тогда
  Стр.Цена = ААА.Сумма/ААА.Количество;
  КонецЕсли;
КонецЦикла;


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


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

|СГРУППИРОВАТЬ ПО
| ОстаткиНаСкладеОстатки.Наименование";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Возврат РезультатЗапроса;
КонецФункции


Я понимаю, что таким образом получится совсем неэффективно, но как могу.
При выборе номенклатуры выводит ошибку:
{Документ.Расходная.Форма.ФормаДокумента.Форма(40)}: Ошибка при вызове метода контекста (ПолучитьЦеныТоваровИзРегистра)
ААА = ПолучитьЦеныТоваровИзРегистра();
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'ret':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}ret
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ВыборкаИзРезультатаЗапроса'
[/font]


Оффлайн vitasw

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
Процедура с запросом должна вернуть число, а не выборку

Оффлайн SGIRG

  • **
  • Сообщений: 93
  • РЕПУТАЦИЯ: 30
  • КПД: 32%
  • Регистрация: 2014-03-26
  • Сайт: 
  • Профессия: Программист 8.1
Не понятен принцип использования склада в запросе....
передайте в параметр запроса ссылку на номенклатуру.
в этом случае запрос вернет одну строку и из неё возьмете цену (которую также надо рассчитать в запросе)
Процедура СписокНоменклатурыНаименованиеПриИзменении(Элемент)
    Стр = Элементы.СписокНоменклатуры.ТекущиеДанные;
    //Стр.Цена = ПолучитьЦену(Стр.Наименование);
    Стр.Сумма = Стр.ОбщееКоличество * Стр.Цена;
    //ААА = ПолучитьЦеныТоваровИзРегистра();
    Цена = ПолучитьЦеныТоваровИзРегистра(Стр.Наименование);
   
    ////доделать тут заполнение
    //Пока ААА.Следующий() Цикл
    //    Если Стр.Наименование = ААА.Наименование Тогда
    //          Стр.Цена = ААА.Сумма/ААА.Количество;
    //      КонецЕсли;
    //КонецЦикла;
    Стр.Цена = Цена;
   
КонецПроцедуры

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

И желательно добавить параметр даты остатков и сделать проверку на нулевое количество остатка в запросе, для обхода ошибки деления на 0
Нажимайте "Спасибо", так приятнее))


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

oleg-x
93 Сообщений
alex0402
54 Сообщений
AIFrame
43 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
38 Сообщений
Oldman06
31 Сообщений
Golickoff Golickoff
30 Сообщений
vitasw
29 Сообщений
MuI_I_Ika MuI_I_Ika
19 Сообщений
DmitriyF DmitriyF
14 Сообщений
BuhRust
13 Сообщений

* Кто онлайн

  • Точка Гостей: 277
  • Точка Скрытых: 0
  • Точка Пользователей: 15
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal