При разработке собственных документов в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11 (УТ 3.2), ERP или Комплексная автоматизация, программисты часто сталкиваются с задачей вывода команд печати в форму списка. Казалось бы, алгоритм стандартный: прописать команды в модуле менеджера, подключить их в форме. Однако возникает неприятный нюанс: если мы хотим скрыть колонку Ссылка в таблице списка, стандартный механизм печати выдает ошибку «Поле объекта не обнаружено». Рассмотрим подробнее, почему это происходит и как правильно настроить форму.
Проанализируем ситуацию. В современных версиях платформы 1С:Предприятие 8.3 реализован механизм оптимизации обмена данными между сервером и клиентом. Когда мы работаем с динамическим списком, платформа старается минимизировать объем передаваемой информации. Если у колонки (элемента формы) снят флаг Видимость, платформа считает, что данные этой колонки на клиенте не нужны, и просто не выбирает их из базы данных.
Функция БСП УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати обращается к данным выделенных строк. Если колонка Ссылка скрыта программно или через свойства формы, массив данных строки на клиенте не содержит ссылки. В итоге, при попытке извлечь ТекущаяСтрока.Ссылка, система закономерно выдает ошибку.
Это самый корректный и эффективный способ решения проблемы. Нам необходимо заставить платформу передавать данные поля Ссылка на клиент, даже если сама колонка не отображается пользователю. Разберем по шагам, как это сделать в конфигураторе:
Список (тип ДинамическийСписок).Список и выберем пункт Настройка списка (или раскроем дерево элементов до раздела Поля).Ссылка.Что это дает? Данная настройка сообщает платформе: «Независимо от того, видит ли пользователь это поле на экране, оно должно быть включено в выборку запроса и передано на клиент». Теперь, даже если колонка Ссылка удалена из элементов формы или ее видимость установлена в Ложь, программный код сможет получить значение ссылки для печати.
Выясним, как должен выглядеть программный код в форме списка, чтобы печать работала корректно для нескольких выделенных строк. Часто разработчики пытаются передать ТекущиеДанные.Ссылка, но это лишает пользователя возможности массовой печати. Посмотрим на правильную реализацию:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация команд печати БСП
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма);
// Если нужно скрыть колонку программно,
// но мы уже установили "Использовать всегда", это не вызовет ошибку
Элементы.СписокСсылка.Видимость = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
// Важно передавать именно Элементы.Список,
// чтобы механизм БСП сам определил все выделенные строки
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Элементы.Список);
КонецПроцедуры
Проанализируем еще одну возможную причину сбоев. Для того чтобы функции УправлениеПечатью работали автоматически, динамический список должен «понимать», объекты какого типа он отображает. Проверьте следующее:
Список должно быть заполнено поле Основная таблица (например, Документ.НашНовыйДокумент).Рассмотрим нюанс управления интерфейсом. Если вы установите Элементы.Ссылка.Видимость = Ложь в коде ПриСозданииНаСервере, элемент управления физически не создается на клиенте. Однако, если использовать свойство Пользовательская видимость в конфигураторе, или просто не выносить поле Ссылка в состав элементов формы (но оставив его в составе полей динамического списка с флагом Использовать всегда), это обеспечит более стабильную работу механизма БСП.
Посмотрим на пример того, как НЕ рекомендуется делать, если вы хотите сохранить возможность массовой печати:
// НЕПРАВИЛЬНО для массовой печати
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
// Передача только одной ссылки вместо таблицы списка
МассивСсылок = Новый Массив;
Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
МассивСсылок.Добавить(Элементы.Список.ТекущиеДанные.Ссылка);
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, МассивСсылок);
КонецЕсли;
КонецПроцедуры
Почему это плохо? Если пользователь выделит в списке 10 документов и нажмет «Печать», при таком коде распечатается только один — тот, на котором стоит курсор. Стандартный метод БСП, принимающий Элементы.Список в качестве источника, автоматически обходит коллекцию ВыделенныеСтроки и формирует правильный массив для передачи в менеджер печати.
Подведем итоги. Чтобы кнопка печати в форме списка собственного документа работала без ошибок при скрытой колонке ссылки, необходимо:
ДобавитьКомандыПечати(КомандыПечать).Ссылка установить флаг Использовать всегда.Элементы.Список.Соблюдение этих правил обеспечит корректную работу интерфейса и позволит избежать трудноуловимых ошибок при взаимодействии серверной и клиентской частей платформы 1С:Предприятие.