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

Очень нужна помощь. 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

Поиск