// Загрузка информации о курсах валют производится с сайта ЦБ РФ
// Информация поступает в виде XML файла, в котором указана дата и курс на эту дату.
// В запросе информации необходимо указать период и код валюты
// Коды валюты - R01235 для USD, R01239 для EUR
// Будем запрашивать курсы за последние 7 дней. Сначала для USD, а затем для EUR
Соединение = СокетСоединить( "www.cbr.ru", 80, true );
СокетПередать( Соединение, "GET /scripts/XML_dynamic.asp?date_req1=" + DTOC( ДОБАВИТЬДНИ( ДАТАВРЕМЯ( ), - 7 ), 4 ) + "&date_req2=" + DTOC( ДАТАВРЕМЯ( ), 4 ) + "&VAL_NM_RQ=R01235 HTTP/1.1" + CHR( 13 ) + CHR( 10 ) + "Host: www.cbr.ru" + CHR( 13 ) + CHR( 10 ) + CHR( 13 ) + CHR( 10 ) );
Ответ = СокетПолучить( Соединение, CHR( 13 ) + CHR( 10 ) + CHR( 13 ) + CHR( 10 ));
IF ( AT( Ответ, 'Content-Length:' ) > 0 )
{
Длина = VAL( SUBSTR( Ответ, AT( Ответ, 'Content-Length:' ) + 15 ));
Ответ = СокетПолучить( Соединение, Длина);
}
ELSE
{
КОДРЕЗУЛЬТАТА = false;
ОПИСАНИЕРЕЗУЛЬТАТА = "Ошибка чтения файла с сайта ЦБ РФ. " + _ERRORDESCRIPTION;
RETURN false;
}
СокетЗакрыть( Соединение );
ИмяФайла = УникальноеИмя( );
Файл = ФайлСоздать( ИмяФайла );
ФайлЗаписать( Файл, Ответ );
ФайлЗакрыть( Файл );
ДобавитьКонтекст( "SET FMTONLY ON
SELECT GETDATE() AS date, CONVERT( float, 0 ) AS nominal,
CONVERT( float, 0 ) AS value SET FMTONLY OFF", "Курсы" );
Загрузить( "Курсы", "XML", ИмяФайла, "Record" );
// Если в справочнике валют указано, что используется обратный курс,
// то надо записывать обратный курс
ОбратныйКурс = ЗАПРОС( "SELECT f_rev FROM sprcur WHERE code = 'USD'" );
ВыбратьКонтекст( "Курсы" );
ПерейтиВНачало( "Курсы" );
WHILE ( !КонецКонтекста( "Курсы" ) )
{
IF ( Курсы.Value <> 0 )
{
ЗАПРОС( "DELETE FROM sprrate
WHERE DATEDIFF( day, date, '" + Курсы.date + "' ) = 0 AND code = 'USD'" );
ЗАПРОС( "INSERT INTO sprrate ( code, date, rate )
VALUES ( 'USD', '" + Курсы.date + "', " +
STR( ЕСЛИ( ОбратныйКурс, 1 / Курсы.Value, Курсы.Value ), 20, 8 ) + ")" );
}
SKIP( );
}
УдалитьКонтекст( "Курсы" );
ФайлУдалить( ИмяФайла );
// Полностью аналогично для евро
Соединение = СокетСоединить( "www.cbr.ru", 80, true );
СокетПередать( Соединение, "GET /scripts/XML_dynamic.asp?date_req1=" + DTOC( ДОБАВИТЬДНИ( ДАТАВРЕМЯ( ), - 7 ), 4 ) + "&date_req2=" + DTOC( ДАТАВРЕМЯ( ), 4 ) + "&VAL_NM_RQ=R01239 HTTP/1.1" + CHR( 13 ) + CHR( 10 ) + "Host: www.cbr.ru" + CHR( 13 ) + CHR( 10 ) + CHR( 13 ) + CHR( 10 ) );
Ответ = СокетПолучить( Соединение, CHR( 13 ) + CHR( 10 ) + CHR( 13 ) + CHR( 10 ));
IF ( AT( Ответ, 'Content-Length:' ) > 0 )
{
Длина = VAL( SUBSTR( Ответ, AT( Ответ, 'Content-Length:' ) + 15 ));
Ответ = СокетПолучить( Соединение, Длина);
}
ELSE
{
КОДРЕЗУЛЬТАТА = false;
ОПИСАНИЕРЕЗУЛЬТАТА = "Ошибка чтения файла с сайта ЦБ РФ. " + _ERRORDESCRIPTION;
RETURN false;
}
СокетЗакрыть( Соединение );
ИмяФайла = УникальноеИмя( );
Файл = ФайлСоздать( ИмяФайла );
ФайлЗаписать( Файл, Ответ );
ФайлЗакрыть( Файл );
ДобавитьКонтекст( "SET FMTONLY ON
SELECT GETDATE() AS date, CONVERT( float, 0 ) AS nominal,
CONVERT( float, 0 ) AS value SET FMTONLY OFF", "Курсы" );
Загрузить( "Курсы", "XML", ИмяФайла, "Record" );
// Если в справочнике валют указано, что используется обратный курс,
// то надо записывать обратный курс
ОбратныйКурс = ЗАПРОС( "SELECT f_rev FROM sprcur WHERE code = 'EUR'" );
ВыбратьКонтекст( "Курсы" );
ПерейтиВНачало( "Курсы" );
WHILE ( !КонецКонтекста( "Курсы" ) )
{
IF ( Курсы.Value <> 0 )
{
ЗАПРОС( "DELETE FROM sprrate
WHERE DATEDIFF( day, date, '" + Курсы.date + "' ) = 0 AND code = 'EUR'" );
ЗАПРОС( "INSERT INTO sprrate ( code, date, rate )
VALUES ( 'EUR', '" + Курсы.date + "', " +
STR( ЕСЛИ( ОбратныйКурс, 1 / Курсы.Value, Курсы.Value ), 20, 8 ) + ")" );
}
SKIP( );
}
УдалитьКонтекст( "Курсы" );
ФайлУдалить( ИмяФайла );
// Данный скрипт предназначен для использования в точке зрения
// в проверке документа кассовой смены перед записью.
// Загружаем реквизиты документа
ДобавитьКонтекст( "SELECT ndok, date, firm, rs, sklad, cur, cur_rate, branch, identity_column
FROM spr008
WHERE identity_column= " + @ИДДокумента, "Документ" );
ОсновнойУчет = ЗАПРОС( "SELECT dbo.fn_getdefaultaccount ( '" + _ТОЧКАЗРЕНИЯ + "' )" );
// Если у документа есть выписанные на основании документы
// выпуска и комплектации, то ничего не делаем
IF ( ЗАПРОС( "SELECT CASE WHEN EXISTS(SELECT * FROM crosslink
WHERE code = '008' AND ic= " + @ИДДокумента + " AND
cr_code = '009') THEN 1 ELSE 0 END " ) == 1 )
RETURN true;
ИмяТаблицыПродукции = "#" + УникальноеИмя( );
//------- Создаем таблицу для сбора необходимой информации
ЗАПРОС( "CREATE TABLE " + ИмяТаблицыПродукции + "
(nn char(10), nnname char(250), kolp float, incena float, cena float, ed char(15),
kodn char(2), koef_e float, koef_c float, sklad char( 3 ) ) " );
СистемноеСообщение( "Пожалуйста, подождите. " +
"Идет проверка документа на наличие производимой продукции." );
ДобавитьКонтекст( "SELECT nn, nnname, SUM( kolp ) AS kolp, ed, kodn, koef_e, koef_c
FROM spec008
WHERE ic= " + @ИДДокумента + "
GROUP BY nn, nnname, ed, kodn, koef_e, koef_c ", "Спецификация" );
ВыбратьКонтекст( "Спецификация" );
ИтогоСумма = 0.00;
WHILE ( !КонецКонтекста( "Спецификация" ) )
{
//------- Если в карточке товара не стоит галочка Формировать автоматически - пропускаем
IF ( ЗАПРОС( "SELECT f_make FROM sprnn WHERE nn= '" + Спецификация.nn + "' " ) )
{
//------- Проверяем наличие необходимого количества уже собранного на складе
ДобавитьКонтекст( "EXECUTE sp_calcsklad '" + Спецификация.nn + "', '" +
TTOC( Документ.date ) + "', '" + Документ.sklad + "', '" +
ОсновнойУчет + "'", "ОстатокНаДату" );
ДобавитьКонтекст( "EXECUTE sp_calcsklad '" + Спецификация.nn + "', '', '" +
Документ.sklad + "', '" + ОсновнойУчет + "'", "ТекущийОстаток" );
// Если не хватает остатка, то добавляем строку в таблицу
IF ( ROUND( Спецификация.kolp - ОстатокНаДату.kolp, 3 ) > 0 OR
ROUND( Спецификация.kolp - ТекущийОстаток.kolp, 3 ) > 0 )
{
Количество = MAX( ROUND( Спецификация.kolp - ОстатокНаДату.kolp, 3 ),
ROUND( Спецификация.kolp - ТекущийОстаток.kolp, 3 ) );
Склад = ЗАПРОС( "SELECT sklad_ingredients FROM sprres_g
WHERE code= (SELECT group_ FROM sprres
WHERE code= '" + Спецификация.nn + "')" );
ЗАПРОС( "INSERT INTO " + ИмяТаблицыПродукции + "
( nn, nnname, kolp, cena, incena, ed, kodn, koef_e, koef_c, sklad )
VALUES ( '" + STDF( Спецификация.nn ) + "', '" +
STDF( Спецификация.nnname ) + "', " +
STR( Количество, 20, 8 ) + ", " +
STR( ОстатокНаДату.cena, 20, 8 ) + ", " +
STR( ОстатокНаДату.cena, 20, 8 ) + ", '" +
STDF( Спецификация.ed ) + "', '" +
STDF( Спецификация.kodn ) + "', " +
STR( Спецификация.koef_e, 20, 8 ) + ", " +
STR( Спецификация.koef_c, 20, 8 ) + ", '" + Склад + "' ) " );
ИтогоСумма += ( Спецификация.kolp - ОстатокНаДату.kolp) *
ОстатокНаДату.cena;
}
УдалитьКонтекст( "ОстатокНаДату" );
УдалитьКонтекст( "ТекущийОстаток" );
}
Пропустить( 1, "Спецификация" );
}
УдалитьКонтекст( "Спецификация" );
//------ Начинаем транзакцию для записи документа Выпуск и комплектация
ЗАПРОС( "BEGIN TRANSACTION" );
//------ Создаем документ Выпуск и комплектация
//------ Код Выпускаи комплектации- 009
// Формируем список учетов для нового документа
СписокУчетов = "";
ДобавитьКонтекст( "SELECT account_ FROM specviewpoints_def
WHERE code= '" + _ТОЧКАЗРЕНИЯ + "' AND objtype= 'DOC' AND
objcode= '009' AND t_concept = ''", "МоделиУчета");
WHILE ( !КонецКонтекста( "МоделиУчета" ) )
{
СписокУчетов += МоделиУчета.account_;
Пропустить( 1, "МоделиУчета" );
}
УдалитьКонтекст( "МоделиУчета" );
СписокУчетов = ALLTRIM( СписокУчетов );
ДобавитьКонтекст( "EXECUTE sp_insertdoc '009', '', '" + Документ.date + "', '', '" +
Документ.firm + "', '', 'RUB', '', '" + СписокУчетов + "', '" +
_ТОЧКАЗРЕНИЯ + "', 0, '" + ОсновнойУчет + "'", "ident" );
ДобавитьКонтекст(
"UPDATE spr009 SET
f_make = 1,
sklad = '" + Документ.sklad + "',
sklad_d = '" + Документ.sklad + "',
summa = " + STR( ИтогоСумма, 20, 8 ) + ",
firm = '" + Документ.firm + "',
rs = '" + Документ.rs + "',
branch = '" + Документ.branch + "',
cur = '" + Документ.cur + "',
cur_rate= " + STR( Документ.cur_rate, 16, 8 ) + ",
taccess = '', caccess='',
note = 'По документу кассовой смены № " +
ALLTRIM( Документ.ndok ) + " от " + DTOC( Документ.date ) + "'
WHERE identity_column= " + ident.ident, "Пустой" );
УдалитьКонтекст( "Пустой" );
ДобавитьКонтекст(
"INSERT INTO spec009 ( ic, nn, spec_ic, ed, kolp, nnname, incena, cena, summa,
kodn, koef_e, koef_c, f_make, sklad )
SELECT " + ident.ident + ", nn, 0, ed, kolp, nnname, incena, cena, kolp * cena,
kodn, koef_e, koef_c, 1, sklad
FROM " + ИмяТаблицыПродукции, "Пустой" );
УдалитьКонтекст( "Пустой" );
//-------- Вызываем процедуру формирования состава продукции
ЗАПРОС("EXECUTE sp_recalc009 " + ident.ident );
// Добавляем связь на основании
ДобавитьКонтекст(
"INSERT INTO crosslink (code, ic, ndok, date, cr_code, cr_ic, cr_ndok, cr_date, cr_type )
VALUES ( '008'," + Документ.identity_column + ", '" + Документ.ndok + "', '" +
TTOC( Документ.date ) + "', '009'," + ident.ident + ", '" + ident.ndok + "', '" +
TTOC( ident.date ) + "', '0' )", "Пустой" );
УдалитьКонтекст( "Пустой" );
ЗАПРОС("IF @@TRANCOUNT > 0 COMMIT TRANSACTION");
СистемноеСообщение( );
УдалитьКонтекст( "Документ" );
//------ Вызываем созданный документ на редактирование
ОтправитьСообщение( _ГЛАВНОЕОКНОПРИЛОЖЕНИЯ, _СООБЩЕНИЕ_ПРОСМОТРДОКУМЕНТА, "009", ident.ident );
УдалитьКонтекст( "ident" );
// Возвращаем ИСТИНУ, т.к. необходимо произвести запись до конца
RETURN true;
// Скрипт создает документ Выписка из банка на основании
// платежных поручений, отмеченных в журнале документов
// Скрипт предназначен для использования в качестве дополнительной команды в пункте
// меню на правой кнопке мыши в журнале платежных поручений
СписокУчетов = "001 002";
ДатаДокумента = ДАТАВРЕМЯ( );
НомерДокумента = "";
ФирмаДокумента = "0000001";
АвторДокумента = "";
ВалютаДокумента = "RUB";
_ТОЧКАЗРЕНИЯ = "0000000001";
КодДенежногоКармана = "001";
РасчетныйСчет = "12345678909876543210";
ИДБанковскойВыписки = ЗАПРОС( "EXECUTE sp_insertdoc '012', '', '" + ДатаДокумента + "',
'" + НомерДокумента + "', '" + ФирмаДокумента + "',
'" + АвторДокумента + "', '" + ВалютаДокумента + "', '',
'" + СписокУчетов + "', '" + _ТОЧКАЗРЕНИЯ + "', 0, '001'", "ident" );
ЗАПРОС( "UPDATE spr012 SET
kassakod = '" + КодДенежногоКармана + "',
firm = '" + ФирмаДокумента + "',
rs = '" + РасчетныйСчет + "',
summa = (SELECT SUM( sumin - sumout )
FROM spec012 WHERE ic= " + ИДБанковскойВыписки + "),
sumin = (SELECT SUM( sumin - sumout )
FROM spec012 WHERE ic= " + ИДБанковскойВыписки + "),
sumout = (SELECT SUM( sumin - sumout )
FROM spec012 WHERE ic= " + ИДБанковскойВыписки + "),
cur = 'RUB',
cur_rate = 1,
note = 'Документ создан автоматически на основании '+
'отмеченных платежных поручений',
author = SUSER_SNAME( ),
branch = (SELECT branch FROM sprkskod
WHERE code = '" + КодДенежногоКармана + "' )
WHERE identity_column = " + ИДБанковскойВыписки );
ДобавитьКонтекст( "INSERT INTO spec012 ( ic, client, contract, code_s, ic_s, ndok_s, date_s,
note_s, sumout, branch )
SELECT " + ИДБанковскойВыписки + ", spr.client, spr.contract, spr.code,
spr.ic, spr.ndok, spr.date, spr.note, spr.summa, spr.branch
FROM spr000 spr
INNER JOIN " + _ИМЯТАБЛИЦЫ + " temp ON temp.code = spr.code AND
temp.ic = spr.ic", "СписокСтрок");
УдалитьКонтекст("СписокСтрок");
ОтправитьСообщение( _ГЛАВНОЕОКНОПРИЛОЖЕНИЯ, _СООБЩЕНИЕ_ПРОСМОТРДОКУМЕНТА, "012", ИДБанковскойВыписки );