При разработке отчетов по складским операциям программисты часто сталкиваются с задачей вывода не только количества списанных материалов, но и их стоимости. В документе Требование-накладная (или его современном аналоге Расход материалов) в табличной части Материалы обычно хранится только количество. Сумма же рассчитывается системой в момент проведения документа и записывается в регистры бухгалтерского или управленческого учета. Рассмотрим, как правильно построить запрос, чтобы получить полные данные для отчета.
Разберем ситуацию, с которой часто начинаются трудности. Попытка соединить табличную часть документа напрямую с регистром бухгалтерии по полю номенклатуры является ошибочной. Проанализируем пример некорректного кода:
|ИЗ
| Документ.ТребованиеНакладная КАК ТребованиеНакладная
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
| ПО ТребованиеНакладная.Материалы.Номенклатура = Хозрасчетный.Регистратор
В данном фрагменте мы видим сразу две критические ошибки. Во-первых, поле Регистратор в регистре содержит ссылку на документ, а не на объект справочника Номенклатура. Во-вторых, даже если соединение выполнено по регистратору, без привязки к конкретным строкам или аналитике (субконто), суммы будут дублироваться или выводиться неверно. Выясним причину: регистр бухгалтерии хранит данные в разрезе проводок, и для получения корректной суммы списания конкретного материала нужно обращаться к субконто счета учета.
Для того чтобы в отчете «вылезла» сумма, нам необходимо строить запрос не от документа, а от движений, которые этот документ сформировал в учете. Рассмотрим наиболее эффективный способ решения задачи — использование виртуальных таблиц регистра бухгалтерии.
Рассмотрим пример исправленного запроса, который позволяет вытащить номенклатуру, склад, количество и сумму одним набором данных:
ВЫБРАТЬ
Хозрасчетный.Регистратор КАК Регистратор,
Хозрасчетный.Период КАК Период,
Хозрасчетный.СубконтоКт1 КАК Номенклатура,
Хозрасчетный.СубконтоКт2 КАК Склад,
Хозрасчетный.КоличествоКт КАК Количество,
Хозрасчетный.Сумма КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНач, &ДатаКон,
Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)), , ) КАК Хозрасчетный
ГДЕ
Хозрасчетный.Регистратор ССЫЛКА Документ.ТребованиеНакладная
И Хозрасчетный.СубконтоКт2 = &Склад
Проанализируем, почему этот вариант работает лучше:
ДвиженияССубконто. Она автоматически разворачивает аналитику (Субконто1, Субконто2) в отдельные поля, что упрощает доступ к номенклатуре и складу.Важно помнить, что обращение к СубконтоКт1 или СубконтоКт2 напрямую («жесткое кодирование») может привести к ошибкам, если в плане счетов изменен порядок субконто. Профессиональный подход подразумевает использование функции ВЫРАЗИТЬ или обращение к типам через параметры виртуальной таблицы.
Разберем, как сделать запрос более гибким. Вместо физической таблицы движений лучше использовать виртуальную таблицу Обороты. Это позволит избежать дублирования строк в случае сложных проводок. Посмотрим на пример структуры такого запроса:
ВЫБРАТЬ
ХозрасчетныйОбороты.Регистратор,
ХозрасчетныйОбороты.Субконто1 КАК Номенклатура,
ХозрасчетныйОбороты.Субконто2 КАК Склад,
ХозрасчетныйОбороты.КоличествоРасход КАК Количество,
ХозрасчетныйОбороты.СуммаРасход КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Регистратор,
Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
ХозрасчетныйОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная
В данном случае мы используем периодичность Регистратор, что позволяет получить детализацию до каждого конкретного документа Требование-накладная.
Выясним важную причину, по которой сумма может не отображаться в отчете, даже если запрос написан идеально. В конфигурациях типа «1С:Бухгалтерия 3.0» или «1С:ERP», если в учетной политике установлено списание по средней стоимости, сумма списания в документе при его проведении может быть предварительной или вообще отсутствовать (если включено отложенное проведение).
Обратите внимание на следующие моменты:
Выручка и продажи или Себестоимость товаров, а не к бухгалтерскому регистру.После того как запрос отлажен, необходимо правильно организовать обход выборки в коде 1С. Рассмотрим стандартную схему вывода данных в ТабличныйДокумент:
Выборка = Запрос.Выполнить().Выбрать();
нпп = 0;
Пока Выборка.Следующий() Цикл
нпп = нпп + 1;
ОбластьДетальныхЗаписей.Параметры.Нпп = нпп;
ОбластьДетальныхЗаписей.Параметры.Номенклатура = Выборка.Номенклатура;
ОбластьДетальныхЗаписей.Параметры.Количество = Выборка.Количество;
ОбластьДетальныхЗаписей.Параметры.Сумма = Выборка.Сумма;
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЦикла;
При таком подходе данные будут выводиться построчно. Если в одном документе Требование-накладная несколько позиций одной и той же номенклатуры, они будут сгруппированы или разделены в зависимости от того, как сформированы проводки в регистре бухгалтерии. Для идеальной точности соответствия строк документа и строк отчета рекомендуется использовать объединение по полю НомерСтроки, если оно поддерживается в вашем регистре (через дополнительные реквизиты проводки).
Подведем итог: ключ к успешному отчету по суммам в Требовании-накладной — это отказ от прямого чтения табличных частей документа в пользу работы с регистрами бухгалтерии и их виртуальными таблицами.