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