Работа с языком запросов в платформе 1С:Предприятие является фундаментальным навыком для любого разработчика конфигураций. Часто в процессе написания кода возникает необходимость расширить выборку данных, включив в неё новые атрибуты справочников, документов или регистров. Ошибки на этом этапе могут привести к некорректной работе отчетов или значительному падению производительности системы.
В этой статье мы детально разберем механизмы добавления полей в конструкцию ВЫБРАТЬ, особенности работы с псевдонимами и специфические нюансы при обращении к виртуальным таблицам. Понимание этих принципов позволит вам писать чистый, быстрый и поддерживаемый код, соответствующий лучшим практикам платформы.
Базовый синтаксис оператора ВЫБРАТЬ
Основой любого запроса является оператор ВЫБРАТЬ, который определяет список возвращаемых полей. Чтобы добавить новое поле, достаточно просто указать его имя через запятую после уже существующих. Платформа автоматически сопоставит имя поля с метаданными объекта, указанного в секции ИЗ.
Однако просто перечислить поля недостаточно, если вы планируете использовать их в дальнейшей обработке. Каждому полю желательно присвоить уникальный псевдоним с помощью ключевого слова КАК. Это делает код более читаемым и защищает от конфликтов имен, особенно при объединении результатов из разных источников данных.
Рассмотрим простой пример, где мы добавляем поле «Артикул» к выборке номенклатуры:
ВЫБРАТЬ
Справочник.Номенклатура.Ссылка КАК Ссылка,
Справочник.Номенклатура.Наименование КАК Наименование,
Справочник.Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура
Обратите внимание, что использование полного пути к полю (Справочник.Имя.Поле) является обязательным требованием для однозначной идентификации объекта метаданных. Пропуск префикса типа метаданных допустим только в простых случаях, но считается дурным тоном в профессиональной разработке.
⚠️ Внимание: Если вы добавляете поле, которое может содержать значение
NULL(незаполненное), убедитесь, что тип данных в результирующей таблице запроса обрабатывается корректно. В коде 1С пустая ссылка и значениеНеопределеномогут вести себя по-разному при сравнении.
Используйте автоподстановку в редакторе запросов (Ctrl+Space), чтобы избежать опечаток в именах полей и автоматически получить полный путь к объекту метаданных.
Работа с псевдонимами и алиасами таблиц
При работе со сложными запросами, включающими множественные объединения или вложенные конструкции, имена таблиц могут стать слишком громоздкими. Для упрощения записи используются алиасы таблиц. Это короткие имена, которые присваиваются источникам данных в секции ИЗ или ПОМЕСТИТЬ.
Использование алиасов позволяет сократить код и сделать логику выборки более прозрачной. После объявления алиаса все поля данной таблицы должны вызываться через него. Это особенно критично, когда в запросе участвуют две таблицы с одинаковыми именами полей, например, «Наименование» в справочнике и в документе.
Пример использования алиаса для добавления поля из связанного справочника:
ВЫБРАТЬ
Док.Ссылка КАК Ссылка,
Док.Дата КАК ДатаДокумента,
Контрагент.Наименование КАК НаименованиеКонтрагента
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент
ПО Док.Контрагент = Контрагент.Ссылка
В данном случае мы добавили поле Наименование из справочника контрагентов, обратившись к нему через алиас Контрагент. Без использования алиаса синтаксический анализатор мог бы не понять, к какой именно таблице относится требуемое поле, если бы оно присутствовало в обоих источниках.
- 🔹 Алиасы должны быть уникальными в пределах одного запроса.
- 🔹 Использование коротких имен (Док, Т, Спр) ускоряет написание кода.
- 🔹 Алиасы обязательны при использовании вложенных запросов.
Добавление полей из виртуальных таблиц
Одной из самых мощных возможностей платформы является работа с виртуальными таблицами регистров. Они позволяют получать срезы данных на конкретный момент времени или за период без необходимости ручного написания сложных алгоритмов выборки последних движений. Синтаксис добавления полей здесь имеет свои особенности.
При обращении к виртуальной таблице, такой как СрезПоследних или Остатки, вы должны указать параметры среза в скобках сразу после имени таблицы. Поля, доступные для выбора, зависят от структуры регистра и параметров среза. Попытка выбрать поле, не входящее в состав измерений, ресурсов или реквизитов регистра, приведет к ошибке.
Рассмотрим пример получения актуальной цены номенклатуры:
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Цена КАК ТекущаяЦена,
Цены.Валюта КАК ВалютаЦены
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&Период,
Номенклатура В (&СписокНоменклатуры)
) КАК Цены
Здесь мы добавили в выборку поля Цена и Валюта, обратившись к виртуальной таблице среза. Важно понимать, что структура этой таблицы формируется динамически в момент выполнения запроса на основе переданных параметров.
⚠️ Внимание: Параметры виртуальных таблиц (например, период среза) должны быть переданы корректно. Если параметр
&Периодне определен или имеет неверный тип, запрос не выполнится, даже если синтаксис полей верен.
Оптимизация виртуальных таблиц
При использовании СрезПоследних старайтесь максимально сужать отбор по измерениям внутри параметров таблицы, а не в секции ГДЕ. Это позволяет движку 1С эффективнее использовать индексы.
Вычисляемые поля и функции в выборке
Часто требуется добавить в запрос не просто существующее поле базы данных, а результат вычислений. Язык запросов 1С поддерживает широкий набор встроенных функций для работы с датами, строками, числами и типами данных. Такие поля называются вычисляемыми.
Вычисляемое поле формируется непосредственно в секции ВЫБРАТЬ. Результат выражения также должен иметь псевдоним. Это позволяет выполнять конвертацию типов, форматирование дат или математические операции прямо на стороне сервера баз данных, что существенно экономит ресурсы клиента.
Пример добавления вычисляемого поля с расчетом суммы и форматированием даты:
ВЫБРАТЬ
Документ.Ссылка,
Документ.Сумма * Документ.Курс КАК СуммаВНалюте,
ФОРМАТ(Документ.Дата, "ДФ='dd.MM.yyyy'") КАК ДатаСтрока,
ЕСТЬNULL(Документ.Комментарий, "Без комментария") КАК Комментарий
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Документ
В этом примере мы добавили три новых поля: рассчитанную сумму в валюте, дату в строковом формате и обработанный комментарий. Функция ЕСТЬNULL особенно полезна для предотвращения ошибок при попытке обратиться к свойству пустой строки.
- 🔹 Функция
ЕСТЬNULLзаменяет пустые значения на указанные константы. - 🔹
ФОРМАТпозволяет гибко управлять представлением данных. - 🔹 Математические операции выполняются с учетом типов операндов.
Вычисления на стороне сервера БД всегда предпочтительнее обработки данных в цикле на клиенте, так как это снижает сетевой трафик и нагрузку на рабочее место пользователя.
Объединение запросов и добавление общих полей
При использовании оператора ОБЪЕДИНИТЬ (UNION) к структуре результирующего набора данных предъявляются строгие требования. Количество полей в каждом из объединяемых запросов должно совпадать, а их типы должны быть совместимы. Добавление нового поля в такую конструкцию требует синхронного изменения во всех частях объединения.
Если вы добавляете поле в первый запрос, вы обязаны добавить соответствующее поле (или заглушку) во все последующие запросы цепочки. Для заполнения отсутствующих данных в других частях объединения часто используют константы или функцию ЕСТЬNULL с приведением типа.
Таблица ниже демонстрирует структуру правильного объединения с добавлением общего поля «ТипЗаписи»:
| Часть запроса | Поле 1 (Ссылка) | Поле 2 (Наименование) | Поле 3 (ТипЗаписи) |
|---|---|---|---|
| Запрос 1 (Покупатели) | Ссылка | Наименование | "Покупатель" |
| Запрос 2 (Поставщики) | Ссылка | Наименование | "Поставщик" |
| Запрос 3 (Прочие) | Ссылка | Наименование | NULL |
Несоблюдение порядка полей или несовместимость типов (например, попытка объединить Число и Строку без явного приведения) вызовет ошибку выполнения. Платформа 1С требует явного указания типов в таких ситуациях.
⚠️ Внимание: При объединении запросов порядок полей определяется первым запросом в цепочке. Изменение порядка полей в последующих запросах без изменения первого приведет к логической ошибке, хотя синтаксически запрос может быть верным.
☑️ Проверка объединения запросов
Типовые ошибки и отладка запросов
Даже опытные разработчики сталкиваются с ситуацией, когда добавленное поле не отображается или вызывает сбой. Чаще всего проблема кроется в несоответствии типа данных или отсутствии прав доступа к конкретному реквизиту объекта. Система 1С предоставляет удобные инструменты для диагностики таких проблем.
Первым шагом всегда должен быть запуск запроса в консоли с проверкой структуры результата. Если поле добавлено, но содержит только NULL, проверьте наличие данных в исходной таблице и корректность условий соединения (JOIN). Ошибки прав доступа обычно проявляются как исключение при выполнении запроса.
Также стоит помнить, что интерфейс платформы и возможности некоторых конструкторов могут изменяться в новых версиях. Всегда сверяйтесь с синтаксическим помощником вашей конкретной версии конфигурации, если стандартные приемы не срабатывают.
Секрет быстрых правок
Если запрос работает в консоли, но не работает в коде модуля, проверьте параметры. Часто проблема в том, что параметр не передан в объект Запрос через метод УстановитьПараметр перед выполнением.
Как добавить поле, которого нет в метаданных?
Вы не можете выбрать поле, которое физически не существует в объекте. Однако вы можете создать вычисляемое поле с константным значением, например 1 КАК Флаг или "" КАК ПустаяСтрока.
Почему запрос выдает ошибку "Неверное имя поля"?
Проверьте регистр букв (хотя 1С обычно нечувствителен к нему, лучше соблюдать стиль), наличие опечаток и убедитесь, что поле не было переименовано в конфигураторе после написания запроса.
Можно ли добавлять поля из временных таблиц?
Да, после создания временной таблицы оператором ПОМЕСТИТЬ, вы можете обращаться к её полям в последующих запросах так же, как к обычным таблицам базы данных.
Как добавить поле со счетчиком строк?
Используйте системное поле НОМЕРЗАПИСИ в секции ВЫБРАТЬ. Оно автоматически пронумерует строки результата запроса по порядку.
Влияет ли добавление поля на скорость запроса?
Минимально. Основное влияние на производительность оказывают соединения (JOIN), отборы (WHERE) и отсутствие индексов. Выборка лишнего поля, которое не используется, лишь незначительно увеличивает объем передаваемых данных.