1с пересчет валюты в запросе
В этой главе разберем практический пример задачи с переменным списком валют – реализуем требование задачи по погашению задолженности оплатой по методу FIFO. Переплату будем отражать как аванс по контрагенту. Сделаем это в обработке проведения документа «Поступление денег».
Проведение документа «Поступление денег»
Алгоритм погашения задолженности в разрезе накладных по FIFO уже разбирали ранее в блоке «Взаиморасчеты – автоматический зачет оплат и/или погашение задолженности».
Особенность данной задачи состоит в том, что отличаются валюты оплаты и задолженности. Все оплаты оформляются в рублях. Задолженности могут быть в любых валютах. Погашать их нужно по курсу на дату оплаты.
Чтобы понимать, какие суммы долга по накладной можно погасить, будем сравнивать задолженности по накладным с суммой оплаты. Для этого сначала нужно сделать суммы соизмеримыми, т.е. выразить в одной валюте.
Для всех имеющихся задолженностей будем определять курс валюты на дату оплаты и рассчитывать рублевый эквивалент. Для этого при получении данных по остаткам задолженностей в запросе будем делать соединение таблицы остатков РН «Взаиморасчеты» с данными виртуальной таблицы срез последних РС «Курсы валют»:
Рисунок 1 – Схема соединения таблиц для получения данных о задолженностях
При поступлении оплаты возможны три варианта:
- Оплата меньше рублевого эквивалента долга по накладной
- Оплата равна рублевому эквиваленту долга по накладной
- Оплата больше рублевого эквивалента долга по накладной.
Разберем, как определить сумму погашения долга в валюте для каждого из вариантов.
Сумма погашения = СуммаОплаты/Курс.
Алгоритм на этом закончен, т.к. вся оплата была израсходована.
Сумма погашения = Сумма долга (вал.)
В данном случае не нужно рассчитывать сумму по курсу, чтобы избежать возможных ошибок округления при пересчете.
Сумма погашения = Сумма долга (вал.)
Также пересчет по курсу не выполняем.
Алгоритм на этом не заканчивается. Рассчитываем остаток оплаты после погашения долга: для этого от суммы оплаты отнимаем рублевый эквивалент погашенного долга.
Далее применяем ту же логику для анализа остатка оплаты.
Cумма погашения долга по Накладной № 1 равна Сумме долга (вал.) и составит 100,00 долларов.
Cумма погашения долга по Накладной № 1 равна Сумме долга (вал.) и составит 100,00 долларов. Cумма погашения долга по Накладной № 2 составит 1 000 / 30 = 33,33 Евро.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
среда, 12 марта 2014 г.
Типовая функция для пересчета из валюты в валюту
Для пересчета из валюты в валюту в типовых конфигурациях используется функция ПересчитатьИзВалютыВВалюту, расположенная в общем модуле - МодульВалютногоУчета.
Текст функции такой:
// Эта функция пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач
// в валюту ВалютаКон по курсу ПоКурсуКон
//
// Параметры:
// Сумма - сумма, которую следует пересчитать;
// ВалютаНач - ссылка на элемент справочника Валют;
// определяет валюты из которой надо пересчитвать;
// ВалютаКон - ссылка на элемент справочника Валют;
// определяет валюты в которую надо пересчитвать;
// ПоКурсуНач - курс из которого надо пересчитать;
// ПоКурсуКон - курс в который надо пересчитать;
// ПоКратностьНач - кратность из которого надо пересчитать (по умолчанию = 1);
// ПоКратностьКон - кратность в который надо пересчитать (по умолчанию = 1);
//
// Возвращаемое значение:
// Сумма, пересчитанная в другую валюту
//
Функция ПересчитатьИзВалютыВВалюту ( Сумма , ВалютаНач , ВалютаКон , ПоКурсуНач , ПоКурсуКон ,
ПоКратностьНач = 1 , ПоКратностьКон = 1 , Погрешность = 0 ,
СоответствиеПогрешностей = Неопределено, Ключ = Неопределено) Экспорт
Если ( ВалютаНач = ВалютаКон ) Тогда
// Считаем, что пересчет не нужен.
Возврат Сумма ;
КонецЕсли;
Если ( ПоКурсуНач = ПоКурсуКон )
и ( ПоКратностьНач = ПоКратностьКон ) Тогда
// пересчет суммы не требуется
Возврат Сумма ;
КонецЕсли;
Если ПоКурсуНач = 0
или ПоКурсуКон = 0
или ПоКратностьНач = 0
или ПоКратностьКон = 0 Тогда
ОбщегоНазначения . СообщитьОбОшибке ( "При пересчете из валюты '" + ВалютаНач + "' в валюту '" + ВалютаКон + "' обнаружен нулевой курс. Пересчет не произведен!" );
Возврат 0 ;
КонецЕсли;
НоваяСумма = ( Сумма * ПоКурсуНач * ПоКратностьКон ) / ( ПоКурсуКон * ПоКратностьНач );
Возврат ОбщегоНазначения . ОкруглитьСУчетомПогрешности ( НоваяСумма , 2 , Погрешность , СоответствиеПогрешностей , Ключ );
В УПП также существует функция ПересчитатьВСуммуРегл, которая предназначена для пересчета суммы управленческого учета в сумму регламентированного учета.
// Функция производит пересчет суммы в валюте упр. учета в валюту регл. учета.
//
Функция ПересчитатьВСуммуРегл ( СуммаУпр , ВалютаРегламентированногоУчета , ВалютаУправленческогоУчета , Дата ) Экспорт
ВалютаРегл = ВалютаРегламентированногоУчета ;
ВалютаУпр = ВалютаУправленческогоУчета ;
КурсВал = ПолучитьКурсВалюты ( ВалютаРегл , Дата );
КурсРегл = КурсВал . Курс ;
КратРегл = КурсВал . Кратность ;
КурсВал = ПолучитьКурсВалюты ( ВалютаУпр , Дата );
КурсУпр = КурсВал . Курс ;
КратУпр = КурсВал . Кратность ;
СуммаРегл = ПересчитатьИзВалютыВВалюту ( СуммаУпр , ВалютаУпр , ВалютаРегл , КурсУпр , КурсРегл , КратУпр , КратРегл );
Примеры вызова функций:
СуммаВзаиморасчетов = МодульВалютногоУчета . ПересчитатьИзВалютыВВалюту ( СуммаДокумента , ВалютаДокумента ,
СтруктураШапкиДокумента . ВалютаВзаиморасчетов , СтруктураШапкиДокумента . КурсДокумента , КурсВзаиморасчетов ,
СтруктураШапкиДокумента . КратностьДокумента , КратностьВзаиморасчетов );
СтрокаТабличнойЧасти . СтоимостьРегл = МодульВалютногоУчета . ПересчитатьВСуммуРегл ( СтрокаТабличнойЧасти . Стоимость , мВалютаРегламентированногоУчета , мВалютаУправленческогоУчета , Дата );
В сборнике задач для подготовки к экзамену «1С: Специалист» по конфигурированию и внедрению 1С: Управление торговлей 11 имеются задачи по доработке типовых отчетов, связанных пересчетом показателей в выбранную валюту на выбранную дату. В статье предлагается альтернативный способ решения, использующий возможности СКД без изменения типового текста запроса. Подход может применяться как при решении экзаменационных задач, так и на практике при доработках типовых отчетов, связанных с пересчетом валют.
Дано: Один из типовых отчетов "1С: УТ", связанный с выводом цен или стоимостей в одном из видов цен.
Требуется: дополнить(изменить) вывод выбранных цен(стоимостей в выбранном виде цен) выводом цен (стоимостей) в выбранной пользователем валюте.
Понятно, что валюта цены и выбранная валюта может являться как рублями (валютой регламентированного учета), так и любой произвольной валютой из справочника.
Таким образом, необходимо рассмотреть 5 вариантов:
Валюта цены
Выбранная валюта
Способ вычисления цены в выбранной валюте
Помножить на курс валюты цены и поделить на кратность валюты цены
Разделить на курс выбранной валюты и помножить на кратность выбранной валюты
Не рубли (совпадает с валютой цены)
Не рубли (не совпадает с валютой цены)
Рассчитать по кросс-курсу:
Получить цену в рублях:
Помножить на курс валюты цены и поделить на кратность валюты цены
Пересчитать цену в выбранную валюту:
Разделить на курс выбранной валюты и помножить на кратность выбранной валюты
Последний вариант является наиболее обобщенным случаем. Под этот алгоритм расчета подходят все предыдущие варианты.
Что же касается описанных выше заданий, то по ним предлагается наиболее очевидный способ решения. Отчет СКД дополняется пересчетом имеющихся данных в выбранную валюту.
Технически это выглядит следующим образом:
- В отчет добавляется виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = .Валюта. Задается имя таблицы – ВалютаЦены.
- В отчет добавляется вторая виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = &ВыбВалюта. Задается имя таблицы – ВалютаОтчета.
- Добавляются новые (или заменяются старые) поля расчета показателей по принципу.
= * ВалютаЦены.Курс*ВалютаОтчета.Кратность/ ВалютаЦены.Кратность/ ВалютаОтчета.Курс.
- Параметры отчета ВыбВалюта и ВыбДата добавляются в изменяемые параметры. Для гарантии заполнения следует включить требование обязательностьи заполнения.
В одной из задач про дату пересчета ничего не сказано. Можно спросить об этом экзаменатора. А можно понимать под датой пересчета – текущую дату. Для этого запретить изменение этого параметра пользователем, а в поле выражение задать формулу ТекущаяДата().
Решение очевидное и несложное, если не считать необходимость задания громоздких формул курсов и кратностей.
Однако на текущем релизе УТ 11 данное решение, увы, не заработало. Причина в том, что текст запроса, введенный в ЭХД в отчетах (по крайне мере тех, которые требуется доработать в данных задачах) в процессе формирования отчетов, подвергается программной доработке. Таким образом, если «родной» текст запроса изменен, то отчет «спотыкается» в связи с невозможностью его программно изменить.
Выкрутиться из этой ситуации, на мой взгляд, можно только программной подменой текста запроса после выполнения всех типовых преобразований. На мой взгляд, очень трудоемкое дело. Кстати, если кому-то известны другие варианты выхода из этой ситуации, напишите, пожалуйста.
Я же нашел иной вариант решения, избавляющий от необходимости изменения текста запроса и громоздких формул.
Сначала я задался вопросом. Неужели в типовой конфигурации нет функции пересчета сумм из валюты в валюту, чтобы ей можно было воспользоваться, не «изобретая велосипед»?
Конечно же, такая функция обнаружилась:
Общий модуль – РаботаСКурсамиВалютУТ
Функция ПересчитатьСуммуДокументаВВалюту(СуммаДокумента, ТекущаяВалюта, НоваяВалюта, Дата) Экспорт
Рассмотрим ее описание в комментариях.
Вполне очевидно, что эта функция полностью отвечает нашим требованиям – если в качестве параметров указать Цену, Валюту цены, Выбранную валюту и дату пересчета, то на выходе получим Цену в требуемой валюте.
Известно, что в СКД можно вызывать экспортируемые функции общих модулей. Однако, как указано в описании, такой общий модуль должен исполняться на клиенте. В свойствах же общего модуля РаботаСКурсамиВалютУТ указаны параметры исполнения: Сервер и Внешнее соединение.
Таким образом, напрямую воспользоваться данной функцией не получится.
Но вполне допустим следующий вариант – создать дополнительный общий модуль, запускающий нужную функцию из варианта исполнения Клиент с использованием Вызова сервера.
Добавим новый общий модуль (предварительно включив режим редактирования конфигурации). В материалах по подготовке к экзаменам добавляемые общие модули рекомендуют называть «Экзамен». В свойствах укажем галочки: Клиент, Сервер и Вызов сервера. В документации по стандартам 1С рекомендуется имя общего модуля дополнять вариантом исполнения. Для нашего варианта – Вызов сервера.
Таким образом, настройки модуля:
Созданный модуль будет содержать одну экспортируемую функцию, которую для ясности можно назвать ПересчитатьСуммуДокументаВВалюту. Назначение данной функции – вызвать одноименную функцию общего модуля РаботаСКурсамиВалютУТ и возвратить результат. Функцию необходимо снабдить инструкцией препроцессора НаСервере
Рассмотрим доработку СКД для типового отчета «Прайс-лист».
В СКД находим необходимые данные для пересчета – это поля Цена и Валюта:
Создадим параметр Валюта отчета. Параметр дата формирования уже имеется «Дата отчета».
Далее на закладке Вычисляемые поля добавляем вызов новой функции.
После этого добавляем новый ресурс. Заметим, что выражение агрегирования для Цены не является элементарным, поэтому следует его полностью скопировать и заменить аргумент Цена на ЦенаВВалюте.
В завершении на закладке Настройки требуется настроить отображение параметра Валюта отчета и добавить вывод ресурса ЦенаВВалюте на соответствующий уровень группировки.
Для задачи, в которой требуется не добавить новое поле с выводом суммы в валюте отчета, а изменить значение существующего поля (сумма в валюте цены), вызов функции можно осуществить не путем создания нового поля на закладке Вычисляемые поля, а непосредственно для изменяемого поля на закладке «Наборы данных» (колонка – Выражение представления).
Очевидным плюсом данного решения является то, что в этом случае дополнительных настроек, связанных с созданием ресурса и изменением структуры вывода не потребуется.
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей. COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Как изменить запись регистра сведений? 36
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата)); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество Как добавить запись в периодический независимый регистр сведений? 16
// Добавление записей в периодический независимый регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); НовЗапис Как добавить записи в непериодический независимый регистр сведений? 13
НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапи Как добавить записи в независимый регистр сведений? 11
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. имя . Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Как выбрать записи из регистра сведений? 9
//ВНИМАНИЕ . // В качестве полей для отбора могут задаваться измерения или реквизиты, для которых // в конфигураторе признак индексирования установлен в значение " Индексировать" или // установлен признак " Ведущее" . Вид сравнения может бы Посмотреть все в категории Регистры сведений
Вывод Диаграммы График Валют, Сохранение диаграммы, графиков и гистограмм в виде Картинки 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"> Посмотреть все в категории Полезные, Универсальные Функции
Читайте также: