Версия для печати темы (https://pro1c.org.ua/index.php?s=9bd3b3173274092a1345e696c8c620e9&showtopic=54891)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Как в выборке результата запроса сравнить значение(ВалютаДокумента)

Автор: jojojoba2 28.10.19, 16:56

Добрый день!

Помогите пожалуйста начинающему программисту. Как сравнить в результате запроса ВалютуДокумента и вывести параметр на макет :
Код

Процедура КнопкаСформироватьНажатие(Кнопка)
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Макет");
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПлатежноеПоручениеВходящее.Ссылка,
        |    ПлатежноеПоручениеВходящее.Номер,
        |    ПлатежноеПоручениеВходящее.Дата,
        |    ПлатежноеПоручениеВходящее.Проведен,
        |    ПлатежноеПоручениеВходящее.ВалютаДокумента,
        |    ПлатежноеПоручениеВходящее.Оплачено,
        |    ПлатежноеПоручениеВходящее.Контрагент,
        |    ПлатежноеПоручениеВходящее.ДатаОплаты,
        |    ПлатежноеПоручениеВходящее.СуммаДокумента,
        |    ПлатежноеПоручениеВходящее.СтатьяДвиженияДенежныхСредств,
        //|    ПлатежноеПоручениеВходящее.Заказ,
        |    ПлатежноеПоручениеВходящее.РасшифровкаПлатежа.(
        |        СуммаНДС
        |    ) как   СуммаНДС
        |ИЗ
        |    Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее
        |ГДЕ
        |    ПлатежноеПоручениеВходящее.ДатаОплаты = &Дата
        |    И ПлатежноеПоручениеВходящее.Проведен =истина
        |    И ПлатежноеПоручениеВходящее.СтатьяДвиженияДенежныхСредств = &СтатьяДвиженияДенежныхСредств
        |    И ПлатежноеПоручениеВходящее.Оплачено = &Оплачено";
          
    Запрос.УстановитьПараметр("Дата", ЗаДату);
    Запрос.УстановитьПараметр("Оплачено", Оплочено);
    //Запрос.УстановитьПараметр("Проведен", "истина");
    Запрос.УстановитьПараметр("СтатьяДвиженияДенежныхСредств", стДвиженияДС);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    Область = Макет.ПолучитьОбласть("Детали");
    РасшифровкаПлатежаОбластьПодвалТаблицы = Макет.ПолучитьОбласть("РасшифровкаПлатежаПодвалТаблицы");
    РасшифровкаПлатежаОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("РасшифровкаПлатежаДетали");
    ТабДок.Очистить();
    ОбластьЗаголовок.Параметры.ДатаОплаты=ЗаДату;
    Номер="ФСМ " +Лев(Строка(ЗаДату),2)+"_" +Сред(Строка(ЗаДату),4,2)+ "/"+Сред(Строка(ЗаДату),9,2);
    ОбластьЗаголовок.Параметры.Номер=Номер;
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    //ТабДок.НачатьАвтогруппировкуСтрок();
    Выборка = РезультатЗапроса.Выбрать();
    СуммаСОбщ=0; СуммаБезОбщ=0; СуммаВознОбщ=0;
    Пока Выборка.Следующий() Цикл
        Область.Параметры.Заполнить(Выборка);
        Область.Параметры.Заказ=Выборка.Ссылка.РасшифровкаПлатежа[0].Сделка;
        НДС =  Выборка.Ссылка.РасшифровкаПлатежа[0].СуммаНДС;
        
        
        
        Если  Область.Параметры.ВалютаДокумента = "дол" Тогда  
            СуммаС = Выборка.СуммаДокумента * 24;
         Иначе
        
        СуммаС = Выборка.СуммаДокумента+НДС;
        КонецЕсли;
        
        
        СуммаВозн= Выборка.СуммаДокумента*ПроцентВН/100;
        СуммаСОбщ=СуммаСОбщ+СуммаС;
        СуммаБезОбщ= СуммаБезОбщ+ Выборка.СуммаДокумента;
        СуммаВознОбщ=СуммаВознОбщ+СуммаВозн;
        Область.Параметры.СуммаВозн=СуммаВозн;
        Область.Параметры.СуммаС=СуммаС;
        //Область.Параметры.СуммаС=СуммаС;
        ТабДок.Вывести(Область, Выборка.Уровень());
        ТабДок.НачатьГруппуСтрок();
        ТабДок.ЗакончитьГруппуСтрок();
    КонецЦикла;
    ОбластьПодвал.Параметры.СуммаСОбщ=СуммаСОбщ;
    ОбластьПодвал.Параметры.СуммаБезОбщ=СуммаБезОбщ;
    ОбластьПодвал.Параметры.СуммаВознОбщ=СуммаВознОбщ;
    ТабДок.Вывести(ОбластьПодвал);
    ТабДок.Показать();
КонецПроцедуры


Это не заработало:
Если  Область.Параметры.ВалютаДокумента = "дол" Тогда  
    СуммаС = Выборка.СуммаДокумента * 24;
Иначе
    СуммаС = Выборка.СуммаДокумента+НДС;
КонецЕсли;


Спасибо.

Автор: sava1 28.10.19, 18:10

Если Выборка.ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда...

Автор: takefive 28.10.19, 19:00

jojojoba2 @ Сегодня, 17:56 * ,

Если Выборка.ВалютаДокумента.Код = КодДоллара Тогда

Автор: jojojoba2 28.10.19, 19:16

Всем спасибо!

Автор: TipsyKID 28.10.19, 19:31

Что за число 24?

Я так понял, если у Вас в долларах указан платеж, то следует делать по аналогии как в документе проведения:

    Если ВидОперации = Перечисления.ВидыОперацийПоступлениеБезналичныхДенежныхСредств.ПрочиеРасчетыСКонтрагентами ИЛИ
        ВидОперации = Перечисления.ВидыОперацийПоступлениеБезналичныхДенежныхСредств.РасчетыПоКредитамИЗаймам Тогда
        
        КурсДокумента      = РасшифровкаПлатежа[0].КурсВзаиморасчетов;
        КратностьДокумента = РасшифровкаПлатежа[0].КратностьВзаиморасчетов;

    Иначе    
        СтруктураКурсаДокумента = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаДокумента,Дата);
        
        КурсДокумента      = СтруктураКурсаДокумента.Курс;
        КратностьДокумента = СтруктураКурсаДокумента.Кратность;
    КонецЕсли;


Получили курс и кратность относительно рег. валюты и рассчитали из валюты документа в рег.валюту. (проверки делать не надо на валюту, код будет работать и под другую валюту)

Если у Вас есть управленческий курс, то добавьте в РС "Курсы валют" ресурсы "КурсВалютУпр", "КратностьВалютУпр" (или добавюте аналогичный РС "Курсы валют (Упр.)").
Далее добавьте свою функцию алогичную
     МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаДокумента,Дата);


Опять же, необходимости в коде проверять на конкретную валюту нет и это говнокод плохой стиль.

Автор: sava1 28.10.19, 20:47

Цитата(TipsyKID @ 28.10.19, 19:31) *
необходимости в коде проверять на конкретную валюту нет и это говнокод плохой стиль.


т.е. код типа
Если ВалютаДокумента = мВалютаРегламентированногоУчета ......

это гавнокод ?
тогда пишите в 1с и локализаторам, а не здеся

Автор: TipsyKID 29.10.19, 16:59

sava1, Не перекручивайте, проверяется не с конкретной валютой а с константой (т.е. с параметром который определяется в инф. базе):

   мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");


где

    ИначеЕсли ВРег(ИмяПараметра) = ВРег("ВалютаРегламентированногоУчета") Тогда
        НайденноеЗначение = Константы.ВалютаРегламентированногоУчета.Получить();


То, что Вы посоветовали, начинающему программисту :
Если Выборка.ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда


Похоже на говнокод, если, конечно, "КодДоллара" не является настройкой информационной базы, но тогда лучше сразу определить параметр с типом СправочникСсылка.Валюты.

Цитата(sava1 @ 28.10.19, 21:47) *
тогда пишите в 1с и локализаторам, а не здеся


Я, если позволите, сам определюсь где писать.
Но разработчикам, тоже, писал об их ошибках.
Некоторые, они исправляют, на другие не хватает бюджета, но от этого ошибка не перестает быть ошибкой.

Автор: sava1 30.10.19, 8:22

Цитата(TipsyKID @ 29.10.19, 16:59) *
Я, если позволите, сам определюсь где писать.

Алаверды - я сам определюсь как писАть.
Цитата(TipsyKID @ 29.10.19, 16:59) *
Но разработчикам, тоже, писал об их ошибках.

Если Вы такие умные - что ж до сих пор не ходите строем ?

Цитата(TipsyKID @ 29.10.19, 16:59) *
То, что Вы посоветовали, начинающему программисту

Я , в отличие от Вас, ничего не советую - был конкретный вопрос и конкретный ответ.

Цитата(TipsyKID @ 29.10.19, 16:59) *
Не перекручивайте, проверяется не с конкретной валютой а с константой (т.е. с параметром который определяется в инф. базе):


Не вижу особой разницы.

п.с. По поводу говнокода - можно долго спорить.
В данном случае код валюты довольно устойчивый показатель.
Давать пространные советы, не зная контекста - тоже плохой стиль , имхо.
ПО-вашему, для проверки на Бакс во внешней обработке - нужно в конфигурацию добавить константу или параметр сеанса Бакс ?



Автор: Vofka 30.10.19, 9:42

sava1, TipsyKID, давайте без перехода на личности, пожалуйста. Тема с говнокодом интересная и интересен, в частности, случай с валютой. Давайте продолжим обсуждение https://pro1c.org.ua/topic/govnokod-ili-net-54934/.

Автор: andr_andrey 30.10.19, 13:34

Как быстрое решение - пойдёт, но это "технический долг", который в будущем придётся отдать.
Вообще следует избегать "магических констант" в тексте программы, так как в идеале - программы это универсальные механизмы обработки данных, и настраиваться механизмы должны в пользовательском режиме без участия программиста.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua