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