Каждый разработчик и администратор систем «1С:Предприятие» рано или поздно сталкивается с ситуацией, когда пользователи жалуются на невозможность сохранить сформированный отчет или печатную форму. Кнопки «Сохранить» и «Сохранить как» (а также соответствующие пункты в главном меню «Файл») неожиданно становятся серыми и неактивными. При этом у пользователя могут быть полные права в системе, что вызывает еще больше недоумения.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем взаимосвязь ключевых свойств табличного документа и предложим пошаговые варианты решения — от простых манипуляций со свойствами формы до написания собственного механизма экспорта данных.
Выясним главные причины блокировки сохранения и разберем методы их устранения.
---
Очень часто разработчики путают назначение свойств табличного документа, отвечающих за редактирование и безопасность данных. Из-за этого возникает ситуация, когда при попытке запретить пользователю изменять ячейки отчета одновременно блокируется и возможность его выгрузки в файлы сторонних форматов (Excel, PDF, Word).
Проанализируем, как эти свойства работают на самом деле:
Защита (уровень всего табличного документа): Если установить ТабличныйДокумент.Защита = Истина, платформа переходит в режим строгой защиты конфиденциальной информации. В этом режиме документ категорически запрещено сохранять на диск, копировать его ячейки в буфер обмена или отправлять по электронной почте. Доступной остается только непосредственная печать на принтер. Кнопки сохранения гарантированно заблокируются платформой.ТолькоПросмотр: Если установить ТабличныйДокумент.ТолькоПросмотр = Истина, пользователь не сможет вручную редактировать текст и формулы в ячейках. Однако он по-прежнему сможет копировать данные и сохранять отчет в любой удобный формат.Защита (уровень конкретных ячеек макета): По умолчанию у всех областей и ячеек любого макета флаг защиты включен. Но этот флаг начинает «работать» и защищать ячейки от изменения только тогда, когда у всего документа включено свойство ТолькоПросмотр = Истина.Разберем по шагам правильную настройку свойств в коде. Чтобы запретить пользователям редактировать готовый отчет, но оставить им полную свободу действий при сохранении файла, необходимо использовать следующее сочетание параметров:
// Настройка результирующего табличного документа перед выводом на экран
ТабДок.ТолькоПросмотр = Истина; // Пользователь не может изменять ячейки руками
ТабДок.Защита = Ложь; // Разрешаем сохранение файла и работу с буфером обмена
Если в коде вашего отчета или обработчика печати присутствовала строчка ТабДок.Защита = Истина;, обязательно замените значение на Ложь.
---
В платформе «1С:Предприятие 8» у табличного документа существует важнейшее свойство Вывод. Оно управляет ограничениями на печать, сохранение и работу с буфером обмена. Это свойство имеет тип системного перечисления ИспользованиеВывода.
Рассмотрим подробнее три возможных состояния этого свойства:
ИспользованиеВывода.Разрешить: Вывод данных, печать и сохранение разрешены всегда, независимо от настроек прав текущего пользователя.ИспользованиеВывода.Запретить: Любой вывод, включая экспорт в Excel/PDF и отправку на печать, жестко блокируется платформой.ИспользованиеВывода.Авто: Поведение системы определяется ролями и дополнительными правами текущего пользователя в конфигурации.Если в свойствах элемента формы или в коде установлено значение Авто, а у пользователя в его профиле безопасности (или наборе ролей) отсутствует специализированное право на вывод информации, кнопки сохранения будут неактивны. Особенно часто это происходит в кастомных или самописных конфигурациях, где роли настраивались вручную.
Чтобы гарантированно обойти это ограничение программно для конкретного отчета (например, если этот отчет не содержит конфиденциальной информации и должен сохраняться всеми без исключения), пропишем в модуле формы перед выводом документа следующее:
// Принудительно разрешаем экспорт и печать табличного документа
ТабличныйДокумент.Вывод = ИспользованиеВывода.Разрешить;
Это действие переопределит автоматические настройки платформы и активирует заветные кнопки «Сохранить».
---
Если свойства табличного документа в коде заданы верно, но кнопки сохранения в конкретном отчете все равно остаются недоступными, проблема может крыться в настройках самого элемента управления на управляемой форме.
Выполним следующую последовательность действий в конфигураторе:
Результат или ПолеТабличногоДокумента1).---
Если ваша конфигурация построена с использованием Библиотеки стандартных подсистем (БСП) или является типовым решением (например, «Управление торговлей», «Бухгалтерия предприятия» и т.д.), возможность выгрузки файлов регулируется ролевой моделью.
Посмотрим, какие роли отвечают за доступ к сохранению документов:
Если у пользователя ограничены права, администратору необходимо зайти в режим «1С:Предприятие» под учетной записью с административными правами, открыть справочник «Профили групп доступа», найти профиль пользователя и добавить в него одну из указанных ролей. Для быстрого сопоставления прав можно использовать обработку для анализа прав и подбора подходящего профиля групп доступа.
---
Иногда возникают ситуации, когда системные ограничения платформы невозможно обойти стандартными методами из-за жесткой политики безопасности организации или особенностей архитектуры старой конфигурации. В таком случае отличным решением станет создание собственной команды и кнопки сохранения непосредственно на форме отчета.
Разберем пример кода, который позволяет полностью контролировать процесс экспорта данных в обход платформенных ограничений меню «Файл»:
&НаКлиенте
Процедура СохранитьОтчетВФайл(Команда)
// Инициализируем диалог выбора пути сохранения файла
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Укажите путь для сохранения отчета";
Диалог.Фильтр = "Документ Excel 2007 (*.xlsx)|*.xlsx|Документ PDF (*.pdf)|*.pdf";
Диалог.МножественныйВыбор = Ложь;
Диалог.ПолноеИмяФайла = "Сформированный_Отчет";
// Если пользователь выбрал путь и нажал "Сохранить"
Если Диалог.Выбрать() Тогда
// Извлекаем расширение файла для определения формата записи
Расширение = НРег(ПолучитьРасширениеФайла(Диалог.ПолноеИмяФайла));
Если Расширение = "pdf" Тогда
ТипФайла = ТипФайлаТабличногоДокумента.PDF;
Иначе
ТипФайла = ТипФайлаТабличногоДокумента.XLSX;
КонецЕсли;
Попытка
// Записываем табличный документ из реквизита формы на диск
Результат.Записать(Диалог.ПолноеИмяФайла, ТипФайла);
ПоказатьПредупреждение(, "Файл успешно сохранен на ваш компьютер!");
Исключение
ВызватьИсключение "Не удалось сохранить файл. Возможно, он открыт в другой программе или у вас нет прав на запись в эту папку.";
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьРасширениеФайла(ПолноеИмяФайла)
// Вспомогательная функция получения расширения
ПозТочки = СтрНайти(ПолноеИмяФайла, ".", НаправлениеПоиска.СКонца);
Если ПозТочки > 0 Тогда
Возврат Сред(ПолноеИмяФайла, ПозТочки + 1);
КонецЕсли;
Возврат "";
EndФункции
Этот метод гарантирует, что кнопка экспорта будет стабильно работать у любого пользователя, которому программно доступна кнопка на форме, независимо от тонких настроек ограничений интерфейса платформы.