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