Разработка в платформе 1С:Предприятие часто требует гибкости в получении данных. Стандартные поля справочников и документов не всегда покрывают потребности аналитики или отчетности. Именно в такие моменты перед разработчиком встает задача: как добавить свое поле в запрос 1С, не изменяя структуру метаданных. Это умение является фундаментальным для создания эффективных отчетов и обработок.

Существует несколько программных способов реализации этой задачи, каждый из которых имеет свои ограничения и области применения. Вы можете использовать псевдонимы для вычисляемых выражений, подключать виртуальные таблицы или применять соединения с другими наборами данных. Глубокое понимание синтаксиса языка запросов позволит вам манипулировать данными прямо на уровне СУБД, что критически важно для производительности.

В этой инструкции мы разберем основные техники расширения результирующего набора данных. Мы рассмотрим создание вычисляемых полей, работу с объединениями и специфику добавления констант. Особое внимание уделим тем случаям, когда стандартные средства языка запросов требуют нестандартного подхода для достижения желаемого результата.

Создание вычисляемых полей через псевдонимы

Самый распространенный способ расширить выборку — использовать выражения в секции ВЫБРАТЬ. Вы можете выполнять арифметические операции, вызывать встроенные функции или формировать строковые конкатенации прямо в тексте запроса. Результат такого выражения необходимо обязательно именовать с помощью ключевого слова КАК, чтобы система могла обратиться к этому полю в дальнейшем.

Рассмотрим пример, где нам нужно получить полную номенклатуру, состоящую из артикула и названия. Вместо того чтобы передавать два поля в отчет, мы формируем одно. Синтаксис позволяет использовать любые допустимые операторы.

ВЫБРАТЬ

Справочник.Номенклатура.Наименование,

Справочник.Номенклатура.Артикул + " " + Справочник.Номенклатура.Наименование КАК ПолноеИмя

ИЗ

Справочник.Номенклатура

Такой подход идеален для форматирования вывода "на лету". Однако стоит учитывать, что сложные вычисления могут нагружать сервер приложений, если объем выборки велик. Оптимизация запросов в 1С часто начинается именно с упрощения вычисляемых полей. Если логика формирования поля слишком сложна, возможно, стоит перенести её в код обработки после получения данных.

Также можно использовать условные операторы внутри выбора. Конструкция ЕСТЬNULL или ВЫБОР..КОГДА..ТОГДА..КОНЕЦ позволяет добавлять логические флаги или статусы прямо в запрос. Это избавляет от необходимости делать дополнительные проходы по данным в цикле.

💡

Используйте функцию ЕСТЬNULL для подстановки значений по умолчанию, если в базе данных поле может быть пустым. Это предотвратит ошибки типов при дальнейшей обработке результата.

Добавление констант и фиксированных значений

Часто в отчеты требуется добавить колонку, которая не хранится в базе, а служит маркером источника данных или категоризации. Например, вы объединяете данные из двух разных информационных баз или таблиц и хотите пометить строки принадлежностью к конкретному источнику. В языке запросов 1С это реализуется путем выбора строковой константы с присвоением ей псевдонима.

Вы просто пишете текст в кавычках в списке выбираемых полей. Система 1С автоматически продублирует это значение для каждой строки результирующего набора. Это простой, но мощный инструмент для маркировки данных. Такие поля часто используются при объединении временных таблиц.

  • 🔹 Маркировка источника данных для последующей фильтрации
  • 🔹 Установка значения по умолчанию для нового реквизита
  • 🔹 Формирование служебных колонок для интерфейса пользователя

При добавлении констант важно следить за типами данных. Если вы планируете объединять (ОБЪЕДИНИТЬ) этот запрос с другим, типы полей с одинаковыми именами должны совпадать. Строка должна соответствовать строке, число — числу. Иначе платформа выдаст ошибку несовместимости типов.

⚠️ Внимание: Избегайте использования слишком длинных строковых констант в запросах с огромным количеством строк (миллионы записей). Хотя это и допустимо технически, это увеличивает объем передаваемых данных между сервером и клиентом, что может замедлить работу тонкого клиента.

📊 Какой способ добавления поля вы используете чаще?
Вычисляемые выражения
Константы
Левое соединение
Временные таблицы

Использование соединений для расширения выборки

Когда нужное поле физически существует в другой таблице, связанной с основной, самым правильным решением будет использование оператора ЛЕВОЕ СОЕДИНЕНИЕ. Этот метод позволяет "подтянуть" дополнительные атрибуты из справочников, документов или регистров, не создавая дублирования строк основной таблицы (при условии связи один-ко-многим или один-к-одному).

Синтаксис соединения требует указания условия связывания таблиц. Обычно это сравнение ссылок или ключевых полей. Если связь не будет найдена, поля из правой таблицы заполнятся значениями NULL (или ЕСТЬNULL, если вы предусмотрели замену). Это стандартный механизм реляционных баз данных, реализованный в 1С.

ВЫБРАТЬ

РегистрНакопления.Продажи.Номенклатура,

Справочник.Номенклатура.Родитель КАК ГруппаТоваров

ИЗ

РегистрНакопления.Продажи КАК Продажи

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Продажи.Номенклатура = Номенклатура.Ссылка

Важно отличать Левое соединение от Внутреннего. Внутреннее соединение отбросит все строки, для которых не нашлось пары в правой таблице. Левое же сохранит все строки из основного источника, что часто критично для полноты отчетов. Неправильный выбор типа соединения — частая причина исчезновения данных в отчетах.

При работе с соединениями следует избегать циклических зависимостей и избыточных связей. Если вы соединяете таблицу саму с собой или делаете цепочку из 5-6 соединений, производительность запроса может упасть экспоненциально. Всегда анализируйте план выполнения запроса через консоль запросов.

Работа с временными таблицами

В сложных сценариях, когда одного запроса недостаточно, на помощь приходят временные таблицы. Вы можете выполнить первый запрос, сохранить его результат во временное хранилище, а затем добавить новые поля уже во втором запросе, обращаясь к этому хранилищу. Это дает полную свободу действий: вы можете менять типы полей, агрегировать данные и добавлять любые вычисления.

Для создания временной таблицы используется конструкция ПОМЕСТИТЬ.. В ТЕМП ТАБЛИЦУ. Имя такой таблицы всегда начинается с символа #. После того как данные помещены туда, вы можете работать с ними как с обычной таблицей базы данных, добавляя нужные колонки через ВЫБРАТЬ.

☑️ Алгоритм работы с временными таблицами

Выполнено: 0 / 4

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

Однако у временных таблиц есть и обратная сторона. Они занимают место в tempdb (в случае MS SQL) или в файловом буфере (для файловой базы). Чрезмерное использование временных таблиц при высокой нагрузке может привести к замедлению работы всей системы. Используйте их только тогда, когда логика действительно требует разделения этапов обработки.

⚠️ Внимание: Временные таблицы существуют только в рамках одной сессии соединения с базой данных. Вы не можете создать временную таблицу в одном сеансе и прочитать её в другом. Также они автоматически удаляются при разрыве соединения или завершении работы обработчика.

Добавление полей через объединения запросов

Оператор ОБЪЕДИНИТЬ (UNION) позволяет склеивать результаты нескольких запросов вертикально. Это полезно, когда нужно добавить в выборку строки, которые физически находятся в разных таблицах, но имеют схожую структуру. Чтобы добавить свое поле в такой конструкции, необходимо убедиться, что оно присутствует во всех частях объединения с одинаковым именем и совместимым типом.

Если в первом запросе вы выбираете поле "Сумма", то и во втором, и в третьем запросе внутри объединения должно быть поле "Сумма". Если во второй таблице такого поля нет, вы должны сгенерировать его искусственно (например, выбрать константу 0 КАК Сумма). Несоблюдение этого правила приведет к ошибке выполнения.

Часть запроса Поле 1 (Имя) Поле 2 (Тип) Особенность
Первый SELECT Документ Число Задает имена и типы
Второй SELECT Документ Число (или NULL) Должно совпадать
Третий SELECT Документ Число (или NULL) Должно совпадать

При использовании объединения стоит помнить, что дубликаты строк по умолчанию удаляются (если не указано ОБЪЕДИНИТЬ ВСЕ). Это может повлиять на количество строк в итоговой выборке. Если ваша задача — просто добавить данные из другого источника без фильтрации повторов, всегда используйте модификатор ВСЕ для повышения производительности.

Почему ОБЪЕДИНИТЬ ВСЕ быстрее?

Операция удаления дубликатов требует сортировки всего набора данных и построчного сравнения, что является ресурсоемкой операцией. Использование ВСЕ отключает эту проверку, отдавая данные "как есть".

Типичные ошибки и рекомендации по оптимизации

При добавлении своих полей разработчики часто сталкиваются с проблемами производительности. Самая распространенная ошибка — использование функций от полей в условиях соединения или фильтрации (ГДЕ). Например, если вы напишете ГДЕ ЛЕВСТР(Поле, 3) = "001", то индекс по этому полю не будет использован, и произойдет полный скан таблицы.

Старайтесь выносить вычисления за пределы условий отбора. Если нужно отфильтровать данные по вычисляемому полю, лучше сначала отобрать основной набор, поместить его во временную таблицу, а уже потом фильтровать вычисляемое поле. Это правило особенно актуально для баз на MS SQL и PostgreSQL.

Еще одна частая проблема — несовпадение типов данных при объединении. Платформа 1С строго типизирована. Попытка объединить строку и число без явного приведения типов вызовет исключение. Используйте функцию ЕСТЬNULL с указанием второго аргумента нужного типа, чтобы гарантировать совместимость.

  • 🔸 Избегайте функций в левой части условий соединения
  • 🔸 Проверяйте типы данных перед оператором ОБЪЕДИНИТЬ
  • 🔸 Не выбирайте лишние поля, которые не будут использованы

Помните, что каждый добавленный вами элемент в запрос влияет на план выполнения. Консоль запросов — ваш лучший друг в отладке. Используйте режим "Показать план выполнения", чтобы убедиться, что добавление нового поля не превратило быстрый запрос в медленный.

⚠️ Внимание: Интерфейс и возможности Консоли запросов могут отличаться в зависимости от версии платформы 1С и используемой СУБД. Всегда сверяйтесь с актуальной документацией для вашей конфигурации, если стандартные методы оптимизации не дают результата.

💡

Оптимальный запрос в 1С — это баланс между читаемостью кода и эффективностью использования индексов базы данных. Добавляйте поля осознанно, избегая вычислений в условиях отбора.

Можно ли добавить поле в запрос через СКД без программирования?

Да, в Системах Компоновки Данных (СКД) вы можете добавлять вычисляемые поля в настройках отчета. Однако "под капотом" СКД все равно генерирует запрос с использованием описанных выше методов (псевдонимы, выражения). Для сложной логики программирование в модуле объекта или внешней обработке остается более гибким вариантом.

Почему мое добавленное поле имеет тип "Неопределено"?

Это происходит, если в разных ветках объединения (ОБЪЕДИНИТЬ) типы полей не совпадают и платформа не может привести их к общему типу. Например, вы объединяете Строку и Число. Проверьте, чтобы во всех частях запроса поле имело совместимый тип, используя приведение типов или константы.

Как добавить поле с текущей датой в запрос?

Используйте встроенную функцию СЕГОДНЯ() или ТЕКУЩАЯДАТА() в секции выбора. Пример: ВЫБРАТЬ СЕГОДНЯ() КАК ДатаОтчета. Это добавит колонку, где в каждой строке будет стоять актуальная дата формирования запроса.

Влияет ли добавление поля на скорость работы запроса?

Само по себе добавление простого поля (ссылки, числа) влияет незначительно. Однако, если поле вычисляемое (содержит функции, конкатенацию) или требует дополнительного соединения с большой таблицей, это может существенно замедлить выполнение запроса, особенно на больших объемах данных.