Работа с данными в платформе 1С:Предприятие неразрывно связана с написанием эффективных запросов. Часто разработчики сталкиваются с ситуацией, когда существующей выборки недостаточно, и необходимо получить дополнительную информацию из связанной таблицы или вычислить новое значение «на лету». Правильное добавление поля в запросе 1С — это фундаментальный навык, который влияет на производительность всей системы.
Некорректное расширение списка выбираемых данных может привести к декартовому произведению или значительному замедлению выполнения кода. В этой статье мы разберем не только синтаксические особенности, но и архитектурные нюансы получения данных из табличных частей, регистров и виртуальных таблиц. Вы научитесь использовать как визуальный конструктор, так и текстовый редактор запросов для решения самых сложных задач выборки.
Понимание механизма работы менеджера запросов и структуры метаданных позволит вам избегать типичных ошибок при формировании временных таблиц. Мы рассмотрим сценарии, когда поле нужно добавить из связанного справочника, и случаи, требующие использования операторов объединения. Готовность к работе с разными типами источников данных сделает ваш код более универсальным и устойчивым к изменениям конфигурации.
Основы синтаксиса и структура оператора ВЫБРАТЬ
Любой запрос в 1С начинается с ключевого слова ВЫБРАТЬ, за которым следует список полей. Именно здесь определяется, какие данные будут извлечены из источника. Добавление нового поля требует указания его имени и, при необходимости, псевдонима, если имя поля содержит пробелы или спецсимволы, либо если вы хотите дать ему более понятное название в результирующей таблице.
Если вы добавляете поле из основной таблицы, достаточно указать его имя через точку после имени таблицы в секции ИЗ. Однако, часто возникает необходимость получить данные из связанных объектов. В таком случае используется конструкция ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Левое соединение гарантирует, что все записи из основной таблицы останутся в выборке, даже если для них не найдется соответствия в присоединяемой таблице.
Рассмотрим пример, где мы добавляем поле «Артикул» из номенклатуры к документу реализации. Синтаксически это выглядит как явное указание пути к полю.
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.Дата,
ТоварыНоменклатура.Артикул КАК АртикулТовара
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТоварыНоменклатура
ПО РеализацияТоваровУслуг.Номенклатура = ТоварыНоменклатура.Ссылка
Использование псевдонимов, как показано выше (КАК АртикулТовара), является хорошей практикой. Это делает код читаемым и упрощает дальнейшую обработку результатов запроса в коде на встроенном языке. Без псевдонимов имена полей могут стать громоздкими, особенно при работе с вложенными запросами.
Всегда используйте псевдонимы для вычисляемых полей и полей из присоединенных таблиц — это упрощает отладку и чтение кода коллегами.
Использование конструктора запросов для новичков
Для тех, кто только начинает осваивать разработку в 1С или предпочитает визуальный интерфейс, встроенный конструктор запросов является незаменимым инструментом. Он позволяет добавлять поля, не зная наизусть точного синтаксиса, и автоматически формирует необходимые соединения. Запустить его можно через кнопку с изображением шестеренки в редакторе модуля или нажатием сочетания клавиш.
В левой части окна конструктора отображается дерево метаданных конфигурации. Чтобы добавить новое поле, достаточно найти нужный объект (справочник, документ, регистр), раскрыть его структуру и перетащить требуемый элемент в верхнюю область окна, где формируется список выбора. Система сама предложит добавить соединение, если поле принадлежит связанному объекту.
- 🔍 Найдите нужный объект в дереве метаданных слева.
- 📂 Раскройте ветку «Реквизиты» или «Табличные части».
- 🖱️ Перетащите поле в область «Поля и сортировки».
- ⚙️ Проверьте автоматически созданное условие соединения в нижней части.
Конструктор также позволяет быстро настроить отбор и упорядочивание данных. Однако стоит помнить, что автоматически сгенерированный код не всегда оптимален. В сложных случаях конструктор может создать избыточные соединения или выбрать неэффективный план выполнения. Поэтому после генерации запроса рекомендуется просмотреть его текст и при необходимости доработать вручную.
Особенностью визуального редактора является возможность предпросмотра данных без запуска внешней обработки. Это ускоряет процесс разработки, позволяя сразу видеть результат добавления нового поля. Тем не менее, глубокое понимание структуры запроса необходимо для работы со сложными виртуальными таблицами, где возможности конструктора могут быть ограничены.
Работа с табличными частями документов и справочников
Наиболее частая задача при разработке — получение данных из табличных частей. В отличие от основных реквизитов, табличные части хранятся в отдельных физических таблицах базы данных. Чтобы добавить поле из табличной части в запрос, необходимо явно указать соединение с этой частью через ссылку на родительский документ или справочник.
Синтаксически это реализуется через добавление еще одного оператора СОЕДИНЕНИЕ. Ключевым моментом здесь является условие соединения: оно должно связывать ссылку на строку табличной части со ссылкой на владельца (документ). Если этого не сделать, запрос вернет декартово произведение, то есть каждая строка документа умножится на каждую строку его табличной части, что приведет к дублированию данных.
| Объект | Тип соединения | Условие соединения | Риск ошибки |
|---|---|---|---|
| Основная таблица | - | - | Отсутствует |
| Справочник (контрагент) | ЛЕВОЕ | По Ссылке на контрагента | Потеря данных при отсутствии контрагента |
| Табличная часть (Товары) | ВНУТРЕННЕЕ | По Ссылке на документ | Дублирование строк документа |
| Регистр сведений (Цены) | ЛЕВОЕ | По Номенклатуре и Дате | Неверная цена при отсутствии среза |
При выборе полей из табличной части важно учитывать, что количество строк в результате запроса изменится. Если в документе 5 товаров, то при добавлении поля «Количество» из табличной части «Товары», строка самого документа в выборке размножится 5 раз. Для агрегации таких данных (например, чтобы получить одну строку на документ с общей суммой) необходимо использовать оператор СУММА и группировку СГРУППИРОВАТЬ ПО.
⚠️ Внимание: При соединении с табличной частью всегда проверяйте, не дублируются ли строки основного документа. Если вам нужна сводная информация, используйте агрегатные функции вместо прямого выбора полей.
☑️ Проверка запроса с табличной частью
Добавление вычисляемых полей и выражений
Часто требуется добавить в запрос поле, которого физически нет в базе данных, но которое можно вычислить на основе существующих значений. В 1С это делается непосредственно в секции ВЫБРАТЬ с использованием арифметических операторов или встроенных функций языка запросов. Такие поля называются вычисляемыми или виртуальными.
Вы можете складывать, вычитать, умножать или делить числовые поля. Также доступны строковые функции, такие как ПОДСТРОКА, СТРОКА или ЕСТЬNULL. Последняя функция особенно полезна для обработки ситуаций, когда присоединенная таблица не имеет записей, и поле принимает значение NULL. Без обработки NULL любые арифметические операции с таким полем также вернут NULL.
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Количество,
РеализацияТоваровУслугТовары.Цена,
(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Цена) КАК Сумма,
ЕСТЬNULL(Номенклатура.Вес, 0) КАК ВесТовара
ИЗ
..
При использовании сложных выражений обязательно присваивайте им псевдоним через ключевое слово КАК. Это не только улучшает читаемость, но и позволяет обращаться к этому полю в секциях УПОРЯДОЧИТЬ ПО или ИМЕЮЩИЕ. Без псевдонима платформа может сгенерировать системное имя вида Выражение001, что затруднит дальнейшую работу.
Особенности работы с NULL
В 1С значение NULL означает «неизвестное значение». Любое сравнение или операция с NULL дает результат NULL, а не 0 или Ложь. Используйте функцию ЕСТЬNULL(Значение, Замена) для подмены NULL на конкретное значение.
Использование виртуальных таблиц и срезов регистров
Одной из самых мощных возможностей платформы 1С являются регистры сведений и накопления. Для получения актуальных данных (например, цены на определенную дату или остатков товара) используются виртуальные таблицы срезов. Добавление поля из такого регистра требует особого синтаксиса, отличающегося от работы с обычными справочниками.
Виртуальные таблицы обозначаются точкой и именем виртуальной таблицы после имени регистра. Например, РегистрСведений.ЦеныНоменклатуры.СрезПоследних. В условии соединения необходимо указывать не только ссылки, но и параметры виртуальной таблицы, такие как дата среза или период. Это позволяет платформе оптимизировать запрос и выбрать только нужные записи из огромного массива движений регистра.
Если вы добавляете поле из регистра накопления, например, остаток товара, важно правильно указать измерения и ресурсы. Ошибка в указании периода может привести к тому, что запрос вернет данные на текущий момент вместо требуемой даты отчета. Всегда сверяйтесь со структурой регистра в конфигураторе, чтобы понять, какие измерения являются ведущими.
⚠️ Внимание: Интерфейсы и названия виртуальных таблиц могут меняться в разных версиях платформы 1С. Всегда проверяйте доступные срезы в дереве метаданных вашей конкретной конфигурации перед написанием запроса.
Использование виртуальных таблиц значительно упрощает код, избавляя от необходимости писать сложные подзапросы для поиска последних записей. Платформа сама формирует оптимальный SQL-код для выборки актуальных данных. Однако стоит помнить, что некоторые типы виртуальных таблиц (например, СрезПервых) могут работать медленнее на больших объемах данных по сравнению с СрезПоследних.
Использование виртуальных таблиц срезов — стандарт де-факто для работы с историческими данными и остатками в 1С, обеспечивающий максимальную производительность.
Частые ошибки и оптимизация производительности
При добавлении новых полей разработчики часто допускают ошибки, которые не вызывают синтаксических сбоев, но критически снижают скорость работы программы. Самая распространенная проблема — выборка лишних полей. Если вы добавили поле «Комментарий» из справочника номенклатуры, но не используете его в отчете, запрос все равно потратит ресурсы на его извлечение и передачу по сети.
Еще одна ошибка — отсутствие индексов по полям, используемым в условиях соединения (ПО) и отбора (ГДЕ). Если вы добавили соединение по какому-то реквизиту, убедитесь, что этот реквизит проиндексирован в метаданных. В противном случае базе данных придется выполнять полное сканирование таблицы, что при больших объемах данных приведет к зависанию системы.
- 🚫 Не используйте
ВЫБРАТЬ *— выбирайте только нужные поля. - 📉 Избегайте функций в условии соединения (например,
ЛЕВЫЙ СИМВОЛ), это отключает использование индексов. - 🔗 Проверяйте тип данных соединяемых полей — неявное преобразование типов тормозит запрос.
- 📊 Используйте временные таблицы для промежуточных результатов сложных выборок.
Для анализа производительности запроса используйте встроенный инструмент «Консоль запросов» или режим отладки с замером времени выполнения. Если добавление одного поля увеличило время выполнения в разы, проверьте план выполнения запроса. Возможно, оптимизатор выбрал неверный путь из-за статистики или отсутствия индексов.
⚠️ Внимание: Избегайте размещения вычисляемых выражений в секции отбора
ГДЕ, если это возможно. Это мешает использованию индексов. Лучше отбирать по сырым данным, а вычисления делать после выборки или в секцииВЫБРАТЬ.
FAQ: Часто задаваемые вопросы
Как добавить поле, если его нет в конфигураторе?
Если поля нет в метаданных, вы не сможете выбрать его напрямую. Вам нужно либо добавить новый реквизит в конфигурацию и обновить базу данных, либо вычислить это значение в запросе с помощью функций и арифметических операций над существующими полями.
Почему запрос возвращает дубли строк после добавления поля?
Скорее всего, вы присоединили таблицу, где одному значению из основной таблицы соответствует несколько записей (например, табличную часть или регистр без группировки). Используйте оператор СГРУППИРОВАТЬ ПО и агрегатные функции (СУММА, МИНИМУМ), чтобы схлопнуть строки.
Можно ли добавить поле из другой базы данных?
В рамках одного запроса 1С напрямую выбрать поле из внешней БД нельзя. Необходимо сначала настроить подключение к внешнему источнику данных через объект ПодключениеВнешнегоИсточникаДанных, зарегистрировать его как таблицу в метаданных, и только затем использовать в запросе.
Что означает ошибка "Таблица не найдена" при добавлении поля?
Эта ошибка возникает, если вы неправильно указали псевдоним таблицы в секции ИЗ или пытаетесь обратиться к полю через псевдоним, который еще не определен в текущей области видимости (например, вложенный запрос).