Как добавить кнопку печати в форму списка документа и скрыть колонку Ссылка без ошибок

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

При разработке собственных документов в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11 (УТ 3.2), ERP или Комплексная автоматизация, программисты часто сталкиваются с задачей вывода команд печати в форму списка. Казалось бы, алгоритм стандартный: прописать команды в модуле менеджера, подключить их в форме. Однако возникает неприятный нюанс: если мы хотим скрыть колонку Ссылка в таблице списка, стандартный механизм печати выдает ошибку «Поле объекта не обнаружено». Рассмотрим подробнее, почему это происходит и как правильно настроить форму.

Разбор ситуации: Почему возникает ошибка при печати?

Проанализируем ситуацию. В современных версиях платформы 1С:Предприятие 8.3 реализован механизм оптимизации обмена данными между сервером и клиентом. Когда мы работаем с динамическим списком, платформа старается минимизировать объем передаваемой информации. Если у колонки (элемента формы) снят флаг Видимость, платформа считает, что данные этой колонки на клиенте не нужны, и просто не выбирает их из базы данных.

Функция БСП УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати обращается к данным выделенных строк. Если колонка Ссылка скрыта программно или через свойства формы, массив данных строки на клиенте не содержит ссылки. В итоге, при попытке извлечь ТекущаяСтрока.Ссылка, система закономерно выдает ошибку.

Решение №1: Использование свойства Использовать всегда

Это самый корректный и эффективный способ решения проблемы. Нам необходимо заставить платформу передавать данные поля Ссылка на клиент, даже если сама колонка не отображается пользователю. Разберем по шагам, как это сделать в конфигураторе:

  1. Откроем форму списка вашего документа.
  2. Перейдем на вкладку Реквизиты и найдем основной реквизит Список (тип ДинамическийСписок).
  3. Нажмем правой кнопкой мыши на Список и выберем пункт Настройка списка (или раскроем дерево элементов до раздела Поля).
  4. В списке полей найдем поле Ссылка.
  5. Установим для него флаг Использовать всегда.

Что это дает? Данная настройка сообщает платформе: «Независимо от того, видит ли пользователь это поле на экране, оно должно быть включено в выборку запроса и передано на клиент». Теперь, даже если колонка Ссылка удалена из элементов формы или ее видимость установлена в Ложь, программный код сможет получить значение ссылки для печати.

Решение №2: Правильное программное подключение печати

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализация команд печати БСП
    УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма);
    
    // Если нужно скрыть колонку программно, 
    // но мы уже установили "Использовать всегда", это не вызовет ошибку
    Элементы.СписокСсылка.Видимость = Ложь;
    
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
    
    // Важно передавать именно Элементы.Список, 
    // чтобы механизм БСП сам определил все выделенные строки
    УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Элементы.Список);
    
КонецПроцедуры

Решение №3: Проверка Основной таблицы

Проанализируем еще одну возможную причину сбоев. Для того чтобы функции УправлениеПечатью работали автоматически, динамический список должен «понимать», объекты какого типа он отображает. Проверьте следующее:

Различие между Видимостью и Пользовательской видимостью

Рассмотрим нюанс управления интерфейсом. Если вы установите Элементы.Ссылка.Видимость = Ложь в коде ПриСозданииНаСервере, элемент управления физически не создается на клиенте. Однако, если использовать свойство Пользовательская видимость в конфигураторе, или просто не выносить поле Ссылка в состав элементов формы (но оставив его в составе полей динамического списка с флагом Использовать всегда), это обеспечит более стабильную работу механизма БСП.

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


// НЕПРАВИЛЬНО для массовой печати
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
    // Передача только одной ссылки вместо таблицы списка
    МассивСсылок = Новый Массив;
    Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
        МассивСсылок.Добавить(Элементы.Список.ТекущиеДанные.Ссылка);
        УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, МассивСсылок);
    КонецЕсли;
КонецПроцедуры

Почему это плохо? Если пользователь выделит в списке 10 документов и нажмет «Печать», при таком коде распечатается только один — тот, на котором стоит курсор. Стандартный метод БСП, принимающий Элементы.Список в качестве источника, автоматически обходит коллекцию ВыделенныеСтроки и формирует правильный массив для передачи в менеджер печати.

Резюме для успешной реализации

Подведем итоги. Чтобы кнопка печати в форме списка собственного документа работала без ошибок при скрытой колонке ссылки, необходимо:

  1. В модуле менеджера объекта реализовать процедуру ДобавитьКомандыПечати(КомандыПечать).
  2. В динамическом списке формы (в реквизитах) для поля Ссылка установить флаг Использовать всегда.
  3. Убедиться, что у динамического списка установлена Основная таблица.
  4. В обработчике команды печати на клиенте передавать в подсистему БСП сам элемент формы Элементы.Список.
  5. Для скрытия колонки использовать свойства видимости в конфигураторе, не беспокоясь о потере данных на клиенте благодаря настройке Использовать всегда.

Соблюдение этих правил обеспечит корректную работу интерфейса и позволит избежать трудноуловимых ошибок при взаимодействии серверной и клиентской частей платформы 1С:Предприятие.

← На главную