Разработка и Конфигурация · 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.
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);Способ 3. Присоединённые файлы (БСП)
В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, Бухгалтерия и другие типовые) есть готовый механизм присоединённых файлов. Табличный документ сохраняется как файл, привязанный к объекту, и пользователь видит его в списке файлов карточки.
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = СсылкаНаОбъект;
ПараметрыФайла.ИмяБезРасширения = "Печатная форма";
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла,
ПоместитьВоВременноеХранилище(ДвоичныеДанные));
УдалитьФайлы(ИмяФайла);
Точные имена модулей зависят от версии БСП: в старых версиях используется ПрисоединенныеФайлы.ДобавитьФайл(), в новых — РаботаСФайлами.ДобавитьФайл(). Проверьте состав общих модулей вашей конфигурации перед написанием кода.
Плюс подхода — файлы доступны пользователю штатно, без доработки интерфейса. Минус — зависимость от БСП и дополнительный рост размера базы за счёт хранения файлов.
Сравнение вариантов
Простой код, чтение только средствами 1С. Подходит для внутреннего хранения результатов.
Файл можно выгрузить и открыть внешне. Нужен промежуточный временный файл.
Файл виден пользователю в карточке объекта. Требует БСП и увеличивает базу.
Не увеличивает базу, но требует общего сетевого каталога и контроля доступности файлов.
Способ 4. Файл на диске со ссылкой в базе
Если документы крупные, а база и так раздута, иногда хранят сами файлы в сетевом каталоге, а в базе — только путь к файлу. Табличный документ записывается методом Записать() в каталог, а в реквизит объекта помещается строка пути.
Этот вариант снижает нагрузку на СУБД, но создаёт риски: файл могут удалить или переместить вручную, сетевой каталог может быть недоступен, а резервное копирование базы не захватит файлы. При выборе этого способа обязательно настройте отдельное резервное копирование каталога и проверку существования файла перед чтением.
ПутьКФайлу = "\\server\share\docs\" + Строка(Объект.Ссылка.УникальныйИдентификатор()) + ".mxl";
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL);
Объект.ПутьКФайлу = ПутьКФайлу;
Объект.Записать();
Проверка результата и типичные ошибки
После записи всегда выполняйте обратное чтение в тестовом режиме: извлеките значение из хранилища и убедитесь, что получен объект ожидаемого типа и документ открывается. Это защищает от ситуации, когда в хранилище записался Неопределено или пустой документ.
Как проверить результат
ТипЗнч() возвращает ТабличныйДокумент или ДвоичныеДанные
Неопределено или строка — значит, записали не то значение
ВысотаТаблицы больше 0, области читаются
Пустой документ — вероятно, записали объект до заполнения
MXL открывается в 1С, XLSX — в Excel без ошибок
Ошибка формата — неверный ТипФайлаТабличногоДокумента при записи
Отдельная частая проблема — права доступа. Если пользователь, под которым выполняется код, не имеет права изменения объекта-владельца, запись молча не выполнится при использовании попыток без обработки исключений. Оборачивайте запись в Попытка/Исключение и журналируйте ошибки.
Пошаговый порядок внедрения
- 1Определите, где хранить документ: реквизит объекта, присоединённые файлы или каталог на диске.
- 2Добавьте в объект реквизит типа ХранилищеЗначения (или проверьте наличие БСП).
- 3Сформируйте ТабличныйДокумент программно и заполните его данными.
- 4Сериализуйте: поместите объект в ХранилищеЗначения или запишите в файл MXL/XLSX и возьмите ДвоичныеДанные.
- 5Запишите объект базы методом Записать() внутри Попытка/Исключение.
- 6Проверьте обратное чтение: Получить(), тип значения, высота таблицы.
- 7Удалите временные файлы и убедитесь, что права пользователей позволяют чтение и запись.
FAQ
Можно ли сохранить табличный документ без изменения конфигурации?
Да, если в конфигурации есть БСП — используйте присоединённые файлы через внешнюю обработку. Также можно выгрузить документ в файл MXL или XLSX на диск без каких-либо доработок, но тогда связь с объектом базы придётся поддерживать вручную.
Какой формат выбрать: MXL, XLSX или PDF?
MXL — если документ будет снова открываться и редактироваться в 1С. XLSX — если его будут открывать в Excel. PDF — только для финальной печатной формы, которую не нужно редактировать: обратное преобразование в табличный документ из PDF невозможно.
Почему после чтения из хранилища документ пустой?
Чаще всего в хранилище записали элемент формы ПолеТабличногоДокумента, записали объект до его заполнения данными или записали Неопределено. Проверьте тип и высоту таблицы непосредственно перед записью.
Насколько сильно это увеличит размер базы?
Зависит от размера документов и их количества. Табличные документы внутри хранилища значений сжимаются, но при массовом хранении крупных файлов рост базы будет заметным. Оцените объём на тестовой копии и рассмотрите вариант с файлами на диске для больших документов.
Можно ли хранить несколько версий одного документа?
Да. Для этого вместо одного реквизита используют табличную часть объекта или регистр сведений с измерением «объект» и ресурсом типа ХранилищеЗначения, добавляя поле даты или номера версии. Присоединённые файлы БСП также естественно поддерживают множество файлов у одного объекта.
Что важно запомнить
Табличный документ нельзя записать в базу напрямую — его сериализуют через ХранилищеЗначения или сохраняют как файл MXL/XLSX. Для типовых конфигураций удобны присоединённые файлы БСП. Всегда проверяйте обратное чтение, удаляйте временные файлы и контролируйте рост базы.