Как программно присоединить файл к заказу в 1С:УНФ 1.6 и избежать удаления данных

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

В современных конфигурациях 1С, таких как «Управление нашей фирмой» (УНФ), механизмы работы с файлами построены на базе Библиотеки стандартных подсистем (БСП). Одной из частых задач разработчика является автоматическое формирование печатной формы в формате PDF и ее прикрепление к документу (например, к Заказу покупателя). Однако простая запись в справочник присоединенных файлов часто приводит к ошибке: «Двоичные данные файла были удалены». Рассмотрим подробнее, почему это происходит и как правильно реализовать эту задачу.

Почему возникает ошибка очистки двоичных данных?

Проанализируем ситуацию: при ручном создании элемента в справочнике ЗаказПокупателяПрисоединенныеФайлы и прямой записи в регистр ДвоичныеДанныеФайлов система может не увидеть связь между этими объектами. Это происходит по нескольким причинам:

  1. Тип хранения файла: В БСП за хранение отвечает реквизит ТипХраненияФайла. Если он не заполнен или указан неверно (например, система ищет файл в томах на диске, а вы записали его в базу), возникнет ошибка доступа.
  2. Версионирование: Структура БСП предполагает наличие «версии» файла. Даже если у вас один файл, система ищет «Текущую версию». Если запись в справочнике есть, а связанной записи в справочнике версий нет, данные считаются отсутствующими.
  3. Статус извлечения текста: Для полнотекстового поиска система проверяет реквизит СтатусИзвлеченияТекста. Некорректное состояние этого поля может блокировать открытие файла.
  4. Транзакционная целостность: При ручном заполнении регистров легко пропустить обязательные реквизиты, такие как хэш-сумма (MD5) или уникальный идентификатор версии, что приводит к признанию файла «поврежденным».

Рассмотрим, как выглядит типичный, но не совсем корректный код, который часто приводит к подобным проблемам:


// Пример кода с ошибками ручного заполнения
НоваяСтрокаСправочника = Справочники.ЗаказПокупателяПрисоединенныеФайлы.СоздатьЭлемент();
НоваяСтрокаСправочника.ВладелецФайла = СсылкаНаЗаказ;
НоваяСтрокаСправочника.Наименование = "Счет.pdf";
НоваяСтрокаСправочника.ФайлХранилище = Новый ХранилищеЗначения(мФайл);
НоваяСтрокаСправочника.Записать();

МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Файл = НоваяСтрокаСправочника.Ссылка;
МенеджерЗаписи.ДвоичныеДанныеФайла = НоваяСтрокаСправочника.ФайлХранилище;
МенеджерЗаписи.Записать();

Этот код игнорирует внутреннюю логику БСП, что и вызывает ошибки в интерфейсе пользователя. Выясним, как сделать это правильно.

Правильный способ: Использование программного интерфейса БСП

Для корректного присоединения файлов в УНФ 1.6/3.0 рекомендуется использовать функции общего модуля РаботаСФайлами. Это гарантирует, что файл будет записан во все необходимые регистры, получит правильный тип хранения и будет корректно отображаться в списке «Присоединенные файлы».

Разберем по шагам алгоритм создания и прикрепления PDF-файла:

Шаг 1. Формирование табличного документа и сохранение во временный файл.

Сначала мы создаем печатную форму и сохраняем ее на диск, чтобы получить двоичные данные.


ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

Шаг 2. Подготовка параметров для БСП.

Вместо ручного создания элемента справочника, мы подготовим структуру, которую передадим в стандартный метод.


ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНаЗаказ);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Счет на оплату");
ПараметрыФайла.Вставить("Расширение", "pdf");
ПараметрыФайла.Вставить("МодификацияУниверсальная", ТекущаяДатаСеанса());

Шаг 3. Вызов метода добавления файла.

Мы используем функцию ДобавитьФайл. Обратите внимание, что в разных версиях БСП название метода и модуля может незначительно отличаться (например, РаботаСФайлами.ДобавитьФайл или ПрисоединенныеФайлы.ДобавитьФайл). Рассмотрим наиболее универсальный вариант для УНФ:


// В качестве источника данных передаем ДвоичныеДанныеФайла
Результат = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ДвоичныеДанныеФайла.ПолучитьАдресВВременномХранилище(), "", "");

// После успешной записи не забываем удалить временный файл с диска
УдалитьФайлы(ИмяФайла);

Анализируем важные нюансы при работе с БСП

При использовании программного интерфейса РаботаСФайлами, система автоматически выполняет следующие действия, которые мы пропускали при ручном подходе:

  1. Определение места хранения: Система проверяет константы (хранить файлы в томах или в базе) и записывает данные согласно настройкам.
  2. Создание версии: Автоматически создается первая версия файла в подчиненном справочнике (например, ЗаказПокупателяПрисоединенныеФайлы имеет связь с версиями).
  3. Расчет хэша: Рассчитывается контрольная сумма, которая предотвращает ошибки при открытии.
  4. Регистрация события: Записываются данные об авторе и времени создания в соответствии со стандартами аудита системы.

Если необходимо использовать «ручной» код

Если по каким-то причинам вы не можете использовать методы БСП (например, при глубокой кастомизации), проанализируем, что обязательно нужно добавить в код из Сообщения 1, чтобы он заработал:

Посмотрим на пример правильного заполнения реквизитов при ручном подходе:


НоваяСтрокаСправочника = Справочники.ЗаказПокупателяПрисоединенныеФайлы.СоздатьЭлемент();
НоваяСтрокаСправочника.ВладелецФайла = МассивСсылок[0].Ссылка;
НоваяСтрокаСправочника.Наименование = "Счет №123";
НоваяСтрокаСправочника.Расширение = "pdf";
НоваяСтрокаСправочника.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
НоваяСтрокаСправочника.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекста.НеИзвлечен;
НоваяСтрокаСправочника.ДатаСоздания = ТекущаяДата();
// Обязательно записываем данные в ХранилищеЗначения
НоваяСтрокаСправочника.ФайлХранилище = Новый ХранилищеЗначения(мФайл, Новый СжатиеДанных(9));
НоваяСтрокаСправочника.Записать();

Важно: Даже такой код может перестать работать после обновления УНФ, если структура хранения метаданных в БСП изменится. Именно поэтому использование РаботаСФайлами.ДобавитьФайл является золотым стандартом разработки.

Резюме

Мы проанализировали проблему исчезновения двоичных данных и выяснили, что основной причиной является несоблюдение структуры хранения БСП. Для надежной работы конфигурации «1С:Управление нашей фирмой» всегда используйте стандартные программные интерфейсы. Это избавит вас от необходимости вручную следить за регистрами двоичных данных, версионированием и правами доступа к файлам.

← На главную