Как сгруппировать данные по номенклатуре и сохранить ссылки на документы без дублирования строк

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

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

Проблема прямого соединения таблиц документов

Разберем типичную ошибку начинающих разработчиков на примере исходного запроса. Когда мы пытаемся соединить таблицу «ПоступлениеМЗ.Материалы» с таблицей «АктСписанияМЗ.Материалы» напрямую через ПОЛНОЕ СОЕДИНЕНИЕ, возникает эффект «декартова произведения». Если по одной номенклатуре было два поступления и три списания, в результате запроса может получиться шесть строк, а итоговые суммы будут многократно завышены.

Анализируем правильный подход к запросу: вместо соединения разных типов документов в одном запросе, необходимо сначала собрать данные по каждому типу во временные таблицы, а затем объединить их. Еще лучше — использовать механизм ОБЪЕДИНИТЬ ВСЕ.


// Сначала собираем все движения в одну временную таблицу
ВЫБРАТЬ
    ТЧ.Номенклатура КАК Номенклатура,
    ТЧ.Количество КАК КоличествоПоступило,
    0 КАК КоличествоСписано,
    ТЧ.Ссылка КАК Документ
ПОМЕСТИТЬ втДанные
ИЗ
    Документ.ПоступлениеМЗ.Материалы КАК ТЧ
ГДЕ
    ТЧ.Ссылка.Проведен

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТЧ.Номенклатура,
    0,
    ТЧ.Количество,
    ТЧ.Ссылка
ИЗ
    Документ.АктСписанияМЗ.Материалы КАК ТЧ
ГДЕ
    ТЧ.Ссылка.Проведен;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    вт.Номенклатура,
    СУММА(вт.КоличествоПоступило) КАК ПоступилоВсего,
    СУММА(вт.КоличествоСписано) КАК СписаноВсего
ИЗ
    втДанные КАК вт
СГРУППИРОВАТЬ ПО
    вт.Номенклатура

В этом примере мы получили чистые итоги по номенклатуре, но потеряли ссылки. Чтобы вернуть их и не испортить группировку, воспользуемся Системой компоновки данных (СКД).

Решение через иерархию группировок в СКД

Самый методически верный способ в 1С — это разделение итогов и детальных записей на уровне настроек отчета. Проанализируем, как это настроить:

  1. Настройка ресурсов: В схеме компоновки данных (СКД) на закладке «Ресурсы» добавим поля КоличествоПоступило и КоличествоСписано с функцией СУММА.
  2. Структура отчета: На закладке «Настройки» создадим иерархию группировок.
    • Верхний уровень: Группировка по полю Номенклатура.
    • Вложенный уровень: Группировка по полю Документ (или детальные записи).

В таком случае в отчете мы увидим одну строку по товару с общими суммами. Слева от названия товара появится «плюсик», при нажатии на который раскроется список всех документов с их частными количествами. Это решает проблему дублей в основной строке.

Использование агрегатных функций для вывода ссылок в одной строке

Если заказчик требует, чтобы ссылки отображались прямо в той же строке, где и номенклатура (например, через запятую), мы можем воспользоваться функциями агрегации СКД. Рассмотрим функцию СоединитьСтроки.

В настройках ресурсов для поля Документ (которое в запросе не должно быть в секции СГРУППИРОВАТЬ ПО) пропишем следующее выражение:

СоединитьСтроки(Различные Документ, ", ", "Нет документов")

В этом случае платформа сама соберет все уникальные ссылки по данной номенклатуре в одну текстовую строку. При этом в ячейке сохранятся расшифровки, и пользователь сможет кликнуть на конкретный документ в списке.

Работа с регистрами: почему это важно

Выясним причину, по которой опытные разработчики советуют не строить отчеты напрямую по документам. Документы описывают событие, но не состояние. Если вы строите отчет по табличным частям, вам приходится вручную обрабатывать признаки проведения, пометки удаления и возвраты.

Проанализируем преимущества регистров: Если в вашей конфигурации данные из документов «ПоступлениеМЗ» и «АктСписанияМЗ» попадают в регистр (например, Регистр Бухгалтерии или Регистр Накопления), запрос к виртуальной таблице ОстаткиИОбороты будет гораздо эффективнее.


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт КАК Поступило,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт КАК Списано,
    ХозрасчетныйОстаткиИОбороты.Регистратор КАК Документ
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , Счет = &СчетМЗ, , ) КАК ХозрасчетныйОстаткиИОбороты

Используя параметр Периодичность = Авто или Периодичность = Регистратор, вы получаете доступ к документам-регистраторам. В СКД при группировке по номенклатуре ресурсы (количество) будут просуммированы корректно, а регистратор останется доступным для расшифровки или вложенных группировок.

Механизм расшифровки (Drill-down)

Если вы хотите, чтобы отчет выглядел максимально просто (только Номенклатура и Суммы), но при двойном клике на сумму открывался список документов, вам даже не нужно выводить поле Ссылка в выбранные поля отчета. Достаточно, чтобы оно присутствовало в наборе данных запроса.

Рассмотрим по шагам настройку такой расшифровки в СКД:

  1. Добавьте поле Ссылка в запрос.
  2. В настройках СКД на уровне группировки «Номенклатура» не добавляйте поле Ссылка в выбранные поля.
  3. При формировании отчета платформа автоматически запомнит контекст. При двойном клике на номенклатуру пользователь сможет выбрать «Расшифровать» и указать поле «Документ» — откроется новый отчет или список документов, относящихся именно к этой строке.

Таким образом, мы разделяем визуальное представление данных и их внутреннюю структуру, обеспечивая чистоту отчета и удобство навигации.

← На главную