Работа с прямыми SQL-запросами в среде 1С 7.7 через внешнюю компоненту 1С++ открывает огромные возможности для повышения производительности, особенно при работе с бухгалтерскими итогами. Однако использование AccountsRecordsetV3 требует понимания специфики работы парсера метаданных. В этой статье мы подробно разберем, как правильно именовать поля, работать с вложенными селектами и настраивать фильтрацию данных.
Одной из самых частых задач является переименование стандартных полей выборки (например, Субконто1) в более понятные бизнес-логике имена (например, ЛицевойСчет). При использовании метасимвола $ для типизации (превращения внутреннего ID в объект 1С) важно помнить, что 1С++ ожидает наличие парного поля для определения типа данных.
Рассмотрим ситуацию: если мы просто переименуем поле в SELECT, парсер выдаст ошибку, так как не найдет дополнительное типизирующее поле. Разберем правильный синтаксис на примере:
"SELECT
Субконто1 [ЛицевойСчет $Субконто],
Субконто1_вид [ЛицевойСчет_вид]
FROM $БИОбороты.Основной(:НачДата, :КонДата ~ ... )"
Важный момент: когда вы даете псевдоним полю через квадратные скобки [НовоеИмя $Тип], поле, отвечающее за вид этого субконто, обязательно должно иметь имя НовоеИмя_вид. Только в этом случае типизация отработает корректно, и в итоговой таблице значений вы получите полноценную ссылку на объект 1С.
Часто возникает необходимость обернуть сложный запрос к бухгалтерским итогам во внешний SELECT для дополнительной фильтрации или группировки. Здесь программисты часто сталкиваются с ошибкой "Недопустимое имя столбца". Проанализируем причину этой проблемы.
Типизация с использованием квадратных скобок (например, [ЛС $Субконто]) должна применяться только в самом верхнем уровне выборки. Во внутренних (вложенных) запросах SQL-сервер ничего не знает о метаданных 1С, поэтому там следует использовать обычные псевдонимы. Рассмотрим правильную структуру вложенного запроса:
SELECT
V.ЛС_ID [ЛицевойСчет $Субконто],
V.ЛС_Type [ЛицевойСчет_вид]
FROM
(
SELECT
Субконто1 as ЛС_ID,
Субконто1_вид as ЛС_Type
FROM $БИОбороты.Основной(...)
) as V
Посмотрим, что здесь происходит: во внутреннем запросе мы дали полям простые имена ЛС_ID и ЛС_Type. Во внешнем запросе мы обращаемся к ним через алиас таблицы V.ЛС_ID и только на этом этапе накладываем типизацию 1С++. Не забывайте всегда указывать алиас для подзапроса (например, as V), иначе SQL-сервер выдаст синтаксическую ошибку.
Прямые запросы не позволяют обращаться к реквизитам через точку (например, Субконто1.Наименование), как это делается в штатном языке запросов 1С 8. Чтобы вытащить данные из связанных справочников, необходимо использовать механизм JOIN. Проанализируем, как это сделать безопасно.
Поскольку субконто может иметь неопределенный тип, использование INNER JOIN может привести к потере данных, если в поле окажется ссылка на другой справочник. Рекомендуется использовать LEFT JOIN. Разберем пример получения адреса из справочника:
SELECT
V.Субконто1 [ЛицевойСчет $Субконто],
Spr.Адрес [Адрес $Справочник.Адреса]
FROM $БИОбороты.Основной(...) as V
LEFT JOIN $Справочник.Адреса as Spr ON V.Субконто1 = Spr.ID
Чтобы понять, какие именно поля доступны в выборке для соединения, воспользуйтесь отладочным приемом: выполните SELECT TOP 1 * FROM .... Это позволит увидеть реальные имена колонок, которые возвращает виртуальная таблица итогов.
Особое внимание стоит уделить параметрам виртуальной таблицы $БИОбороты. Фильтры, переданные внутри параметров этой таблицы, работают значительно быстрее, чем условие WHERE в конце запроса, так как отсекают лишние данные еще на этапе агрегации SQL-сервером.
Если вам нужно исключить обороты счета "сам на себя" (где счет совпадает с корр. счетом), условие нужно прописывать непосредственно в параметрах виртуальной таблицы. Проанализируем структуру параметров:
'Месяц').(Счет = :ВыбСчет) AND (Счет <> КорСчет).Важно помнить, что в базе данных 1С 7.7 счета хранятся не в виде кодов (типа "60.1"), а в виде внутренних 9-символьных идентификаторов. Поэтому при сравнении всегда используйте передачу параметров через :ИмяПараметра, чтобы 1С++ сама подставила нужный ID.
При работе с AccountsRecordsetV3 придерживайтесь следующих правил:
ТаблицуЗначений и заполнить представления штатными средствами 1С, чем нагружать SQL-запрос десятком соединений со справочниками.[] ресурсоемка для парсера, используйте ее только для финального вывода данных.Таким образом, правильное использование псевдонимов и понимание механизмов работы AccountsRecordsetV3 позволяют строить сложные и высокоэффективные отчеты, которые будут работать в десятки раз быстрее стандартных бухгалтерских итогов 1С 7.7.