В типовых и нетиповых конфигурациях 1С часто возникает ситуация, когда документ создается на основании другого документа, но ссылка на документ-основание хранится не в реквизите шапки ДокументОснование, а в строках табличной части (например, реквизит ДокументПартии в документе ПоступлениеДопРасходов). Рассмотрим, как правильно извлечь данные и рассчитать сумму таких подчиненных документов для отображения в форме документа-основания.
Проанализируем специфику документа ПоступлениеДопРасходов. В одной табличной части документа доп. расходов может быть указано несколько разных документов партий (или несколько строк по одному и тому же документу). Если в запросе обращаться к реквизиту Сумма шапки документа, возникнут следующие проблемы:
Таким образом, для получения корректной суммы затрат по конкретному документу-основанию необходимо суммировать именно строки табличной части (поле Сумма), относящиеся к данному основанию, и обязательно фильтровать проведенные документы.
Разберем, как составить оптимальный запрос. Обратите внимание, что в платформе 1С:Предприятие нет необходимости делать явное соединение табличной части с шапкой документа, так как обратиться к реквизитам шапки можно через точку от реквизита Ссылка табличной части.
Посмотрим на пример запроса для получения итоговой суммы дополнительных расходов по конкретному документу-партии:
ВЫБРАТЬ
ПоступлениеДопРасходовТовары.ДокументПартии КАК ДокументПартии,
СУММА(ПоступлениеДопРасходовТовары.Сумма) КАК СуммаДопРасходов,
СУММА(ПоступлениеДопРасходовТовары.СуммаНДС) КАК СуммаНДСДопРасходов
ИЗ
Документ.ПоступлениеДопРасходов.Товары КАК ПоступлениеДопРасходовТовары
ГДЕ
ПоступлениеДопРасходовТовары.ДокументПартии = &ДокументОснование
И ПоступлениеДопРасходовТовары.Ссылка.Проведен = ИСТИНА
И ПоступлениеДопРасходовТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
СГРУППИРОВАТЬ ПО
ПоступлениеДопРасходовТовары.ДокументПартии
Если требуется получить детализацию в разрезе конкретных подчиненных документов, добавим группировку по ссылке на документ доп. расходов:
ВЫБРАТЬ
ПоступлениеДопРасходовТовары.Ссылка КАК ДокументДопРасходов,
СУММА(ПоступлениеДопРасходовТовары.Сумма) КАК Сумма,
СУММА(ПоступлениеДопРасходовТовары.СуммаНДС) КАК СуммаНДС
ИЗ
Документ.ПоступлениеДопРасходов.Товары КАК ПоступлениеДопРасходовТовары
ГДЕ
ПоступлениеДопРасходовТовары.ДокументПартии = &ДокументОснование
И ПоступлениеДопРасходовТовары.Ссылка.Проведен = ИСТИНА
СГРУППИРОВАТЬ ПО
ПоступлениеДопРасходовТовары.Ссылка
Выбор способа расчета зависит от того, где именно требуется отображать полученную сумму:
ПриСозданииНаСервере или ПриЧтенииНаСервере. Это не создает критической нагрузки на систему.СуммаДопРасходов. Заполнение и пересчет этого реквизита следует выполнять программно при проведении и отмене проведения подчиненного документа (ПоступлениеДопРасходов).Рассмотрим дополнительные способы получения связанных документов и итоговых сумм:
СвязанныеДокументы или СтруктураПодчиненности. Метод КритерииОтбора.[ИмяКритерия].Найти(&Ссылка) задействует штатные индексы платформы и быстро возвращает список всех документов, ссылающихся на исходный через шапку или табличные части.ПартииТоваровНаСкладах или СебестоимостьТоваров). Запрос к виртуальной таблице остатков или оборотов соответствующего регистра с отбором по регистратору или партии часто выполняется быстрее, чем прямое чтение табличных частей документов.