helpf.pro
Регистрация

Трансляция 1С запросов в T-SQL

IKSparrow
21.10.2010 18:57Прочитано: 8015
Где-то видел обработку, которая транслировала запросы 1С в язык T-SQL - где бы такую достать? Хотя эта же операция делается с помощью SQL Profiler, неизвестным мне образом. Может кто подскажет варианты такой трансляции?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
22.10.2010 10:13Ответ № 1
(0) IKSparrow, вот на эту тему:
Трансляция запросов

А так для 7.7 совместно с 1С++
конструктор запросов (новичкам), подходит для регистров любой конфигурации как DBF так и SQL. Скачивать файлы может только зарегистрированный пользователь!
и еще одна игрушка "Простой конструктор" называется.
интерфейс аля конструктор запросов 8-ки.
использую эту ert для быстрого формирования запроса, далее ручками правлю.
так же позволяет выполнять полученный запрос.
автор: Касяк И. Роман ака Joint - Скачивать файлы может только зарегистрированный пользователь!

И вот интересный конструтор!


Библиотека для формирования SQL-запросов из 1С
Библиотека SpellSQL является аналогом ODBCSQL, т.е. большинство методов имеют тот же синтаксис, а также добавлены несколько дополнительных функций. Как и ODBCSQL, SpellSQL создает прямые запросы к базам данных, поэтому работать будет с любыми БД.
Для замены достаточно зарегистрировать эту библиотеку у себя на компьютере с помощью Regsvr32, а в модулях, где она используется заменить имя класса в СоздатьОбъект на "SpellSQL.SQLtools".
Библиотека построена на ADO, следовательно, на Вашем компьютере необходимо наличие ADO. Компилировалась под 2000.
В архиве сама библиотека, документация, пример использования и ALS-файл для синтаксис помощника.
При подключении к 1С (процедура Connect1C) нужно ввести имя пользователя и его пароль. Если пароль введен неверно, то открывается окно авторизации доступа. Количество подключений одного пользователя неограничено. Если каталог базы не был указан, то в диалоге авторизации можно выбрать базу для подключения.
При нормальном соединении сессия регистрируется в файле активных соединений. Так что она будет видна в мониторе.
При соединении и отключении формируются записи в журнале регистрации событий, которые можно видеть в мониторе.
Эта библиотека создает внутри базы 1С таблицу со списком метаданных. Для этого используются специальные методы.
SpellKeeper Скачивать файлы может только зарегистрированный пользователь!

Обработка переводящая запрос SQL в формат 1С.
Данная обработка умеет:
- Переводить запрос в формате SQL, используя компоненту rainbow (включена в архив), в формат 1С.
- Выдавать сведения о структуре метаданных в формате dds (dh, dt, sc, ra, rg) Created by FiGr
Скачивать файлы может только зарегистрированный пользователь!
E_Migachev
22.10.2010 10:18Ответ № 2
Набрел на Сравнение языков запросов 1с и t-sql *06
Отчет - простая оборотно-сальдовая ведомость
Текст запроса на языке запросов 1с:
Код 1C v 8.х
 
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Счет КАК Счет,
Счет.Код КАК СчетКод,
Счет.Наименование КАК СчетНаименование,
Счет.Представление КАК СчетПредставление,
Счет.Забалансовый КАК СчетЗабалансовый,
СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
СуммаОборотДт КАК СуммаОборотДт,
СуммаОборотКт КАК СуммаОборотКт,
СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты( &НачПериода, &КонПериода, , , НЕ Счет.Забалансовый , , Организация = &Организация ) КАК ОстаткиИОбороты
АВТОУПОРЯДОЧИВАНИЕ
ИТОГИ
СУММА(СуммаНачальныйОстатокДт),
СУММА(СуммаНачальныйОстатокКт),
СУММА(СуммаОборотДт),
СУММА(СуммаОборотКт),
СУММА(СуммаКонечныйОстатокДт),
СУММА(СуммаКонечныйОстатокКт)
ПО
Счет ИЕРАРХИЯ


Текст t-sql:
Код SQL
 exec sp_executesql N'S_elect
#V8TblAli1_Q_000_T_001._AccountRRef f_1,
_Acc3._Code f_2,
_Acc3._Description f_3,
_Acc3._IDRRef f_4,
_Acc3._Code f_5,
_Acc3._OffBalance f_6,
#V8TblAli1_Q_000_T_001._Fld5874InitialBalanceDt f_7,
#V8TblAli1_Q_000_T_001._Fld5874InitialBalanceCt f_8,
#V8TblAli1_Q_000_T_001._Fld5874TurnoverDt f_9,
#V8TblAli1_Q_000_T_001._Fld5874TurnoverCt f_10,
#V8TblAli1_Q_000_T_001._Fld5874FinalBalanceDt f_11,
#V8TblAli1_Q_000_T_001._Fld5874FinalBalanceCt f_12,
_Acc3._OrderField _sf_1,
_Acc3._IDRRef _sf_2RRef,
_Acc3._ParentIDRRef f_13,
#V8TblAli1_Q_000_T_001._AccKind f_14
FROM
(
S_elect
_AccTtl05881_R._AccountRRef _AccountRRef,
CASE
WHEN SUM(_AccTtl05881_R._TurnoverDt5882) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverDt5882)
END _Fld5874TurnoverDt,
CASE
WHEN SUM(_AccTtl05881_R._TurnoverCt5883) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverCt5883)
END _Fld5874TurnoverCt,
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(0 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874) > CAST(0 AS NUMERIC(1,0))
THEN SUM(_AccTtl05881_R._Fld5874)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END _Fld5874InitialBalanceDt,
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(1 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874) < CAST(0 AS NUMERIC(1,0))
THEN - SUM(_AccTtl05881_R._Fld5874)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END _Fld5874InitialBalanceCt,
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(0 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884) > CAST(0 AS NUMERIC(1,0))
THEN SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END _Fld5874FinalBalanceDt,
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(1 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884) < CAST(0 AS NUMERIC(1,0))
THEN - SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END _Fld5874FinalBalanceCt,
CASE
WHEN SUM(_AccTtl05881_R._TurnoverDt5882 - _AccTtl05881_R._TurnoverCt5883) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverDt5882 - _AccTtl05881_R._TurnoverCt5883)
END _Fld5874Turnover,
MAX(_Acc3_Accs._Kind) _AccKind
FROM
_AccTtl05881 _AccTtl05881_R WITH(NOLOCK)
INNER JOIN _Acc3 _Acc3_Accs WITH(NOLOCK)
ON _Acc3_Accs._IDRRef = _AccTtl05881_R._AccountRRef
LEFT OUTER JOIN _Acc3 WITH(NOLOCK)
ON _AccTtl05881_R._AccountRRef = _Acc3._IDRRef
WHERE
_AccTtl05881_R._Period = @P1 AND NOT _Acc3._OffBalance = @P2 AND _AccTtl05881_R._Fld5872RRef = @P3 AND (_AccTtl05881_R._Fld5874 <> CAST(@P4 AS NUMERIC(1,0)) OR
_AccTtl05881_R._TurnoverDt5882 <> CAST(@P4 AS NUMERIC(1,0)) OR
_AccTtl05881_R._TurnoverCt5883 <> CAST(@P4 AS NUMERIC(1,0)) OR
_AccTtl05881_R._Turnover5884 <> CAST(@P4 AS NUMERIC(1,0)))
GROUP BY
_AccTtl05881_R._AccountRRef
HAVING
CASE
WHEN SUM(_AccTtl05881_R._TurnoverDt5882) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverDt5882)
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._TurnoverCt5883) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverCt5883)
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(0 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874) > CAST(0 AS NUMERIC(1,0))
THEN SUM(_AccTtl05881_R._Fld5874)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(1 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874) < CAST(0 AS NUMERIC(1,0))
THEN - SUM(_AccTtl05881_R._Fld5874)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(0 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884) > CAST(0 AS NUMERIC(1,0))
THEN SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._Fld5874) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
WHEN MAX(_Acc3_Accs._Kind) = CAST(1 AS NUMERIC(1,0)) OR
MAX(_Acc3_Accs._Kind) = CAST(2 AS NUMERIC(1,0)) AND SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884) < CAST(0 AS NUMERIC(1,0))
THEN - SUM(_AccTtl05881_R._Fld5874 + _AccTtl05881_R._Turnover5884)
ELSE CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
END <> CAST(@P4 AS NUMERIC(1,0)) OR
CASE
WHEN SUM(_AccTtl05881_R._TurnoverDt5882 - _AccTtl05881_R._TurnoverCt5883) IS NULL
THEN CAST(CAST(0 AS NUMERIC(1,0)) AS NUMERIC(28,2))
ELSE SUM(_AccTtl05881_R._TurnoverDt5882 - _AccTtl05881_R._TurnoverCt5883)
END <> CAST(@P4 AS NUMERIC(1,0))
) #V8TblAli1_Q_000_T_001
LEFT OUTER JOIN _Acc3 WITH(NOLOCK)
ON #V8TblAli1_Q_000_T_001._AccountRRef = _Acc3._IDRRef
ORDER BY
_Acc3._OrderField,
_Acc3._IDRRef
S_elect @@TRANCOUNT', N'@P1 datetime,@P2 varbinary(1),@P3 varbinary(16),@P4 numeric(1,0)', {ts '2007-03-01 00:00:00'}, 0x01, 0x9BC90020ED8F451111DB842CE52B3C42, 0


Запрос может менятся в зависимости от настроек, приведена базовая версия.
Сколько же времени нужно потратить на отладку такого же запроса в t-sql-е, насколько он сложнее для человеческого восприятия и т.д. и т.п.
IKSparrow
09.11.2010 13:43Ответ № 3
Спасибо! Весьма актуальные штучки. На счёт восприятия - действительно тяжеловато воспринимать такой огромный TSQL-запрос по сравнению с 1С, но иногда это требуется для отладки и чёткого понимания, что происходит непосредственно на уровне базы, а не платформы.
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.