Как правильно присоединить журнал документов в прямых SQL-запросах 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе с прямыми SQL-запросами в 1С 7.7 мы часто сталкиваемся с задачами объединения данных из справочников и журналов документов. Одной из частых проблем, с которой встречаются разработчики, является несоответствие форматов идентификаторов при попытке связать таблицу справочника с таблицей _1SJourn. Давайте разберем, почему это происходит и как правильно решить эту задачу.

Понимание структуры хранения документов в 1С 7.7

Для того чтобы успешно связывать таблицы, важно понимать, как 1С 7.7 хранит ссылки на документы. Когда в справочнике создается поле с типом данных Документ (неопределенного вида), база данных выделяет под это поле 13 символов.

Эти 13 символов имеют строгую структуру:

  1. Первые 4 символа — это внутренний код вида документа, так называемый префикс.
  2. Остальные 9 символов — это уникальный идентификатор документа (IDDoc), который хранится в системной таблице _1SJourn.

Именно из-за этого различия в длине (13 символов в справочнике против 9 символов в IDDoc) обычное условие соединения ON Справочник.Поле = Журнал.IDDoc не работает: SQL-сервер не находит совпадений, так как сравнивает 13-символьную строку с 9-символьной.

Решение проблемы через функцию SUBSTRING

Чтобы выполнить корректное соединение, нам необходимо «отсечь» лишние 4 символа префикса из значения справочника. Для этого в SQL используется функция SUBSTRING. Давайте рассмотрим, как выглядит правильный запрос.

Предположим, у нас есть справочник Серия с полем ДокументПрих. Чтобы связать его с журналом _1SJourn по полю IDDoc, мы должны написать условие соединения следующим образом:


SELECT 
    Серия.ДокументПрих as [ДокументПрих $Документ],
    Серия.СерийныйНомер as СерийныйНомер,
    Жур.Date_Time_IDDoc as ДатаВремя
FROM
    $Справочник.Серия AS Серия 
LEFT JOIN 
    _1SJourn Жур ON SUBSTRING(Серия.ДокументПрих, 5, 9) = Жур.IDDoc

В этом примере функция SUBSTRING(Серия.ДокументПрих, 5, 9) берет поле с идентификатором документа, начиная с 5-го символа, и забирает ровно 9 символов. Полученное значение идеально совпадает с форматом IDDoc в журнале, что позволяет успешно произвести LEFT JOIN.

Важные рекомендации по оптимизации запросов

Хотя использование функций в блоке ON решает функциональную задачу, стоит учитывать вопросы производительности при работе с большими объемами данных:

Работа с датами из журнала

Поскольку вы часто будете соединять справочники с журналами именно для фильтрации по датам, обратите внимание на поле Date_Time_IDDoc. Это строка, содержащая дату, время и ID документа в 23-символьном формате. Для получения полноценного типа данных DateTime, пригодного для сравнения, используйте преобразование:

CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime)

Этот фрагмент извлекает первые 8 символов (год, месяц, день) и преобразует их в формат даты, что позволяет легко фильтровать документы за определенный период, используя стандартные операторы сравнения SQL.

Теперь, когда мы разобрались с механизмом связывания, вы можете строить сложные отчеты и выборки, объединяя справочники и документы в 1С 7.7 быстро и корректно!

← На главную