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