При разработке конфигурации «с нуля» на платформе 1С:Предприятие 8 начинающие разработчики часто сталкиваются с неожиданным поведением системы: привычные элементы интерфейса, которые всегда присутствовали в типовых решениях (таких как УПП, УТ, БП), внезапно исчезают. Один из таких элементов — меню «Дополнительные внешние отчеты и обработки».
В этой статье мы подробно разберем, почему этого пункта нет в дефолтной («чистой») базе, как устроена работа с внешними файлами на уровне платформы и как самостоятельно реализовать удобный механизм хранения и запуска обработок в обычной форме.
Проанализируем ситуацию: платформа 1С сама по себе является лишь средой исполнения кода. Она предоставляет базовые инструменты, но визуальный интерфейс, справочники, документы и сервисные функции создаются непосредственно разработчиками конфигурации. Разберем по шагам, в чем разница между возможностями платформы и возможностями прикладного решения.
Для понимания архитектуры 1С важно четко разграничить две вещи:
.epf) и внешними отчетами (файлы .erf). Но она умеет делать это только напрямую через файловую систему вашего компьютера или сервера. На уровне платформы доступно стандартное действие через главное меню «Файл» -> «Открыть» (или сочетание клавиш Ctrl + O). Этот способ работает всегда, даже если в вашей конфигурации нет ни одного объекта метаданных.Выясним причину: в вашей «чистой» конфигурации этого пункта меню нет просто потому, что вы еще не создали метаданные (справочники, общие модули, регистры), которые отвечают за хранение бинарных файлов внутри базы данных, и не вывели соответствующую команду в интерфейс.
Рассмотрим подробнее три основных способа решения этой задачи.
Если внешние отчеты или обработки нужны вам временно на этапе проектирования новой системы, вам не обязательно создавать сложные механизмы хранения. Вы можете открывать файлы .epf и .erf напрямую с диска.
Для этого в режиме «1С:Предприятие» выберите пункт меню Файл -> Открыть... и укажите путь к нужному файлу на вашем компьютере. Убедитесь, что у вашего пользователя в правах (ролях) установлена галочка ИнтерактивноеОткрытиеВнешнихОбработок и ИнтерактивноеОткрытиеВнешнихОтчетов, иначе платформа заблокирует запуск в целях безопасности.
Если вы хотите, чтобы пользователи вашей новой конфигурации могли загружать обработки в саму информационную базу и запускать их оттуда, давайте создадим этот механизм самостоятельно. В обычных формах это делается очень просто.
Разберем процесс создания по шагам:
Шаг 1. Создание справочника
В конфигураторе создайте новый справочник. Назовем его, например, ВнешниеОбработки.
Шаг 2. Добавление реквизитов
Добавьте в созданный справочник следующие реквизиты:
ХранилищеФайла — тип данных ХранилищеЗначения. В этом реквизите в виде двоичных данных будет храниться сам файл нашей обработки.ИмяДефолтногоФайла — тип данных Строка (длина 150-250 символов), чтобы сохранять оригинальное название файла.ВидОбъекта — тип данных ПеречислениеСсылка.ВидыДополнительныхВнешнихОбработок (или обычная строка, если не хотите создавать перечисление), чтобы отличать отчеты от обработок.Шаг 3. Создание формы элемента
Создайте форму элемента справочника (обычную форму). Разместите на ней стандартные реквизиты, а также две кнопки:
Шаг 4. Написание программного кода
Давайте посмотрим на пример программного кода для этих кнопок. Перейдем в модуль формы элемента справочника.
Код для загрузки файла внешней обработки в информационную базу:
Процедура КнопкаЗагрузитьНажатие(Элемент)
// Инициализируем диалог выбора файла на диске
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Фильтр = "Внешние обработки (*.epf)|*.epf|Внешние отчеты (*.erf)|*.erf";
ДиалогВыбора.Заголовок = "Выберите файл для загрузки в базу данных";
Если ДиалогВыбора.Выбрать() Тогда
ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;
ИмяДефолтногоФайла = ДиалогВыбора.ИмяФайла;
// Читаем файл в бинарный вид
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Помещаем двоичные данные в ХранилищеЗначения со сжатием
ХранилищеФайла = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9));
// Автоматически заполняем наименование элемента справочника
Наименование = ИмяДефолтногоФайла;
Предупреждение("Файл успешно загружен в базу данных!");
КонецЕсли;
КонецПроцедуры
Код для извлечения файла из базы данных во временный каталог и его последующего запуска:
Процедура КнопкаВыполнитьНажатие(Элемент)
// Проверяем, загружен ли файл в хранилище значений
ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
Если ДвоичныеДанныеФайла = Неопределено Тогда
Предупреждение("Сначала необходимо загрузить файл обработки!");
Возврат;
КонецЕсли;
// Получаем уникальное имя временного файла в операционной системе
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
// Записываем двоичные данные из базы во временный файл на диске
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
// Пробуем запустить файл как обработку или отчет
Попытка
// Используем встроенный метод платформы "ВнешниеОбработки"
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ОбработкаФорма = ОбработкаОбъект.ПолучитьФорму();
Если ОбработкаФорма <> Неопределено Тогда
ОбработкаФорма.Открыть();
Иначе
ОбработкаОбъект.ПолучитьОсновнуюФорму().Открыть();
КонецЕсли;
Исключение
// Если это не обработка, пробуем запустить как отчет
Попытка
ИмяВременногоФайлаОтчета = ПолучитьИмяВременногоФайла("erf");
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайлаОтчета);
ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяВременногоФайлаОтчета);
ОтчетФорма = ОтчетОбъект.ПолучитьФорму();
Если ОтчетФорма <> Неопределено Тогда
ОтчетФорма.Открыть();
Иначе
ОтчетОбъект.ПолучитьОсновнуюФорму().Открыть();
КонецЕсли;
Исключение
Предупреждение("Не удалось запустить файл как внешнюю обработку или отчет! Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Шаг 5. Вывод в интерфейс
Остается лишь зайти в свойства вашего интерфейса в конфигураторе и добавить команду открытия формы списка вашего нового справочника ВнешниеОбработки. Таким образом, у вас появится заветный пункт меню «Дополнительные внешние обработки».
Поскольку вы упомянули, что в дальнейшем планируете объединить («натянуть») вашу разработку на конфигурацию УПП (Управление производственным предприятием), лучшим решением будет не изобретать велосипед, а использовать готовые механизмы УПП.
В типовой конфигурации УПП 1.3 уже присутствует развитая система работы с внешними файлами. Она базируется на справочнике ВнешниеОбработки и общем модуле УниверсальныеМеханизмы.
Проанализируем алгоритм ваших действий при интеграции с УПП:
ВнешниеОбработки.ВнешниеОбработки и перенести его через файл сравнения/объединения в свою пустую базу, захватив сопутствующие общие модули. Однако будьте готовы к тому, что по цепочке связей система потребует перенести множество других объектов (роли, общие картинки, перечисления).Важный совет: до момента слияния вашей чистой конфигурации с УПП используйте обычный запуск через Файл -> Открыть. Это сбережет ваше время и избавит конфигурацию от лишних временных объектов, которые потом будет тяжело сопоставлять при объединении с метаданными УПП.