При формировании отчетов, особенно касающихся налогового учета и расчетов по налогу на прибыль, мы часто сталкиваемся с необходимостью агрегировать данные из различных источников. Одной из распространенных ситуаций является учет расходов, таких как проценты по кредитам, которые были введены в систему 1С v7.7 не через специализированные документы, а с помощью механизма «Операция, введенная вручную». Это может вызвать затруднения, поскольку стандартные запросы к документам, привычные нам при работе с другими объектами, могут не сработать напрямую с «Операцией».
Рассмотрим подробнее, как мы можем эффективно извлекать необходимую информацию из операций, введенных вручную, для построения наших отчетов. Мы выясним, какие методы и объекты 1С v7.7 позволяют решить эту задачу, и разберем практические примеры.
Самый мощный и производительный инструмент для получения сводных данных в 1С v7.7 – это объект БухгалтерскиеИтоги. Он идеально подходит, когда нам нужны агрегированные данные: обороты или остатки по счетам за определенный период, с учетом необходимой аналитики (субконто). Если наш отчет по расходам на прибыль требует именно сводных цифр по процентам и кредитам, то использование БухИтогов будет наиболее оптимальным решением.
Преимущества БухИтогов:
БухИтоги оперируют уже проиндексированными и агрегированными данными регистров бухгалтерии, что значительно ускоряет формирование отчетов, особенно на больших базах.Как мы можем использовать БухИтоги?
Для использования БухгалтерскихИтогов нам необходимо создать объект, установить период и указать счета, по которым мы хотим получить данные. Например, для процентов по кредитам это могут быть счета затрат, такие как 91.02 «Прочие расходы» или другие счета, используемые в нашей конфигурации для учета подобных затрат. Далее мы можем установить необходимые фильтры по субконто, чтобы выбрать только те проводки, которые относятся к процентам.
Рассмотрим общий алгоритм работы с БухИтогами:
БухгалтерскиеИтоги.УстановитьПериод() или НачДата() и КонДата().ОборотДт(), ОборотКт(), СальдоДт(), СальдоКт().УстановитьСубконто(), чтобы отфильтровать данные по конкретному виду затрат или договору.Пример получения оборотов по счету 91.02 для налогового учета:
БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.УстановитьПериод(НачПериода, КонПериода);
БухИтоги.ИспользоватьСубконто(ВидСубконто.ВидыЗатрат, , , , , ВидСубконто.Договоры); // Пример использования нескольких видов субконто
БухИтоги.ВыполнитьЗапрос();
// Получаем обороты по дебету счета 91.02, например, для анализа расходов
Если БухИтоги.ВыбратьСчет("91.02") = 1 Тогда
Пока БухИтоги.ПолучитьСчет() = 1 Цикл
// Здесь мы можем получить детализацию по субконто
Если БухИтоги.ВыбратьСубконто(ВидСубконто.ВидыЗатрат) = 1 Тогда
Пока БухИтоги.ПолучитьСубконто(ВидСубконто.ВидыЗатрат) = 1 Цикл
Если БухИтоги.Субконто(ВидСубконто.ВидыЗатрат).Наименование = "Проценты по займам и кредитам" Тогда
СуммаПроцентов = БухИтоги.ОборотДт();
// Добавляем СуммаПроцентов в наш отчет
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
В этом примере мы сначала выбираем счет 91.02, а затем перебираем его субконто по виду «ВидыЗатрат», чтобы найти именно те записи, которые относятся к процентам по кредитам. Это позволяет нам получить требуемую сумму для отчета по расходам.
Если нам требуется более детальная информация, чем просто сводные данные, например, содержание проводки, конкретный документ-основание (если он был указан в операции), или мы хотим фильтровать данные по каким-то специфическим реквизитам самой операции, то нам подойдет метод программного перебора. Несмотря на то, что «Операция, введенная вручную» является документом в системе 1С v7.7, мы не можем работать с ней в запросах так же прямолинейно, как с другими типами документов (например, Документ.РеализацияТоваровУслуг). Для работы с проводками «Операции» нам потребуется использовать два объекта: Документ.Операция для выбора самих документов и Операция для работы с их проводками.
Разберем по шагам, как мы можем реализовать этот подход:
Документ.Операция и воспользуемся его методом ВыбратьДокументы().Пока Док.ПолучитьДокумент() = 1 Цикл ... КонецЦикла.Операция и связать его с текущим документом. Для этого используем метод Опер.НайтиОперацию(Док.ТекущийДокумент()).Операция связан с документом, мы можем выбрать все его проводки методом Опер.ВыбратьПроводки() и затем перебрать их с помощью цикла Пока Опер.ПолучитьПроводку() = 1 Цикл ... КонецЦикла.Опер.Дт (счет дебета), Опер.Кт (счет кредита), Опер.Сумма, Опер.СубконтоДт, Опер.СубконтоКт, Опер.Содержание и другим. Здесь мы можем применять наши условия фильтрации (например, по счетам или наименованию субконто), чтобы отобрать нужные проводки, относящиеся к процентам по кредитам.Рассмотрим пример кода, демонстрирующий этот метод, аналогичный тому, что был представлен в обсуждении:
// Создаем объекты для работы с документами "Операция" и их проводками
Док = СоздатьОбъект("Документ.Операция");
Опер = СоздатьОбъект("Операция");
// Определяем период для выборки документов
ВыбНачПериода = Дата(2023, 01, 01); // Например, начало года
ВыбКонПериода = Дата(2023, 12, 31); // Например, конец года
// Выбираем все документы "Операция" за указанный период
Док.ВыбратьДокументы(ВыбНачПериода, ВыбКонПериода);
// Таблица значений для сбора результатов, если требуется
ТЗРезультат = СоздатьОбъект("ТаблицаЗначений");
ТЗРезультат.НоваяКолонка("ДатаОперации");
ТЗРезультат.НоваяКолонка("НомерОперации");
ТЗРезультат.НоваяКолонка("СчетДт");
ТЗРезультат.НоваяКолонка("СубконтоДт");
ТЗРезультат.НоваяКолонка("СчетКт");
ТЗРезультат.НоваяКолонка("СубконтоКт");
ТЗРезультат.НоваяКолонка("СуммаПроводки", "Число");
ТЗРезультат.НоваяКолонка("Содержание");
// Перебираем каждый документ "Операция"
Пока Док.ПолучитьДокумент() = 1 Цикл
// Связываем объект "Операция" с текущим документом
Опер.НайтиОперацию(Док.ТекущийДокумент());
// Выбираем все проводки текущей операции
Опер.ВыбратьПроводки();
// Перебираем каждую проводку в операции
Пока Опер.ПолучитьПроводку() = 1 Цикл
// Проверяем условия для отбора проводок по процентам и кредитам
// Например, ищем дебет счета 91.02
Если Опер.Дт.Код = "91.02" Тогда
// ИЛИ проверяем субконто на соответствие виду затрат "Проценты по займам"
// В v7.7 субконто может быть нескольких видов, обращаться к ним нужно через Субконто(ВидСубконто)
// или напрямую через Субконто1, Субконто2, Субконто3, Субконто4 в зависимости от настройки счета
// Предположим, что вид затрат "Проценты по займам и кредитам" хранится в Субконто1 Дт
Если ТипЗначенияСчет(Опер.Дт) = 1 И Опер.Дт.ВидСубконто(1).Наименование = "Виды затрат" И Опер.СубконтоДт(1).Наименование = "Проценты по займам и кредитам" Тогда
ТЗРезультат.НоваяСтрока();
ТЗРезультат.ДатаОперации = Опер.ДатаОперации;
ТЗРезультат.НомерОперации = Опер.НомерОперации;
ТЗРезультат.СчетДт = Опер.Дт;
ТЗРезультат.СубконтоДт = Опер.СубконтоДт(1); // Первое субконто дебета
ТЗРезультат.СчетКт = Опер.Кт;
ТЗРезультат.СубконтоКт = Опер.СубконтоКт(1); // Первое субконто кредита
ТЗРезультат.СуммаПроводки = Опер.Сумма;
ТЗРезультат.Содержание = Опер.Содержание;
Иначе
// Если счет 91.02, но без соответствующего субконто,
// можем проверить "Содержание" проводки
Если Найти(НижРег(Опер.Содержание), "проценты") > 0 ИЛИ Найти(НижРег(Опер.Содержание), "кредит") > 0 Тогда
ТЗРезультат.НоваяСтрока();
ТЗРезультат.ДатаОперации = Опер.ДатаОперации;
ТЗРезультат.НомерОперации = Опер.НомерОперации;
ТЗРезультат.СчетДт = Опер.Дт;
ТЗРезультат.СубконтоДт = Опер.СубконтоДт(1);
ТЗРезультат.СчетКт = Опер.Кт;
ТЗРезультат.СубконтоКт = Опер.СубконтоКт(1);
ТЗРезультат.СуммаПроводки = Опер.Сумма;
ТЗРезультат.Содержание = Опер.Содержание;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Теперь ТЗРезультат содержит все необходимые данные для отчета
// Мы можем вывести ее на форму или использовать для дальнейшей обработки.
ТЗРезультат.Вывести();
Важные моменты при программном переборе:
Документ.Операция, а затем для каждого такого документа использовать метод НайтиОперацию() объекта Операция. Ошибка, как показано в сообщении 9, когда мы пытаемся вызвать Опер.ВыбратьПроводки() без предварительного выбора операции, приведет к ошибке "Операция не выбрана!".СубконтоДт(Индекс) или СубконтоКт(Индекс), где Индекс — это номер субконто (1, 2, 3, 4) в плане счетов. Нам необходимо знать, к какому субконто привязан вид затрат в нашей конфигурации. Альтернативно, можно использовать более универсальный доступ через Опер.Субконто(ВидСубконто.ИмяВидаСубконто), но это требует предварительного получения объекта ВидСубконто.Опер.Содержание может быть последней инстанцией для поиска нужных проводок по ключевым словам. Однако этот метод менее надежен и более подвержен ошибкам, чем фильтрация по счетам и субконто.Мы рекомендуем выбирать метод в зависимости от требований к детализации отчета:
БухгалтерскиеИтоги. Это наиболее эффективный способ.Для обеспечения точности налогового учета всегда проверяем корректность заполнения аналитики (субконто) при вводе операций вручную. Чем точнее заполнена аналитика, тем проще и надежнее будет извлекать данные для отчетов, будь то с помощью БухИтогов или программного перебора.
Таким образом, мы видим, что, несмотря на некоторые особенности работы с «Операцией, введенной вручную», 1С v7.7 предоставляет все необходимые механизмы для извлечения нужных данных. Выбор конкретного метода будет зависеть от сложности и требований к детализации нашего отчета.