Почему при печати документа в 1С:Бухгалтерия 3.0 выводятся сразу все документы и как это исправить

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке новых документов в современных конфигурациях на платформе 1С:Предприятие 8.3, таких как «Бухгалтерия предприятия 3.0», программисты часто сталкиваются с ситуацией, когда механизм печати ведет себя некорректно. Одной из самых загадочных на первый взгляд проблем является «массовая печать»: вы выбираете один конкретный документ (например, созданный вами «Акт приемки»), нажимаете кнопку «Печать», а система формирует печатные формы для всех существующих в базе документов этого типа. В этой статье мы подробно разберем, почему так происходит, как работает подсистема управления печатью и как быстро устранить эту ошибку.

Анализ механизма управления печатью в БСП

Прежде всего, разберем, как устроена печать в типовых решениях. В Бухгалтерии 3.0 используется подсистема «Управление печатью» из состава Библиотеки стандартных подсистем (БСП). В отличие от старых конфигураций, где печать могла вызываться напрямую из формы, здесь логика разделена. Основная работа происходит в модуле менеджера документа в процедуре Печать.

Важно понимать ключевую особенность: когда пользователь инициирует печать, система передает в модуль менеджера не одну ссылку на документ, а всегда массив ссылок (параметр МассивОбъектов). Даже если в списке выбран только один документ, он будет помещен в массив. Это сделано для унификации групповой и одиночной печати. Если программист при написании запроса для получения данных документа забывает об этом факте, возникают проблемы.

Разбор типичной ошибки в коде запроса

Рассмотрим ситуацию, с которой столкнулся автор темы. При создании нового документа «Акт приемки» путем копирования существующего (например, «Счета на оплату»), логика формирования печатной формы переносится в новый модуль менеджера. Проанализируем, где именно кроется ошибка. Как правило, в процедуре формирования данных используется запрос к таблице документа.

Если запрос выглядит следующим образом, он является ошибочным:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	_АктПриемкиТехники.Ссылка КАК Ссылка,
    |	_АктПриемкиТехники.Номер КАК Номер,
    |	_АктПриемкиТехники.Дата КАК Дата,
    |	_АктПриемкиТехники.Контрагент КАК Контрагент
    |ИЗ
    |	Документ._АктПриемкиТехники КАК _АктПриемкиТехники";

В данном примере отсутствует секция фильтрации. Поскольку запрос выполняется в серверном контексте, он обращается к базе данных и выбирает абсолютно все записи из таблицы Документ._АктПриемкиТехники. Затем цикл обработки результатов запроса формирует макет для каждой найденной записи. В итоге пользователь получает на экран огромный список печатных форм вместо одной ожидаемой.

Правильная реализация фильтрации по массиву объектов

Чтобы исправить эту проблему, необходимо обязательно наложить условие на выборку данных, используя переданный в процедуру массив ссылок. Выясним, как должен выглядеть корректный код. Нам нужно добавить условие ГДЕ и установить параметр запроса.

Разберем исправленный вариант запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	_АктПриемкиТехники.Ссылка КАК Ссылка,
    |	_АктПриемкиТехники.Номер КАК Номер,
    |	_АктПриемкиТехники.Дата КАК Дата,
    |	_АктПриемкиТехники.Контрагент КАК Контрагент
    |ИЗ
    |	Документ._АктПриемкиТехники КАК _АктПриемкиТехники
    |ГДЕ
    |	_АктПриемкиТехники.Ссылка В(&МассивОбъектов)";

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

Именно использование конструкции В(&МассивОбъектов) гарантирует, что система выберет только те документы, которые пользователь выделил в списке или открыл для печати. Это критически важный момент для любого документа в конфигурациях на БСП.

Особенности отладки печати в фоновых заданиях

Иногда программисты сталкиваются с тем, что в отладчике массив выглядит правильно (содержит одну ссылку), но результат все равно неверный. Рассмотрим, почему это происходит. В современных версиях платформы (8.3.15 и выше) формирование печатных форм часто выносится в фоновые задания для повышения отзывчивости интерфейса.

Если вы установили точку останова в модуле менеджера, а она не срабатывает, необходимо выполнить следующие действия:

  1. Проверить настройки отладки в конфигураторе.
  2. Убедиться, что включена «Отладка фоновых заданий».
  3. В некоторых случаях для тестирования можно временно отключить фоновую печать в настройках программы (если конфигурация это позволяет) или использовать отладочный вызов через УправлениеПечатью.СформироватьПечатныеФормыДляТестирования.

Рекомендации по оптимизации и расширению функционала

Проанализируем еще несколько важных аспектов, которые помогут сделать механизм печати более надежным:

1. Использование типизации ссылок. Если ваш запрос собирает данные из разных типов документов (например, вы делаете общую печатную форму для Акта и Заказа), всегда проверяйте типы объектов в массиве или делайте объединение запросов с фильтрацией по ССЫЛКА.

2. Проверка коллекции печатных форм. В процедуре Печать есть таблица КоллекцияПечатныхФорм. Убедитесь, что вы добавляете в нее строку только для тех макетов, которые были запрошены пользователем. Проверить это можно с помощью функции УправлениеПечатью.НужноПечататьМакет.

3. Сортировка результатов. Чтобы порядок документов в печатной форме соответствовал порядку их выбора пользователем, рекомендуется использовать временные таблицы для сохранения порядка ссылок из массива или добавлять УПОРЯДОЧИТЬ ПО в финальный запрос.

4. Очистка кэша сервера. В редких случаях, особенно в серверных базах, изменения в модуле менеджера могут не подхватываться сразу из-за кэширования. Если вы добавили условие ГДЕ, но печать все равно выводит лишнее — попробуйте перезапустить сеанс или очистить серверный кэш.

Заключение

Мы выяснили, что причина «глюка» с печатью всей базы кроется в архитектурной особенности БСП: передаче массива объектов и необходимости явной фильтрации в запросе. Помните, что при создании объектов копированием нужно быть предельно внимательным к текстам запросов в модулях менеджеров. Добавление условия ГДЕ Ссылка В (&МассивОбъектов) — это обязательный стандарт при разработке подсистем печати в 1С:Бухгалтерия 3.0.

← На главную