При решении задач определения даты начала ведения учета, синхронизации данных или пересчета итогов в конфигурациях на платформе 1С:Предприятие 7.7 (в частности, в «Торговля и Склад 7.7») возникает необходимость программно найти самый ранний проведенный документ в информационной базе. Разберем по шагам правильные и быстрые способы реализации этой задачи как штатным языком 1С 7.7, так и с помощью прямых запросов к базе данных.
Для поиска первого документа в хронологическом порядке используется объект Документ, метод установки фильтра и последующая выборка. Рассмотрим синтаксис метода УстановитьФильтр:
Параметры метода: УстановитьФильтр(<Проведенные>, <НеПроведенные>, <НеИмеющиеПризнаковУчета>, <Оперативные>, <Расчетные>, <Бухг>)
Чтобы отобрать исключительно проведенные документы, первым параметром передается 1, а вторым — 0. Для конфигурации «Торговля и Склад» можно также явно указать учет по оперативным регистрам.
Разберем готовый пример кода:
Док = СоздатьОбъект("Документ");
// Устанавливаем фильтр: только проведенные документы
Док.УстановитьФильтр(1, 0);
// Инициализируем выборку по всему журналу в прямом хронологическом порядке
Док.ВыбратьДокументы();
// Обязательно позиционируемся на первой записи выборки
Если Док.ПолучитьДокумент() = 1 Тогда
ПервыйДокумент = Док.ТекущийДокумент();
Сообщить("Самый первый проведенный документ: " + ПервыйДокумент + " от " + Док.ДатаДок);
Иначе
Сообщить("В базе нет ни одного проведенного документа!");
КонецЕсли;
Важные нюансы штатной выборки:
ВыбратьДокументы() выполняет обход от самого старого документа к самому новому (прямой хронологический порядок). Использовать метод Док.ОбратныйПорядок(1) не нужно, так как он развернет выборку и вернет самый последний документ.ВыбратьДокументы() недостаточно для чтения данных. Чтобы объект Документ спозиционировался на конкретной записи, обязательно вызывается Док.ПолучитьДокумент(). Обращение к Док.ТекущийДокумент() без предварительного ПолучитьДокумент() вернет пустое значение.В случае больших баз данных на Microsoft SQL Server для мгновенного получения информации можно выполнить прямой SQL-запрос к таблице общего журнала документов _1SJOURN.
В таблице _1SJOURN статус проведения хранится в поле CLOSED в виде битовой маски:
CLOSED & 1 = 1 — документ проведен по оперативному учету (ТиС);CLOSED & 2 = 2 — документ проведен по бухгалтерскому учету;CLOSED & 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 сортирует записи по возрастанию даты и времени, что гарантирует получение именно самого раннего документа в базе.
Проанализируем практические ситуации при поиске точки начала учета:
Док.ВыбратьДокументы(Дата("01.01.2010")).ВводОстатковТМЦ) либо минимальную дату движения в регистрах остатков.