При работе с конфигурацией «Рарус: Автотранспорт» редакции 5.5 на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с особенностями структуры путевых листов. В отличие от типовых решений, где заказчик (контрагент) обычно указывается в шапке документа, в специфических формах (например, в сдельных или повременных путевых листах) контрагент может находиться в табличной части. Это позволяет одному транспортному средству обслуживать нескольких заказчиков за один выезд.
Однако такая структура усложняет построение стандартных отчетов, таких как «Реестр путевых листов» (форма №8). Рассмотрим подробнее, как изменить запрос и логику обработки данных, чтобы добавить наименование контрагента в печатную форму отчета.
В стандартном отчете аРеестрПутевыхЛистов используется объект Запрос. Автор темы столкнулся с тем, что при попытке простого обращения к реквизиту ПЛ.Контрагент данные не выводятся или возникает ошибка, так как реквизита «Контрагент» в шапке некоторых видов документов попросту нет — он «спрятан» в строках. Выясним причину: запрос в 1С 7.7 при обходе группировки по документам не «видит» содержимое строк табличной части автоматически, если это не описано в тексте запроса и не обработано в цикле.
Для того чтобы данные из табличной части попали в выборку, нам необходимо явно указать их в тексте запроса и добавить соответствующую группировку. Разберем по шагам, как должен выглядеть модифицированный запрос в процедуре ПечатьФормы8().
Нам нужно добавить переменную Контрагент, которая ссылается на соответствующий реквизит табличной части для каждого вида путевого листа, и обязательно добавить группировку по этой переменной. Важно использовать флаг Без Групп, чтобы избежать попадания в отчет иерархии справочника контрагентов.
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать1)
|Период с (пвДатаНач) по (пвДатаКон);
|ОбрабатыватьДокументы все;
|Обрабатывать НеПомеченныеНаУдаление;
|ПЛ = Документ.аПЛ_Повременный.ТекущийДокумент, Документ.аПЛ_Сдельный.ТекущийДокумент, ...;
|Контрагент = Документ.аПЛ_Повременный.Контрагент, Документ.аПЛ_Сдельный.Контрагент;
|Группировка ПЛ;
|Группировка Контрагент Без Групп;
|"//}}ЗАПРОС
;
Обратите внимание: мы перечисляем источники для переменной Контрагент через запятую для всех типов документов, участвующих в отчете. Это ключевой момент для работы с полиморфными запросами в 1С 7.7.
После того как мы изменили текст запроса, нам нужно изменить алгоритм обхода результатов. Теперь у нас появилась вложенная группировка. Даже если в путевом листе всего один контрагент (одна строка), технически в структуре запроса это выглядит как подчиненный уровень.
Проанализируем обновленную логику цикла Пока Запрос.Группировка():
Пока Запрос.Группировка("ПЛ") = 1 Цикл
стрТабельный = ""; стрФИО = ""; стрГаражный = ""; стрКонтрагент = "";
докПЛ = Запрос.ПЛ;
// Получаем данные водителя и авто из шапки документа
спрВодитель = докПЛ.Водитель;
спрАвтомобиль = докПЛ.Автомобиль;
// Теперь заходим во вложенную группировку, чтобы достать контрагента
Если Запрос.Группировка("Контрагент") = 1 Тогда
// Берем первого найденного контрагента из строк ПЛ
стрКонтрагент = Запрос.Контрагент.Наименование;
КонецЕсли;
// Заполняем строковые переменные для вывода в таблицу
Если ПустоеЗначение(спрВодитель) = 0 Тогда
стрТабельный = спрВодитель.Код;
стрФИО = спрВодитель.Наименование;
КонецЕсли;
// Выводим секцию в печатную форму
тблТаб.ВывестиСекцию("Строка");
КонецЦикла;
В этой конструкции метод Запрос.Группировка("Контрагент") позволяет нам позиционироваться на данных табличной части. Если ваша задача предполагает, что в путевом листе может быть несколько разных заказчиков и их нужно вывести через запятую, вы можете заменить Если на Пока и накапливать результат в строку.
Конфигурация «Рарус: Автотранспорт» часто хранит макеты в Общих таблицах. Посмотрим на пример настройки ячейки в секции «Строка» макета ТМФ 8:
ТМФ 8.стрКонтрагент.Совет: Если вы боитесь повредить общую таблицу (которая может обновиться при накатке релиза), рекомендуется создать внешний отчет (файл .ert) и перенести макет в него. В коде отчета тогда нужно будет использовать метод тблТаб.ИсходнаяТаблица("ИмяТаблицыВнутриОтчета") без обращения к общим таблицам.
При использовании сложных группировок в 1С 7.7 следует помнить о производительности. Как отметил один из участников обсуждения, использование конструкции Упорядочить по ПЛ.ДатаДок, ПЛ.ВремяДок внутри текста запроса иногда может быть избыточным, так как группировка по документам (ПЛ) по умолчанию выдает результат в хронологическом порядке. Если вы столкнулись с ошибками выполнения запроса, попробуйте убрать явное упорядочивание — это может стабилизировать работу отчета.
Для успешного вывода данных из табличной части в реестр на платформе 1С 7.7 необходимо выполнить три условия:
Контрагент) в список переменных запроса.Запрос.Группировка() для доступа к значениям строк.Этот метод универсален и может быть использован для вывода любых данных из табличных частей (номенклатуры, адресов, сумм работ) в сводные отчеты по документам в среде 1С:Предприятие 7.7.