При работе с прямыми SQL-запросами в 1С 7.7 мы часто сталкиваемся с задачами объединения данных из справочников и журналов документов. Одной из частых проблем, с которой встречаются разработчики, является несоответствие форматов идентификаторов при попытке связать таблицу справочника с таблицей _1SJourn. Давайте разберем, почему это происходит и как правильно решить эту задачу.
Для того чтобы успешно связывать таблицы, важно понимать, как 1С 7.7 хранит ссылки на документы. Когда в справочнике создается поле с типом данных Документ (неопределенного вида), база данных выделяет под это поле 13 символов.
Эти 13 символов имеют строгую структуру:
IDDoc), который хранится в системной таблице _1SJourn.Именно из-за этого различия в длине (13 символов в справочнике против 9 символов в IDDoc) обычное условие соединения ON Справочник.Поле = Журнал.IDDoc не работает: SQL-сервер не находит совпадений, так как сравнивает 13-символьную строку с 9-символьной.
Чтобы выполнить корректное соединение, нам необходимо «отсечь» лишние 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 решает функциональную задачу, стоит учитывать вопросы производительности при работе с большими объемами данных:
SUBSTRING или LEFT в условии соединения может привести к тому, что оптимизатор SQL-сервера не сможет эффективно использовать индексы, построенные по полю IDDoc. При выполнении запросов на таблицах с миллионами записей это может вызвать замедление работы.IDDoc из журнала к формату справочника, «достроив» его префиксом (например, добавив 4 пробела), однако это требует знания конкретного префикса вида документа.RIGHT(Поле, 9) вместо SUBSTRING. Это делает код более читаемым и компактным.Поскольку вы часто будете соединять справочники с журналами именно для фильтрации по датам, обратите внимание на поле Date_Time_IDDoc. Это строка, содержащая дату, время и ID документа в 23-символьном формате. Для получения полноценного типа данных DateTime, пригодного для сравнения, используйте преобразование:
CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime)
Этот фрагмент извлекает первые 8 символов (год, месяц, день) и преобразует их в формат даты, что позволяет легко фильтровать документы за определенный период, используя стандартные операторы сравнения SQL.
Теперь, когда мы разобрались с механизмом связывания, вы можете строить сложные отчеты и выборки, объединяя справочники и документы в 1С 7.7 быстро и корректно!