Как в 1С 7.7 сделать выборку проводок и выгрузить их в таблицу значений?

Программист 1С v7.7 Бухгалтерский учет
← На главную

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

Рассмотрим два основных способа решения этой задачи: классический перебор через объект Операция и более производительный метод через объект БухгалтерскиеИтоги.

Способ 1: Использование объекта Операция (прямой перебор)

Этот метод интуитивно понятен: мы последовательно перебираем все документы «Операция» за указанный период, а внутри каждой операции перебираем все входящие в нее проводки. Проанализируем пример кода, который позволяет реализовать этот алгоритм.

Предположим, на форме обработки у нас созданы реквизиты ВыбНачДата, ВыбКонДата, ВыбСчетДт, ВыбСчетКт и таблица значений с идентификатором Таб. Прежде всего, нам необходимо подготовить таблицу значений, очистить ее и добавить необходимые колонки.


// Очищаем таблицу перед заполнением
Таб.УдалитьСтроки(); 

// Создаем объект для обхода операций
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперации(ВыбНачДата, ВыбКонДата); 

Пока Опер.ПолучитьОперацию() = 1 Цикл
    // Для каждой операции открываем выборку проводок
    Опер.ВыбратьПроводки(); 
    
    Пока Опер.ПолучитьПроводку() = 1 Цикл
        // Обязательно проверяем соответствие счетам, выбранным на форме
        Если (Опер.Дебет.Счет = ВыбСчетДт) И (Опер.Кредит.Счет = ВыбСчетКт) Тогда
            
            Таб.НоваяСтрока();
            
            // Заполняем данные о счетах и сумме
            Таб.СчетДт = Опер.Дебет.Счет;
            Таб.СчетКт = Опер.Кредит.Счет;
            Таб.Сумма = Опер.Сумма;
            
            // Работа с субконто (например, Основное средство)
            // В 1С 7.7 на счете может быть несколько субконто. 
            // Проверим первое субконто по дебету
            Если Опер.Дебет.Счет.КоличествоСубконто() > 0 Тогда
                Субконто1 = Опер.Дебет.Субконто(1);
                Если ТипЗначенияСтр(Субконто1) = "Справочник" Тогда
                    Таб.ОсновноеСредство = Субконто1;
                КонецЕсли;
            КонецЕсли;
            
            Состояние("Обработана дата: " + Опер.ДатаОперации);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Разберем важные моменты этого кода. Метод ВыбратьОперации ограничивает выборку только по времени. Обратите внимание, что фильтрацию по счетам мы делаем вручную внутри цикла с помощью оператора Если. Это является "слабым местом" метода: если проводок в базе миллионы, программа будет проверять каждую из них, что значительно замедлит работу.

Способ 2: Оптимальная выборка через БухгалтерскиеИтоги

Для повышения производительности, особенно в крупных базах, рекомендуется использовать объект БухгалтерскиеИтоги. Этот объект умеет обращаться к предварительно рассчитанным итогам и выполнять фильтрацию на уровне базы данных, не нагружая оперативную память перебором лишних проводок.

Выясним, как реализовать ту же задачу эффективнее. Рассмотрим пошаговый алгоритм использования метода ВыбратьПериод в режиме корреспонденций.


БИ = СоздатьОбъект("БухгалтерскиеИтоги");

// Устанавливаем фильтр по конкретным счетам
// Это позволит системе игнорировать все остальные проводки
БИ.ИспользоватьСчет(ВыбСчетДт, 1); // 1 - только этот счет
БИ.ИспользоватьКорСчет(ВыбСчетКт);

// Выполняем расчет за период. Параметр "Проводка" позволяет получить детализацию
БИ.ВыполнитьЗапрос(ВыбНачДата, ВыбКонДата, ВыбСчетДт, ВыбСчетКт, , 3, "Проводка");

// Выбираем корреспонденции (проводки)
БИ.ВыбратьПериод();

Пока БИ.ПолучитьПериод() = 1 Цикл
    Таб.НоваяСтрока();
    Таб.СчетДт = БИ.Счет;
    Таб.СчетКт = БИ.КорСчет;
    Таб.Сумма = БИ.Сумма;
    
    // Получаем субконто "Основное средство" напрямую
    // Предполагаем, что оно назначено на счете дебета
    Таб.ОсновноеСредство = БИ.Субконто(1); 
КонецЦикла;

Использование метода ВыполнитьЗапрос с указанием конкретных счетов дебета и кредита позволяет сократить время выполнения задачи в десятки раз. Кроме того, объект БухгалтерскиеИтоги автоматически обрабатывает иерархию счетов и субконто, что делает код более надежным.

Важные нюансы при работе с Таблицей Значений

При заполнении ТаблицыЗначений (ТЗ) важно соблюдать правила типизации и корректного обращения к реквизитам. Проанализируем типичные ошибки и рекомендации:

  1. Типизация колонок: При создании таблицы на программном уровне (если она не создана на форме) используйте метод НоваяКолонка("Имя", "Тип"). Это критично для сортировки. Например: Таб.НоваяКолонка("Сумма", "Число", 15, 2);.
  2. Проверка типов субконто: Поскольку в 1С 7.7 субконто имеет неопределенный тип, перед обращением к свойствам (например, Наименование) всегда проверяйте, выбран ли объект. Используйте функцию ПустоеЗначение() или Выбран() для справочников.
  3. Вывод информации: При обработке больших массивов данных обязательно используйте функцию Состояние(). Это даст пользователю понять, что программа не "зависла", а продолжает работу.

Обработка данных справочника «Необоротные активы»

Если ваша задача — выбрать проводки именно по основным средствам, убедитесь, что вы обращаетесь к нужному номеру субконто. На разных счетах (например, 10, 11, 15) основные средства могут находиться на разных позициях (первое, второе или третье субконто). Проверить это можно в Плане счетов в Конфигураторе или программно через метод ВидСубконто().

Пример безопасного получения значения ОС:


// Проверяем, является ли 1-е субконто справочником ОС
Если БИ.Счет.ВидСубконто(1) = ВидСубконто.ОсновныеСредства Тогда
    ОС = БИ.Субконто(1);
    Если ПустоеЗначение(ОС) = 0 Тогда
        Таб.ОсновноеСредство = ОС;
    КонецЕсли;
КонецЕсли;

Таким образом, мы рассмотрели два подхода к выборке проводок. Для простых разовых задач новичку проще использовать объект Операция, однако для профессиональной разработки и работы с реальными объемами данных следует осваивать объект БухгалтерскиеИтоги.

← На главную