Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
01 июл 2022, 07:48

Очень нужна помощь. 1С 8.3

Автор Родион Раскольников, 30 сен 2017, 23:36

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

Родион Раскольников

Здравствуйте, прошу вашей помощи. Задание звучит так: При поступлении товаров в приходной накладной должна указываться цена и сумма покупки, но в регистр товар должен приходоваться по продажной стоимости.
У меня имеется регистр сведений "Цены". Мне необходимо, чтобы в документе "Приходная накладная" я мог ввести цену и сумму, а при проведении этого документа товар приходовался уже по продажной стоимости.
Пожалуйста, напишите конкретно при помощи чего и как можно это осуществить. Спасибо
Модуль документа "Приходная накладная"
Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиТоваров.Записывать = Истина;

Для Каждого ТекСтрокаСписокТоваров Из СписокТоваров Цикл
//Регистр Остатки товаров Приход
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Наименование = ТекСтрокаСписокТоваров.Наименование;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаСписокТоваров.Количество;
Движение.Стоимость = ТекСтрокаСписокТоваров.Цена*ТекСтрокаСписокТоваров.Количество;

КонецЦикла;

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

vitasw

Запросом доставать из документа данные о количестве, а из регистра цен - данные о цене.

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

Запрос.УстановитьПараметр("ДатаДокумента", Дата);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;


oleg-x

Вот этот кусок кода немного поменяй
Движение.Стоимость = ТекСтрокаСписокТоваров.Цена*ТекСтрокаСписокТоваров.Количество;

На этот:
Движение.Стоимость = ПолучитьЦенуПродажи(ТекСтрокаСписокТоваров.Наименование)*ТекСтрокаСписокТоваров.Количество; //функция возвращает цену продажи

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

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Oldman06

Цитата: oleg-x от 02 окт 2017, 12:20
Вот этот кусок кода немного поменяй
Движение.Стоимость = ТекСтрокаСписокТоваров.Цена*ТекСтрокаСписокТоваров.Количество;

На этот:
Движение.Стоимость = ПолучитьЦенуПродажи(ТекСтрокаСписокТоваров.Наименование)*ТекСтрокаСписокТоваров.Количество; //функция возвращает цену продажи

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



И если в табличной части документа 1000 строк, то будет выполнено 1000 запросов в БД. Замечательно ... Делайте как в первом ответе.

oleg-x

ЦитироватьИ если в табличной части документа 1000 строк, то будет выполнено 1000 запросов в БД. Замечательно ... Делайте как в первом ответе.
Да, только в первом варианте надо добавить проверку на NULL, а то умножать на NULL, как то не очень...
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Oldman06

Цитата: oleg-x от 02 окт 2017, 12:42
ЦитироватьИ если в табличной части документа 1000 строк, то будет выполнено 1000 запросов в БД. Замечательно ... Делайте как в первом ответе.
Да, только в первом варианте надо добавить проверку на NULL, а то умножать на NULL, как то не очень...

Да, согласен. И вложенный запрос в соединении я бы не использовал.

vitasw

ЦитироватьДа, согласен. И вложенный запрос в соединении я бы не использовал.

Аргументируйте пожалуйста

Oldman06

Цитата: vitasw от 03 окт 2017, 09:42
ЦитироватьДа, согласен. И вложенный запрос в соединении я бы не использовал.

Аргументируйте пожалуйста
Пожалуйста. https://its.1c.ru/db/metod8dev#content:5842:hdoc
Да, соединение с вложенным запросом справа, может и не так критично, но согласно тексту вышеуказанной статьи:
Цитировать
... Обратите внимание на то, что в какой части соединения (правой или левой) используется подзапрос - не важно. Точно так же не важно, какого типа соединение указано (ЛЕВОЕ, ПРАВОЕ и т.д.). Во всех случаях такая конструкция является потенциально опасной и должна быть исправлена при помощи временных таблиц...
также является злом. :)

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

Рейтинг@Mail.ru Rambler's Top100

Поиск