Как в 1С 7.7 программно получить самый первый проведенный документ

Программист 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Способ 1. Штатная выборка через объект «Документ» с установкой фильтра

Для поиска первого документа в хронологическом порядке используется объект Документ, метод установки фильтра и последующая выборка. Рассмотрим синтаксис метода УстановитьФильтр:

Параметры метода: УстановитьФильтр(<Проведенные>, <НеПроведенные>, <НеИмеющиеПризнаковУчета>, <Оперативные>, <Расчетные>, <Бухг>)

Чтобы отобрать исключительно проведенные документы, первым параметром передается 1, а вторым — 0. Для конфигурации «Торговля и Склад» можно также явно указать учет по оперативным регистрам.

Разберем готовый пример кода:


Док = СоздатьОбъект("Документ");
// Устанавливаем фильтр: только проведенные документы
Док.УстановитьФильтр(1, 0);

// Инициализируем выборку по всему журналу в прямом хронологическом порядке
Док.ВыбратьДокументы();

// Обязательно позиционируемся на первой записи выборки
Если Док.ПолучитьДокумент() = 1 Тогда
    ПервыйДокумент = Док.ТекущийДокумент();
    Сообщить("Самый первый проведенный документ: " + ПервыйДокумент + " от " + Док.ДатаДок);
Иначе
    Сообщить("В базе нет ни одного проведенного документа!");
КонецЕсли;

Важные нюансы штатной выборки:

  1. Направление сортировки: По умолчанию метод ВыбратьДокументы() выполняет обход от самого старого документа к самому новому (прямой хронологический порядок). Использовать метод Док.ОбратныйПорядок(1) не нужно, так как он развернет выборку и вернет самый последний документ.
  2. Метод позиционирования: Вызова метода ВыбратьДокументы() недостаточно для чтения данных. Чтобы объект Документ спозиционировался на конкретной записи, обязательно вызывается Док.ПолучитьДокумент(). Обращение к Док.ТекущийДокумент() без предварительного ПолучитьДокумент() вернет пустое значение.

Способ 2. Прямой SQL-запрос к таблице журнала (для клиент-серверного варианта)

В случае больших баз данных на Microsoft SQL Server для мгновенного получения информации можно выполнить прямой SQL-запрос к таблице общего журнала документов _1SJOURN.

В таблице _1SJOURN статус проведения хранится в поле CLOSED в виде битовой маски:

  1. CLOSED & 1 = 1 — документ проведен по оперативному учету (ТиС);
  2. CLOSED & 2 = 2 — документ проведен по бухгалтерскому учету;
  3. CLOSED & 4 = 4 — документ проведен по расчету зарплаты;
  4. CLOSED > 0 — документ проведен по любому из видов учета.

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


SELECT TOP 1 
    IDDOC, 
    IDDOCDEF, 
    DATE_TIME_IDDOC 
FROM 
    _1SJOURN 
WHERE 
    (CLOSED & 1) = 1 
ORDER BY 
    DATE_TIME_IDDOC ASC

Обратим внимание на направление сортировки: ORDER BY DATE_TIME_IDDOC ASC сортирует записи по возрастанию даты и времени, что гарантирует получение именно самого раннего документа в базе.

Ограничения и практические рекомендации

Проанализируем практические ситуации при поиске точки начала учета:

  1. Ошибочные даты операторов: Пользователи базы данных могут случайно ввести документ с опечаткой в годе (например, указать 1900 или 2000 год вместо текущего). В таком случае штатная выборка вернет некорректный документ глубоко в прошлом. Если примерный период старта известен, рекомендуется ограничить левую границу в выборке: Док.ВыбратьДокументы(Дата("01.01.2010")).
  2. Определение реального начала учета: Если целью является фиксация старта хозяйственной деятельности, первый проведенный документ может оказаться тестовым. В учетных системах надежнее проверять документы ввода начальных остатков (например, ВводОстатковТМЦ) либо минимальную дату движения в регистрах остатков.
  3. Кэширование результата: Если дата начала учета требуется регулярно в алгоритмах отчетов или обработок, рекомендуется один раз определить ее и записать в периодическую или обычную константу, чтобы не нагружать базу повторным сканированием журнала документов.
← На главную