К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как сохранить табличный документ в базе

Как сохранить табличный документ в базе 1С: через хранилище значений, реквизиты объекта, файлы и присоединённые файлы. Примеры кода, ошибки и FAQ.

Табличный документ в 1С — это объект типа «ТабличныйДокумент», который формируется в памяти при построении отчётов, печатных форм и макетов. Сам по себе он не хранится в базе: после закрытия формы или завершения процедуры объект уничтожается. Чтобы сохранить результат, нужно явно поместить его в реквизит объекта, в хранилище значений, в присоединённые файлы или записать файлом на диск с привязкой к данным базы.

Выбор способа зависит от задачи: нужно ли хранить документ как часть объекта (например, печатную форму заказа), как файл для обмена, или как временный результат для последующей обработки. Ниже разобраны все рабочие варианты с примерами кода, типичными ошибками и способами проверки результата.

Как устроено хранение табличного документа в 1С

Объект «ТабличныйДокумент» существует только в оперативной памяти сеанса. Платформа не предоставляет типа поля «табличный документ» для реквизитов справочников и документов, поэтому напрямую записать его в базу нельзя. Вместо этого документ преобразуют в сериализуемое представление: двоичные данные файла формата MXL, строку внутреннего формата или файл другого формата (XLSX, PDF, HTML).

Стандартный контейнер для таких данных в 1С — реквизит типа «ХранилищеЗначения». Он принимает любое сериализуемое значение, включая ДвоичныеДанные и сам ТабличныйДокумент (последний автоматически упаковывается через механизм сериализации). При чтении значение извлекается методом Получить().

Альтернатива — механизм присоединённых файлов из Библиотеки стандартных подсистем (БСП), если она внедрена в конфигурацию. Тогда табличный документ сохраняется как файл MXL или XLSX, привязанный к конкретному объекту, и пользователь может открыть его из карточки объекта без программирования интерфейса.

Способ 1. Сохранение в реквизит типа «ХранилищеЗначения»

Самый простой вариант — добавить объекту конфигурации (справочнику, документу) реквизит с типом «ХранилищеЗначения» и поместить туда табличный документ целиком. Платформа сама выполнит сериализацию.

// Запись

Объект.ХранимыйДокумент = Новый ХранилищеЗначения(ТабДокумент, Новый СжатиеДанных(9));

Объект.Записать();

// Чтение

ТабДокумент = Объект.ХранимыйДокумент.Получить();

Если ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") Тогда

// работаем с документом

КонецЕсли;

Второй параметр конструктора — СжатиеДанных — уменьшает объём записи в базе. Табличные документы с большим количеством строк сжимаются заметно, поэтому сжатие рекомендуется включать всегда, если документы крупнее нескольких десятков строк.

Ограничение способа: данные хранятся во внутреннем формате платформы. Прочитать их можно только средствами 1С, открыть такой документ в Excel без дополнительной обработки нельзя. Если нужен внешний формат — используйте сохранение в файл.

Способ 2. Сохранение как двоичные данные файла MXL или XLSX

Если документ должен открываться внешними программами или передаваться между базами, его записывают в файл через метод Записать() с указанием типа файла, а затем файл помещают в хранилище как ДвоичныеДанные.

ИмяФайла = ПолучитьИмяВременногоФайла("mxl");

ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);

Объект.ФайлДокумента = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));

Объект.Записать();

УдалитьФайлы(ИмяФайла);

Чтение выполняется в обратном порядке: двоичные данные извлекаются, записываются во временный файл, и табличный документ читается из него методом Прочитать().

ДвоичныеДанные = Объект.ФайлДокумента.Получить();

ИмяФайла = ПолучитьИмяВременногоФайла("mxl");

ДвоичныеДанные.Записать(ИмяФайла);

ТабДокумент = Новый ТабличныйДокумент;

ТабДокумент.Прочитать(ИмяФайла);

УдалитьФайлы(ИмяФайла);

Вместо MXL можно использовать XLSX, PDF, HTML, ODS или TXT — метод Записать() поддерживает все эти типы. Учтите: при сохранении в PDF или HTML документ перестаёт быть редактируемым табличным документом, обратное чтение в ТабличныйДокумент возможно только из MXL и частично из XLSX.

1c
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Способ 3. Присоединённые файлы (БСП)

В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, Бухгалтерия и другие типовые) есть готовый механизм присоединённых файлов. Табличный документ сохраняется как файл, привязанный к объекту, и пользователь видит его в списке файлов карточки.

ИмяФайла = ПолучитьИмяВременногоФайла("mxl");

ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);

ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();

ПараметрыФайла.ВладелецФайлов = СсылкаНаОбъект;

ПараметрыФайла.ИмяБезРасширения = "Печатная форма";

РаботаСФайлами.ДобавитьФайл(ПараметрыФайла,

ПоместитьВоВременноеХранилище(ДвоичныеДанные));

УдалитьФайлы(ИмяФайла);

Точные имена модулей зависят от версии БСП: в старых версиях используется ПрисоединенныеФайлы.ДобавитьФайл(), в новых — РаботаСФайлами.ДобавитьФайл(). Проверьте состав общих модулей вашей конфигурации перед написанием кода.

Плюс подхода — файлы доступны пользователю штатно, без доработки интерфейса. Минус — зависимость от БСП и дополнительный рост размера базы за счёт хранения файлов.

Сравнение вариантов

ХранилищеЗначения (объект целиком)

Простой код, чтение только средствами 1С. Подходит для внутреннего хранения результатов.

Двоичные данные MXL/XLSX

Файл можно выгрузить и открыть внешне. Нужен промежуточный временный файл.

Присоединённые файлы БСП

Файл виден пользователю в карточке объекта. Требует БСП и увеличивает базу.

Файл на диске + путь в базе

Не увеличивает базу, но требует общего сетевого каталога и контроля доступности файлов.

Способ 4. Файл на диске со ссылкой в базе

Если документы крупные, а база и так раздута, иногда хранят сами файлы в сетевом каталоге, а в базе — только путь к файлу. Табличный документ записывается методом Записать() в каталог, а в реквизит объекта помещается строка пути.

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

ПутьКФайлу = "\\server\share\docs\" + Строка(Объект.Ссылка.УникальныйИдентификатор()) + ".mxl";

ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL);

Объект.ПутьКФайлу = ПутьКФайлу;

Объект.Записать();

Проверка результата и типичные ошибки

После записи всегда выполняйте обратное чтение в тестовом режиме: извлеките значение из хранилища и убедитесь, что получен объект ожидаемого типа и документ открывается. Это защищает от ситуации, когда в хранилище записался Неопределено или пустой документ.

Типичные ошибки
01
Сохранение ПолеТабличногоДокумента вместо ТабличныйДокумент — при чтении получите Неопределено или ошибку сериализации.
02
Запись в объект без вызова Записать() — данные останутся только в памяти.
03
Отсутствие УдалитьФайлы() для временных файлов — каталог временных файлов сервера разрастается.
04
Сохранение в PDF с ожиданием обратного чтения — из PDF табличный документ не восстанавливается.
05
Чтение без проверки типа Получить() — если хранилище пустое, код упадёт при обращении к свойствам.
Контрольные точки

Как проверить результат

Тип значения после Получить()
Норма

ТипЗнч() возвращает ТабличныйДокумент или ДвоичныеДанные

Тревожный признак

Неопределено или строка — значит, записали не то значение

Содержимое документа
Норма

ВысотаТаблицы больше 0, области читаются

Тревожный признак

Пустой документ — вероятно, записали объект до заполнения

Открытие файла
Норма

MXL открывается в 1С, XLSX — в Excel без ошибок

Тревожный признак

Ошибка формата — неверный ТипФайлаТабличногоДокумента при записи

Отдельная частая проблема — права доступа. Если пользователь, под которым выполняется код, не имеет права изменения объекта-владельца, запись молча не выполнится при использовании попыток без обработки исключений. Оборачивайте запись в Попытка/Исключение и журналируйте ошибки.

Пошаговый порядок внедрения

Порядок действий
  1. 1
    Определите, где хранить документ: реквизит объекта, присоединённые файлы или каталог на диске.
  2. 2
    Добавьте в объект реквизит типа ХранилищеЗначения (или проверьте наличие БСП).
  3. 3
    Сформируйте ТабличныйДокумент программно и заполните его данными.
  4. 4
    Сериализуйте: поместите объект в ХранилищеЗначения или запишите в файл MXL/XLSX и возьмите ДвоичныеДанные.
  5. 5
    Запишите объект базы методом Записать() внутри Попытка/Исключение.
  6. 6
    Проверьте обратное чтение: Получить(), тип значения, высота таблицы.
  7. 7
    Удалите временные файлы и убедитесь, что права пользователей позволяют чтение и запись.

FAQ

Можно ли сохранить табличный документ без изменения конфигурации?

Да, если в конфигурации есть БСП — используйте присоединённые файлы через внешнюю обработку. Также можно выгрузить документ в файл MXL или XLSX на диск без каких-либо доработок, но тогда связь с объектом базы придётся поддерживать вручную.

Какой формат выбрать: MXL, XLSX или PDF?

MXL — если документ будет снова открываться и редактироваться в 1С. XLSX — если его будут открывать в Excel. PDF — только для финальной печатной формы, которую не нужно редактировать: обратное преобразование в табличный документ из PDF невозможно.

Почему после чтения из хранилища документ пустой?

Чаще всего в хранилище записали элемент формы ПолеТабличногоДокумента, записали объект до его заполнения данными или записали Неопределено. Проверьте тип и высоту таблицы непосредственно перед записью.

Насколько сильно это увеличит размер базы?

Зависит от размера документов и их количества. Табличные документы внутри хранилища значений сжимаются, но при массовом хранении крупных файлов рост базы будет заметным. Оцените объём на тестовой копии и рассмотрите вариант с файлами на диске для больших документов.

Можно ли хранить несколько версий одного документа?

Да. Для этого вместо одного реквизита используют табличную часть объекта или регистр сведений с измерением «объект» и ресурсом типа ХранилищеЗначения, добавляя поле даты или номера версии. Присоединённые файлы БСП также естественно поддерживают множество файлов у одного объекта.

Итог

Что важно запомнить

Табличный документ нельзя записать в базу напрямую — его сериализуют через ХранилищеЗначения или сохраняют как файл MXL/XLSX. Для типовых конфигураций удобны присоединённые файлы БСП. Всегда проверяйте обратное чтение, удаляйте временные файлы и контролируйте рост базы.