Блог дизайнера

МЕНЮ
  • Подборки с фотографиями

1с формула пересчета валюты

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

Дано: Один из типовых отчетов "1С: УТ", связанный с выводом цен или стоимостей в одном из видов цен.

Требуется: дополнить(изменить) вывод выбранных цен(стоимостей в выбранном виде цен) выводом цен (стоимостей) в выбранной пользователем валюте.

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

Таким образом, необходимо рассмотреть 5 вариантов:

Валюта цены

Выбранная валюта

Способ вычисления цены в выбранной валюте

Помножить на курс валюты цены и поделить на кратность валюты цены

Разделить на курс выбранной валюты и помножить на кратность выбранной валюты

Не рубли (совпадает с валютой цены)

Не рубли (не совпадает с валютой цены)

Рассчитать по кросс-курсу:

Получить цену в рублях:

Помножить на курс валюты цены и поделить на кратность валюты цены

Пересчитать цену в выбранную валюту:

Разделить на курс выбранной валюты и помножить на кратность выбранной валюты

Последний вариант является наиболее обобщенным случаем. Под этот алгоритм расчета подходят все предыдущие варианты.

Что же касается описанных выше заданий, то по ним предлагается наиболее очевидный способ решения. Отчет СКД дополняется пересчетом имеющихся данных в выбранную валюту.

Технически это выглядит следующим образом:

  1. В отчет добавляется виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = .Валюта. Задается имя таблицы – ВалютаЦены.
  2. В отчет добавляется вторая виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = &ВыбВалюта. Задается имя таблицы – ВалютаОтчета.
  3. Добавляются новые (или заменяются старые) поля расчета показателей по принципу.

= * ВалютаЦены.Курс*ВалютаОтчета.Кратность/ ВалютаЦены.Кратность/ ВалютаОтчета.Курс.

  1. Параметры отчета ВыбВалюта и ВыбДата добавляются в изменяемые параметры. Для гарантии заполнения следует включить требование обязательностьи заполнения.

В одной из задач про дату пересчета ничего не сказано. Можно спросить об этом экзаменатора. А можно понимать под датой пересчета – текущую дату. Для этого запретить изменение этого параметра пользователем, а в поле выражение задать формулу ТекущаяДата().

Решение очевидное и несложное, если не считать необходимость задания громоздких формул курсов и кратностей.

Однако на текущем релизе УТ 11 данное решение, увы, не заработало. Причина в том, что текст запроса, введенный в ЭХД в отчетах (по крайне мере тех, которые требуется доработать в данных задачах) в процессе формирования отчетов, подвергается программной доработке. Таким образом, если «родной» текст запроса изменен, то отчет «спотыкается» в связи с невозможностью его программно изменить.

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

Я же нашел иной вариант решения, избавляющий от необходимости изменения текста запроса и громоздких формул.

Сначала я задался вопросом. Неужели в типовой конфигурации нет функции пересчета сумм из валюты в валюту, чтобы ей можно было воспользоваться, не «изобретая велосипед»?

Конечно же, такая функция обнаружилась:

Общий модуль – РаботаСКурсамиВалютУТ

Функция ПересчитатьСуммуДокументаВВалюту(СуммаДокумента, ТекущаяВалюта, НоваяВалюта, Дата) Экспорт

Рассмотрим ее описание в комментариях.


Вполне очевидно, что эта функция полностью отвечает нашим требованиям – если в качестве параметров указать Цену, Валюту цены, Выбранную валюту и дату пересчета, то на выходе получим Цену в требуемой валюте.

Известно, что в СКД можно вызывать экспортируемые функции общих модулей. Однако, как указано в описании, такой общий модуль должен исполняться на клиенте. В свойствах же общего модуля РаботаСКурсамиВалютУТ указаны параметры исполнения: Сервер и Внешнее соединение.

Таким образом, напрямую воспользоваться данной функцией не получится.

Но вполне допустим следующий вариант – создать дополнительный общий модуль, запускающий нужную функцию из варианта исполнения Клиент с использованием Вызова сервера.

Добавим новый общий модуль (предварительно включив режим редактирования конфигурации). В материалах по подготовке к экзаменам добавляемые общие модули рекомендуют называть «Экзамен». В свойствах укажем галочки: Клиент, Сервер и Вызов сервера. В документации по стандартам 1С рекомендуется имя общего модуля дополнять вариантом исполнения. Для нашего варианта – Вызов сервера.

Таким образом, настройки модуля:


Созданный модуль будет содержать одну экспортируемую функцию, которую для ясности можно назвать ПересчитатьСуммуДокументаВВалюту. Назначение данной функции – вызвать одноименную функцию общего модуля РаботаСКурсамиВалютУТ и возвратить результат. Функцию необходимо снабдить инструкцией препроцессора НаСервере


Рассмотрим доработку СКД для типового отчета «Прайс-лист».

В СКД находим необходимые данные для пересчета – это поля Цена и Валюта:


Создадим параметр Валюта отчета. Параметр дата формирования уже имеется «Дата отчета».


Далее на закладке Вычисляемые поля добавляем вызов новой функции.


После этого добавляем новый ресурс. Заметим, что выражение агрегирования для Цены не является элементарным, поэтому следует его полностью скопировать и заменить аргумент Цена на ЦенаВВалюте.


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

Для задачи, в которой требуется не добавить новое поле с выводом суммы в валюте отчета, а изменить значение существующего поля (сумма в валюте цены), вызов функции можно осуществить не путем создания нового поля на закладке Вычисляемые поля, а непосредственно для изменяемого поля на закладке «Наборы данных» (колонка – Выражение представления).

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

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

среда, 12 марта 2014 г.

Типовая функция для пересчета из валюты в валюту

Для пересчета из валюты в валюту в типовых конфигурациях используется функция ПересчитатьИзВалютыВВалюту, расположенная в общем модуле - МодульВалютногоУчета.

Текст функции такой:

// Эта функция пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач
// в валюту ВалютаКон по курсу ПоКурсуКон
//
// Параметры:
// Сумма - сумма, которую следует пересчитать;
// ВалютаНач - ссылка на элемент справочника Валют;
// определяет валюты из которой надо пересчитвать;
// ВалютаКон - ссылка на элемент справочника Валют;
// определяет валюты в которую надо пересчитвать;
// ПоКурсуНач - курс из которого надо пересчитать;
// ПоКурсуКон - курс в который надо пересчитать;
// ПоКратностьНач - кратность из которого надо пересчитать (по умолчанию = 1);
// ПоКратностьКон - кратность в который надо пересчитать (по умолчанию = 1);
//
// Возвращаемое значение:
// Сумма, пересчитанная в другую валюту
//
Функция ПересчитатьИзВалютыВВалюту ( Сумма , ВалютаНач , ВалютаКон , ПоКурсуНач , ПоКурсуКон ,
ПоКратностьНач = 1 , ПоКратностьКон = 1 , Погрешность = 0 ,
СоответствиеПогрешностей = Неопределено, Ключ = Неопределено) Экспорт

Если ( ВалютаНач = ВалютаКон ) Тогда

// Считаем, что пересчет не нужен.
Возврат Сумма ;
КонецЕсли;

Если ( ПоКурсуНач = ПоКурсуКон )
и ( ПоКратностьНач = ПоКратностьКон ) Тогда

// пересчет суммы не требуется
Возврат Сумма ;
КонецЕсли;

Если ПоКурсуНач = 0
или ПоКурсуКон = 0
или ПоКратностьНач = 0
или ПоКратностьКон = 0 Тогда
ОбщегоНазначения . СообщитьОбОшибке ( "При пересчете из валюты '" + ВалютаНач + "' в валюту '" + ВалютаКон + "' обнаружен нулевой курс. Пересчет не произведен!" );
Возврат 0 ;
КонецЕсли;


НоваяСумма = ( Сумма * ПоКурсуНач * ПоКратностьКон ) / ( ПоКурсуКон * ПоКратностьНач );
Возврат ОбщегоНазначения . ОкруглитьСУчетомПогрешности ( НоваяСумма , 2 , Погрешность , СоответствиеПогрешностей , Ключ );

В УПП также существует функция ПересчитатьВСуммуРегл, которая предназначена для пересчета суммы управленческого учета в сумму регламентированного учета.

// Функция производит пересчет суммы в валюте упр. учета в валюту регл. учета.
//
Функция ПересчитатьВСуммуРегл ( СуммаУпр , ВалютаРегламентированногоУчета , ВалютаУправленческогоУчета , Дата ) Экспорт

ВалютаРегл = ВалютаРегламентированногоУчета ;
ВалютаУпр = ВалютаУправленческогоУчета ;

КурсВал = ПолучитьКурсВалюты ( ВалютаРегл , Дата );
КурсРегл = КурсВал . Курс ;
КратРегл = КурсВал . Кратность ;

КурсВал = ПолучитьКурсВалюты ( ВалютаУпр , Дата );
КурсУпр = КурсВал . Курс ;
КратУпр = КурсВал . Кратность ;

СуммаРегл = ПересчитатьИзВалютыВВалюту ( СуммаУпр , ВалютаУпр , ВалютаРегл , КурсУпр , КурсРегл , КратУпр , КратРегл );

Примеры вызова функций:

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


СтрокаТабличнойЧасти . СтоимостьРегл = МодульВалютногоУчета . ПересчитатьВСуммуРегл ( СтрокаТабличнойЧасти . Стоимость , мВалютаРегламентированногоУчета , мВалютаУправленческогоУчета , Дата );

Расширение «Курсы валют в формулах расчета динамических цен» позволяет использовать в формулах расчета динамических цен операнды текущих курсов валют [КурсДоллара], [КурсЕвро], [КурсЮаня] без внесения изменений в типовую конфигурацию "Управление нашей фирмой".

Операнды курсов валют отображаются в конструкторе формул при включении в настройках программы возможности использования нескольких валют, а также при наличии в справочнике соответствующих валют с кодами "840" для USD, "978" для EUR, "156" для CNY.

Для динамических цен с включенным авторасчетом (галочка "Рассчитывать автоматически при изменении базовых цен"), содержащих операнды курсов валют в своих формулах, автоматический перерасчет цен выполняется в случае изменения формулы, базовых цен, а также при:

  • Записи курса валюты пользователем
  • Загрузке курсов валют штатной обработкой
  • Загрузке курсов валют штатным регламентным заданием

Для регламентного задания "Загрузка курсов валют" рекомендуется настроить расписание выполнения один раз в день (в начале суток).

Автоматический прерасчет динамических цен выполняется штатным регламентным заданием "Обработка очереди цен".

Расширение протестировано в конфигурациях УНФ начиная с версии 1.6.12.4 (режим совместимости 8.3.10) и далее по версию 1.6.25.236 (режим совместимости 8.3.16).
Для нормальной работы расширения необходимо снять галочку "Безопасный режим. " в свойствах расширения. Также может потребоваться изменить режим совместимости расширения на соответствующий режиму совместимости конфигурации (см. прилагающуюся инструкцию по установке расширения) при установке расширения или обновлении конфигурации УНФ.

ВНИМАНИЕ! В базовых версиях прикладных решений работа с расширениями не поддерживается.

ВАЖНО! Расширение версий с 1.0 по 1.6 предназначено для конфигураций УНФ по 1.6.16.219 включительно, расширение версии 1.7 - для УНФ начиная с 1.6.17.101, расширение версии 1.8 - для УНФ начиная с 1.6.19. расширение версии 1.9 - для УНФ начиная с 1.6.20. расширение версии 1.10 - для УНФ начиная с 1.6.21. расширение версии 1.11 - для УНФ начиная с 1.6.22. расширение версии 1.12 - для УНФ начиная с 1.6.25.

В типовой конфигурации УНФ начиная c редакции 1.6.17 реализован типовой пересчет по курсу валюты базовой цены:

"Автоматический пересчет динамических цен в валюте

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

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

Если курс валюты задаете вручную, динамические цены автоматически пересчитаются.

Если вы установили курс в зависимости от загружаемых курсов валют. Тогда запускайте пересчет кнопкой Регистрировать новые цены и закрыть при существенном для вас изменении курса..."

После обновления на УНФ 1.6.17 необходимо убрать множители курсов валют из формул расчета динамических цен для исключения удвоенной конвертации.

Однако, типовой механизм не выполняет автоматический пересчет цен при изменении курсов валют, у которых задан способ установки "загружается из Интернета", а предлагает запускать пересчет кнопкой Регистрировать новые цены и закрыть.

Для подключения имеющейся в данном расширении функции автоматического пересчета цены при загрузке курса, введите в формулу расчета операнд курса валюты, по примеру формулы №7.

Примеры формул с использованием операндов (только для версий расширения ниже 1.7):

1) Динамическая цена в рублях с расчетом от базовой цены в долларах по текущему курсу доллара

2) Динамическая цена в рублях с расчетом от базовой цены в евро по текущему курсу евро +1%

[Ценавевро] * [КурсЕвро] * (100 + 1) / 100

3) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют,
при суммировании в формуле базовых цен в разных валютах, для позиции должна быть заполнена только одна из базовых цен

([Ценавдолларах] * [КурсДоллара]) + ([Ценавевро] * [КурсЕвро]) + [Ценаврублях]

4) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют,
при использовании в функции минимума, для позиции должны быть заполнены все базовые цены, иначе минимальная цена будет нулевая

МИН( ( [Ценавдолларах] * [КурсДоллара] ) , ( [Ценавевро] * [КурсЕвро] ) , [Ценаврублях] )

5) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют по логическому условию

где Ценавдолларах, Ценавевро, Ценаврублях - примеры идентификаторов базовых видов цен в справочнике

Примеры формул с использованием операндов (только для версий расширения начиная с 1.7):

6) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют по логическому условию

7) Динамическая цена в рублях с расчетом от базовых цен в юанях по логическому условию

Распечатать

Как сделать Расшифровку в табличном документе 0
Вопрос: Подскажите пожалуйста, каким образом можно сделать следующее. У меня есть выводимый в табличный документ результат запроса, к ячейке есть расшифровка. Я хочу чтобы при двойном клике на ячейку выполнялась процедура которая к примеру зап Универсальная функция получения курса валюты 0
Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(" Валюта" , Валюта)); Сумма = ВалютнаяСумма * Запись.Курс; Если Запись.Кратность 0 Тогда Сумма = С Функция пересчета валютной суммы по курсу на дату документа 0
Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(" Валюта" , Валюта)); Сумма = ВалютнаяСумма * Запись.Курс / Запись.Кратность; Возврат Сумма; КонецФу Посмотреть все результаты поиска похожих

Еще в этой же категории

Момент Времени и Граница, назначение, примеры использования 39
Момент времени: Фирма 1С описывает так: Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методо Преобразование даты 1С в unixtime (Unix Time Stamp) 17
Как известно, unixtime содержит количество секунд, прошедших с 1 января 1970 года. Поэтому, для преобразования даты 1С в дату unixtime нам всего то нужно от нашей даты отнять дату 01.01.1970 и перевести получившееся значения в удобоваримый формат. Функция месяц прописью 11
// пример от glory01 А = Формат(20020820153309, " ДФ=ММММ" ) // А = " Август" А = Формат(ТекущаяДата(), " ДФ=ММММ" ) // А = " Март" Функция МесяцПрописью(НомерМесяца) Экспорт НомерМесяца=Число(НомерМесяца); Если НомерМесяца = 1 Тогда Воз Как вычислить разницу между двумя датами в месяцах 11
Функция РазницаДатВМесяцах(Дата1, Дата2) Экспорт ДатаНач = ?(Дата1 Дата2, Дата1, Дата2); ДатаКон = ?(Дата1 Дата2, Дата2, Дата1); Годы = Год( датаКон ) - Год( датаНач ); Месяцы = Месяц( датаКон ) - Месяц( датаНач ); Разность = месяцы + Как вычислить разницу между двумя датами в часах и минутах 10
Функция РазностьВремени(Время1, Время2); Разность = Время1 - Время2; Если Разность 0 Тогда Часов = Цел(Разность / 3600); Минут = Цел((Разность - Часов * 3600) / 60); Возврат Дата(1, 1, 1, Часов, Минут, 0); Иначе Возврат Дата(1,1,1,0,0,0); Посмотреть все в категории Работа с Датами (Временем)

Распечатать

Вывод Диаграммы График Валют, Сохранение диаграммы, графиков и гистограмм в виде Картинки 0
Алгоритм обработки выполняет запрос к регистру сведений " курсы валют" за определенный пользователем период. Полученные данные выборки в цикле выводятся в элемент экранной формы " диаграмма" в режиме построения графика. Для элемента управления " Ди Документ "Корректировка записей регистров" - Как программно создать и заполнить? 8
Документ «Корректировка записей регистров» в типовых конфигурациях 1С предназначен для ручной корректировки записей регистров накопления, зависимых регистров сведений и регистров бухгалтерии. Типичные ситуации, в которых может понадобиться документ « Загрузка данных в 1С из PDF 4
В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла. И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С. Чтение PDF файлов из 1С Первым дело я стал Запись в регистр сведений (Установить курс и кратность валюты) 1
// Запись в регистр сведений (Установить курс и кратность валюты) // Параметры: // Валюта - ссылка на элемент справочника Валют // Процедура ЗаписатьКурс(Валюта) Экспорт РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи() Использование предложения ДЛЯ ИЗМЕНЕНИЯ 0
Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в Посмотреть все результаты поиска похожих

Еще в этой же категории

Полезные возможности редактора кода 1С 28
Мне частенько приходится взаимодействовать с 1С-разработчиками, и во время совместной работы над проектами замечаю, что далеко не все из них хорошо знают свой главный инструмент – «Конфигуратор». Причем это не относится к степени крутости девелопера Работа с буфером обмена средствами 1С 19
Копировать из 1С в буфер обмена( без ВК): ЭлементыФормы.Добавить(Тип(" ПолеHTMLДокумента" ), " Поле_HTML_Документа_acb123" , Ложь); Окно = ЭлементыФормы.Поле_HTML_Документа_acb123.Документ.ParentWindow; Окно.ClipboardData.SetData(" Text" , Текст Структура и название таблиц использыемых для хранения данных в БД 1С 8.х 17
Данные, которые определяют логику функционирования системы на базе 1С:Предприятия, относятся к информационной базе. Хранение информационной базы осуществляется в базе данных с виде набора таблиц, для чего 1С:Предприятие 8.1 может использовать одну из Программно получить список активных пользователей 12
Процедура ПолучениеСпискаАктивныхПользователей() ИтогСписокСоединений.Очистить(); СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы(); Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл ТЗ=ИтогСпи Как получить ссылку на объект из навигационной ссылки? 7
Процедура ПолучитьСсылкуИзНавигационной(НС) ПерваяТочка = Найти(НС, " e1cib/data/" ); ВтораяТочка = Найти(НС, " ?ref icon-exclamation-sign"> Посмотреть все в категории Полезные, Универсальные Функции

Читайте также:

      
  • Mobiletool программа для прослушивания записей разговоров мобильного телефона sms и др
  •   
  • Как настроить абзац в ворде реферат
  •   
  • Как сделать ссылку на рисунок в ворде
  •   
  • Обозреватель объектов sql server visual studio как открыть
  •   
  • Asus virtual camera что это за программа
  • Контакты
  • Политика конфиденциальности