Как работает оператор Период С в запросах 1С 7.7 при указании документа или позиции документа?

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

При построении отчетов и выборок в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с необходимостью ограничить расчетный интервал не календарной датой, а конкретным документом. В связи с этим возникает вопрос: как именно платформа интерпретирует различные варианты передачи границы периода — через ссылку на документ ТекущийДокумент() или через функцию СформироватьПозициюДокумента() с различными смещениями. Разберем эти механизмы детально.

Сравнение вариантов передачи границ периода

Рассмотрим три основных варианта указания границы периода запроса и проанализируем их поведение:

  1. Передача ссылки на документ: ТекущийДокумент()
  2. Передача позиции со смещением назад: СформироватьПозициюДокумента(ТекущийДокумент(), -1)
  3. Передача точной позиции документа: СформироватьПозициюДокумента(ТекущийДокумент()) или СформироватьПозициюДокумента(ТекущийДокумент(), 0)

Разберем, являются ли варианты 1 и 3 эквивалентными. Да, варианты 1 и 3 абсолютно эквивалентны. Когда в качестве параметра границы в оператор Период С ... По ... передается ссылка на документ, платформа неявно преобразует ее во внутреннюю позицию документа (строку формата DATE_TIME_IDDOC) с нулевым смещением. Сам документ и его движения при этом включаются в интервал запроса.

Вариант 2 с отрицательным смещением -1 сдвигает расчетную границу на квант времени непосредственно до момента проведения документа. В этом случае сам документ и его движения в интервал не попадут, а итоговые остатки по регистрам будут рассчитаны строго на состояние перед его проведением.

Если же указать смещение 1, граница переместится в позицию строго после документа, гарантируя включение его движений в начало следующего расчетного интервала.

Структура позиции документа и обработка одинакового времени

Выясним причину, по которой 1С 7.7 корректно различает документы, созданные в одну и ту же секунду. Внутренняя позиция документа представляет собой 23-символьную строку, состоящую из трех частей:

  1. Дата документа (8 символов в формате ГГГГММДД);
  2. Время документа (6 символов в 36-ричной системе счисления);
  3. Внутренний идентификатор документа (9 символов IDDOC).

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

Практический пример использования в тексте запроса

Посмотрим на пример построения текста запроса с ограничением периода по документам:


// Задаем границы интервала
ПозНачала = СформироватьПозициюДокумента(ДокНачало, -1);
ПозКонца = СформироватьПозициюДокумента(ДокКонец, 0);

ТекстЗапроса = 
"//{{ЗАПРОС(ВыборкаПоДокументам)
|Период с ПозНачала по ПозКонца;
|ОбрабатыватьДокументы Все;
|Док = Документ.Табель.ТекущийДокумент;
|Группировка Док;
|"//}}ЗАПРОС
;

Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка("Док") = 1 Цикл
        Сообщить("Обработан документ: " + Запрос.Док);
    КонецЦикла;
КонецЕсли;

Важные особенности и ограничения платформы

Проанализируем ключевые нюансы, которые необходимо учитывать при работе с периодами запросов в 1С 7.7:

  1. Разница между типом «Дата» и «Документ»: Если граница задана типом Дата, интервал включает сутки целиком (с 00:00:00 начальной даты по 23:59:59 конечной даты). Если передается Документ или строковая Позиция, границы отсекаются с точностью до конкретной позиции документа в журнале.
  2. Незаписанные документы: Функция СформироватьПозициюДокумента() и неявное приведение работают только для записанных в базу документов, имеющих IDDOC. Передача ссылки на новый (незаписанный) документ приведет к ошибке выполнения запроса.
  3. Точка Актуальности (ТА): Если конечный документ периода расположен позже Точки Актуальности итогов, штатный механизм запросов по регистрам остатков рассчитает итоги только на момент ТА.

Альтернативные способы получения данных на позицию документа

Помимо объекта Запрос, позиционирование по документу активно применяется и в других механизмах платформы:

  1. Временный расчет регистров:
    
    Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
    ВременныйРасчет(1);
    РассчитатьРегистрыНа(СформироватьПозициюДокумента(ТекущийДокумент(), -1));
    Остаток = Рег.Остаток(ВыбТовар, "Количество");
    
  2. Бухгалтерские итоги: Метод ВыполнитьЗапрос() объекта БухгалтерскиеИтоги принимает как даты, так и ссылки на документы или строковые позиции.
  3. Объектная выборка: Метод ВыбратьДокументы(НачГраница, КонГраница) также полноценно поддерживает передачу ссылок на документы или позиций в качестве граничных параметров.
← На главную