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

Подставление цены номенклатуры из регистра накопления.

Автор Денис Степанищев, 20 июл 2016, 10:34

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

Денис Степанищев

Только начинаю познавать азы прогр-я 1с.
Необходимо продать товар по его средней себестоимости.

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

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


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



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

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



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

vitasw

Процедура с запросом должна вернуть число, а не выборку

SGIRG

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


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


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

Теги:

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

Рейтинг@Mail.ru

Поиск