В современных конфигурациях 1С, таких как «Управление нашей фирмой» (УНФ), механизмы работы с файлами построены на базе Библиотеки стандартных подсистем (БСП). Одной из частых задач разработчика является автоматическое формирование печатной формы в формате PDF и ее прикрепление к документу (например, к Заказу покупателя). Однако простая запись в справочник присоединенных файлов часто приводит к ошибке: «Двоичные данные файла были удалены». Рассмотрим подробнее, почему это происходит и как правильно реализовать эту задачу.
Проанализируем ситуацию: при ручном создании элемента в справочнике ЗаказПокупателяПрисоединенныеФайлы и прямой записи в регистр ДвоичныеДанныеФайлов система может не увидеть связь между этими объектами. Это происходит по нескольким причинам:
ТипХраненияФайла. Если он не заполнен или указан неверно (например, система ищет файл в томах на диске, а вы записали его в базу), возникнет ошибка доступа.СтатусИзвлеченияТекста. Некорректное состояние этого поля может блокировать открытие файла.Рассмотрим, как выглядит типичный, но не совсем корректный код, который часто приводит к подобным проблемам:
// Пример кода с ошибками ручного заполнения
НоваяСтрокаСправочника = Справочники.ЗаказПокупателяПрисоединенныеФайлы.СоздатьЭлемент();
НоваяСтрокаСправочника.ВладелецФайла = СсылкаНаЗаказ;
НоваяСтрокаСправочника.Наименование = "Счет.pdf";
НоваяСтрокаСправочника.ФайлХранилище = Новый ХранилищеЗначения(мФайл);
НоваяСтрокаСправочника.Записать();
МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Файл = НоваяСтрокаСправочника.Ссылка;
МенеджерЗаписи.ДвоичныеДанныеФайла = НоваяСтрокаСправочника.ФайлХранилище;
МенеджерЗаписи.Записать();
Этот код игнорирует внутреннюю логику БСП, что и вызывает ошибки в интерфейсе пользователя. Выясним, как сделать это правильно.
Для корректного присоединения файлов в УНФ 1.6/3.0 рекомендуется использовать функции общего модуля РаботаСФайлами. Это гарантирует, что файл будет записан во все необходимые регистры, получит правильный тип хранения и будет корректно отображаться в списке «Присоединенные файлы».
Разберем по шагам алгоритм создания и прикрепления PDF-файла:
Шаг 1. Формирование табличного документа и сохранение во временный файл.
Сначала мы создаем печатную форму и сохраняем ее на диск, чтобы получить двоичные данные.
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
Шаг 2. Подготовка параметров для БСП.
Вместо ручного создания элемента справочника, мы подготовим структуру, которую передадим в стандартный метод.
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНаЗаказ);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Счет на оплату");
ПараметрыФайла.Вставить("Расширение", "pdf");
ПараметрыФайла.Вставить("МодификацияУниверсальная", ТекущаяДатаСеанса());
Шаг 3. Вызов метода добавления файла.
Мы используем функцию ДобавитьФайл. Обратите внимание, что в разных версиях БСП название метода и модуля может незначительно отличаться (например, РаботаСФайлами.ДобавитьФайл или ПрисоединенныеФайлы.ДобавитьФайл). Рассмотрим наиболее универсальный вариант для УНФ:
// В качестве источника данных передаем ДвоичныеДанныеФайла
Результат = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ДвоичныеДанныеФайла.ПолучитьАдресВВременномХранилище(), "", "");
// После успешной записи не забываем удалить временный файл с диска
УдалитьФайлы(ИмяФайла);
При использовании программного интерфейса РаботаСФайлами, система автоматически выполняет следующие действия, которые мы пропускали при ручном подходе:
ЗаказПокупателяПрисоединенныеФайлы имеет связь с версиями).Если по каким-то причинам вы не можете использовать методы БСП (например, при глубокой кастомизации), проанализируем, что обязательно нужно добавить в код из Сообщения 1, чтобы он заработал:
НоваяСтрокаСправочника.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; (или ВТомахНаДиске).НоваяСтрокаСправочника.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекста.НеИзвлечен;.ПутьКФайлу пуст, если хранение идет в базе.Посмотрим на пример правильного заполнения реквизитов при ручном подходе:
НоваяСтрокаСправочника = Справочники.ЗаказПокупателяПрисоединенныеФайлы.СоздатьЭлемент();
НоваяСтрокаСправочника.ВладелецФайла = МассивСсылок[0].Ссылка;
НоваяСтрокаСправочника.Наименование = "Счет №123";
НоваяСтрокаСправочника.Расширение = "pdf";
НоваяСтрокаСправочника.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
НоваяСтрокаСправочника.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекста.НеИзвлечен;
НоваяСтрокаСправочника.ДатаСоздания = ТекущаяДата();
// Обязательно записываем данные в ХранилищеЗначения
НоваяСтрокаСправочника.ФайлХранилище = Новый ХранилищеЗначения(мФайл, Новый СжатиеДанных(9));
НоваяСтрокаСправочника.Записать();
Важно: Даже такой код может перестать работать после обновления УНФ, если структура хранения метаданных в БСП изменится. Именно поэтому использование РаботаСФайлами.ДобавитьФайл является золотым стандартом разработки.
Мы проанализировали проблему исчезновения двоичных данных и выяснили, что основной причиной является несоблюдение структуры хранения БСП. Для надежной работы конфигурации «1С:Управление нашей фирмой» всегда используйте стандартные программные интерфейсы. Это избавит вас от необходимости вручную следить за регистрами двоичных данных, версионированием и правами доступа к файлам.