При разработке в 1С:Предприятии 8.3 программисты часто сталкиваются с необходимостью вывода данных в динамический список из сложного произвольного запроса, включающего временные таблицы. В таких ситуациях, несмотря на корректную работу запроса в консоли, пользователи могут получить ошибку вида "Поле не найдено 'Description'" или "Поле не найдено 'DeletionMark'" при попытке отобразить список в режиме предприятия. Разберем эту проблему и предложим шаги для ее решения.
Изначально разработчик столкнулся с ошибкой "Поле не найдено 'Description'". В запросе такого поля нет, но есть поле СправочникЗапросы.Описание, которое преобразуется как ВЫРАЗИТЬ(СправочникЗапросы.Описание КАК СТРОКА(1000)) КАК Описание. После некоторых изменений в запросе, связанных с заменой вложенного запроса на временную таблицу, проблема изменилась: теперь 1С выдает ошибку "Поле не найдено 'DeletionMark'". При этом в запросе присутствует поле СправочникЗапросы.ПометкаУдаления.
Давайте посмотрим на примеры запросов, которые использовал автор, и проанализируем их структуру.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
СправочникЗапросы.ДатаСоздания КАК ДатаСоздания,
СправочникЗапросы.Ссылка КАК Ссылка,
СправочникЗапросы.Источник КАК Источник,
СправочникЗапросы.Ответственный КАК Ответственный,
СправочникЗапросы.Статус КАК Статус,
ТелефонныйЗвонок.Ссылка КАК СсылкаДокумент,
ПредметыПапкиВзаимодействий.Рассмотрено КАК Рассмотрено,
ПредметыПапкиВзаимодействий.РассмотретьПосле КАК РассмотретьПосле,
ПредметыПапкиВзаимодействий.Предмет КАК Сделка,
СправочникЗапросы.ПометкаУдаления КАК ПометкаУдаления,
СправочникЗапросы.Наименование,
ВЫБОР
КОГДА ПредметыПапкиВзаимодействий.Рассмотрено = ИСТИНА
ТОГДА 1
КОГДА ПредметыПапкиВзаимодействий.Рассмотрено = ЛОЖЬ
ТОГДА 2
КОНЕЦ КАК Приоритет,
ВЫРАЗИТЬ(СправочникЗапросы.Описание КАК СТРОКА(1000)) КАК Описание,
СправочникЗапросы.Код,
СправочникЗапросы.Компания,
СправочникЗапросы.Имя
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Справочник.Запросы КАК СправочникЗапросы
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
СправочникЗапросы.Ссылка КАК Запрос,
ТелефонныйЗвонок.Ссылка КАК Ссылка
ИЗ
Справочник.Запросы КАК СправочникЗапросы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
ПО ТелефонныйЗвонок.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
ПО СправочникЗапросы.Ссылка = ТелефонныйЗвонок.ВзаимодействиеОснование
СГРУППИРОВАТЬ ПО
СправочникЗапросы.Ссылка,
ТелефонныйЗвонок.Ссылка) КАК ТелефонныйЗвонок
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияСтатусовСделокСКлиентами.СрезПоследних КАК ИсторияСтатусовСделокСКлиентамиСрезПоследних
ПО ПредметыПапкиВзаимодействий.Предмет = ИсторияСтатусовСделокСКлиентамиСрезПоследних.Сделка
ПО ТелефонныйЗвонок.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
ПО СправочникЗапросы.Ссылка = ТелефонныйЗвонок.Запрос
СГРУППИРОВАТЬ ПО
СправочникЗапросы.Ссылка,
СправочникЗапросы.Наименование,
СправочникЗапросы.ДатаСоздания,
СправочникЗапросы.Источник,
СправочникЗапросы.Ответственный,
СправочникЗапросы.Статус,
ПредметыПапкиВзаимодействий.Рассмотрено,
ПредметыПапкиВзаимодействий.РассмотретьПосле,
ПредметыПапкиВзаимодействий.Предмет,
СправочникЗапросы.ПометкаУдаления,
ТелефонныйЗвонок.Ссылка,
ВЫРАЗИТЬ(СправочникЗапросы.Описание КАК СТРОКА(1000)),
СправочникЗапросы.Код,
СправочникЗапросы.Компания,
СправочникЗапросы.Имя ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ_Данные.Ссылка,
МАКСИМУМ(ВЫБОР
КОГДА ВТ_Данные.Рассмотрено = ЛОЖЬ
ТОГДА 2
ИНАЧЕ 1
КОНЕЦ) КАК Приоритет
ПОМЕСТИТЬ ВТ_Приоритеты
ИЗ
ВТ_Данные КАК ВТ_Данные
СГРУППИРОВАТЬ ПО
ВТ_Данные.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ_Приоритеты.Ссылка,
МАКСИМУМ(ВТ_Данные.СсылкаДокумент) КАК СсылкаДокумент
ПОМЕСТИТЬ ВТ_ИтогиПриоритетов
ИЗ
ВТ_Приоритеты КАК ВТ_Приоритеты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
ПО ВТ_Приоритеты.Ссылка = ВТ_Данные.Ссылка
И ВТ_Приоритеты.Приоритет = ВТ_Данные.Приоритет
СГРУППИРОВАТЬ ПО
ВТ_Приоритеты.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ_Данные.Ссылка КАК Ссылка,
ВТ_Данные.ДатаСоздания,
ВТ_Данные.Источник,
ВТ_Данные.Ответственный,
ВТ_Данные.Статус,
ВТ_Данные.Рассмотрено,
ВТ_Данные.РассмотретьПосле,
ВТ_Данные.Сделка,
ВТ_Данные.ПометкаУдаления,
ВТ_Данные.Наименование,
ВТ_Данные.Приоритет,
ВТ_Данные.СсылкаДокумент,
ВТ_Данные.Описание,
ВТ_Данные.Код,
ВТ_Данные.Компания,
ВТ_Данные.Имя
ИЗ
ВТ_ИтогиПриоритетов КАК ВТ_ИтогиПриоритетов
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
ПО ВТ_ИтогиПриоритетов.Ссылка = ВТ_Данные.Ссылка
И (ВТ_ИтогиПриоритетов.СсылкаДокумент = ВТ_Данные.СсылкаДокумент
ИЛИ ВТ_Данные.СсылкаДокумент ЕСТЬ NULL)
Как мы видим, поля Описание и ПометкаУдаления присутствуют в конечном запросе. Это исключает простую ошибку отсутствия поля в выборке.
Когда динамический список 1С выдает такие ошибки, несмотря на наличие полей в запросе, это часто указывает на более глубокие проблемы, связанные с интерпретацией метаданных или языковыми настройками. Рассмотрим основные причины и способы их устранения.
Наиболее вероятная причина таких ошибок, как "Поле не найдено 'Description'" и "Поле не найдено 'DeletionMark'", кроется в языковых настройках. 1С:Предприятие, в зависимости от версии платформы, настроек операционной системы или установленного языка интерфейса, может пытаться найти стандартные имена полей (такие как Наименование и ПометкаУдаления) в их английских эквивалентах - 'Description' и 'DeletionMark' соответственно. Если система по каким-то причинам ожидает английское имя, но в запросе поле названо на русском или имеет другой псевдоним, возникает ошибка.
Что нужно сделать:
Явно переименуйте стандартные поля в запросе. Даже если вы используете стандартное имя, лучше явно присвоить псевдоним самому себе. Для полей Наименование и ПометкаУдаления убедитесь, что они выбраны в конечном запросе именно с этими именами.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Запросы.Ссылка КАК Ссылка,
...
Запросы.ПометкаУдаления КАК ПометкаУдаления, // Убедитесь, что это поле присутствует
Запросы.Наименование КАК Наименование, // И это
...
ИЗ
ВТ_ИтогиПриоритетов КАК ВТ_ИтогиПриоритетов
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
ПО ВТ_ИтогиПриоритетов.Ссылка = ВТ_Данные.Ссылка
И (ВТ_ИтогиПриоритетов.СсылкаДокумент = ВТ_Данные.СсылкаДокумент
ИЛИ ВТ_Данные.СсылкаДокумент ЕСТЬ NULL)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Запросы КАК Запросы
ПО ВТ_ИтогиПриоритетов.Ссылка = Запросы.Ссылка
Если в вашем запросе вы используете поле Описание, которое не является стандартным реквизитом 'Наименование', то оно должно быть явно обозначено, как и было в запросе автора: ВЫРАЗИТЬ(СправочникЗапросы.Описание КАК СТРОКА(1000)) КАК Описание.
Проверьте язык операционной системы и интерфейса 1С. Попробуйте изменить язык ОС на русский, если он установлен на английский. Также проверьте настройки языка интерфейса 1С. Иногда достаточно просто перезапустить 1С или клиентское приложение после этих изменений.
Динамический список имеет свои особенности и настройки, которые могут влиять на выполнение запроса.
Удалите и пересоздайте таблицу формы. После значительных изменений в запросе динамического списка (особенно при изменении состава или имен полей) старые настройки формы могут "кешировать" информацию о полях. Чтобы исключить это влияние, рекомендуем:
Настройки списка -> Установить стандартные настройки) у пользователей, которые могут ссылаться на несуществующие поля.Отключите автозаполнение доступных полей. Свойство "Автозаполнение доступных полей" в динамическом списке позволяет системе автоматически определять поля для группировки, отбора и сортировки. В случае сложных произвольных запросов это может приводить к ошибкам, если 1С пытается вывести поля, которые она не может найти или интерпретировать. Отключите эту опцию и явно укажите все необходимые поля во вкладке "Компоновка данных" конструктора запроса динамического списка.
Проверьте отборы и условное оформление. Иногда в динамическом списке (или в его форме) настроены отборы или правила условного оформления, которые требуют наличия определенных полей. Если эти поля отсутствуют в конечном запросе, это может вызвать ошибку. Внимательно проверьте все настройки, как пользовательские, так и разработчика.
Укажите основную таблицу динамического списка. В свойствах динамического списка можно указать "Основная таблица". Если ваш запрос основан на справочнике (как Справочник.Запросы в вашем случае), убедитесь, что эта таблица корректно указана. Если основная таблица указана, убедитесь, что ваш запрос не возвращает больше записей, чем есть в этой основной таблице, чтобы избежать потенциальных проблем с дублированием ключей.
Создайте новую форму списка для тестирования. В качестве диагностического шага попробуйте создать совершенно новую форму списка, привязать к ней ваш запрос и установить ее как основную форму списка объекта. Это поможет исключить влияние старых или поврежденных настроек формы.
Начиная с версии 8.3.8 платформа 1С поддерживает пакетные запросы в динамических списках, что позволяет использовать временные таблицы. Однако есть нюансы:
Иногда ошибки "Поле не найдено" могут быть вызваны более общими проблемами:
Очистка кеша 1С. Поврежденный кеш может быть причиной многих "странных" ошибок. Попробуйте очистить кеш 1С, удалив соответствующие каталоги в профиле пользователя (обычно находятся в %LOCALAPPDATA%\1C\1CE\ и %APPDATA%\1C\1CE\) или через утилиту администрирования.
Проверка целостности базы. Используйте утилиту chdbfl.exe для проверки и исправления возможных ошибок в файловой базе или обратитесь к администратору СУБД для проверки целостности серверной базы данных.
Если проблема сохраняется, мы можем предпринять более глубокие шаги по отладке:
Используйте отладчик. Возможно, ваш запрос программно изменяется или дополняется в модуле формы или в общем модуле. Установите точку останова в событии ПриСозданииНаСервере формы или в процедуре, которая устанавливает текст запроса динамического списка. Это позволит нам увидеть окончательный текст запроса, который отправляется на исполнение.
Перехватите запрос SQL профайлером. Если у вас серверная база данных (SQL Server, PostgreSQL и т.д.), используйте соответствующий профайлер (например, SQL Server Profiler) для перехвата запроса, который 1С отправляет в СУБД. Выполните этот запрос напрямую в СУБД. Это поможет определить, проблема возникает на уровне 1С или на уровне базы данных. Если запрос работает в СУБД без ошибок, проблема, скорее всего, связана с интерпретацией результатов 1С.
Проверьте имя реквизита "Ссылка". В некоторых случаях, когда используется псевдоним Ссылка для поля СправочникЗапросы.Ссылка, это может вызывать неоднозначность в некоторых механизмах платформы. Попробуйте явно преобразовать ссылку, например: ВЫРАЗИТЬ(СправочникЗапросы.Ссылка КАК Справочник.Запросы) КАК Ссылка, чтобы точно указать тип ссылки.
Проверьте параметры в модуле формы. Убедитесь, что в модуле формы списка случайно не устанавливаются параметры с именами 'Description' или 'DeletionMark', которые затем используются в запросе или отборах, но не определены корректно.
Рассмотрим последнюю версию запроса автора, который уже включает некоторые из предложенных изменений, но все еще выдает ошибку "DeletionMark".
ВЫБРАТЬ РАЗЛИЧНЫЕ
СправочникЗапросы.Ссылка КАК Запрос,
ТелефонныйЗвонок.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТелефонныйЗвонок
ИЗ
Справочник.Запросы КАК СправочникЗапросы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
ПО ТелефонныйЗвонок.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
ПО СправочникЗапросы.Ссылка = ТелефонныйЗвонок.ВзаимодействиеОснование
СГРУППИРОВАТЬ ПО
СправочникЗапросы.Ссылка,
ТелефонныйЗвонок.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
СправочникЗапросы.ДатаСоздания КАК ДатаСоздания,
СправочникЗапросы.Ссылка КАК Ссылка,
СправочникЗапросы.Источник КАК Источник,
СправочникЗапросы.Ответственный КАК Ответственный,
СправочникЗапросы.Статус КАК Статус,
ТелефонныйЗвонок1.Ссылка КАК СсылкаДокумент,
ПредметыПапкиВзаимодействий.Рассмотрено КАК Рассмотрено,
ПредметыПапкиВзаимодействий.РассмотретьПосле КАК РассмотретьПосле,
ПредметыПапкиВзаимодействий.Предмет КАК Сделка,
СправочникЗапросы.ПометкаУдаления КАК ПометкаУдаления,
СправочникЗапросы.Наименование,
ВЫБОР
КОГДА ПредметыПапкиВзаимодействий.Рассмотрено = ИСТИНА
ТОГДА 1
КОГДА ПредметыПапкиВзаимодействий.Рассмотрено = ЛОЖЬ
ТОГДА 2
КОНЕЦ КАК Приоритет,
СправочникЗапросы.Имя
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Справочник.Запросы КАК СправочникЗапросы
ЛЕВОЕ СОЕДИНЕНИЕ ТелефонныйЗвонок КАК ТелефонныйЗвонок1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияСтатусовСделокСКлиентами.СрезПоследних КАК ИсторияСтатусовСделокСКлиентамиСрезПоследних
ПО ПредметыПапкиВзаимодействий.Предмет = ИсторияСтатусовСделокСКлиентамиСрезПоследних.Сделка
ПО ТелефонныйЗвонок1.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
ПО СправочникЗапросы.Ссылка = ТелефонныйЗвонок1.Запрос
СГРУППИРОВАТЬ ПО
СправочникЗапросы.Ссылка,
СправочникЗапросы.Наименование,
СправочникЗапросы.ДатаСоздания,
СправочникЗапросы.Источник,
СправочникЗапросы.Ответственный,
СправочникЗапросы.Статус,
ПредметыПапкиВзаимодействий.Рассмотрено,
ПредметыПапкиВзаимодействий.РассмотретьПосле,
ПредметыПапкиВзаимодействий.Предмет,
СправочникЗапросы.ПометкаУдаления,
СправочникЗапросы.Имя,
ТелефонныйЗвонок1.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ_Данные.Ссылка,
МАКСИМУМ(ВЫБОР
КОГДА ВТ_Данные.Рассмотрено = ЛОЖЬ
ТОГДА 2
ИНАЧЕ 1
КОНЕЦ) КАК Приоритет
ПОМЕСТИТЬ ВТ_Приоритеты
ИЗ
ВТ_Данные КАК ВТ_Данные
СГРУППИРОВАТЬ ПО
ВТ_Данные.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ_Приоритеты.Ссылка,
МАКСИМУМ(ВТ_Данные.СсылкаДокумент) КАК СсылкаДокумент
ПОМЕСТИТЬ ВТ_ИтогиПриоритетов
ИЗ
ВТ_Приоритеты КАК ВТ_Приоритеты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
ПО ВТ_Приоритеты.Ссылка = ВТ_Данные.Ссылка
И ВТ_Приоритеты.Приоритет = ВТ_Данные.Приоритет
СГРУППИРОВАТЬ ПО
ВТ_Приоритеты.Ссылка ;
////////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Запросы.Ссылка КАК Ссылка,
Запросы.ДатаСоздания,
Запросы.Источник,
Запросы.Ответственный,
Запросы.Статус,
Запросы.ПометкаУдаления, // Здесь присутствует
Запросы.Наименование, // Здесь присутствует
ВТ_Данные.Рассмотрено,
ВТ_Данные.РассмотретьПосле,
ВТ_Данные.Имя,
ВТ_Данные.СсылкаДокумент
ИЗ
ВТ_ИтогиПриоритетов КАК ВТ_ИтогиПриоритетов
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
ПО ВТ_ИтогиПриоритетов.Ссылка = ВТ_Данные.Ссылка
И (ВТ_ИтогиПриоритетов.СсылкаДокумент = ВТ_Данные.СсылкаДокумент
ИЛИ ВТ_Данные.СсылкаДокумент ЕСТЬ NULL)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Запросы КАК Запросы
ПО ВТ_ИтогиПриоритетов.Ссылка = Запросы.Ссылка
В этом запросе мы видим, что поле ПометкаУдаления (Запросы.ПометкаУдаления) и Наименование (Запросы.Наименование) явно выбраны в конечном пакете запроса после соединения с основной таблицей Справочник.Запросы. Это еще раз подтверждает, что проблема не в простом отсутствии поля в выборке, а в его интерпретации платформой.
На основе анализа и дополнительной информации мы можем сформулировать комплексный план по диагностике и устранению проблемы:
Наименование и ПометкаУдаления) явно выбраны с русскоязычными псевдонимами в окончательном запросе.
После каждого изменения сохраняйте конфигурацию и перезапускайте 1С:Предприятие в режиме отладки, чтобы проверить, исчезла ли ошибка. Эти пошаговые действия помогут вам локализовать и устранить проблему "Поле не найдено" в динамическом списке.