1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? Код 1C v 7.x
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе
Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов;
Url = "http://www.bank.gov.ua/control/uk/curmetal/currency/search?formType=searchFormDate&time_step=" + ? ( Ежедневно = 1 , "daily" , "monthly" ) +
"&date=" + Формат( ДатаКурса, "ДДДММГГГГ" ) + "&outer=table&execute=run&time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
Reader = СоздатьОбъект( "MSXML2.XMLHTTP" ) ;
Reader. Open( "Get" , Url, 0 ) ;
Reader. Send( ) ;
Пока Reader. ReadyState < > 4 Цикл
Состояние( "Чтение данных за <" + ДатаКурса + "> " ) ;
КонецЦикла ;
Док = СоздатьОбъект( "HtmlFile" ) ;
Док. open( "text/html" ) ;
Док. write( Reader. ResponseText) ;
Док. close( ) ;
HtmlTab = Док. getElementsByTagName( "table" ) . item( 5 ) ;
ТабКурсов = СоздатьОбъект( "ТаблицаЗначений" ) ;
ТабКурсов. НоваяКолонка( "ЦифрКод" , "Строка" , 3 , , "Цифр. код" ) ;
ТабКурсов. НоваяКолонка( "БуквКод" , "Строка" , 3 , , "Букв. код" ) ;
ТабКурсов. НоваяКолонка( "Название" , "Строка" ) ;
ТабКурсов. НоваяКолонка( "Курс" , "Число" , 14 , 4 ) ;
ТабКурсов. НоваяКолонка( "Кратность" , "Число" , 9 , 0 ) ;
Строк = HtmlTab. rows. length;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если ( НомСтроки = 1 ) Или ( Р. cells. length < > 5 ) Тогда
Продолжить;
КонецЕсли ;
ТабКурсов. НоваяСтрока( ) ;
ТабКурсов. ЦифрКод = СокрЛП( Р. cells( 0 ) . innerText) ;
ТабКурсов. БуквКод = СокрЛП( Р. cells( 1 ) . innerText) ;
ТабКурсов. Название = СокрЛП( Р. cells( 3 ) . innerText) ;
ТабКурсов. Курс = 0 + СтрЗаменить( СокрЛП( Р. cells( 4 ) . innerText) , " " , "" ) ;
ТабКурсов. Кратность = 0 + СтрЗаменить( СокрЛП( Р. cells( 2 ) . innerText) , " " , "" ) ;
КонецЦикла ;
Reader = 0 ;
ТабКурсов. ВыбратьСтроку( , "Курсы за " + ДатаКурса) ;
Возврат ТабКурсов;
КонецФункции
Категория:
HTML, JS, VML Как получить курсы валют с сайта http://finance.ua/ за любую дату ? Код 1C v 7.x
Функция ПолучитьТаблицуКурсов(ДатаКурса)
Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов;
Reader = СоздатьОбъект( "MSXML2.XMLHTTP" ) ;
Url = "http://tables.finance.ua/ru/currency/official/-/1/" + ДатаГод( ДатаКурса) + "/" + ДатаМесяц( ДатаКурса) + "/" + ДатаЧисло( ДатаКурса) + "?time=" + _GetPerformanceCounter( ) ;
Сообщить( Url) ;
Reader. Open( "Get" , Url, 0 ) ;
Reader. Send( ) ;
Пока Reader. ReadyState < > 4 Цикл
Состояние( "Чтение данных за <" + ДатаКурса + "> " ) ;
КонецЦикла ;
Док = СоздатьОбъект( "HtmlFile" ) ;
Док. open( "text/html" ) ;
Док. write( Reader. ResponseText) ;
Док. close( ) ;
HtmlTab = Док. getElementByID( "currency-official-table" ) ;
Строк = HtmlTab. rows. length;
ТабКурсов = СоздатьОбъект( "ТаблицаЗначений" ) ;
ТабКурсов. НоваяКолонка( "ЦифрКод" , "Строка" , 3 , , "Цифр. код" ) ;
ТабКурсов. НоваяКолонка( "БуквКод" , "Строка" , 3 , , "Букв. код" ) ;
ТабКурсов. НоваяКолонка( "Название" , "Строка" ) ;
ТабКурсов. НоваяКолонка( "Курс" , "Число" , 14 , 4 ) ;
ТабКурсов. НоваяКолонка( "Кратность" , "Число" , 9 , 0 ) ;
Для НомСтроки = 1 По Строк Цикл
Р = HtmlTab. rows( НомСтроки - 1 ) ;
Если ( НомСтроки = 1 ) Или ( Р. cells. length < > 7 ) Тогда
Продолжить;
КонецЕсли ;
ТабКурсов. НоваяСтрока( ) ;
ТабКурсов. ЦифрКод = СокрЛП( Р. cells( 0 ) . innerText) ;
ТабКурсов. БуквКод = СокрЛП( Р. cells( 1 ) . innerText) ;
ТабКурсов. Название = СокрЛП( Р. cells( 3 ) . innerText) ;
ТабКурсов. Курс = 0 + СтрЗаменить( СокрЛП( Р. cells( 4 ) . innerText) , " " , "" ) ;
ТабКурсов. Кратность = 0 + СтрЗаменить( СокрЛП( Р. cells( 2 ) . innerText) , " " , "" ) ;
КонецЦикла ;
Reader = 0 ;
ТабКурсов. ВыбратьСтроку( , "Курсы за " + ДатаКурса) ;
Возврат ТабКурсов;
КонецФункции
Категория:
HTML, JS, VML Срез последних (остатки) на каждую дату Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Код 1C v 8.х ВЫБРАТЬ
Таб1 . СсылкаДок,
Таб1 . ДатаДок,
Таб1 . ВалютаДок,
Таб2 . Курс
ИЗ
( ВЫБРАТЬ
ЗаказПокупателя. Ссылка КАК СсылкаДок,
ЗаказПокупателя. Дата КАК ДатаДок,
ЗаказПокупателя. ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ( Валюты. Период) КАК ПериодДок
ИЗ
Документ. ЗаказПокупателя КАК ЗаказПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений. КурсыВалют КАК Валюты
ПО Валюты. Период < = ЗаказПокупателя. Дата И
Валюты. Валюта = ЗаказПокупателя. ВалютаДокумента
СГРУППИРОВАТЬ ПО
ЗаказПокупателя. Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений. КурсыВалют КАК Таб2
ПО Таб1 . ПериодДок = Таб2 . Период И Таб1 . ВалютаДок = Таб2 . Валюта
Для общего развития:
Что есть срез последних в платформе?
Код 1C v 8.х ВЫБРАТЬ
Рег. Период,
Рег. Измерение,
Рег. Ресурс
ИЗ
РегситрСведений. ПериодическийРегистр. СрезПоследних( &Дата) КАК Рег
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, ... секунда)
Код 1C v 8.х ВЫБРАТЬ
Таблица3 . Ресурс,
Таблица3 . Измерение,
Таблица3 . Период
ИЗ
( ВЫБРАТЬ
Таблица1 . Измерение КАК Измерение,
МАКСИМУМ( Таблица1 . Период) КАК Период
ИЗ
РегистрСведений. ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1 . Период < = &Дата
СГРУППИРОВАТЬ ПО
Таблица1 . Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений. ПериодическийРегистр КАК Таблица3
ПО Таблица2 . Измерение= Таблица3 . Измерение
И Таблица2 . Период = Таблица3 . Период
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х ВЫБРАТЬ
Таблица5 . Ресурс,
Таблица5 . Измерение,
Таблица5 . Период,
Таблица5 . Регистратор
ИЗ
( ВЫБРАТЬ
МАКСИМУМ( Таблица3 . Регистратор) КАК Регистратор,
Таблица3 . Измерение
ИЗ
( ВЫБРАТЬ
Таблица1 . Измерение КАК Измерение,
МАКСИМУМ( Таблица1 . Период) КАК Период
ИЗ
РегистрСведений. ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1 . Период < = &Дата
СГРУППИРОВАТЬ ПО
Таблица1 . Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений. ПериодическийРегистр КАК Таблица3
ПО Таблица2 . Измерение= Таблица3 . Измерение
И Таблица2 . Период = Таблица3 . Период
СГРУППИРОВАТЬ ПО
Таблица3 . Измерение) КАК Таблица4
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений. ПериодическийРегистр КАК Таблица5
ПО Таблица4 . Измерение = Таблица5 . Измерение
И Таблица4 . Регистратор = Таблица5 . Регистратор
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя. Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя. Дата КАК Дата,
ЗаказПокупателя. ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя. СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя. * ,
Дата,
ВалютаДокумента. * ,
СуммаДокумента}
ИЗ
Документ. ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя. Ссылка. * КАК ЗаказПокупателя,
ЗаказПокупателя. СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних. Валюта КАК Валюта,
КурсыВалютСрезПоследних. Курс КАК Курс,
КурсыВалютСрезПоследних. Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта. * ,
Курс,
Кратность}
ИЗ
РегистрСведений. КурсыВалют. СрезПоследних( &Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних. Курс,
КурсыВалютСрезПоследних. Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Категория:
Регистры накопления Как изменить запись регистра сведений? Код 1C v 8.х НаборЗаписей = РегистрыСведений. НумерацияДоговоров. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Отбор. Период. Установить( НачалоГода( Дата) ) ;
НаборЗаписей. Отбор. Организация. Установить( Организация) ;
НаборЗаписей. Прочитать( ) ;
Если НаборЗаписей. Количество( ) = 0 Тогда
НовыйНомер = НаборЗаписей. Добавить( ) ;
НовыйНомер. Организация = Организация;
НовыйНомер. Период = НачалоГода( Дата) ;
НовыйНомер. Номер = 2 ; ном= 1 ;
ИначеЕсли НаборЗаписей. Количество( ) = 1 Тогда
НовыйНомер = НаборЗаписей[0 ];
ном = НовыйНомер. Номер;
НовыйНомер. Номер = ном+ 1 ;
КонецЕсли ;
НаборЗаписей. Записать( ) ;
Номер = Организация. Префикс + "-" + Ном + "/" + Строка( Прав( Год( ТекущаяДата( ) ) , 2 ) ) ;
Код 1C v 8.х
КурсыВалют = РегистрыСведений. КурсыВалют;
НаборКурсов = КурсыВалют. СоздатьНаборЗаписей( ) ;
Доллар = Справочники. Валюты. НайтиПоНаименованию( "USD" ) ;
НаборКурсов. Отбор. Валюта. Установить( Доллар) ;
НаборКурсов. Отбор. Период. Установить( НачалоДня( ТекущаяДата( ) ) ) ;
НаборКурсов. Прочитать( ) ;
Если НаборКурсов. Количество( ) = 0 Тогда
НовыйКурс = НаборКурсов. Добавить( ) ;
НовыйКурс. Валюта = Доллар;
НовыйКурс. Период = ТекущаяДата( ) ;
ИначеЕсли НаборКурсов. Количество( ) = 1 Тогда
НовыйКурс = НаборКурсов[0 ];
Иначе
Предупреждение( "Курс валюты задается один раз в день." , 60 ) ;
Возврат ;
КонецЕсли ;
НовыйКурс. Курс = 31.44 ;
НовыйКурс. Кратность = 1 ;
НаборКурсов. Записать( ) ;
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура И
| ШтрихкодыНоменклатуры.Характеристика = &Характеристика" ;
Запрос. УстановитьПараметр( "Номенклатура" , Товар) ;
Запрос. УстановитьПараметр( "Характеристика" , ХарактеристикаТовара) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если НЕ Выборка. Следующий( ) Тогда
ТекЗапись = РегистрыСведений. ШтрихкодыНоменклатуры. СоздатьМенеджерЗаписи( ) ;
ТекЗапись. Номенклатура = Товар;
Если ЗначениеЗаполнено( ХарактеристикаТовара) Тогда
ТекЗапись. Характеристика = ХарактеристикаТовара;
Иначе
ТекЗапись. Характеристика = Справочники. ХарактеристикиНоменклатуры. ПустаяСсылка( ) ;
КонецЕсли ;
ТекЗапись. Штрихкод = ? ( ПустаяСтрока( ШтрихКод) , РегистрыСведений. ШтрихкодыНоменклатуры. СформироватьШтрихкодEAN13( ) , Штрихкод) ;
Попытка
ТекЗапись. Записать( ) ;
Исключение
КонецПопытки ;
Иначе
НайденныйШтрихкод = Выборка. Штрихкод;
ТекЗапись = РегистрыСведений. ШтрихкодыНоменклатуры. СоздатьМенеджерЗаписи( ) ;
ТекЗапись. Штрихкод = НайденныйШтрихкод;
ТекЗапись. Прочитать( ) ;
ТекЗапись. Штрихкод = Штрихкод;
Попытка
ТекЗапись. Записать( ) ;
Исключение
КонецПопытки ;
КонецЕсли ;
Категория:
Регистры сведений Как получить Срез Последних значений на Каждую Дату Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя. Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя. Дата КАК Дата,
ЗаказПокупателя. ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя. СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя. * ,
Дата,
ВалютаДокумента. * ,
СуммаДокумента}
ИЗ
Документ. ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя. Ссылка. * КАК ЗаказПокупателя,
ЗаказПокупателя. СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних. Валюта КАК Валюта,
КурсыВалютСрезПоследних. Курс КАК Курс,
КурсыВалютСрезПоследних. Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта. * ,
Курс,
Кратность}
ИЗ
РегистрСведений. КурсыВалют. СрезПоследних( &Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних. Курс,
КурсыВалютСрезПоследних. Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Defender aka LINN
Как получить Срез Последних на Каждую Дату
То же самое простым запросом Категория:
Схема Компоновки Данных Как добавить запись в периодический независимый регистр сведений? Код 1C v 8.х
НаборЗаписей = РегистрыСведений. КурсыВалют. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Отбор. Валюта. Установить( ТекущаяВалюта) ;
НаборЗаписей. Отбор. Период. Установить( ТекущаяДата) ;
НовЗапись = НаборЗаписей. Добавить( ) ;
НовЗапись. Валюта = ТекущаяВалюта;
НовЗапись. Период = ТекущаяДата;
НовЗапись. Курс = ТекущийКурс;
НовЗапись. Кратность = ТекущаяКратность;
НаборЗаписей. Записать( Истина ) ;
Категория:
Регистры сведений Использование предложения ДЛЯ ИЗМЕНЕНИЯ Предложение
ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять. В этом случае другое соединение будет ожидать освобождения этих данных уже в момент считывания внутри транзакции, т.е. не сможет прочесть заблокированные данные до тех пор, пока не будет завершена транзакция, наложившая блокировку. Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения
ДЛЯ ИЗМЕНЕНИЯ . Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята. Если запрос выполняется вне транзакции, то в нем могут быть считаны и заблокированные данные.
Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение
ДЛЯ ИЗМЕНЕНИЯ игнорируется.
В случае если после предложения
ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут считанные данные из всех таблиц, задействованных в запросе. В случае указания конкретных таблиц будут блокироваться только данные из перечисленных таблиц. Для блокировки можно указывать только таблицы верхнего уровня (т.е. не табличные части), участвующие в запросе. Должны приводиться именно имена таблиц, а не их псевдонимы, определенные в запросе. В случае указания виртуальной таблицы будут блокированы данные из всех таблиц, задействованных в виртуальной таблице. При указании виртуальной таблицы следует записывать ее имя без параметров.
Пример использования предложения
ДЛЯ ИЗМЕНЕНИЯ можно посмотреть в типовой конфигурации "Управление торговлей" в модуле документа РеализацияТоваров, в функции СформироватьЗапросПоШапке(Режим), которая вызывается из обработчика проведения документа. В этой функции, в случае оперативного проведения выполняется запрос, в котором накладывается блокировка на регистр остатков:
Код 1C v 8.х ВЫБРАТЬ
Док. Дата,
Док. Ссылка,
Док. ВидОперации,
Док. Организация,
Док. ОтражатьВРегламентированномУчете,
Док. ОтражатьВУправленческомУчете,
Док. ПодразделениеКомпании,
Док. Контрагент,
Док. ДоговорВзаиморасчетов,
Док. СкладКомпании,
Док. Сделка,
Док. Сделка. ВидОперации КАК ВидЗаказаПокупателя,
Док. КурсДокумента,
Док. КратностьДокумента,
Док. ВалютаДокумента,
Док. СуммаДокумента,
Док. КурсВзаиморасчетов,
Док. КратностьВзаиморасчетов,
Док. СкладКомпании. Розничный КАК СкладКомпанииРозничный,
Док. ДоговорВзаиморасчетов. ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
Док. ДоговорВзаиморасчетов. ВедениеВзаиморасчетов КАК ВедениеВзаиморасчетов,
Док. ДоговорВзаиморасчетов. КонтролироватьЧислоДнейЗадолженности
КАК КонтролироватьЧислоДнейЗадолженности,
Док. ДоговорВзаиморасчетов. ДопустимоеЧислоДнейЗадолженности
КАК ДопустимоеЧислоДнейЗадолженности,
Док. ДоговорВзаиморасчетов. КонтролироватьСуммуЗадолженности
КАК КонтролироватьСуммуЗадолженности,
Док. ДоговорВзаиморасчетов. ДопустимаяСуммаЗадолженности
КАК ДопустимаяСуммаЗадолженности,
Док. ДоговорВзаиморасчетов. ПроцентПредоплаты КАК ПроцентПредоплаты,
Док. УчитыватьНДС,
Док. УчитыватьНП,
Док. СуммаВключаетНДС,
Док. СуммаВключаетНП,
Константы. ВалютаУправленческогоУчетаКомпании КАК ВалютаУправленческогоУчета,
КурсыВалютСрезПоследних. Курс КАК КурсВалютыУпрУчета,
КурсыВалютСрезПоследних. Кратность КАК КратностьВалютыУпрУчета,
ВзаиморасчетыПоДоговору. СуммаВалОстаток КАК СуммаВалОстатокПоДоговору,
ВзаиморасчетыПоСделке. СуммаВалОстаток КАК СуммаВалОстатокПоСделке,
ПерваяСделка. ДатаПервойСделки,
СуммыЗаказов. СуммаЗаказаОборот,
СуммыЗаказов. СуммаОплатыОборот
ИЗ
Документ. РеализацияТоваров Док,
Константы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений. КурсыВалют. СрезПоследних( &ДатаДокумента,)
КАК КурсыВалютСрезПоследних
ПО Константы. ВалютаУправленческогоУчетаКомпании = КурсыВалютСрезПоследних. Валюта
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления. КонтрагентыВзаиморасчетыКомпании. Остатки( ,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов)
КАК ВзаиморасчетыПоДоговору
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
( ВЫБРАТЬ
МИНИМУМ( Сделка. Дата) КАК ДатаПервойСделки,
ДоговорВзаиморасчетов
ИЗ РегистрНакопления. КонтрагентыВзаиморасчетыКомпании. Остатки( ,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов)
ГДЕ СуммаВалОстаток > 0
И ДоговорВзаиморасчетов. ВедениеВзаиморасчетов = &ПоРасчетнымДокументам
И ДоговорВзаиморасчетов. КонтролироватьЧислоДнейЗадолженности
СГРУППИРОВАТЬ ПО ДоговорВзаиморасчетов) КАК ПерваяСделка
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления. КонтрагентыВзаиморасчетыКомпании. Остатки( ,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов
И Сделка = &Сделка
) КАК ВзаиморасчетыПоСделке
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления. СуммыЗаказов. Обороты( , , , Заказ = &Сделка) КАК СуммыЗаказов
ПО Истина
ГДЕ
Док. Ссылка = &ДокументСсылка
ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления. КонтрагентыВзаиморасчетыКомпании. Остатки
Категория:
Запросы Как в запросе получить значение регистра сведений на разные даты? Вопрос:
Есть возможность в запросе получить значение переодического регистра сведений если меняется дата в строке запроса. Например: Выбираю таблицу товаров из документа поступления за переод и хочу получить значение цены из регистра цены номенклатуры на дату документа?
Ответ:
Нужно получить результат, в котором каждой дате будет сопоставлена соответствующая (меньшая или равная ей дата) из регистра сведений и значение ресурса регистра, соответствующее этой дате. Вот, например, как я получаю курс доллара на день продажи:
Код 1C v 8.х ВЫБРАТЬ
ДатаПродажиДатаКурса. ДатаПродажи КАК ДатаПродажи,
ДатаПродажиДатаКурса. ДатаКурса КАК ДатаКурса,
КурсыВалют. Курс КАК Курс,
КурсыВалют. Кратность КАК Кратность
ИЗ
( ВЫБРАТЬ
ДатыПродаж. ДатаПродажи КАК ДатаПродажи,
МАКСИМУМ( КурсыВалют. Период) КАК ДатаКурса
ИЗ
РегистрСведений. КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ РАЗЛИЧНЫЕ
Продажи. Период КАК ДатаПродажи
ИЗ
РегистрНакопления. Продажи КАК Продажи
ГДЕ
Продажи. ДоговорКонтрагента. Владелец = &Клиент) КАК ДатыПродаж
ПО КурсыВалют. Период < = ДатыПродаж. ДатаПродажи
СГРУППИРОВАТЬ ПО
ДатыПродаж. ДатаПродажи) КАК ДатаПродажиДатаКурса
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений. КурсыВалют КАК КурсыВалют
ПО ДатаПродажиДатаКурса. ДатаКурса = КурсыВалют. Период
ГДЕ
КурсыВалют. Валюта = &Доллар
Категория:
Регистры сведений Пример загрузки остатков в документ 1С из DBF файла Код 1C v 8.х ФайлОстатков = Новый XBase;
ФайлОстатков. Кодировка = КодировкаXBase. OEM;
ФайлОстатков. ОткрытьФайл( ПутьКТаблицеОстатков) ;
ФайлОстатков. Первая( ) ;
Пока Не ФайлОстатков. ВКонце( ) Цикл
КодКонтрагента = СокрЛП( ФайлОстатков. ПолучитьЗначениеПоля( "ZKPO" ) ) ;
Если КодКонтрагента = "" Тогда
КодКонтрагента = СокрЛП( ФайлОстатков. ПолучитьЗначениеПоля( "IDENKOD" ) ) ;
КонецЕсли ;
НаименованиеКонтрагента = СокрЛП( СтрЗаменить( ФайлОстатков. ПолучитьЗначениеПоля( "NAME" ) , "?" , "і" ) ) ;
Контрагент = ПолучитьКонтрагента( КодКонтрагента, НаименованиеКонтрагента) ;
СимволСчета = СокрЛП( ФайлОстатков. ПолучитьЗначениеПоля( "SYMBOL" ) ) ;
ОстатокДебет = ФайлОстатков. ПолучитьЗначениеПоля( "DB_PP" ) ;
ОстатокКредит = ФайлОстатков. ПолучитьЗначениеПоля( "KR_PP" ) ;
Документ = Документы. КорректировкаДолга. СоздатьДокумент( ) ;
Документ. Организация = Организация;
Документ. Дата = "20090630235959" ;
Документ. ВидОперации = Перечисления. ВидыОперацийКорректировкаДолга. ВводНачальныхОстатков;
Если ОстатокДебет > 0 Тогда
Документ. КонтрагентДебитор = Контрагент;
Документ. СуммыДолга. Очистить( ) ;
СтрокаСуммыДолга = Документ. СуммыДолга. Добавить( ) ;
СтрокаСуммыДолга. ВидЗадолженности = Перечисления. ВидыЗадолженности. Дебиторская;
СтрокаСуммыДолга. ДоговорКонтрагента = ПолучитьДоговор( Документ. КонтрагентДебитор) ;
Если Лев( СимволСчета, 3 ) = "361" Тогда
СтрокаСуммыДолга. ТипКонтрагента = Перечисления. СтатусыКонтрагентов. Покупатель;
Иначе
СтрокаСуммыДолга. ТипКонтрагента = Перечисления. СтатусыКонтрагентов. Поставщик;
КонецЕсли ;
СтрокаСуммыДолга. КратностьВзаиморасчетов = 1.00 ;
СтрокаСуммыДолга. КурсВзаиморасчетов = 1.00 ;
СтрокаСуммыДолга. Сумма = ОстатокДебет;
СтрокаСуммыДолга. СуммаВзаиморасчетов = ОстатокДебет;
СтрокаСуммыДолга. СтавкаНДС = Перечисления. СтавкиНДС. НДС20 ;
СтрокаСуммыДолга. СчетУчетаРасчетов = ПланыСчетов. Хозрасчетный. НайтиПоКоду( СимволСчета) ;
Иначе
Документ. КонтрагентДебитор = Контрагент;
Документ. СуммыДолга. Очистить( ) ;
СтрокаСуммыДолга = Документ. СуммыДолга. Добавить( ) ;
СтрокаСуммыДолга. ВидЗадолженности = Перечисления. ВидыЗадолженности. Кредиторская;
СтрокаСуммыДолга. ДоговорКонтрагента = ПолучитьДоговор( Документ. КонтрагентДебитор) ;
Если Лев( СимволСчета, 3 ) = "361" Тогда
СтрокаСуммыДолга. ТипКонтрагента = Перечисления. СтатусыКонтрагентов. Покупатель;
Иначе
СтрокаСуммыДолга. ТипКонтрагента = Перечисления. СтатусыКонтрагентов. Поставщик;
КонецЕсли ;
СтрокаСуммыДолга. КратностьВзаиморасчетов = 1.00 ;
СтрокаСуммыДолга. КурсВзаиморасчетов = 1.00 ;
СтрокаСуммыДолга. Сумма = ОстатокКредит;
СтрокаСуммыДолга. СуммаВзаиморасчетов = ОстатокКредит;
СтрокаСуммыДолга. СтавкаНДС = Перечисления. СтавкиНДС. НДС20 ;
СтрокаСуммыДолга. СчетУчетаРасчетов = ПланыСчетов. Хозрасчетный. НайтиПоКоду( СимволСчета) ;
КонецЕсли ;
Документ. ВалютаДокумента = Валюта;
Документ. СчетДт = ПланыСчетов. Хозрасчетный. Вспомогательный;
Документ. СчетКт = ПланыСчетов. Хозрасчетный. Вспомогательный;
Документ. Записать( РежимЗаписиДокумента. Проведение) ;
ФайлОстатков. Следующая( ) ;
КонецЦикла ;
ФайлОстатков. ЗакрытьФайл( ) ;
Категория:
JSON, XML, TXT, CSV, DBF Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение( "export.rbc.ru" ) ;
ИмяФайла = ПолучитьИмяВременногоФайла( ".txt" ) ;
СтрокаСоединения= "/free/" + Источник+ "/free.fcgi?period=DAILY&tickers=" + Валюта1 + "&d1=" + День1 + "&m1=" + Месяц1 + "&y1=" + Год1 + "&d2=" + День2 + "&m2=" + Месяц2 + "&y2=" + Год2 + "&separator=%7C&data_format=BROWSER" ;
СтрокаСоединения= СтрЗаменить( СтрокаСоединения, " " , "" ) ;
Попытка
Соединение. Получить( СтрокаСоединения, ИмяФайла) ;
Исключение
Сообщить( "Невозможно получить курс по адресу http://export.rbc.ru" + СтрокаСоединения) ;
КонецПопытки ;
КурсыТекст= Новый ТекстовыйДокумент;
КурсыТекст. Прочитать( ИмяФайла) ;
Код 1C v 8.х
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
соминет. open ( "GET" , Адресс, Ложь ) ;
соминет. send( ) ;
Возврат соминет. responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
Возврат Формат( Дат, "ДФ="" гггг/ММ/дд"" " ) ;
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
Для А = 1 по Список. Количество( ) цикл
Если Список[а- 1 ]. Пометка тогда
Сообщить( "Загружаем курсы для " + Строка( Список[а- 1 ]. Значение) ) ;
Код = Строка( Список[а- 1 ]. Значение. Код) ;
Дат = ПериодС;
Пока Дат < = ПериодПо цикл
Стр = ПолучитьКакСтроку( "http://cbrates.rbc.ru/tsv/" + Код+ "/" + ПреобразоватьДату( Дат) + ".tsv" ) ;
Поз = Найти( Стр, Символы. Таб) ;
Если Поз = 0 Тогда
Дат = Дат + 86400 ;
Продолжить;
КонецЕсли ;
Кратность = Число( СокрЛП( Лев( стр, Поз- 1 ) ) ) ;
курс = Число( СокрЛП( Сред( Стр, Поз+ 1 , СтрДлина( Стр) - Поз) ) ) ;
Сообщить( "Дата=" + Строка( Дат) + " Курс=" + Строка( курс) + " Кратность=" + Строка( Кратность) ) ;
Запись = РегистрыСведений. КурсыВалют. СоздатьМенеджерЗаписи( ) ;
Запись. Период = Дат;
Запись. Валюта = Список[а- 1 ]. Значение. Ссылка;
Запись. Курс = Курс;
Запись. Кратность = Кратность;
Запись. Записать( Истина ) ;
Дат = Дат + 86400 ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x
перем тзПустышка;
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
если стрНазвание = "стрУРЛа" тогда
запуститьприложение( стрУРЛа) ;
конецесли ;
конецпроцедуры
процедура кнПолучить()
стрИмяФайла = каталогпользователя( ) + "$$$$.###" ;
олеХМЛ = создатьобъект( "Microsoft.XMLHTTP" ) ;
олеХМЛ. Open( "GET" , стрУРЛа, 0 ) ;
олеХМЛ. Send( ) ;
олеАДО = создатьобъект( "ADODB.Stream" ) ;
олеАДО. Mode = 3 ;
олеАДО. Type = 1 ;
олеАДО. Open( ) ;
олеШелл = создатьобъект( "MSScriptControl.ScriptControl" ) ;
олеШелл. Language = "vbscript" ;
олеШелл. AddObject( "oleADO" , олеАДО) ;
олеШелл. AddObject( "oleXML" , олеХМЛ) ;
олеШелл. Eval( "oleADO.Write(oleXML.ResponseBody)" ) ;
олеАДО. SaveToFile( стрИмяФайла, 2 ) ;
олеАДО. Close( ) ;
олеАДО. Mode= 3 ;
олеАДО. Type = 2 ;
олеАДО. CharSet= "UTF-8" ;
олеАДО. Open( ) ;
олеАДО. LoadFromFile( стрИмяФайла) ;
стрТемп = "" ;
пока олеАДО. EOS( ) = 0 цикл
стрТемп = стрТемп + олеАДО. ReadText( - 2 ) + разделительстрок;
конеццикла ;
олеАДО. Close( ) ;
фс. УдалитьФайл( стрИмяФайла) ;
чисПозиция = найти( стрТемп, "Официальные курсы валют на" ) ;
если чисПозиция = 0 тогда
предупреждение( "Не получилось получить курсы валют" ) ;
иначе
тзТемп = создатьобъект( "ТаблицаЗначений" ) ;
тзПустышка. Выгрузить( тзТемп) ;
стрТемп = сред( стрТемп, чисПозиция) ;
дтКурса = дата( стрзаменить( стрполучитьстроку( стрТемп, 2 ) , "/" , "." ) ) ;
чисПозиция = 18 ;
чисКоличествоСтрок = стрколичествострок( стрТемп) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция) ;
пока найти( стрТекущая, "input type="" checkbox"" name="" idval"" " ) > 0 цикл
тзТемп. НоваяСтрока( ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 1 ) ;
тзТемп. Количество = число( стрТекущая) ;
тзТемп. Наименование = сокрлп( стрзаменить( стрзаменить( стрТекущая, тзТемп. Количество, "" ) , "</td>" , "" ) ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 2 ) ;
стрТекущая = сокрлп( стрзаменить( стрзаменить( стрТекущая, "<td class="" gen7"" align="" center"" >" , "" ) , "</td>" , "" ) ) ;
тзТемп. Код1 = лев( стрТекущая, 3 ) ;
тзТемп. Код2 = прав( стрТекущая, 3 ) ;
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция + 5 ) ;
тзТемп. Курс = число( стрзаменить( стрзаменить( стрТекущая, "<td class="" gen7"" align="" center"" >" , "" ) , "</td>" , "" ) ) ;
чисПозиция = чисПозиция + 17 ;
если чисПозиция > чисКоличествоСтрок тогда
стрТекущая = "" ;
иначе
стрТекущая = стрполучитьстроку( стрТемп, чисПозиция) ;
конецесли ;
конеццикла ;
тзТемп. Выгрузить( тзКурсов) ;
конецесли ;
конецпроцедуры
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D" ;
тзПустышка = создатьобъект( "ТаблицаЗначений" ) ;
тзПустышка. НоваяКолонка( "Количество" , "число" , 3 , 0 , "" , 5 ) ;
тзПустышка. НоваяКолонка( "Наименование" , "строка" , , , "Наименование" , 70 ) ;
тзПустышка. НоваяКолонка( "Код1" , "строка" , 3 , , "код" , 10 ) ;
тзПустышка. НоваяКолонка( "Код2" , "строка" , 3 , , "код" , 10 ) ;
тзПустышка. НоваяКолонка( "Курс" , "число" , 7 , 2 , "Курс" , 10 ) ;
тзПустышка. Выгрузить( тзКурсов) ;
Категория:
COM-объекты, WMI, WSH Функция пересчета валютной суммы по курсу на дату документа Код 1C v 8.х Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт
Запись = РегистрыСведений. КурсыВалют. ПолучитьПоследнее( Дата, Новый Структура( "Валюта" , Валюта) ) ;
Сумма = ВалютнаяСумма * Запись. Курс / Запись. Кратность;
Возврат Сумма;
КонецФункции
Категория:
Регистры сведений Универсальная функция получения курса валюты Код 1C v 8.х Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт
Запись = РегистрыСведений. КурсыВалют. ПолучитьПоследнее( Дата, Новый Структура( "Валюта" , Валюта) ) ;
Сумма = ВалютнаяСумма * Запись. Курс;
Если Запись. Кратность < > 0 Тогда
Сумма = Сумма / Запись. Кратность;
КонецЕсли ;
Возврат Сумма;
КонецФункции
ВалютДол= Справочники. Валюты. НайтиПоНаименованию( "USD" ) ;
ВалютнаяСумма= 1000 ;
Сумм= ПересчетСуммыПоКурсу( ВалютнаяСумма, ВалютДол, ДатаДокумента) ;
Категория:
Полезные, Универсальные Функции Запись в регистр сведений (Установить курс и кратность валюты) Код 1C v 8.х
// Запись в регистр сведений (Установить курс и кратность валюты)
// Параметры:
// Валюта - ссылка на элемент справочника Валют
//
Процедура ЗаписатьКурс(Валюта) Экспорт
РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
РегистрКурсыВалют.Период = ДатаКурса;
РегистрКурсыВалют.Валюта = Валюта;
РегистрКурсыВалют.Курс = 1;
РегистрКурсыВалют.Кратность = 1;
РегистрКурсыВалют.Записать();
КонецПроцедуры
Категория:
Регистры сведений Функция пересчитывает сумму из валюты ВалютаНач по курсу КурНач в валюту ВалютаКон по курсу КурКон Код 1C v 8.х
// Эта функция пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач
// в валюту ВалютаКон по курсу ПоКурсуКон
//
// Параметры:
// Сумма - сумма, которую следует пересчитать;
// ВалютаНач - ссылка на элемент справочника Валют;
// определяет валюты из которой надо пересчитвать;
// ВалютаКон - ссылка на элемент справочника Валют;
// определяет валюты в которую надо пересчитвать;
// ПоКурсуНач - курс из которого надо пересчитать;
// ПоКурсуКон - курс в который надо пересчитать;
// ПоКратностьНач - кратность из которого надо пересчитать (по умолчанию = 1);
// ПоКратностьКон - кратность в который надо пересчитать (по умолчанию = 1);
//
// Возвращаемое значение:
// Сумма, пересчитанная в другую валюту
//
Функция ПересчитатьИзВалютыВВалюту(Сумма, ВалютаНач, ВалютаКон, ПоКурсуНач, ПоКурсуКон,
ПоКратностьНач = 1, ПоКратностьКон = 1 ) Экспорт
Если (ВалютаНач = ВалютаКон) Тогда
// Считаем, что пересчет не нужен.
Возврат Сумма;
КонецЕсли;
Если (ПоКурсуНач = ПоКурсуКон)
и (ПоКратностьНач = ПоКратностьКон) Тогда
// ну, тут и считать нечего...
Возврат Сумма;
КонецЕсли;
Если ПоКурсуНач = 0
или ПоКурсуКон = 0
или ПоКратностьНач = 0
или ПоКратностьКон = 0 Тогда
СообщитьОбОшибке(" при пересчете обнаружен нулевой курс.");
Возврат 0;
КонецЕсли;
Возврат Окр((Сумма * ПоКурсуНач * ПоКратностьКон) / (ПоКурсуКон * ПоКратностьНач), 2);
КонецФункции
Категория:
Работа с Датами (Временем)