8.х РОЗ Валютный учёт

Тема в разделе ""1С:Розница"", создана пользователем rossoxa, 16 авг 2015.

  1. TopicStarter Overlay
    rossoxa
    Offline

    rossoxa

    Регистрация:
    8 авг 2015
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Добрый день ,Уважаемые . Прошу Вашей помощи . Есть задача в 1С розница добавить валютный учёт.
    "в РМК и в чеке ККМ нужно вводить валюту и должен осуществляться пересчет на рубли
    по курсу"
    Заранее спасибо .С программированием знаком . (Веб)Сейчас потихоньку перехожу работать на 1С .
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    не совсем понятно для чего все это, т.к. расчеты наличными ВСЕГДА выполняются в национальной валюте.
  3. TopicStarter Overlay
    rossoxa
    Offline

    rossoxa

    Регистрация:
    8 авг 2015
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Клиент - маленькая сеть магазинчиков Дьюти фри .Они хотят иметь возможность принять в евро и долларах , плюс отследить .
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Хорошо. Это достаточно серьезные доработки конфигурации, советую посмотреть реализацию валютного пересчета в той же БУХ 2.0 или УТ10.3.
    rossoxa нравится это.
  5. TopicStarter Overlay
    rossoxa
    Offline

    rossoxa

    Регистрация:
    8 авг 2015
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Прошу вашей помощи .
    Код:
    #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    
    #Область ОбработчикиСобытий
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
        Если СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле Тогда
            ТекстЗапроса =
            "ВЫБРАТЬ
            |    Валюты.Наименование КАК СимвольныйКод
            |ИЗ
            |    Справочник.Валюты КАК Валюты
            |ГДЕ
            |    (Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты)
            |            ИЛИ Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.РасчетПоФормуле))";
         
            Запрос = Новый Запрос(ТекстЗапроса);
            ЗависимыеВалюты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("СимвольныйКод");
         
            Для Каждого Валюта Из ЗависимыеВалюты Цикл
                Если Найти(ФормулаРасчетаКурса, Валюта) > 0 Тогда
                    Отказ = Истина;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
     
        Если ЗначениеЗаполнено(ОсновнаяВалюта.ОсновнаяВалюта) Тогда
            Отказ = Истина;
        КонецЕсли;
     
        Если Отказ Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                НСтр("ru = 'Курс валюты можно связать только с курсом независимой валюты.'"));
        КонецЕсли;
     
        Если СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты Тогда
            ИсключаемыеРеквизиты = Новый Массив;
            ИсключаемыеРеквизиты.Добавить("ОсновнаяВалюта");
            ИсключаемыеРеквизиты.Добавить("Наценка");
            ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, ИсключаемыеРеквизиты);
        КонецЕсли;
     
        Если СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле Тогда
            ИсключаемыеРеквизиты = Новый Массив;
            ИсключаемыеРеквизиты.Добавить("ФормулаРасчетаКурса");
            ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, ИсключаемыеРеквизиты);
        КонецЕсли;
     
        Если Не ЭтоНовый()
            И СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты
            И РаботаСКурсамиВалют.СписокЗависимыхВалют(Ссылка).Количество() > 0 Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                НСтр("ru = 'Валюта не может быть подчиненной, так как она является основной для других валют.'"));
            Отказ = Истина;
        КонецЕсли;
     
    КонецПроцедуры
    
    Процедура ПриЗаписи(Отказ)
     
        Если ОбменДанными.Загрузка Тогда
            Возврат;
        КонецЕсли;
     
        ЭтоБазовая = ПолучитьФункциональнуюОпцию("БазоваяВерсия");
     
        РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(Ссылка);
     
        Если ДополнительныеСвойства.Свойство("ОбновитьКурсы") Тогда
            Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
                РаботаСКурсамиВалют.ПриОбновленииКурсовВалютВМоделиСервиса(ЭтотОбъект);
            Иначе
                ОбновитьКурсВалюты(ЭтотОбъект);
            КонецЕсли;
        КонецЕсли;
     
        Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВалют") Тогда
            УстановитьПривилегированныйРежим(Истина);
            Запрос = Новый Запрос(
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    Валюты.Ссылка
            |ИЗ
            |    Справочник.Валюты КАК Валюты
            |ГДЕ
            |    Валюты.Ссылка <> &Ссылка
            |    И НЕ Валюты.ПометкаУдаления");
            Запрос.УстановитьПараметр("Ссылка", Ссылка);
            Если Не Запрос.Выполнить().Пустой() Тогда
                Константы.ИспользоватьНесколькоВалют.Установить(Истина);
            КонецЕсли;
            УстановитьПривилегированныйРежим(Ложь);
        КонецЕсли;
     
        ОбновитьПовторноИспользуемыеЗначения();
     
    КонецПроцедуры
    
    Процедура ПередЗаписью(Отказ)
     
        Если ОбменДанными.Загрузка Тогда
            Возврат;
        КонецЕсли;
     
        Если ЭтоНовый() Тогда
            ДополнительныеСвойства.Вставить("ОбновитьКурсы");
            ДополнительныеСвойства.Вставить("ЭтоНовый");
        Иначе
            ПредыдущиеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Код,СпособУстановкиКурса,ОсновнаяВалюта,Наценка,ФормулаРасчетаКурса");
            Если (ПредыдущиеЗначения.СпособУстановкиКурса <> СпособУстановкиКурса)
                Или (СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета
                    И ПредыдущиеЗначения.Код <> Код)
                Или (СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты
                    И (ПредыдущиеЗначения.ОсновнаяВалюта <> ОсновнаяВалюта Или ПредыдущиеЗначения.Наценка <> Наценка))
                Или (СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле
                    И ПредыдущиеЗначения.ФормулаРасчетаКурса <> ФормулаРасчетаКурса) Тогда
                ДополнительныеСвойства.Вставить("ОбновитьКурсы");
            КонецЕсли;
        КонецЕсли;
     
        Если СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты Тогда
            ОсновнаяВалюта = Справочники.Валюты.ПустаяСсылка();
            Наценка = 0;
        КонецЕсли;
     
        Если СпособУстановкиКурса <> Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле Тогда
            ФормулаРасчетаКурса = "";
        КонецЕсли;
     
    КонецПроцедуры
    
    #КонецОбласти
    
    #Область СлужебныеПроцедурыИФункции
    
    Процедура ОбновитьКурсВалюты(ПодчиненнаяВалюта)
     
        Если СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты Тогда
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ
            |    КурсыВалют.Период,
            |    КурсыВалют.Валюта,
            |    КурсыВалют.Курс,
            |    КурсыВалют.Кратность
            |ИЗ
            |    РегистрСведений.КурсыВалют КАК КурсыВалют
            |ГДЕ
            |    КурсыВалют.Валюта = &ВалютаИсточник";
            Запрос.УстановитьПараметр("ВалютаИсточник", ПодчиненнаяВалюта.ОсновнаяВалюта);
         
            Выборка = Запрос.Выполнить().Выбрать();
         
            НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Валюта.Установить(ПодчиненнаяВалюта.Ссылка);
         
            Наценка = ПодчиненнаяВалюта.Наценка;
         
            Пока Выборка.Следующий() Цикл
             
                НоваяЗаписьНабораКурсов = НаборЗаписей.Добавить();
                НоваяЗаписьНабораКурсов.Валюта    = ПодчиненнаяВалюта.Ссылка;
                НоваяЗаписьНабораКурсов.Кратность = Выборка.Кратность;
                НоваяЗаписьНабораКурсов.Курс      = Выборка.Курс + Выборка.Курс * Наценка / 100;
                НоваяЗаписьНабораКурсов.Период    = Выборка.Период;
             
            КонецЦикла;
                 НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьКонтрольПодчиненныхВалют", Истина);
            Если ПодчиненнаяВалюта.ДополнительныеСвойства.Свойство("ЭтоНовый") Тогда
                НаборЗаписей.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
            КонецЕсли;
         
            НаборЗаписей.Записать();
         
        ИначеЕсли СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле Тогда
         
            // Получить основные валюты для ПодчиненнаяВалюта.
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ
            |    Валюты.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Валюты КАК Валюты
            |ГДЕ
            |    &ФормулаРасчетаКурса ПОДОБНО ""%"" + Валюты.Наименование + ""%""";
         
            Запрос.УстановитьПараметр("ФормулаРасчетаКурса", ПодчиненнаяВалюта.ФормулаРасчетаКурса);
            ОсновныеВалюты = Запрос.Выполнить().Выгрузить();
         
            Если ОсновныеВалюты.Количество() = 0 Тогда
                ТекстОшибки = НСтр("ru = 'В формуле должна быть использована хотя бы одна основная валюта.'");
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Объект.ФормулаРасчетаКурса");
                ВызватьИсключение ТекстОшибки;
            КонецЕсли;
         
            ОбновленныеПериоды = Новый Соответствие; // Кеш для однократного пересчета курса за один и тот же период.
            // Перезаписать курсы основных валют для обновления курса валюты ПодчиненнаяВалюта.
            Для каждого ЗаписьОсновнойВалюты Из ОсновныеВалюты Цикл
                НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Валюта.Установить(ЗаписьОсновнойВалюты.Ссылка);
                НаборЗаписей.Прочитать();
                НаборЗаписей.ДополнительныеСвойства.Вставить("ОбновитьКурсЗависимойВалюты", ПодчиненнаяВалюта.Ссылка);
                НаборЗаписей.ДополнительныеСвойства.Вставить("ОбновленныеПериоды", ОбновленныеПериоды);
             
                Если ПодчиненнаяВалюта.ДополнительныеСвойства.Свойство("ЭтоНовый") Тогда
                    НаборЗаписей.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
                КонецЕсли;
             
                НаборЗаписей.Записать();
            КонецЦикла
         
        КонецЕсли;
     
    КонецПроцедуры
    
    #КонецОбласти
    
    #КонецЕсли
    При проверке пишет РаботаСКурсамиВалют-переменная неопределенна.Однако я скопировал из 1С Ут .Там работает.
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Это общий модуль. Вы откуда и куда копируете ????
  7. TopicStarter Overlay
    rossoxa
    Offline

    rossoxa

    Регистрация:
    8 авг 2015
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Из 1С УТ 11.1 в 1С Розницв 2.1

    Спасибо. Нашёл

Поделиться этой страницей