Содержание:
1. Причина ошибки Неоднозначное поле
2. Как устранить ошибку в запросе Неоднозначное поле
1. Причина ошибки Неоднозначное поле
«Неоднозначное поле» – это ошибка программы 1С, возникающая в результате формирования некорректного текста запроса. А именно, когда имя таблицы и поле – идентичны. Неопределенность возникает из-за одинаковых имен полей и имен таблиц в запросе.
Ниже приведен скрин-пример с простым текстом без ошибки в запросе «Неоднозначное поле» и умышленное ее допущение:
Причина возникновения ошибки неоднозначного поля в 1С
Правило о недопущении неоднозначности поля является аксиомой. В результате такого искаженного текста запроса возникает неоднозначность и попытка двойственного чтения данных.
Также ошибка «Неоднозначное поле» в 1С может появиться в менее примитивном примере, в результате связи двух таблиц, где имя одной таблицы совпадет с именем поля другой таблицы:
Ошибка в результате связи двух таблиц
Об этом пользователя оповестит окно конструктора запроса (ошибка Неоднозначное поле) и высветит предупреждение с вопросом игнорировать его или нет.
Окно конструктора запросов с оповещением об ошибке
В случае подтверждения будьте готовы к тому, что конструктор запроса Вы не сможете открыть повторно, пока не устраните ошибку неоднозначности поля непосредственно в самом тексте без использования конструктора запросов:
Тут “зарыта собака” ошибки Неоднозначное поле в тексте запроса
При попытке открытия конструктора запроса система выдаст оповещение об ошибке неоднозначности поля с указаниям места текста «конфликта».
Система сама указывает на место ошибки Неоднозначное поле
2. Как устранить ошибку в запросе Неоднозначное поле
Для устранения ошибки в запросе в 1С «Неоднозначное поле» достаточно переименовать таблицу, назначив имя, отличное от имени поля:
Устранение ошибки Неоднозначное поле
Проговорим еще раз:
1. Имя справочника не должно совпадать с именем ресурса регистра сведений.
Пример:
Псевдоним Справочник.Номенклатура КАК Номенклатура
совпадает с именем поля ЦеныНоменклатуры.Номенклатура
Достаточно исправить:
Справочник.Номенклатура КАК спрНоменклатура
2. Используем переименование таблиц в случае возможного совпадения с полями ссылочного характера.
Переименование таблиц
3. При создании временных таблиц не допускайте повторения имен таблиц в запросе и их совпадения, т.к. это вызовет большую вероятность возникновения ошибки в случае связи или объединения этих таблиц.
Пример:
Объединение таблиц с ошибкой Неоднозначное поле
Частая ошибка начинающих программистов – обращение к данным и запрос к табличным частям документа с их незамысловатым переименованием, например, как ЗаказПокупателя.
Типичная ошибка начинающих программистов, приводящая к ошибке Неоднозначное поле
На выходе получаем все ту же ошибку неоднозначного поля «ЗаказПокупателя.Ссылка». Где в запросе ошибка? Правильно – в совпадение имен таблиц.
Достаточно переименовать ТоварыЗаказКлиента и УслугиЗаказКлиента (или ЗаказКлиента и ЗаказКлиента1) – ошибка запроса неоднозначное поле исчезнет.
Специалист компании «Кодерлайн»
Юлия Антонова
Неоднозначное поле в запросе 1С 8.3
Ошибка Неоднозначное поле в запросе 1С 8.3 связана с наличием одинаковых имен в запросе 1С. В этом случае возникает неопределенность обработки запроса при обращении к данным и появляется соответствующее сообщение:
Ошибка, как правило, возникает у начинающих программистов. А исправляется она простым переименованием одинаковых имен в запросе.
Неоднозначное поле в запросе 1С 8.3
Ошибка 1С Неоднозначное поле может возникать как в Конфигураторе при написании запроса, так и в пользовательском режиме при выполнении некорректного программного кода.
Рассмотрим причины возникновения ошибки и порядок ее исправления на примере.
Одинаковые имена объектов в таблице запроса
Для поиска и устранения ошибки выполните следующие действия:
- Войдите в Конфигуратор.
- Откройте внешний отчет Цены номенклатуры.
- Найдите строчку ТипЦен.Номенклатура КАК Номенклатура в функции ERRORНаСервере. Программа в окне сообщения об ошибке в фигурных скобках дает подсказку, что это 2 строчка в запросе.
Обратите внимание: таблица запроса названа ТипЦен, и реквизит таблицы регистра сведений имеет то же название:
В результате возникает двойственность чтения данных, и программа не может однозначно определить, что в этом случае нужно использовать. Команда ТипЦен.Номенклатура может относиться как к самой таблице, так и к реквизиту таблицы.
Исправление ошибки неоднозначное поле
Исправление ошибки 1С Неоднозначное поле предполагает переименование имени таблицы запроса на новое, например, ЦеныНоменклатурыСрезПоследних. Теперь одинаковых имен в таблице запроса нет. Данные по номенклатуре и цене будут браться из таблицы записей периодического регистра сведений ЦеныноменклатурыСрезПоследних.
Программа понимает, что параметр Номенклатура относится именно к таблице запроса ЦеныНоменклатурыСрезПоследних.
Правильный запрос на чтение актуальных цен номенклатуры описан в процедуре WORKНаСервере.
Сохранение процедур с корректным кодом WORK и некорректным кодом ERROR выполняется отдельно для удобства демонстрации работы запросов в 1С.
Пример ошибки
Протестируем работу внешнего отчета с корректным и некорректным запросом на примере:
- Откройте внешний отчет Цены номенклатуры в 1С: кнопка Главное меню — Файл — Открыть.
- Нажмите кнопку WORK для выполнения правильного запроса.
Запрос отработал правильно!
Нажмите кнопку ERROR для выполнения запроса с ошибкой.
Вот так можно получить ошибку 1С запрос Неоднозначное поле. Будьте внимательны при создании запросов!
Заказать консультацию
По этой или иной ошибке Вы можете обратиться к нашим специалистам, мы Вам поможем решить Вашу проблему.
Неоднозначное поле
Причина ошибки в совпадении названия (псевдонима) таблицы и имени поля таблицы или реквизита, либо реквизитов соединяемых таблиц. Причем совпадение псевдонимов полей в разных источниках допускается.
Данная ошибка может возникнуть:
- в момент сохранения конструктора запрос,
- при начале редактирования через конструктор,
- при исполнении ошибочного запроса.
Текст запроса, который может вызвать ошибку
ВЫБРАТЬ
Ссылка.Ссылка КАК Ключи
ИЗ
Справочник.Ключи КАК Ссылка
Ошибка при соединении
Чаще всего ошибка возникает не в простых запросах (как выше), а при соединении похожих или одинаковых таблиц.
Например, справочников по полям ссылка, наименование, код (присутствующих у всех)
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ключи КАК Ключи2
ПО Наименование = Наименование
Исправление ошибки
- При соединениях следует указывать названия таблиц: Ключи.Ссылка = Ключи2.Ссылка.
- Названия таблиц выбирать не совпадающими с полем «Имя» реквизита.
- Если объект добавлен вами и вы создали, например, реквизит Договоры в Справочник.Договоры, лучше переименовать его, т.к. подобные ошибки будут возникать регулярно.
- Если используются временные таблицы, обратите внимание на их имена на предмет аналогичного совпадения.
Пример кода с временными таблицами — «Наименование» не вызывает ошибку в отличии от ссылка (Поле не используется при соединении, но есть в полях выборки):
ВЫБРАТЬ
"ключ" КАК Ссылка
ПОМЕСТИТЬ Ключи
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Наименование,
Ссылка
ИЗ
Справочник.Ключи КАК Ключи
ЛЕВОЕ СОЕДИНЕНИЕ Ключи как Ключи2 ПО (ИСТИНА)
Безошибочный код
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
Реклама магазина самообслуживания: треска, стоящая в очереди за cобственной печенью.
Неоднозначное поле «СписаниеТоваров.Ссылка» |
Я |
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
Это можно примерно сравнить: терапевт явно не умеет делать операцию на сердце, но если в экстренной ситуации под руководством может постараться спасти жизнь.))
- Главная
- О сайте
- Главная
- Содержание
Категории
—>
рубрики: Конструктор запросов | Дата: 9 февраля, 2017
Иногда при составлении запросов с помощью конструктора запросов 1С выдается сообщение про неоднозначное поле. В этой статье воспроизведем ситуацию в которой возникает эта ошибка и разберемся как действовать в таких случаях.
Воспроизводим ошибку
Создадим в конфигураторе любой справочник (в моем случае это будет справочник Товары). Добавим в справочник реквизит с таким же именем – Товары.
А теперь откроем конструктор запросов, выберем таблицу со справочником Товары и из этой таблицы поле Товары
Нажимаем на кнопку OK и видим следующее сообщение об ошибке
В принципе из этого сообщения можно понять в чем причина ошибки
А теперь вместо поля товары выберем любое другое. Например Ссылка. Но даже в этом случае программа не даст нам сохранить запрос
А вот из этого сообщения уже мало что можно понять. О каком таком неоднозначном поле идет речь. Когда впервые сталкиваешься с этим, приходится потратить немало времени, чтобы разобраться в чем причина. Особенно если учесть, что реквизитов у объекта по которому строим запрос может быть пара десятков. И навскидку не всегда можно увидеть, что есть реквизит с тем же наименованием, что и таблица.
Исправляем ошибку
Как всегда после обнаружения причины ошибки встает вопрос: «Что делать?».
Во-первых конечно же надо строить правильную архитектуру конфигурации, чтобы потом не приходилось ничего исправлять. Но если уж сложилась ситуация, которую мы рассмотрели, то и ее можно исправить. Вспоминаем, что у таблицы есть псевдоним, т.е. наименование таблицы можно задать самому. Щелкаем по таблице правой кнопкой и выбираем пункт меню Переименовать таблицу
В открывшемся окне зададим имя для нашей таблицы – ТаблицаТоваров.
После чего спокойно сохраняем запрос и получаем вот такой текст запроса
ВЫБРАТЬ
ТаблицаТоваров.Товары КАК Товары
ИЗ
Справочник.Товары КАК ТаблицаТоваров