Содержание:
1. Причина ошибки Неоднозначное поле
2. Как устранить ошибку в запросе Неоднозначное поле
1. Причина ошибки Неоднозначное поле
«Неоднозначное поле» – это ошибка программы 1С, возникающая в результате формирования некорректного текста запроса. А именно, когда имя таблицы и поле – идентичны. Неопределенность возникает из-за одинаковых имен полей и имен таблиц в запросе.
Ниже приведен скрин-пример с простым текстом без ошибки в запросе «Неоднозначное поле» и умышленное ее допущение:

Причина возникновения ошибки неоднозначного поля в 1С
Правило о недопущении неоднозначности поля является аксиомой. В результате такого искаженного текста запроса возникает неоднозначность и попытка двойственного чтения данных.
Также ошибка «Неоднозначное поле» в 1С может появиться в менее примитивном примере, в результате связи двух таблиц, где имя одной таблицы совпадет с именем поля другой таблицы:

Ошибка в результате связи двух таблиц
Об этом пользователя оповестит окно конструктора запроса (ошибка Неоднозначное поле) и высветит предупреждение с вопросом игнорировать его или нет.

Окно конструктора запросов с оповещением об ошибке
В случае подтверждения будьте готовы к тому, что конструктор запроса Вы не сможете открыть повторно, пока не устраните ошибку неоднозначности поля непосредственно в самом тексте без использования конструктора запросов:

Тут “зарыта собака” ошибки Неоднозначное поле в тексте запроса
При попытке открытия конструктора запроса система выдаст оповещение об ошибке неоднозначности поля с указаниям места текста «конфликта».

Система сама указывает на место ошибки Неоднозначное поле
2. Как устранить ошибку в запросе Неоднозначное поле
Для устранения ошибки в запросе в 1С «Неоднозначное поле» достаточно переименовать таблицу, назначив имя, отличное от имени поля:

Устранение ошибки Неоднозначное поле
Проговорим еще раз:
1. Имя справочника не должно совпадать с именем ресурса регистра сведений.
Пример:
Псевдоним Справочник.Номенклатура КАК Номенклатура
совпадает с именем поля ЦеныНоменклатуры.Номенклатура
Достаточно исправить:
Справочник.Номенклатура КАК спрНоменклатура
2. Используем переименование таблиц в случае возможного совпадения с полями ссылочного характера.

Переименование таблиц
3. При создании временных таблиц не допускайте повторения имен таблиц в запросе и их совпадения, т.к. это вызовет большую вероятность возникновения ошибки в случае связи или объединения этих таблиц.
Пример:

Объединение таблиц с ошибкой Неоднозначное поле
Частая ошибка начинающих программистов – обращение к данным и запрос к табличным частям документа с их незамысловатым переименованием, например, как ЗаказПокупателя.

Типичная ошибка начинающих программистов, приводящая к ошибке Неоднозначное поле
На выходе получаем все ту же ошибку неоднозначного поля «ЗаказПокупателя.Ссылка». Где в запросе ошибка? Правильно – в совпадение имен таблиц.
Достаточно переименовать ТоварыЗаказКлиента и УслугиЗаказКлиента (или ЗаказКлиента и ЗаказКлиента1) – ошибка запроса неоднозначное поле исчезнет.
Специалист компании «Кодерлайн»
Юлия Антонова
Неоднозначное поле
Причина ошибки в совпадении названия (псевдонима) таблицы и имени поля таблицы или реквизита, либо реквизитов соединяемых таблиц. Причем совпадение псевдонимов полей в разных источниках допускается.
Данная ошибка может возникнуть:
- в момент сохранения конструктора запрос,
- при начале редактирования через конструктор,
- при исполнении ошибочного запроса.
Текст запроса, который может вызвать ошибку
ВЫБРАТЬ
Ссылка.Ссылка КАК Ключи
ИЗ
Справочник.Ключи КАК Ссылка
Ошибка при соединении
Чаще всего ошибка возникает не в простых запросах (как выше), а при соединении похожих или одинаковых таблиц.
Например, справочников по полям ссылка, наименование, код (присутствующих у всех)
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ключи КАК Ключи2
ПО Наименование = Наименование
Исправление ошибки
- При соединениях следует указывать названия таблиц: Ключи.Ссылка = Ключи2.Ссылка.
- Названия таблиц выбирать не совпадающими с полем «Имя» реквизита.
- Если объект добавлен вами и вы создали, например, реквизит Договоры в Справочник.Договоры, лучше переименовать его, т.к. подобные ошибки будут возникать регулярно.
- Если используются временные таблицы, обратите внимание на их имена на предмет аналогичного совпадения.
Пример кода с временными таблицами — «Наименование» не вызывает ошибку в отличии от ссылка (Поле не используется при соединении, но есть в полях выборки):
ВЫБРАТЬ
"ключ" КАК Ссылка
ПОМЕСТИТЬ Ключи
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Наименование,
Ссылка
ИЗ
Справочник.Ключи КАК Ключи
ЛЕВОЕ СОЕДИНЕНИЕ Ключи как Ключи2 ПО (ИСТИНА)
Безошибочный код
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
Реклама — виновница того, что народ выбрал себе в вожди Гитлера. Реклама призвана убеждать граждан, что ситуация нормальна, когда она катастрофически ненормальна.
- Главная
- О сайте
- Главная
- Содержание
Категории
—>
рубрики: Конструктор запросов | Дата: 9 февраля, 2017
Иногда при составлении запросов с помощью конструктора запросов 1С выдается сообщение про неоднозначное поле. В этой статье воспроизведем ситуацию в которой возникает эта ошибка и разберемся как действовать в таких случаях.
Воспроизводим ошибку
Создадим в конфигураторе любой справочник (в моем случае это будет справочник Товары). Добавим в справочник реквизит с таким же именем – Товары.
А теперь откроем конструктор запросов, выберем таблицу со справочником Товары и из этой таблицы поле Товары
Нажимаем на кнопку OK и видим следующее сообщение об ошибке
В принципе из этого сообщения можно понять в чем причина ошибки
А теперь вместо поля товары выберем любое другое. Например Ссылка. Но даже в этом случае программа не даст нам сохранить запрос
А вот из этого сообщения уже мало что можно понять. О каком таком неоднозначном поле идет речь. Когда впервые сталкиваешься с этим, приходится потратить немало времени, чтобы разобраться в чем причина. Особенно если учесть, что реквизитов у объекта по которому строим запрос может быть пара десятков. И навскидку не всегда можно увидеть, что есть реквизит с тем же наименованием, что и таблица.
Исправляем ошибку
Как всегда после обнаружения причины ошибки встает вопрос: «Что делать?».
Во-первых конечно же надо строить правильную архитектуру конфигурации, чтобы потом не приходилось ничего исправлять. Но если уж сложилась ситуация, которую мы рассмотрели, то и ее можно исправить. Вспоминаем, что у таблицы есть псевдоним, т.е. наименование таблицы можно задать самому. Щелкаем по таблице правой кнопкой и выбираем пункт меню Переименовать таблицу
В открывшемся окне зададим имя для нашей таблицы – ТаблицаТоваров.
После чего спокойно сохраняем запрос и получаем вот такой текст запроса
ВЫБРАТЬ
ТаблицаТоваров.Товары КАК Товары
ИЗ
Справочник.Товары КАК ТаблицаТоваров
При выполнении запроса, если, например, название временной таблицы совпадет с названием реквизита, и возникает двойственность чтения данных, будет получено сообщение в 1С Неоднозначное поле в запросе.
Содержание
- 1 Причина ошибки
- 2 Исправление ошибки
- 2.1 Вам будет интересно
Причина ошибки
В 1С Неоднозначное поле в запросе может возникнуть:
- в момент сохранения конструктора запроса;
- при исполнении ошибочного запроса.
Рассмотрим на примере: создадим временную таблицу из справочника контрагентов с неким условием и назовем ее Контрагент.
Свяжем ее с документом Обучение и развитие сотрудников по одноименному реквизиту. При попытке сохранения запроса увидим следующее предупреждение.
Такое же предупреждение можно получить, если попытаться связать две таблицы, где имя одной таблицы совпадет с именем поля другой таблицы:
При попытке закрыть запрос возникает предупреждение Неоднозначное поле. Более того, если проигнорировать, то уже в дальнейшем сталкиваемся с ошибкой при открытии запроса посредством конструктора.
Исправление ошибки
Чтобы открыть запрос, в котором было предупреждение о неоднозначности, который проигнорировали, необходимо внести изменения в текст запроса. Действия могут быть различные: удалить соединение таблиц, заменить название и др., поняв причину ошибки.
В примере, который описан на картинке выше, необходимо вручную заменить в строке соединения таблиц Контрагент.Контрагент на ОбучениеРазвитиеСотрудников.Контрагент. Уже после того, как конструктор запроса откроется, исправьте временную таблицу, присвоив ей другое имя, не совпадающее с реквизитом, и настройте заново соединение временной таблицы и документа.
Чтобы подобное не происходило, необходимо при назначении имени временной таблицы указывать такое название, которое вряд ли будет далее совпадать с названием реквизита или наименованием табличной части объекта метаданных. При создании нового объекта или реквизита конфигурации постарайтесь задавать уникальное имя, чтобы в дальнейшем не сталкиваться с проблемами при соединении в запросах.
Откройте конфигуратор и посмотрите названия временных таблиц в запросах, которые задают разработчики 1С. Они добавляют в названия таблиц приставки ВТ, ВТ_ и т. д., тем самым избегая неоднозначности в чтении данных.
См. также:
- Поле объекта недоступно для записи в 1С 8.3
- Переменная не определена в 1С 8.3
- Метод объекта не обнаружен в 1С 8.3
- Поле объекта не обнаружено в 1С 8.3
- Нарушение прав доступа 1С 8.3: внешняя обработка
Поставьте вашу оценку этой статье:
Загрузка…
Дата публикации: Апр 3, 2021
Поставьте вашу оценку этой статье:
Загрузка…
Неоднозначное поле «СписаниеТоваров.Ссылка» |
Я |
03.02.17 — 16:21
Здравствуйте.
Недавно обнаружилась ошибка у бухгалтера при печати отчета:
{Документ.СписаниеТоваров.МодульОбъекта(928)}: Ошибка при вызове метода контекста (Выполнить)
Док = Запрос.Выполнить().Выбрать();
по причине:
{(17, 2)}: Неоднозначное поле «СписаниеТоваров.Ссылка»
<<?>>СписаниеТоваров.Ссылка = &ТекДокумент
Пример кода:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекДокумент», ЭтотОбъект.Ссылка);
Запрос.УстановитьПараметр(«Дата» , Дата);
Запрос.Текст =
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СписаниеТоваров.Номер,
| СписаниеТоваров.Дата КАК ДатаДокумента,
| СписаниеТоваров.Организация,
| СписаниеТоваров.СтруктурноеПодразделение,
| СписаниеТоваров.Склад.Представление КАК СкладПредставление,
| СписаниеТоваров.ИнвентаризационнаяКомиссия.(
| ФизЛицо КАК ФизЛицо,
| Председатель КАК Председатель
| ),
| ОтветственныеЛицаСрезПоследних.ФизическоеЛицо КАК ОтветственноеЛицо
|ИЗ
| Документ.СписаниеТоваров КАК СписаниеТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица.СрезПоследних(&Дата, ) КАК ОтветственныеЛицаСрезПоследних
| ПО СписаниеТоваров.Склад = ОтветственныеЛицаСрезПоследних.СтруктурнаяЕдиница
|ГДЕ
| СписаниеТоваров.Ссылка = &ТекДокумент»;
Док = Запрос.Выполнить().Выбрать();
Посмотрел печатный отчет внутренний и находится в Общих макетах.
Вроде бы как при нажатии на кнопку вызывается нужная функция, но при этом возникает такая ошибка.
Целый день пытаюсь понять в чем ошибка. Если кто знает, пожалуйста подскажите в каком направлении «копать».
1 — 03.02.17 — 16:23
2 — 03.02.17 — 16:28
Да, все ссылки красные)).
Я даже создал новую базу, а там данный отчет работает без ошибок. Код один в один.
3 — 03.02.17 — 16:30
(0) Целый день?
LOL
Запрос.Текст =
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СписаниеТоваров2.Номер,
| СписаниеТоваров2.Дата КАК ДатаДокумента,
| СписаниеТоваров2.Организация,
| СписаниеТоваров2.СтруктурноеПодразделение,
| СписаниеТоваров2.Склад.Представление КАК СкладПредставление,
| СписаниеТоваров2.ИнвентаризационнаяКомиссия.(
| ФизЛицо КАК ФизЛицо,
| Председатель КАК Председатель
| ),
| ОтветственныеЛицаСрезПоследних.ФизическоеЛицо КАК ОтветственноеЛицо
|ИЗ
| Документ.СписаниеТоваров КАК СписаниеТоваров2
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица.СрезПоследних(&Дата, ) КАК ОтветственныеЛицаСрезПоследних
| ПО СписаниеТоваров2.Склад = ОтветственныеЛицаСрезПоследних.СтруктурнаяЕдиница
|ГДЕ
| СписаниеТоваров2.Ссылка = &ТекДокумент»;
4 — 03.02.17 — 16:39
Спасибо большое.
Признаюсь стыдно ((((.
Здоровья Вам и всех благ ))).
5 — 03.02.17 — 16:40
(4) Не стыдно не знать, стыдно не найти в инете за пять минут
6 — 03.02.17 — 16:42
+(5) Логика очень простая, СписаниеТоваров — это не только назначенный альяс документа, но и имя какого-то еще реквизита или табличной части, поэтому 1С не знает, что брать, документ или реквизит/ТЧ
7 — 03.02.17 — 16:47
Я не 1С программист. Меня лишь попросили помочь. До этого 1С видел пару раз.
Ответ про то, что имя какого-то еще реквизита или табличной части может быть таким же мне не попадалось в такой формулировки.
8 — 03.02.17 — 16:48
(7) Слушай, мне там вокруг дома подмести нужно, поможешь?
9 — 03.02.17 — 16:50
))))) Ты мне помог, вполне могу. Не вижу в этом ничего плохого.
10 — 03.02.17 — 16:53
можешь сопли на кулак мотать, можешь маму звать, в штаны ссать, а поставленную задачу должен выполнить. Умри, но сделай, Он сделал.
Цитата из фильма 9 рота.
Задачу сделал — молодец, не сделал, сиди и делай.
11 — 03.02.17 — 16:55
(9) Плохого в этом то, что ты работаешь тыжпрограммистом.
Либо делай это своей профессией либо не суйся.
Не задумывался, почему тебя никто не просит помочь сделать операцию на сердце или самолет перегнать в другой город?
12 — 03.02.17 — 16:58
(11) никто еще с клавиатурой не родился. и никто на С++ говорить не начал, все приходит с опытом.
13 — 03.02.17 — 17:00
(12) Я и не говорю, уйди накуй с поля, где взрослые в футбол играют.
Я говорю либо делай это своей профессией либо не суйся, не будь тыжпрограммистом.
14 — 03.02.17 — 17:23
Я и не думал, что придется в коде копаться. На вид казалось раз все до этого работало, то значит где-то настройках что-то поменяли. И я начал не с кода. Читал на просторах интернета как работают эти печатные формы. На Вашем форуме много тем пересмотрел.
15 — 03.02.17 — 17:25
(14) А, ну понятно. Значит, операцию на сердце ты делать не возьмешься, а вот скальпелем махнуть пару раз нет проблем, че там сложного, да?
Er2003
16 — 03.02.17 — 18:08
Это можно примерно сравнить: терапевт явно не умеет делать операцию на сердце, но если в экстренной ситуации под руководством может постараться спасти жизнь.))
Ошибка в Конструкторе запроса: Неоднозначное поле
Такая ошибка возникает, когда в запросе присутствует таблица (вернее ее псевдоним) и поле с одним и тем же названием. Как в следующем примере.
ВЫБРАТЬ Номенклатура.Наименование КАК Наименование, КодыТоваровSKU.SKU КАК SKU ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU ПО КодыТоваровSKU.Номенклатура = Номенклатура.Ссылка
Здесь присутствует таблица Номенклатура и поле Номенклатура в таблице КодыТоваровSKU. Конструктор запроса видит в таком коде неоднозначность. При попытке сохранить такой запрос из Конструктора запроса Конфигуратора, получим ошибку.

В Конструкторе запроса Консоли запросов такой запрос вообще не получится сформировать. При попытке добавить любое поле из таблицы Номенклатура двойным щелчком просто ничего на произойдет.

При попытке добавления через «плюсик» получим ошибку.

Для решения этой проблемы необходимо переименовать таблицу в запросе, т.е. присвоить ей псевдоним, не совпадающий ни с одним из полей в запросе. Например так.
Получившийся запрос сохранится без ошибок.
ВЫБРАТЬ СправочникНоменклатура.Наименование КАК Наименование, КодыТоваровSKU.SKU КАК SKU ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU ПО КодыТоваровSKU.Номенклатура = СправочникНоменклатура.Ссылка

















