Имя: Пароль:
1C
1С v8
Получить результат (таблицу) процедуры с параметрами (Внешний источник данных)
0 dimasad
 
24.03.26
23:03
Стоит задача использовать в различных отчетах данные из сторонней СУБД.
Просто подключить таблицу ВИД - не проблема, а вот получить результат процедуры из ВИД - фиг.

ВИД подключал согласно документации ( https://its.1c.ru/db/v8321doc#bookmark:dev:TI000001645 )
Вызов процедуры в скуле такой:
exec dbo.rep_on ID, DateOn, DateOff
exec dbo.rep_on 31, '20260101', '20260201'

В ВИД создал ручками таблицу описал все поля, Вид таблицы - выражение: rep_on(&1, &2, &3). Даже явное указание параметров выдает ошибки:
dbo.rep_on(36159, '20260101', '20260201') - объект не найден;
[dbo].[report_on] (31, '20260101', '20260201') - неправильная конструкция "("
[dbo].[report_on] 31, '20260101', '20260201') - неправильный синтаксис "31";


Кто знает как заставить это г... взлететь, да еще и передавать туда параметры?

ПС/тестил в консоле запросов.
ППС/ странная оссобенность нашел эту процедуру при подключении функции синтаксис странный: rep_on;1(&1, &2, &3)
1 Garykom
 
гуру
25.03.26
00:01
(0) Через хранимки уже пробовал?
Через них можно даже INSERT делать
https://infostart.ru/1c/articles/1019947/
2 H A D G E H O G s
 
25.03.26
00:06
Тыц, тыц, тыц.
3 bolder
 
25.03.26
00:20
(0) Вызов хранимых процедур недокументирован.Поэтому только через грабли и набитые шишки.ВИД подключает физические таблицы внешней БД.В (1) про это есть.(2)собственные функции - да пожалуйста.
4 Garykom
 
гуру
25.03.26
02:01
(3) Дык в (2) как раз сначала создание хранимки на SQL
А затем вызов ее
5 bolder
 
25.03.26
08:51
(4) Ну ОК.Отстал от жизни.Из (0):
"В зависимости от того, какой объект СУБД описывает создаваемая объект в «1С:Предприятие», следует корректно установить свойство Вид таблицы. Если свойство установлено в значение Таблица ‑ то объект конфигурации будет выступать аналогом реальной таблицы базы данных или представления (view). В остальных случаях свойство Вид таблицы следует установить в значение Выражение. Если таблица внешнего источника данных имеет вид Таблица, то в свойство Имя в источнике данных необходимо указать имя реальной таблицы или не параметризованного представления, например dbo.ErrorLog. Для таблицы вида Выражение, следует указать свойство Выражение в источнике данных. В простейшем случае это будет вызов функции, возвращающей табличные данные, например dbo.ufnGetContactInformation(&1). Если в это поле записывается выражение, то рекомендуется указать его в скобках, для минимизации различных конфликтов при реальном выполнении запроса к СУБД."
В таком виде ВИД еще не использовал...
В (2) отличный пример скалярной функции.
6 dimasad
 
25.03.26
12:03
(2) Когда Функция возвращает значение - понятно (с таким игрался).
У меня даже не вьюшка поэтому стопанул на проблеме как получить таблицу...
инфы очень мало.

Код процедуры в MSSQL^
IS NOT NULL DROP TABLE #FinalReport;
    CREATE TABLE #FinalReport (
        [КАТЕГОРИЯ уровень 1] NVARCHAR(600),
        [Месяц] NVARCHAR(50),
    ...............
        [Дополнительно] FLOAT
    );

    -- ============================================================================
    -- Предварительная загрузка справочников, не зависящих от месяца
    -- ============================================================================
    IF OBJECT_ID('tempdb..#AllCategories') IS NOT NULL DROP TABLE #AllCategories;
    SELECT
    ...............
    -- ============================================================================
    -- Цикл по месяцам от @data_start до @data_end
    -- ============================================================================
    DECLARE @dt1 DATETIME = @data_start;
    DECLARE @dt2 DATETIME;
    DECLARE @CurrentMonth DATETIME;

    WHILE @dt1 <= @data_end
    BEGIN
        SET @dt2 = EOMONTH(@dt1);
        SET @CurrentMonth = @dt1;

        -- ============================================================================
        -- Получаем обороты за текущий месяц
        -- ============================================================================
        IF OBJECT_ID('tempdb..#Footing') IS NOT NULL DROP TABLE #Footing;
        SELECT
    ...............

        -- ============================================================================
        -- Список договоров месяца для получения истории категорий
        -- ============================================================================
        IF OBJECT_ID('tempdb..#ContractList') IS NOT NULL DROP TABLE #ContractList;
        SELECT DISTINCT ДогНомЗап AS Договор
    ...............
        -- ============================================================================
        -- История категорий для договоров месяца
        -- ============================================================================
        IF OBJECT_ID('tempdb..#Categories') IS NOT NULL DROP TABLE #Categories;
        CREATE TABLE #Categories (
    ...............

        -- Индексы на #Categories для быстрого поиска
        CREATE CLUSTERED INDEX IX_MonthCategories_Contract ON #Categories (Договор, ДатНач, ДатКнц);
        CREATE INDEX IX_MonthCategories_Dates ON #Categories (Договор, ДатКнц DESC) INCLUDE (идКатегории);
        -- ============================================================================
        -- Основная таблица с данными договоров за месяц +  категории
        -- ============================================================================
        IF OBJECT_ID('tempdb..#data') IS NOT NULL DROP TABLE #data;
        SELECT
    ...............
        -- ============================================================================
        -- Вставка результатов месяца в итоговую таблицу
        -- ============================================================================
        INSERT INTO #FinalReport
        SELECT            
    ...............
    -- ============================================================================
    -- Итоги
    -- ============================================================================
    SELECT
        [ИНН],
        [Договор],
    ...............
        [Дополнительно]
    FROM #FinalReport
    ORDER BY [Договор], [Месяц], [КАТЕГОРИЯ]
END
7 Garykom
 
гуру
25.03.26
12:58
(6) Не надо так делать!
Напиши лучше микросервис на Go
И тупо дергай его из 1С через HTTPСоединение

Микросервис будет выглядеть примерно так
https://github.com/Garykom/psql/blob/main/main.go
У меня там под PostgreSQL, переделать на MSSQL простейше
И даже не микросервис а консольная утилита командной строки с параметрами, для макета 1С

У меня все руки не дойдут сделать универсально и через командную строку и http-сервис
8 H A D G E H O G s
 
25.03.26
13:00
(6) Тыц, Тыц, Тыц.

Выражение именно вооот так, в скобочках, ибо многомудрая 1С заключит его в подзапрос MSSQL

(select * from dbo.Table_TestFunc())
9 dimasad
 
25.03.26
14:00
(7) Интересно... но не вариант JSON тянуть с 200+тыр записями .
Тут еще и ресурсы и время надо учитывать.
Но, за идею спасибо!
10 dimasad
 
25.03.26
14:12
(8) В SQL-Клиенте я ее вызвать могу только так:
EXEC dbo.report_on 36159,'20260101','20260201'

обернуть это в SELECT не получается:
select * FROM (EXEC dbo.report_osv 36159,'20260101','20260201')

по-ходу останется мне с ADODB страдать...
11 H A D G E H O G s
 
25.03.26
14:26
(10) Что такое у вас
dbo.report_on
?
12 dimasad
 
25.03.26
14:46
(11) хранимая Процедура, предоставленная админами сторонней БД.
Вот ее лист - (6)
13 Мультук
 
гуру
25.03.26
14:52
(12)

Он у вас пытается спросить почему вот тут вы делаете  EXEC одной процедуры

EXEC dbo.report_on 36159,'20260101','20260201'

а тут в select оборачиваете совсем другую:

select * FROM (EXEC dbo.report_osv 36159,'20260101','20260201')
14 Garykom
 
гуру
25.03.26
14:53
(10) >по-ходу останется мне с ADODB страдать...
это хуже чем работать через http-сервис или утилиту на Go
жесткая привязка к Win и ADO
15 Garykom
 
гуру
25.03.26
15:26
(9) >не вариант JSON тянуть с 200+тыр записями
Платформа 1С с JSON весьма шустро работает
В массив структур прочитает за разумное время

Если хочется реально быстро данные в базу 1С засовывать
Предлагаю создать в конфе 1С отдельный РС
И туда внешними средствами СУБД переливать данные напрямую

Затем просто читаешь из этого РС в 1С
16 dimasad
 
25.03.26
15:28
(13) Эт я уже туплю... ее переименовывали по сто раз, а я ctr+c/ctrl+v и не проверил...
Все норм... сейчас она report_osv
17 dimasad
 
25.03.26
15:32
(14) Согласен.
(15) да и вообще, цель была использовать именно ВИД, без переноса его в ИБ 1С.
18 H A D G E H O G s
 
25.03.26
16:07
(12) Перепишите ее на хранимую функцию.

Из хранимой процедуры нельзя сделать прямой Select и ее нельзя вызвать из хранимой функции, чтобы сделать обертку (ну почти нельзя, но нельзя).
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс