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