Имя: Пароль:
1C
1С v8
Выборка реквизита из заголовка документа Поступления при расчете себестоимости
0 Arikite
 
10.04.13
10:25
День добрый, Почтеннейшие гуру!

Исходная: конфигурация УТ ред. 10.2
Дабы сразу изложить суть вопроса прикладываю код (не уверен в том, что не нарушаю правил форума большим листингом, но еже ли так прошу прощения низко кланяясь :-)

Отмечу ваше внимание на том, факте что я в этом интересном деле новичок - поэтому прошу Вас сильно не пинать ))

Итак, был некий программист написавший надстройку для документа реализации позволяющей сформировать отчет по себестоимости не посредственно из док. реализации. По выполнению процедуры пользователю представляется добавленная в документ форма с расчетными данными. Приведу ниже код написанный программером


Процедура ПриОткрытии()
   Если ЗначениеЗаполнено(СсылкаНаОБъект) Тогда
       Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
       |    РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
       |    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
       |    РеализацияТоваровУслугТовары.СерияНоменклатуры КАК СерияНоменклатуры,
       |    СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
       |    СРЕДНЕЕ(РеализацияТоваровУслугТовары.Цена) КАК Цена,
       |    СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
       |    РеализацияТоваровУслугТовары.Ссылка.ВалютаДокумента,
       |    РеализацияТоваровУслугТовары.НомерСтроки
       |ПОМЕСТИТЬ ВТ_Реализация
       |ИЗ
       |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
       |ГДЕ
       |    РеализацияТоваровУслугТовары.Ссылка = &Ссылка
       |    И РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
       |
       |СГРУППИРОВАТЬ ПО
       |    РеализацияТоваровУслугТовары.Ссылка,
       |    РеализацияТоваровУслугТовары.Номенклатура,
       |    РеализацияТоваровУслугТовары.СерияНоменклатуры,
       |    РеализацияТоваровУслугТовары.Ссылка.ВалютаДокумента,
       |    РеализацияТоваровУслугТовары.НомерСтроки
       |
       |ИНДЕКСИРОВАТЬ ПО
       |    Номенклатура,
       |    СерияНоменклатуры,
       |    Ссылка
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ПоступлениеТоваровУслугТовары.Ссылка.ВалютаДокумента,
       |    ПоступлениеТоваровУслугТовары.Ссылка.КурсВзаиморасчетов,
       |    ПоступлениеТоваровУслугТовары.Ссылка.Дата,
       |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
       |    ПоступлениеТоваровУслугТовары.СерияНоменклатуры КАК СерияНоменклатуры,
       |    СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) КАК Цена,
       |    СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма,
       |    ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
       |    СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество
       |ПОМЕСТИТЬ ВТ_Поступление
       |ИЗ
       |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
       |ГДЕ
       |    ПоступлениеТоваровУслугТовары.Номенклатура В
       |            (ВЫБРАТЬ
       |                ВТ_Реализация.Номенклатура
       |            ИЗ
       |                ВТ_Реализация КАК ВТ_Реализация)
       |    И ПоступлениеТоваровУслугТовары.СерияНоменклатуры В
       |            (ВЫБРАТЬ
       |                ВТ_Реализация.СерияНоменклатуры
       |            ИЗ
       |                ВТ_Реализация КАК ВТ_Реализация)
       |    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
       |
       |СГРУППИРОВАТЬ ПО
       |    ПоступлениеТоваровУслугТовары.Ссылка,
       |    ПоступлениеТоваровУслугТовары.Номенклатура,
       |    ПоступлениеТоваровУслугТовары.СерияНоменклатуры,
       |    ПоступлениеТоваровУслугТовары.Ссылка.ВалютаДокумента,
       |    ПоступлениеТоваровУслугТовары.Ссылка.КурсВзаиморасчетов,
       |    ПоступлениеТоваровУслугТовары.Ссылка.Дата
       |
       |ИНДЕКСИРОВАТЬ ПО
       |    Номенклатура,
       |    СерияНоменклатуры,
       |    Ссылка
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    МАКСИМУМ(КурсыВалют.Период) КАК Период,
       |    КурсыВалют.Валюта КАК Валюта,
       |    ПоступлениеТоваровУслуг.Ссылка КАК Ссылка
       |ПОМЕСТИТЬ ВТ_ДатыКурсов
       |ИЗ
       |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
       |        ПО (КурсыВалют.Валюта = ПоступлениеТоваровУслуг.ВалютаДокумента)
       |            И (КурсыВалют.Период <= ПоступлениеТоваровУслуг.Дата)
       |ГДЕ
       |    ПоступлениеТоваровУслуг.Ссылка В
       |            (ВЫБРАТЬ
       |                ВТ_Поступление.Ссылка
       |            ИЗ
       |                ВТ_Поступление КАК ВТ_Поступление)
       |
       |СГРУППИРОВАТЬ ПО
       |    ПоступлениеТоваровУслуг.Ссылка,
       |    КурсыВалют.Валюта
       |
       |ИНДЕКСИРОВАТЬ ПО
       |    Валюта,
       |    Ссылка
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    КурсыВалют.Курс,
       |    КурсыВалют.Валюта КАК Валюта,
       |    ВТ_ДатыКурсов.Ссылка КАК Ссылка,
       |    КурсыВалют.Кратность
       |ПОМЕСТИТЬ ВТ_КурсыВалютПоДокументам
       |ИЗ
       |    РегистрСведений.КурсыВалют КАК КурсыВалют
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыКурсов КАК ВТ_ДатыКурсов
       |        ПО КурсыВалют.Период = ВТ_ДатыКурсов.Период
       |            И КурсыВалют.Валюта = ВТ_ДатыКурсов.Валюта
       |
       |ИНДЕКСИРОВАТЬ ПО
       |    Ссылка,
       |    Валюта
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ВТ_Реализация.Номенклатура.Артикул КАК Артикул,
       |    ВТ_Реализация.Номенклатура,
       |    ВТ_Реализация.СерияНоменклатуры КАК Серия,
       |    ВТ_Реализация.Количество,
       |    ВТ_Поступление.Цена,
       |    ВТ_Поступление.Цена * ВТ_Реализация.Количество КАК СуммаВВалюте,
       |    ВТ_Поступление.ВалютаДокумента КАК Валюта,
       |    ВТ_КурсыВалютПоДокументам.Курс,
       |    ВТ_Поступление.Цена * ВТ_Реализация.Количество * ВТ_КурсыВалютПоДокументам.Курс КАК СуммаВРублях,
       |    ВТ_Реализация.Цена КАК ЦенаПродажи,
       |    ВТ_Реализация.Сумма КАК СуммаПродажи,
       |    ВТ_Реализация.ВалютаДокумента КАК ВалютаПродажи,
       |    ВТ_Поступление.Ссылка КАК Поступление
       |ИЗ
       |    ВТ_Реализация КАК ВТ_Реализация
       |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Поступление КАК ВТ_Поступление
       |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КурсыВалютПоДокументам КАК ВТ_КурсыВалютПоДокументам
       |            ПО (ВТ_КурсыВалютПоДокументам.Ссылка = ВТ_Поступление.Ссылка)
       |        ПО ВТ_Реализация.Номенклатура = ВТ_Поступление.Номенклатура
       |            И ВТ_Реализация.СерияНоменклатуры = ВТ_Поступление.СерияНоменклатуры
       |
       |УПОРЯДОЧИТЬ ПО
       |    ВТ_Реализация.НомерСтроки";
       //
       Запрос.УстановитьПараметр("Ссылка",СсылкаНаОБъект );
       Результат = Запрос.Выполнить();
       ЭлементыФормы.ТП_Результат.Значение=Результат.Выгрузить();
       ЭлементыФормы.ТП_Результат.СоздатьКолонки();
       ЭлементыФормы.ТП_Результат.Колонки.ЦенаПродажи.Видимость=Ложь;
       ЭлементыФормы.ТП_Результат.Колонки.СуммаПродажи.Видимость=Ложь;
       ЭлементыФормы.ТП_Результат.Колонки.ВалютаПродажи.Видимость=Ложь;
       ЭлементыФормы.ТП_Результат.Колонки.Количество.Ширина=15;
       ЭлементыФормы.ТП_Результат.Колонки.Цена.Ширина=15;
       
       ЭлементыФормы.ТП_Результат.Колонки.СуммаВВалюте.Ширина=15;
       ЭлементыФормы.ТП_Результат.Колонки.СуммаВРублях.Ширина=15;
       ЭлементыФормы.ТП_Результат.Колонки.СуммаВВалюте.ТекстШапки="Сумма в вал.";
       ЭлементыФормы.ТП_Результат.Колонки.СуммаВРублях.ТекстШапки="Сумма в руб.";
       
       ЭлементыФормы.ТП_Результат.Колонки.Валюта.Ширина=15;
       ЭлементыФормы.ТП_Результат.Колонки.Поступление.ЭлементУправления.Доступность=Ложь;
       ЭлементыФормы.НадписьВсего.Значение="Всего сумма в руб.: "+Строка(ТП_Результат.Итог("СуммаВРублях"));
       ЭлементыФормы.ТП_Результат.Колонки.Номенклатура.ЭлементУправления.КнопкаОткрытия=Истина;
       ЭлементыФормы.ТП_Результат.Колонки.Номенклатура.ЭлементУправления.КнопкаВыбора=Ложь;
   КонецЕсли;
КонецПроцедуры

Процедура ТП_РезультатВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
   Если Колонка.Имя="Поступление" Тогда
       ТекСтрока=Элемент.ТекущиеДанные.Поступление;
       Форма =ТекСтрока.ПолучитьФорму("ФормаДокумента",,);
       Форма.Открыть();
       Если Форма.Открыта() Тогда
          Форма.Активизировать();
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры

Процедура ТП_РезультатПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   ЦветСтрокиКрасный = Новый Цвет(255, 0, 0);
   Если ДанныеСтроки.Цена=0 Тогда
       ОформлениеСтроки.ЦветТекста=ЦветСтрокиКрасный;    
   КонецЕсли;
   //Сообщить("");
КонецПроцедуры


При решении этой задачи не известным мне программистом не был учтен НДС по поставке. Себестоимость рассчитывалась как результат умножения количества на цену в документе поставки.

Собственно вопрос каким образом подключить в этот расчет сумму НДС отраженного в документе поставки. При этом НДС ведь может быть и включенным в сумму.

Прекрасно понимаю, что Вы ни чем не обязаны, но буду очень признателен за Ваши полезные мысли!
1 cw014
 
10.04.13
10:26
(0) Можешь в запросе прямо рассчитывать из полей "СтавкаНДС" и "Ссылка.СуммаВключаетНДС"
2 cw014
 
10.04.13
10:26
(0) Через ВЫБОР КОГДА ...
3 Arikite
 
10.04.13
10:35
(2) буду признателен вам за детали...
4 Trainee
 
10.04.13
10:36
(0) Первый пакет - документ реализация (нужен, чтоб отобрать нужные позиции)

Второй пакет - док. покупки!!! И да, именно, здесь можно добавить НДС
5 Arikite
 
10.04.13
10:45
(4) Исходя из подобных соображений пробовал добавить в выборку из второго пакета стоимости ндс по документу поставки следующим образом:

СУММА(ПоступлениеТоваровУслугТовары.СуммаНДС/ПоступлениеТоваровУслугТовары.Колчисетво) КАК ЦенаНДС;

Расчет себестоимости в валюте изменил следующим образом:

ВТ_Поступление.Цена * ВТ_Реализация.Количество + (ВТ_Реализация.Количество*ЦенаНДС) КАК СуммаВВалюте


Расчет себестоимости в рублях изменил следующим образом:

ВТ_Поступление.Цена * ВТ_Реализация.Количество * ВТ_КурсыПоДокументам.Курс + (ВТ_Реализация.Количество*(ЦенаНДС*ВТ_КурсыПоДокументам.Курс)) КАК СуммаВрублях


Но, в случае, если по поставке ндс включен в сумму, ожидаемо, расчет производится не верно. Логика понятна, но как реализовать не знаю. Почтеннейшие Гуру - направьте на путь правильны строчками кода :-)
6 Trainee
 
10.04.13
10:50
(5) Я не гуру, но в (2) ответили ЧЕРЕЗ ВЫбОР

т.е. не СУММА(ПоступлениеТоваровУслугТовары.СуммаНДС/ПоступлениеТоваровУслугТовары.Колчисетво) КАК ЦенаНДС

а ВЫБОР КОГДА Ссылка.СуммаВключаетНДС ТОГДА
...
Иначе
...
Конец
7 Arikite
 
10.04.13
11:35
Правильно? :

ВЫБОР КОГДА ПоступлениеТоваровУслугТовары.Ссылка.СуммаВключаетНДС Тогда
   СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК СуммаВключаетНДС,
   Иначе
   СУММА(ПоступлениеТоваровУслугТовары.СуммаНДС/ПоступлениеТоваровУслугТовары.Количество) Как ЦенаНДС
Конец КАК
8 Trainee
 
10.04.13
12:13
9 Arikite
 
10.04.13
12:58
(8) Спасибо за линк!