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

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

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

Анализ исходной проблемы в коде

Рассмотрим ситуацию, когда нам необходимо получить проводки, где в Дебете находится счет брокера (BROKER), а в Кредите — счет акций (SHARES). В коде автора мы видим попытку использовать фильтр по субконто и выполнение запроса по счету кредита:


Report.ИСПользоватьСубконто(ВидыСубконто.Brokers, Broker, 2);
Report.ИСПользоватьСубконто(ВидыСубконто.Shares,, 1,);
// ...
Report.ВыПолнитьЗаПроС(ВыбНачПериода, ВыбКонПериода, Ct, ,Currency,,"Проводка","СВК");

Проанализируем, почему такой подход может вернуть «проводки наоборот» или не вернуть нужные данные. Основная причина кроется в механизме работы метода ВыполнитьЗапрос. Когда мы передаем в качестве третьего параметра счет Ct (кредит), система считает его основным счетом запроса. Все установленные ранее фильтры ИспользоватьСубконто применяются именно к этому основному счету.

Если счет SHARES (акции) не имеет вида субконто Brokers, то запрос отработает некорректно. Кроме того, в 1С 7.7 при использовании периодичности "Проводка" важно понимать, что объект БухгалтерскиеИтоги собирает данные по счету, указанному в параметрах, независимо от того, в дебете он или в кредите, если не заданы дополнительные условия фильтрации корреспонденции.

Способ 1. Использование объекта БухгалтерскиеИтоги с корреспондирующим счетом

Разберем, как правильно настроить БухгалтерскиеИтоги, чтобы получить строго определенную корреспонденцию. В методе ВыполнитьЗапрос есть четвертый параметр — КоррСчет. Это ключ к решению проблемы штатными средствами запроса.

Важные правила настройки:

  1. Основной счет: В качестве основного счета запроса (3-й параметр) лучше указывать счет, по которому задан наиболее жесткий фильтр субконто. В нашем примере это счет Dt (брокер), так как по нему мы фильтруем конкретного брокера (Broker).
  2. Корреспондирующий счет: В 4-й параметр передаем счет Ct (акции).
  3. Тип итогов: Для получения детальных проводок используем тип итогов "Проводка".

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


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.Операция.Сумма);
    КонецЕсли;
КонецЦикла;

Способ 2. Выборка через объект Операция (ВыбратьПроводки)

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

Проанализируем алгоритм работы с этим методом:


Проводки = СоздатьОбъект("Операция");
// Параметры: ДатаНач, ДатаКон, Счет, КоррСчет, Валюта, ПланСчетов
Проводки.ВыбратьПроводки(ВыбНачПериода, ВыбКонПериода, 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), то такой подход оправдан.

Однако, если используется штатный валютный учет, то счет один, а учет ведется в разрезе справочника Валюты. В этом случае:

  1. Счет нужно получать просто по его коду: СчетПоКоду("BROKER").
  2. Валюту нужно передавать как отдельный фильтр в метод ВыполнитьЗапрос или ВыбратьПроводки.
  3. Обязательно убедитесь, что у счета в плане счетов включен признак «Валютный», иначе фильтрация по валюте не сработает.

Советы по отладке и кодировке

Если вы видите в коде «пляшущие буквы» (например, ИСПользоватьСубконто), это признак проблем с кодировкой в конфигураторе. Это часто происходит при переносе кода между системами с разными региональными настройками (Cyrillic vs Western). Чтобы избежать ошибок компиляции, рекомендуется:

Подведем итог: если вам нужно «скрестить» карточку счета с анализом по субконто и данные начинают «съезжать», самым надежным способом будет использование ВыбратьПроводки с последующей ручной фильтрацией условий внутри цикла. Это дает полный контроль над логикой выборки и исключает неоднозначность итогов.

← На главную