Нам часто приходится сталкиваться с задачами, когда типовой функционал конфигурации «Управление торговлей», редакция 10.3 (УТ 10.3) требует доработки. Одной из самых частых задач является создание внешней печатной формы (ВПФ) для счета на оплату покупателю, а также организация его выгрузки в формат Excel (XLS/XLSX) для отправки клиентам. Давайте подробно разберем, как правильно реализовать данный механизм, обойти ограничения безопасности платформы 1С:Предприятие 8.3 и решить проблему с блокировкой копирования ячеек табличного документа.
Часто на форумах начинающим разработчикам советуют использовать «Библиотеку стандартных подсистем» (БСП) для создания внешних обработок. Выясним, почему это грубейшая ошибка.
Конфигурация УТ 10.3 разработана на старой архитектуре обычного приложения (обычных формах). БСП современных версий (начиная с 2.x и 3.x) создана исключительно для управляемого приложения (управляемых форм), используемых в современных решениях вроде УТ 11, БП 3.0, ERP 2.0. Механизмы интеграции внешних печатных форм в них кардинально различаются. В УТ 10.3 нет общих модулей БСП для регистрации обработок. Попытка внедрить туда шаблон кода для БСП приведет к ошибкам компиляции. Нам потребуется использовать классический механизм регистрации обычного приложения.
Разберем по шагам процесс создания внешней печатной формы счета:
ПечатьСчетаВXLS.epf.
СсылкаНаОбъект.
Тип реквизита должен строго соответствовать документу-источнику. В нашем случае это ссылка на документ заказа или счета: ДокументСсылка.ЗаказПокупателя или ДокументСсылка.СчетНаОплатуПокупателю. Для универсальности можно выбрать составной тип данных, включающий оба эти документа.
Печать(). Платформа при вызове внешней печатной формы ищет именно эту функцию. Она должна сформировать и вернуть табличный документ.
Посмотрим на пример базового шаблона кода:
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
// Получаем макет нашей печатной формы
Макет = ПолучитьМакет("МакетСчета");
// Получаем данные из документа-источника через СсылкаНаОбъект
ДокументОбъект = СсылкаНаОбъект.ПолучитьОбъект();
// Заполняем параметры макета данными из документа
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = ДокументОбъект.Номер;
ОбластьШапка.Параметры.ДатаДокумента = ДокументОбъект.Дата;
ОбластьШапка.Параметры.Контрагент = ДокументОбъект.Контрагент;
ТабДокумент.Вывести(ОбластьШапка);
// Здесь также выводим строки табличной части (товары, услуги) и подвал
// Разрешаем пользователю выделять и копировать данные
ТабДокумент.ТолькоПросмотр = Истина;
ТабДокумент.Защита = Ложь;
Возврат ТабДокумент;
КонецФункции
МакетСчета. Сверстаем в нем привычную форму счета с областями «Шапка», «Строка» и «Подвал».
.epf и привяжем его к нужному типу документа.
При запуске внешних обработок в новых версиях платформы 1С:Предприятие 8.3 (начиная с версии 8.3.9 и выше) часто возникает окно «Предупреждение безопасности». Платформа блокирует выполнение внешнего кода, защищая систему от потенциально опасных действий. Проанализируем три способа решения этой проблемы:
Способ 1. Отключение защиты для конкретного пользователя.
В режиме Конфигуратора откроем меню Администрирование -> Пользователи. Найдем пользователя, под которым работает менеджер или бухгалтер, откроем его свойства. На вкладке «Основные» снимем флажок «Защита от опасных действий». Это самый простой способ для локальной работы.
Способ 2. Глобальное отключение через файл настроек conf.cfg.
Если пользователей много, мы можем отключить проверку безопасности на уровне всей платформы для определенных баз. Для этого найдем конфигурационный файл платформы conf.cfg (в Windows он обычно находится в папке C:\Program Files\1cv8\conf\). Добавим в него строчку, отключающую защиту: DisableUnsafeActionProtection=.*. Вместо регулярного выражения .* можно прописать путь к конкретной базе.
Способ 3. Отключение безопасного режима при регистрации обработки.
При регистрации внешней печатной формы в справочнике дополнительных обработок убедимся, что снят флажок «Безопасный режим». Если этот флажок установлен, платформа жестко ограничивает работу обработки (например, запрещает вызовы внешних COM-объектов или запись файлов на локальный диск).
Выясним причину, почему в типовых печатных формах 1С при выводе документа на экран контекстное меню «Копировать» по правой кнопке мыши оказывается неактивным. Разработчики типовой конфигурации УТ 10.3 в целях защиты документов от случайного изменения пользователями перед печатью устанавливают у табличного документа свойство Защита = Истина. Из-за этого платформа полностью блокирует выделение и копирование ячеек в буфер обмена.
Решение для пользователя (без программирования):
Когда печатная форма счета уже выведена на экран, пользователю достаточно перейти в главное меню программы по пути: Таблица -> Вид -> Редактирование. После этого защита временно деактивируется, ячейки можно выделять, а в контекстном меню появится активная кнопка «Копировать» (или сработает привычное сочетание клавиш Ctrl+C).
Решение для разработчика (в коде ВПФ):
Чтобы избавить пользователей от рутинных действий, мы можем программно управлять поведением табличного документа в коде функции Печать(). Установим свойства следующим образом:
ТабДокумент.ТолькоПросмотр = Истина; // Пользователь не сможет редактировать ячейки напрямую
ТабДокумент.Защита = Ложь; // Защита снята: выделение и копирование ячеек разрешено!
Вывод табличного документа установлено в значение Разрешить, иначе сохранение и печать будут заблокированы на уровне прав пользователя.
Как сохранить счет напрямую в Excel из 1С:
Платформа 1С:Предприятие 8.3 обладает встроенным механизмом сохранения любых табличных документов в форматы XLS и XLSX. Для этого после формирования счета на экране нужно выполнить следующие действия: