При работе в 1С:Предприятии 7.7 задача получения данных о себестоимости товаров из бухгалтерских проводок может вызвать затруднения, особенно если вы привыкли к механизмам 1С 8.x. Основная сложность заключается в том, что стандартный объект Запрос (так называемый «черный запрос») не всегда корректно и эффективно справляется с анализом бухгалтерских итогов и проводок. Разберем наиболее эффективные способы решения этой задачи.
Это рекомендуемый и самый надежный способ получения данных из бухгалтерского учета в 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 позволяет получить разворот по проводкам и периодам, что необходимо для детального анализа.
Если вы все же решили использовать объект Запрос, как в исходном вопросе, необходимо обратить внимание на типичные ошибки типизации. В 1С 7.7 обращение через точку к субконто в запросе (например, Операция.КорСубконто.Номенклатура) крайне нестабильно.
Выясним причину, почему запрос может быть пустым:
Условие(СодержаниеПроводки = "Себестоимость товара") очень жесткая. Если в базе есть лишний пробел или текст написан в другом регистре, условие отсечет все данные. Лучше временно убрать это условие для отладки.СчетПоКоду("90.2.1") возвращает существующий счет. В разных конфигурациях коды счетов могут различаться (например, "90.2" вместо "90.2.1").Если задача стоит в получении данных из 1С 8.x, мы не можем просто передать ссылку на товар из «восьмерки» в запрос «семерки». Проанализируем правильный алгоритм:
V77.Application.Посмотрим на пример вызова метода через OLE:
// Код на стороне 1С 8
Товар77 = База77.CreateObject("Reference.Номенклатура");
Если Товар77.FindByName("ВашТовар") = 1 Тогда
ТекТовар77 = Товар77.CurrentItem();
// Далее используем ТекТовар77 в параметрах Бухгалтерских Итогов
КонецЕсли;
Опытные разработчики 1С 7.7 отмечают, что объект Запрос по метаданным Операция работает значительно медленнее, чем БухгалтерскиеИтоги. Кроме того, «черный запрос» обращается к таблице проводок напрямую, не используя предварительно рассчитанные итоги, что создает избыточную нагрузку на базу данных при больших объемах информации.
Подведем итог: Для получения себестоимости всегда отдавайте предпочтение объекту БухгалтерскиеИтоги. Используйте метод ИспользоватьКорСубконто, чтобы отфильтровать данные по конкретному товару, который находится на стороне кредита (счет 41), когда вы анализируете дебет (счет 90).