При разработке отчетов и обработок в среде 1С:Предприятие 7.7 программисты часто сталкиваются с ситуацией, когда объект БухгалтерскиеИтоги выдает данные не в том разрезе или не по тому направлению корреспонденции, которое ожидается. Особенно это актуально при работе с валютными счетами и сложной аналитикой (субконто). В этой статье мы подробно разберем, почему возникают ошибки при получении проводок по дебету и кредиту определенных счетов и как правильно реализовать эту задачу двумя способами.
Рассмотрим ситуацию, когда нам необходимо получить проводки, где в Дебете находится счет брокера (BROKER), а в Кредите — счет акций (SHARES). В коде автора мы видим попытку использовать фильтр по субконто и выполнение запроса по счету кредита:
Report.ИСПользоватьСубконто(ВидыСубконто.Brokers, Broker, 2);
Report.ИСПользоватьСубконто(ВидыСубконто.Shares,, 1,);
// ...
Report.ВыПолнитьЗаПроС(ВыбНачПериода, ВыбКонПериода, Ct, ,Currency,,"Проводка","СВК");
Проанализируем, почему такой подход может вернуть «проводки наоборот» или не вернуть нужные данные. Основная причина кроется в механизме работы метода ВыполнитьЗапрос. Когда мы передаем в качестве третьего параметра счет Ct (кредит), система считает его основным счетом запроса. Все установленные ранее фильтры ИспользоватьСубконто применяются именно к этому основному счету.
Если счет SHARES (акции) не имеет вида субконто Brokers, то запрос отработает некорректно. Кроме того, в 1С 7.7 при использовании периодичности "Проводка" важно понимать, что объект БухгалтерскиеИтоги собирает данные по счету, указанному в параметрах, независимо от того, в дебете он или в кредите, если не заданы дополнительные условия фильтрации корреспонденции.
Разберем, как правильно настроить БухгалтерскиеИтоги, чтобы получить строго определенную корреспонденцию. В методе ВыполнитьЗапрос есть четвертый параметр — КоррСчет. Это ключ к решению проблемы штатными средствами запроса.
Важные правила настройки:
Dt (брокер), так как по нему мы фильтруем конкретного брокера (Broker).Ct (акции)."Проводка".Посмотрим на исправленный пример кода:
Report = СоздатьОбъект("БухгалтерскиеИтоги");
// Фильтр по субконто основного счета (BROKER)
Report.ИспользоватьСубконто(ВидыСубконто.Brokers, ВыбБрокер, 2);
// Если нужно, фильтруем и по акциям, но помним, что в 7.7 фильтрация по кор. субконто ограничена
Report.ИспользоватьСубконто(ВидыСубконто.Shares, , 1);
// Выполняем запрос: Dt - основной, Ct - корреспондирующий
Report.ВыполнитьЗапрос(НачДата, КонДата, Dt, Ct, Валюта, 1, "Проводка", "С");
Report.ВыбратьПериоды();
Пока Report.ПолучитьПериод() = 1 Цикл
// Проверяем направление. Нам нужен Дт BROKER - Кт SHARES.
// Так как BROKER - основной счет запроса, проверяем его сторону в проводке.
Если Report.Операция.Дебет.Счет = Dt Тогда
// Это наша искомая проводка
Сообщить("Найдена проводка на сумму: " + Report.Операция.Сумма);
КонецЕсли;
КонецЦикла;
Как справедливо заметили участники обсуждения на форуме, для получения списка конкретных проводок часто эффективнее и надежнее использовать метод ВыбратьПроводки. Этот метод работает напрямую с журналом проводок, минуя механизм предварительного расчета итогов, что исключает ошибки, связанные с неправильной интерпретацией субконто в сложных запросах.
Проанализируем алгоритм работы с этим методом:
Проводки = СоздатьОбъект("Операция");
// Параметры: ДатаНач, ДатаКон, Счет, КоррСчет, Валюта, ПланСчетов
Проводки.ВыбратьПроводки(ВыбНачПериода, ВыбКонПериода, Dt, Ct, Currency);
Пока Проводки.ПолучитьПроводку() = 1 Цикл
// В этом цикле система УЖЕ отобрала только те проводки,
// где участвуют счета Dt и Ct в любой комбинации.
// Нам нужно отсечь "обратные" проводки (Дт SHARES - Кт BROKER).
Если (Проводки.Дебет.Счет = Dt) И (Проводки.Кредит.Счет = Ct) Тогда
// Дополнительная проверка субконто брокера
Если Проводки.Дебет.Субконто(ВидыСубконто.Brokers) = Broker Тогда
Sha = Проводки.Кредит.Субконто(ВидыСубконто.Shares);
Tra = Проводки.НомерСтроки; // Или другой идентификатор транзакции
Сообщение = "Найдена акция: " + Sha + " в строке " + Tra;
Сообщить(Сообщение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Преимущества метода ВыбратьПроводки:
Дебет.Счет и Кредит.Счет.БухгалтерскихИтогов (счета, субконто, периоды).В тексте обращения автора упоминается код счета с добавлением валюты: СчетПоКоду("BROKER" + Currency.Code). Выясним важный технический момент: в 1С 7.7 счета в плане счетов обычно имеют фиксированные коды. Если в вашей конфигурации для каждой валюты создан отдельный счет в плане счетов (например, BROKER.USD, BROKER.EUR), то такой подход оправдан.
Однако, если используется штатный валютный учет, то счет один, а учет ведется в разрезе справочника Валюты. В этом случае:
СчетПоКоду("BROKER").ВыполнитьЗапрос или ВыбратьПроводки.Если вы видите в коде «пляшущие буквы» (например, ИСПользоватьСубконто), это признак проблем с кодировкой в конфигураторе. Это часто происходит при переносе кода между системами с разными региональными настройками (Cyrillic vs Western). Чтобы избежать ошибок компиляции, рекомендуется:
Подведем итог: если вам нужно «скрестить» карточку счета с анализом по субконто и данные начинают «съезжать», самым надежным способом будет использование ВыбратьПроводки с последующей ручной фильтрацией условий внутри цикла. Это дает полный контроль над логикой выборки и исключает неоднозначность итогов.