You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Запрос к регистру сведений: ссылочное измерение — строкой-наименованием, ресурс — Неопределено, СрезПоследних со ссылочным ресурсом не компилируется #1920
СрезПоследних со ссылочным ресурсом не выполняется: no such column: реклама. В сгенерированном SQL ресурс назван реклама, а колонка в таблице — реклама_id; измерение при этом развёрнуто как филиал_id AS филиал.
onebase check, который исполняет запросы модулей, падает на таком модуле той же ошибкой. Проверку конфигурации не пройти, хотя запрос написан корректно.
РегистрыСведений.X.СоздатьНаборЗаписей() + Отбор + Прочитать() по тому же регистру отдаёт настоящие ссылки (СправочникСсылка.Филиал) и дату периода. Сломан именно путь Запрос.
ПроцедураВыполнить()
Ф=Справочники.Филиал.Создать();
Ф.Наименование ="МСК";СсылкаФ= Ф.Записать();Р=Справочники.Реклама.Создать();
Р.Наименование ="Тест";СсылкаР= Р.Записать();З=РегистрыСведений.НомераРекламы.СоздатьМенеджерЗаписи();
З.Период = ДобавитьДень(ТекущаяДата(),-1);
З.НомерТелефона ="4951983100";
З.Филиал = СсылкаФ;
З.Реклама = СсылкаР;
З.Записать();Запрос=Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ Филиал, Реклама ИЗ РегистрСведений.НомераРекламы ГДЕ НомерТелефона = &Н";
Запрос.УстановитьПараметр("Н","4951983100");Для Каждого С Из Запрос.Выполнить() Цикл
Утверждать.Равно(Строка(ТипЗнч(С.Филиал)),"СправочникСсылка.Филиал","запрос: тип измерения Филиал");
Утверждать.Равно(Строка(ТипЗнч(С.Реклама)),"СправочникСсылка.Реклама","запрос: тип ресурса Реклама");
Утверждать.Равно(С.Филиал, СсылкаФ,"запрос: измерение Филиал = записанная ссылка");КонецЦикла;
Запрос.Текст ="ВЫБРАТЬ Филиал, Реклама ИЗ РегистрСведений.НомераРекламы.СрезПоследних(&НаДату) ГДЕ НомерТелефона = &Н";
Запрос.УстановитьПараметр("НаДату", ТекущаяДатаВремя());Для Каждого С Из Запрос.Выполнить() Цикл
Утверждать.Равно(С.Реклама, СсылкаР,"СрезПоследних: ресурс Реклама = записанная ссылка");КонецЦикла;Набор=РегистрыСведений.НомераРекламы.СоздатьНаборЗаписей();
Набор.Отбор.НомерТелефона ="4951983100";
Набор.Прочитать();
Утверждать.Равно(Строка(ТипЗнч(Набор.Получить(0).Филиал)),"СправочникСсылка.Филиал","набор записей: тип измерения Филиал");КонецПроцедуры
▶ ПробаРегистра
ПРОВАЛ — запрос: тип измерения Филиал (ожидалось «СправочникСсылка.Филиал», получено «Строка»)
ПРОВАЛ — запрос: тип ресурса Реклама (ожидалось «СправочникСсылка.Реклама», получено «Неопределено»)
ПРОВАЛ — запрос: измерение Филиал = записанная ссылка (ожидалось «МСК», получено «МСК»)
ОШИБКА — src\пробарегистра.proc.os:28: Ошибка выполнения SQL: run query: SQL logic error: no such column: реклама (1)
SQL: SELECT ref_филиал.наименование AS филиал, реклама FROM (SELECT period, номертелефона, филиал, реклама FROM (SELECT period, номертелефона, филиал_id AS филиал, реклама, ROW_NUMBER() OVER (PARTITION BY номертелефона, филиал_id ORDER BY period DESC) AS _rn FROM инфо_номерарекламы AS _t WHERE period <= ?) _w WHERE _rn = 1) AS срезпоследних_номерарекламы LEFT JOIN филиал ref_филиал ON ref_филиал.id = срезпоследних_номерарекламы.филиал WHERE COALESCE(номертелефона, '') = ?
onebase check --project .:
src/пробарегистра.proc.os:26:20: [Запрос модуля (исполнение)] [dsl.syntax] SQL logic error: no such column: реклама (1)
Найдено ошибок: 1
Строка «ожидалось «МСК», получено «МСК»» — то же самое с другой стороны: значение из запроса — строка-наименование, сравнение со ссылкой ложно.
СрезПоследних с ссылочным ресурсом компилируется: ресурс берётся из колонки <имя>_id.
Где это мешает
Конфигурация cc2: входящему звонку подставляются филиал и реклама по номеру линии из периодического регистра сведений. Через Запрос этого не сделать: присвоение реквизиту документа даёт «несоответствие типов… передано значение типа «Строка»», а поиск ссылки по наименованию неоднозначен — у реклам и филиалов бывают одинаковые имена. Пока обходим набором записей (СоздатьНаборЗаписей + Отбор + Прочитать).
Реализацию готов взять контрибутором (@AnnaSIceberg) Draft PR от свежего main, если сопровождающий решит так.
Что происходит
Запрос к регистру сведений неверно отдаёт ссылочные поля регистра.
Обычный запрос (
ВЫБРАТЬ … ИЗ РегистрСведений.X):Строка, «МСК»), а не ссылкой;Неопределено, хотя в записи он заполнен.По контракту ТипЗнч на колонке результата запроса отдаёт «Строка», а не ссылочный тип #1150 (
wrapRefColumns) ссылочная колонка результата должна бытьСправочникСсылка.X.СрезПоследнихсо ссылочным ресурсом не выполняется:no such column: реклама. В сгенерированном SQL ресурс названреклама, а колонка в таблице —реклама_id; измерение при этом развёрнуто какфилиал_id AS филиал.onebase check, который исполняет запросы модулей, падает на таком модуле той же ошибкой. Проверку конфигурации не пройти, хотя запрос написан корректно.РегистрыСведений.X.СоздатьНаборЗаписей()+Отбор+Прочитать()по тому же регистру отдаёт настоящие ссылки (СправочникСсылка.Филиал) и дату периода. Сломан именно путьЗапрос.Воспроизведение
Upstream
main66a9a104, SQLite, Windows. Минимальный проект:catalogs/филиал.yamlиcatalogs/реклама.yaml— по одному полюНаименование: string.inforegs/номерарекламы.yaml:processors/ПробаРегистра.yaml—kind: test, модульsrc/пробарегистра.proc.os:Фактически
onebase check --project .:Строка «ожидалось «МСК», получено «МСК»» — то же самое с другой стороны: значение из запроса — строка-наименование, сравнение со ссылкой ложно.
Ожидаемое
СправочникСсылка.Xс идентификатором, как у колонок справочников и документов (ТипЗнч на колонке результата запроса отдаёт «Строка», а не ссылочный тип #1150).Неопределено.СрезПоследнихс ссылочным ресурсом компилируется: ресурс берётся из колонки<имя>_id.Где это мешает
Конфигурация cc2: входящему звонку подставляются филиал и реклама по номеру линии из периодического регистра сведений. Через
Запросэтого не сделать: присвоение реквизиту документа даёт «несоответствие типов… передано значение типа «Строка»», а поиск ссылки по наименованию неоднозначен — у реклам и филиалов бывают одинаковые имена. Пока обходим набором записей (СоздатьНаборЗаписей+Отбор+Прочитать).Реализацию готов взять контрибутором (@AnnaSIceberg) Draft PR от свежего
main, если сопровождающий решит так.