При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью доработки стандартных отчетов в типовых конфигурациях, таких как Управление торговлей 11, ERP Управление предприятием или Комплексная автоматизация. Для минимизации изменений в основной конфигурации используется механизм расширений. Однако при попытке заимствовать стандартную общую форму ФормаОтчета в расширение (даже без написания какого-либо программного кода) может возникнуть неприятная ситуация: кнопки «Печать» и «Сохранить» в командной панели отчета становятся неактивными (серыми). Это происходит как до формирования отчета, так и после вывода данных на экран.
В этой статье мы подробно разберем причины возникновения этой проблемы, проанализируем внутренние механизмы платформы и предложим несколько проверенных способов решения — от простого изменения настроек до программных обходов и создания альтернативных форм.
Для того чтобы эффективно решить проблему, нам необходимо понять, почему платформа блокирует кнопки вывода данных при переносе формы в контекст расширения. Выделим несколько ключевых причин:
8.3.16.1030.Результат и тип ТабличныйДокумент. При заимствовании формы в расширение путь к данным этого поля может «подмерзать», из-за чего командная панель считает, что выводить на печать нечего.Рассмотрим подробнее каждый метод решения этой проблемы, двигаясь от наиболее простых и правильных к обходным путям (костылям), если первые варианты по каким-то причинам применить невозможно.
Поскольку проблема носит преимущественно платформенный характер, наиболее правильным решением будет обновление платформы 1С:Предприятие. Ошибки взаимодействия расширений с общими формами отчетов были массово устранены разработчиками начиная с версии 8.3.16.1030.
Если у вас установлена более старая версия, выполните обновление сервера и клиентских приложений до актуального релиза ветки 8.3.16, 8.3.18 или выше. Во многих случаях после обновления платформы кнопки «Печать» и «Сохранить» автоматически возвращаются в активное состояние без изменения кода.
Если обновить платформу оперативно невозможно, проанализируем настройки самого расширения конфигурации. Выполним следующие шаги:
F4).Версия 8.3.14, то и в расширении должна стоять именно она.Ложь). Если безопасный режим активен, платформа может блокировать интерактивные операции с файловой системой и принтерами.Если стандартное заимствование формы ФормаОтчета продолжает блокировать кнопки, воспользуемся обходным приемом, который рекомендуют опытные специалисты. Суть метода заключается в том, чтобы заставить платформу воспринимать форму не как заимствованный «чужой» объект, а как «собственный» объект расширения.
Разберем этот процесс по шагам:
_ДемоФормаОтчета.Ctrl+A), скопируем их и вставим в нашу новую форму _ДемоФормаОтчета._ДемоФормаОтчета вместо стандартной.Поскольку форма создана непосредственно в расширении, платформа инициализирует её контекст и стандартные команды со стопроцентной надежностью, и кнопки печати и сохранения будут полностью активны.
Если вы не хотите создавать дубликаты форм и переносить программный код, можно попытаться программно вернуть доступность кнопкам управления в момент инициализации или обновления отображения формы.
Для этого откроем модуль заимствованной формы отчета в расширении и добавим обработчики событий. Проанализируем пример кода:
&НаСервере
Процедура _ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Явно указываем элементу "Результат" отображать состояние печати
Если Элементы.Найти("Результат") <> Неопределено Тогда
Элементы.Результат.ОтображатьСостояниеПечати = Истина;
КонецЕсли;
// Если в конфигурации используется БСП, можно принудительно включить доступность команд печати
Попытка
ЭтаФорма.ДоступностьКомандПечати = Истина;
Исключение
// Игнорируем ошибку, если свойство отсутствует в данной версии БСП
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура _ПриОткрытииПосле(Отказ)
// Вызываем принудительное обновление отображения данных на клиенте
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
В данном коде метод ОтображатьСостояниеПечати = Истина связывает поле табличного документа с контекстом вывода на печать, а вызов метода ОбновитьОтображениеДанных() заставляет платформу перерисовать интерфейс и пересчитать доступность стандартных кнопок в командной панели формы.
Иногда проблема кроется в том, что права на вывод данных («Вывод») теряются при прохождении через контекст безопасности расширения. Проанализируем решение с добавлением специальной роли:
_ОсновнаяРольРасширения.Вывод и Сохранение данных пользователя на уровне всей конфигурации).Использование этого комплекса мер позволяет гарантированно обойти любые ограничения платформы 1С:Предприятие 8.3, связанные с недоступностью печати и сохранения файлов из заимствованных общих форм отчетов.