Как узнать количество движений документа в 1С 7.7?

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

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

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

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

Решение через язык запросов

Если нам необходимо получить количество движений без циклического обхода, мы можем использовать штатный механизм запросов 1С. В языке запросов существует агрегатная функция Счётчик(), которая позволяет подсчитать количество строк в выборке по заданному условию.

Рассмотрим, как реализовать этот подход на практике. Нам необходимо обратиться к регистру и отфильтровать записи по конкретному документу-регистратору.

Пример кода для выполнения запроса:


// Предположим, что ДокументОбъект - это наш документ
ТекстЗапроса = 
"//{{ЗАПРОС(КоличествоДвижений)
|Период с ДокументОбъект.ДатаДок по ДокументОбъект.ДатаДок;
|ОбрабатыватьДокументы Проведенные;
|Рег = Регистр.НашРегистр;
|Функция Кол = Счётчик();
|Условие (Рег.ТекущийДокумент = ДокументОбъект);
|Группировка ДокументОбъект;
|//}}ЗАПРОС";

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

Важные нюансы реализации

  1. Работа в DBF и SQL: Несмотря на бытующее мнение, что запросы к регистрам в 1С 7.7 могут вести себя по-разному в зависимости от типа базы, функция Счётчик() является стандартным инструментом языка. Она успешно работает как в файловом (DBF), так и в SQL-варианте базы данных.
  2. Непроведенные документы: Важно помнить об архитектурной особенности 1С 7.7: движения документа существуют в базе данных только в том случае, если документ проведен. Если документ не проведен, записи в таблицах регистров отсутствуют, и любая функция подсчета (в том числе запрос) вернет значение 0.
  3. Библиотека 1С++: Для профессиональных разработчиков, работающих с высоконагруженными SQL-базами, существует библиотека 1С++. Она позволяет выполнять прямые запросы к SQL-таблицам, что часто оказывается производительнее стандартного движка запросов 1С, особенно при необходимости работы с большими объемами данных регистра.

Заключение

Хотя в 1С 7.7 нет прямого метода для получения количества движений, использование запросов с функцией Счётчик() является наиболее корректным и стандартизированным способом решения этой задачи. Это позволяет избежать «тяжелого» перебора записей в цикле и сделать код более лаконичным и быстрым.

← На главную