Читаем внимательно учебник из документации: Глава 3: Работа с документами
Все документы 1С хранятся в таблице _1Sjourn(или 1Sjourn для DBF). Конечно, это не очень хорошо, особенно когда блокируется вся таблица при проведении 1 документа, но мы не можем изменять структуры БД, поэтому будем довольствоваться тем, что есть
Структура таблицы
F=ROW_ID |Row ID |I |0 |0 ß Это поле есть только в SQL версии
F=IDJOURNAL |ID of Journal |I |0 |0
F=IDDOC |ID Document |C |9 |0
F=IDDOCDEF |ID Def Document |I |0 |0
F=APPCODE |App code |S |0 |0
F=DATE_TIME_IDDOC |Date+Time+IDDoc |C |23 |0 ß Это поле есть только в SQL версии
В DBF его аналог выглядит так:
F=DATE |date |D |8 |0
F=TIME |Time |C |6 |0
F=DNPREFIX |Prefix Document No |C |18 |0
F=DOCNO |Document No |C |10 |0
F=CLOSED |Flag document is clo |Y |0 |0
F=ISMARK |Doc is Marked for De |L |0 |0
F=ACTCNT |Action counter |I |0 |0
F=VERSTAMP |Version stamp |I |0 |0
F=RF32735 |Reg Action Flag |L |0 |0
F=SP12955 |(P)Автор |C |9 |0
F=SP31982 |(P)Фирма |C |9 |0
F=DS13520 |Flag document in seq |Y |0 |0
IDDoc – уникальный идентификатор документа
IDDocDef – вид
Date_Time_IDDoc – позиция документа, она же дата
Важно! Это поле в СКЛ версии – строка, тогда как в ДБФ – это дата. Это приводит к тому, что в СКЛ версии чтобы получить дату документа нужно выполнить преобразование CAST(LEFT(date_time_iddoc,8) as datetime) а в дбф этого делать не нужно. Однако на условия по дете это никак не сказывается.
Пример: Получить документы “Реализация” за период с НачДата по КонДата
ТекстЗапроса = "
|SELECT
| Жур.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид
|FROM
| _1SJourn as Жур
|WHERE
| Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
| Жур.IDDocDef = $ВидДокумента.Реализация";
Для DBF запрос будет таким:
|SELECT
| Жур.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид
|FROM
| 1SJourn as Жур
|WHERE
| Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
| Жур.IDDocDef = $ВидДокумента.Реализация";
как видно оба запроса идентичны, но отличаются именами полей, таблиц и модификаторами. Я стараюсь всегда делать универсальный запрос, который будет работать как на ДБФ так и на СКЛ, поэтому я добавляю проверку на версию 1С(СКЛ или ДЮФ) и дописываю недостающие переменные или поля в зависимости от этой версии. Т.е. предыдущий запрос выглядел бы так:
|SELECT
| Жур.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид
|FROM
| "+?(ЭтоСКЛ=1,"_","")+"1SJourn as Жур
|WHERE
| Жур.Date"+?(ЭтоСКЛ=1,"_Time_IdDoc","")+" BETWEEN :НачДата"+?(ЭтоСКЛ=1,"","~~")+" AND :КонДата~"+?(ЭтоСКЛ=1,"","~")+" AND
| Жур.IDDocDef = $ВидДокумента.Реализация";
RS.УстановитьТекстовыйПараметр("НачДата", НачДата);
RS.УстановитьТекстовыйПараметр("КонДата", КонДата);
Здесь стоит обратить внимание на 2 вещи:
1) Для типизации документа по полю IDDoc необходимо, чтобы в выборке присутствовало поле содержащее IDDocDef с именем <ИмяПоляIDDoc>_вид, в нашем случае это будет Док_вид. Для полей, которые содержат реквизит типа “Документ” конкретного вида вспомогательного поля не требуется.
2) Модификатор параметра КонДата. Он необходим для того, чтобы в выборку попали документы за последний день.
Поле Date_Time_IDDoc, отвечающее за дату содержит значения вида ‘20030731767WS0 1O6P ‘. Соответственно параметр НачДата будет выглядеть как ‘20030701’, а КонДата с модификатором - ‘20030731Z’, кроме того, в DBF версии модификатор должен быть ~~.
Он переведет дату из 01.01.2006 в {d '2006-01-01'}.
Посмотрим, как в запросе преобразовать поле Date_Time_IDDoc в дату документа
Для DBF такого перевода не требуется, т.е. можно написать просто Жур.Date
|