Работа с бухгалтерскими проводками в версии 1С:Предприятие 7.7 имеет свои особенности, отличные от современных версий платформы. Основная сложность для начинающего разработчика заключается в правильном обходе коллекции проводок и эффективной фильтрации данных. В рамках данной статьи мы разберем, как создать внешнюю обработку, которая по заданным фильтрам (счета дебета и кредита, период) собирает данные и выводит их в таблицу значений.
Рассмотрим два основных способа решения этой задачи: классический перебор через объект Операция и более производительный метод через объект БухгалтерскиеИтоги.
Этот метод интуитивно понятен: мы последовательно перебираем все документы «Операция» за указанный период, а внутри каждой операции перебираем все входящие в нее проводки. Проанализируем пример кода, который позволяет реализовать этот алгоритм.
Предположим, на форме обработки у нас созданы реквизиты ВыбНачДата, ВыбКонДата, ВыбСчетДт, ВыбСчетКт и таблица значений с идентификатором Таб. Прежде всего, нам необходимо подготовить таблицу значений, очистить ее и добавить необходимые колонки.
// Очищаем таблицу перед заполнением
Таб.УдалитьСтроки();
// Создаем объект для обхода операций
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперации(ВыбНачДата, ВыбКонДата);
Пока Опер.ПолучитьОперацию() = 1 Цикл
// Для каждой операции открываем выборку проводок
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку() = 1 Цикл
// Обязательно проверяем соответствие счетам, выбранным на форме
Если (Опер.Дебет.Счет = ВыбСчетДт) И (Опер.Кредит.Счет = ВыбСчетКт) Тогда
Таб.НоваяСтрока();
// Заполняем данные о счетах и сумме
Таб.СчетДт = Опер.Дебет.Счет;
Таб.СчетКт = Опер.Кредит.Счет;
Таб.Сумма = Опер.Сумма;
// Работа с субконто (например, Основное средство)
// В 1С 7.7 на счете может быть несколько субконто.
// Проверим первое субконто по дебету
Если Опер.Дебет.Счет.КоличествоСубконто() > 0 Тогда
Субконто1 = Опер.Дебет.Субконто(1);
Если ТипЗначенияСтр(Субконто1) = "Справочник" Тогда
Таб.ОсновноеСредство = Субконто1;
КонецЕсли;
КонецЕсли;
Состояние("Обработана дата: " + Опер.ДатаОперации);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Разберем важные моменты этого кода. Метод ВыбратьОперации ограничивает выборку только по времени. Обратите внимание, что фильтрацию по счетам мы делаем вручную внутри цикла с помощью оператора Если. Это является "слабым местом" метода: если проводок в базе миллионы, программа будет проверять каждую из них, что значительно замедлит работу.
Для повышения производительности, особенно в крупных базах, рекомендуется использовать объект БухгалтерскиеИтоги. Этот объект умеет обращаться к предварительно рассчитанным итогам и выполнять фильтрацию на уровне базы данных, не нагружая оперативную память перебором лишних проводок.
Выясним, как реализовать ту же задачу эффективнее. Рассмотрим пошаговый алгоритм использования метода ВыбратьПериод в режиме корреспонденций.
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
// Устанавливаем фильтр по конкретным счетам
// Это позволит системе игнорировать все остальные проводки
БИ.ИспользоватьСчет(ВыбСчетДт, 1); // 1 - только этот счет
БИ.ИспользоватьКорСчет(ВыбСчетКт);
// Выполняем расчет за период. Параметр "Проводка" позволяет получить детализацию
БИ.ВыполнитьЗапрос(ВыбНачДата, ВыбКонДата, ВыбСчетДт, ВыбСчетКт, , 3, "Проводка");
// Выбираем корреспонденции (проводки)
БИ.ВыбратьПериод();
Пока БИ.ПолучитьПериод() = 1 Цикл
Таб.НоваяСтрока();
Таб.СчетДт = БИ.Счет;
Таб.СчетКт = БИ.КорСчет;
Таб.Сумма = БИ.Сумма;
// Получаем субконто "Основное средство" напрямую
// Предполагаем, что оно назначено на счете дебета
Таб.ОсновноеСредство = БИ.Субконто(1);
КонецЦикла;
Использование метода ВыполнитьЗапрос с указанием конкретных счетов дебета и кредита позволяет сократить время выполнения задачи в десятки раз. Кроме того, объект БухгалтерскиеИтоги автоматически обрабатывает иерархию счетов и субконто, что делает код более надежным.
При заполнении ТаблицыЗначений (ТЗ) важно соблюдать правила типизации и корректного обращения к реквизитам. Проанализируем типичные ошибки и рекомендации:
НоваяКолонка("Имя", "Тип"). Это критично для сортировки. Например: Таб.НоваяКолонка("Сумма", "Число", 15, 2);.Наименование) всегда проверяйте, выбран ли объект. Используйте функцию ПустоеЗначение() или Выбран() для справочников.Состояние(). Это даст пользователю понять, что программа не "зависла", а продолжает работу.Если ваша задача — выбрать проводки именно по основным средствам, убедитесь, что вы обращаетесь к нужному номеру субконто. На разных счетах (например, 10, 11, 15) основные средства могут находиться на разных позициях (первое, второе или третье субконто). Проверить это можно в Плане счетов в Конфигураторе или программно через метод ВидСубконто().
Пример безопасного получения значения ОС:
// Проверяем, является ли 1-е субконто справочником ОС
Если БИ.Счет.ВидСубконто(1) = ВидСубконто.ОсновныеСредства Тогда
ОС = БИ.Субконто(1);
Если ПустоеЗначение(ОС) = 0 Тогда
Таб.ОсновноеСредство = ОС;
КонецЕсли;
КонецЕсли;
Таким образом, мы рассмотрели два подхода к выборке проводок. Для простых разовых задач новичку проще использовать объект Операция, однако для профессиональной разработки и работы с реальными объемами данных следует осваивать объект БухгалтерскиеИтоги.