Как получить себестоимость товара в 1С 7.7 из проводок

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

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

Метод 1: Использование объекта БухгалтерскиеИтоги

Это рекомендуемый и самый надежный способ получения данных из бухгалтерского учета в 1С 7.7. Объект БухгалтерскиеИтоги оптимизирован для работы с планом счетов и аналитикой (субконто).

Рассмотрим ситуацию, когда нам нужно найти проводки списания себестоимости (Дебет 90.2.1 — Кредит 41.1). Важно помнить, что в 1С 7.7 аналитика по номенклатуре обычно привязана к 41 счету. Поэтому, если мы анализируем обороты между этими счетами, нам нужно использовать методы для работы с корреспондирующими субконто.

Проанализируем пример кода, который исправляет типичную ошибку «пустого результата»:


Процедура Сформировать()
    Перем БИ;
    БИ = СоздатьОбъект("БухгалтерскиеИтоги");
    
    // Указываем, что нас интересует аналитика по номенклатуре
    // Если мы смотрим со стороны 90 счета на 41, номенклатура будет КорСубконто
    БИ.ИспользоватьКорСубконто(ВидыСубконто.Номенклатура, ВыбТовар, 2);
    
    // Выполняем запрос по конкретным счетам за нужный период
    // Параметры: ДатаНач, ДатаКон, Счет, КорСчет, Валюта, ТипИтогов, Периодичность, ПоЗабалансовым
    БИ.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, "90.2.1", "41.1", , 3, , "СК");
    
    // Выбираем корреспондирующие субконто (номенклатуру со счета 41.1)
    БИ.ВыбратьКорСубконто(ВидыСубконто.Номенклатура);
    
    Пока БИ.ПолучитьКорСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
        Товар = БИ.КорСубконто(ВидыСубконто.Номенклатура);
        Себестоимость = БИ.КорКО("С"); // Сумма корреспондирующего оборота (Кредитового для 41 счета)
        Количество = БИ.КорКО("К");    // Количество корреспондирующего оборота
        
        Сообщить("Товар: " + Товар + " | Сумма: " + Себестоимость + " | Кол-во: " + Количество);
    КонецЦикла;
КонецПроцедуры

Важный нюанс: В методе ВыполнитьЗапрос использование седьмого параметра (тип итогов) со значением 3 позволяет получить разворот по проводкам и периодам, что необходимо для детального анализа.

Метод 2: Особенности прямого запроса к операциям

Если вы все же решили использовать объект Запрос, как в исходном вопросе, необходимо обратить внимание на типичные ошибки типизации. В 1С 7.7 обращение через точку к субконто в запросе (например, Операция.КорСубконто.Номенклатура) крайне нестабильно.

Выясним причину, почему запрос может быть пустым:

  1. Порядок субконто: На счете 90.2.1 «Номенклатура» может не быть первым субконто. Если первым идет «Виды номенклатуры», то прямой запрос может не увидеть объект.
  2. Условие по содержанию: Проверка Условие(СодержаниеПроводки = "Себестоимость товара") очень жесткая. Если в базе есть лишний пробел или текст написан в другом регистре, условие отсечет все данные. Лучше временно убрать это условие для отладки.
  3. Счета по коду: Убедитесь, что функция СчетПоКоду("90.2.1") возвращает существующий счет. В разных конфигурациях коды счетов могут различаться (например, "90.2" вместо "90.2.1").

Метод 3: Работа через COM-соединение (из 1С 8 в 1С 7.7)

Если задача стоит в получении данных из 1С 8.x, мы не можем просто передать ссылку на товар из «восьмерки» в запрос «семерки». Проанализируем правильный алгоритм:

  1. Создаем COM-объект V77.Application.
  2. Находим нужный товар в контексте 7.7 по коду или наименованию.
  3. Вызываем экспортную функцию из глобального модуля 7.7, которая выполнит поиск (как в Методе 1) и вернет результат.

Посмотрим на пример вызова метода через OLE:


// Код на стороне 1С 8
Товар77 = База77.CreateObject("Reference.Номенклатура");
Если Товар77.FindByName("ВашТовар") = 1 Тогда
    ТекТовар77 = Товар77.CurrentItem();
    // Далее используем ТекТовар77 в параметрах Бухгалтерских Итогов
КонецЕсли;

Почему не рекомендуется использовать "Черный запрос" для проводок?

Опытные разработчики 1С 7.7 отмечают, что объект Запрос по метаданным Операция работает значительно медленнее, чем БухгалтерскиеИтоги. Кроме того, «черный запрос» обращается к таблице проводок напрямую, не используя предварительно рассчитанные итоги, что создает избыточную нагрузку на базу данных при больших объемах информации.

Подведем итог: Для получения себестоимости всегда отдавайте предпочтение объекту БухгалтерскиеИтоги. Используйте метод ИспользоватьКорСубконто, чтобы отфильтровать данные по конкретному товару, который находится на стороне кредита (счет 41), когда вы анализируете дебет (счет 90).

← На главную