Разные результаты запроса из внешнего источника данных при работе через сервер и клиент
Дамы и господа! Кто сталкивался с работой внешних источников данных, точнее с их не очень адекватным поведением?
Имеем базу на Firebird, которую через драйвера прокинули в конфигурацию как ВИД.
Имеем запрос в эту базу, который при программном формировании выдаёт пустую таблицу.
И имеем тот же самый запрос, который на клиенте, через консоль выдаёт необходимый результат.
Собственно вопрос: Что я делаю не так и куда копать?
Пример кода (программное формирование:
Результатом тут является пустая таблица (см аттач)
Вот запрос из СКД:
И во втором аттаче результат выполнения того же запроса, но через консольку или через встроенный отчёт...
Имеем базу на Firebird, которую через драйвера прокинули в конфигурацию как ВИД.
Имеем запрос в эту базу, который при программном формировании выдаёт пустую таблицу.
И имеем тот же самый запрос, который на клиенте, через консоль выдаёт необходимый результат.
Собственно вопрос: Что я делаю не так и куда копать?
Пример кода (программное формирование:
Код формирования СКД |
---|
// Инициализация макета СКД
ОтчётСКД = Отчеты.СМаркетЗагрузкаДанныхИзВнешнегоИсточника.Создать();
СхемаКомпоновкиДанных = ОтчётСКД.СхемаКомпоновкиДанных;
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Настройки отчёта
ПараметрДатаНачала = СхемаКомпоновкиДанных.Параметры.Найти("ДатаНачала");
ПараметрДатаОкончания = СхемаКомпоновкиДанных.Параметры.Найти("ДатаОкончания");
ПараметрДатаНачала.Значение = ДатаНачала;
ПараметрДатаОкончания.Значение = ДатаОкончания;
// Разбираем предопределённые отборы
Для Каждого ВариантОтбора Из Настройки.Отбор.Элементы Цикл
Если Строка(ВариантОтбора.ЛевоеЗначение) = "DOCHEAD_FILIALINDEX" Тогда // Филиалы
Если СписокФилиалов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = СписокФилиалов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "DOCTYPE" Тогда // Типы документов
Если МассивТиповДокументов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивТиповДокументов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "OPERATIONID_OPERATION" Тогда // Виды операций
Если МассивВидовОпераций.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивВидовОпераций;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Формируем результат
ТаблицаВывода = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаВывода);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТаблицаВывода; Показать |
Результатом тут является пустая таблица (см аттач)
Вот запрос из СКД:
Запрос из СКД |
---|
ВЫБРАТЬ
DOCHEAD.ID_DOCHEAD КАК ID_DOCHEAD,
DOCHEAD.SHOPINDEX КАК SHOPINDEX,
DOCHEAD.DOCHEAD_FILIALINDEX КАК DOCHEAD_FILIALINDEX,
DOCHEAD.OPERATION КАК OPERATION,
DOCHEAD.DOCINDEX КАК DOCINDEX,
DOCHEAD.DOC_DATE КАК DOC_DATE,
DOCHEAD.CLIENT_INDEX КАК CLIENT_INDEX,
DOCHEAD.CLIENT2_INDEX КАК CLIENT2_INDEX,
DOCHEAD.DOC_STATE КАК DOC_STATE,
DOCHEAD.COMMENT КАК COMMENT,
DOCHEAD.LEGAL_PERSON КАК LEGAL_PERSON,
DOCSPEC.ARTICUL КАК ARTICUL,
DOCSPEC.QUANTITY КАК QUANTITY,
DOCSPEC.PRICERUB КАК PRICERUB,
DOCSPEC.TAXHEAD КАК TAXHEAD,
DOCSPEC.NDS КАК NDS,
DOCKINDTable.NAME_DOCKIND КАК NAME_DOCKIND,
DOCTYPETable.NAME_DOCTYPE КАК NAME_DOCTYPE,
FirstCLIENTSTable.INN_CLIENTS КАК First_INN_CLIENTS,
FirstCLIENTSTable.NAME_CLIENTS КАК First_NAME_CLIENTS,
SecondCLIENTSTable.INN_CLIENTS КАК Second_INN_CLIENTS,
SecondCLIENTSTable.NAME_CLIENTS КАК Second_NAME_CLIENTS,
DOCHEAD.DOCTYPE КАК DOCTYPE,
DOCHEAD.OPERATION.ID_OPERATION КАК OPERATIONID_OPERATION
ИЗ
ВнешнийИсточникДанных.SMarket.Таблица.DOCHEAD КАК DOCHEAD
ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.SMarket.Таблица.DOCSPEC КАК DOCSPEC
ПО DOCHEAD.ID_DOCHEAD = DOCSPEC.ID_DOCHEAD
ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.SMarket.Таблица.DOCKIND КАК DOCKINDTable
ПО DOCHEAD.DOCKIND = DOCKINDTable.ID_DOCKIND
ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.SMarket.Таблица.DOCTYPE КАК DOCTYPETable
ПО DOCHEAD.DOCTYPE = DOCTYPETable.ID_DOCTYPE
ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.SMarket.Таблица.CLIENTS КАК FirstCLIENTSTable
ПО DOCHEAD.CLIENT_INDEX = FirstCLIENTSTable.ID_CLIENTS
ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.SMarket.Таблица.CLIENTS КАК SecondCLIENTSTable
ПО DOCHEAD.CLIENT2_INDEX = SecondCLIENTSTable.ID_CLIENTS
ГДЕ
DOCHEAD.DOC_DATE МЕЖДУ &ДатаНачала И &ДатаОкончания Показать |
И во втором аттаче результат выполнения того же запроса, но через консольку или через встроенный отчёт...
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Убери все фильтры, попробуй без них получить результат, вначале. (Период оставь, получи за один день)
Часто ошибка в них.
// Разбираем предопределённые отборы
Для Каждого ВариантОтбора Из Настройки.Отбор.Элементы Цикл
Если Строка(ВариантОтбора.ЛевоеЗначение) = "DOCHEAD_FILIALINDEX" Тогда // Филиалы
Если СписокФилиалов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = СписокФилиалов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "DOCTYPE" Тогда // Типы документов
Если МассивТиповДокументов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивТиповДокументов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "OPERATIONID_OPERATION" Тогда // Виды операций
Если МассивВидовОпераций.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивВидовОпераций;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПоказатьДля Каждого ВариантОтбора Из Настройки.Отбор.Элементы Цикл
Если Строка(ВариантОтбора.ЛевоеЗначение) = "DOCHEAD_FILIALINDEX" Тогда // Филиалы
Если СписокФилиалов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = СписокФилиалов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "DOCTYPE" Тогда // Типы документов
Если МассивТиповДокументов.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивТиповДокументов;
КонецЕсли;
ИначеЕсли Строка(ВариантОтбора.ЛевоеЗначение) = "OPERATIONID_OPERATION" Тогда // Виды операций
Если МассивВидовОпераций.Количество() Тогда
ВариантОтбора.Использование = Истина;
ВариантОтбора.ПравоеЗначение = МассивВидовОпераций;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Убери все фильтры, попробуй без них получить результат, вначале. (Период оставь, получи за один день)
Часто ошибка в них.
(2)
Убери все фильтры, попробуй без них получить результат, вначале. (Период оставь, получи за один день)
Часто ошибка в них.
Первое,, что тестил, результат тот же. Пустая таблица.
Притом запрос не через СКД, даёт тот же результат, к сожалению.
Да и отборы транспилируются платформой в качестве "WHERE" при компоновке запроса в базу.
Убери все фильтры, попробуй без них получить результат, вначале. (Период оставь, получи за один день)
Часто ошибка в них.
Первое,, что тестил, результат тот же. Пустая таблица.
Притом запрос не через СКД, даёт тот же результат, к сожалению.
Да и отборы транспилируются платформой в качестве "WHERE" при компоновке запроса в базу.
(3)
Поменяй внешний источник данных на Таблицу значений (напиши для теста).
Так ты проверишь правильность кода.
Поменяй внешний источник данных на Таблицу значений (напиши для теста).
Так ты проверишь правильность кода.
Прикрепленные файлы:
ПримерОтчетаСТаблицейЗначений.erf
(1)
Отбор через настройки получаете, а почему параметры так?
// Инициализация макета СКД
ОтчётСКД = Отчеты.СМаркетЗагрузкаДанныхИзВнешнегоИсточника.Создать();
СхемаКомпоновкиДанных = ОтчётСКД.СхемаКомпоновкиДанных;
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Настройки отчёта
ПараметрДатаНачала = СхемаКомпоновкиДанных.Параметры.Найти("ДатаНачала");
ПараметрДатаОкончания = СхемаКомпоновкиДанных.Параметры.Найти("ДатаОкончания");
ПараметрДатаНачала.Значение = ДатаНачала;
ПараметрДатаОкончания.Значение = ДатаОкончания;
ОтчётСКД = Отчеты.СМаркетЗагрузкаДанныхИзВнешнегоИсточника.Создать();
СхемаКомпоновкиДанных = ОтчётСКД.СхемаКомпоновкиДанных;
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Настройки отчёта
ПараметрДатаНачала = СхемаКомпоновкиДанных.Параметры.Найти("ДатаНачала");
ПараметрДатаОкончания = СхемаКомпоновкиДанных.Параметры.Найти("ДатаОкончания");
ПараметрДатаНачала.Значение = ДатаНачала;
ПараметрДатаОкончания.Значение = ДатаОкончания;
Отбор через настройки получаете, а почему параметры так?
ПараметрДатаНачала = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаНачала"));
ПараметрДатаНачала.Использование = Истина;
ПараметрДатаНачала.Значение = ДатаНачала;
ПараметрДатаОкончания = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОкончания"));
ПараметрДатаОкончания.Использование = Истина;
ПараметрДатаОкончания.Значение = ДатаОкончания;
Странно 1С как-то с Firebird работает. Я лично не разобрался. Тупо написал процедуру, в которой отправляется запрос, в ответ таблица значений. Сам запрос отлаживаю через саму консоль Firebird. Задача была разовая, заказчика устроило. Собирает данные из системы доступа по карточкам.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот