Создание файлов в 1С 8.3: из интерфейса и кодом
Содержание
Файл в 1С 8.3 создают двумя путями: вручную из интерфейса (выгрузка отчёта, печатной формы или данных в Excel, PDF, текст) и программно на встроенном языке — через объекты ТекстовыйДокумент, ЗаписьТекста, ЗаписьXML, ЗаписьJSON и запись ТабличногоДокумента. Первый способ не требует знаний программирования, второй нужен для обмена, выгрузок по расписанию и формирования документов нестандартного вида.
Выбор зависит от задачи. Разовая выгрузка — сохраняете прямо из формы. Регулярная или в заданном формате (XML для контрагента, CSV для банка) — пишете код в обработке или регламентном задании. Ниже разобраны оба подхода, а также тонкости тонкого и веб-клиента, где файл физически оказывается не там, где ожидает новичок.
Выгрузка файла из интерфейса без программирования
Самый частый случай — сохранить то, что уже на экране. Эта возможность одинакова в Бухгалтерии 3.0, ЗУП 3.1 и Управлении торговлей 11: она встроена в платформу, а не в конкретную конфигурацию.
Отчёт или список в табличном виде сохраняется так:
- Сформируйте отчёт или откройте список документов.
- В командной панели нажмите кнопку сохранения (значок дискеты) или
Главное меню → Файл → Сохранить как. - Выберите формат:
Лист Excel 2007 (xlsx),Документ PDF,Текстовый документ (txt),Табличный документ (mxl). - Укажите имя и папку, нажмите
Сохранить.
Печатную форму документа (счёт, акт, накладную) выгружают из окна предпросмотра печати той же кнопкой сохранения. Для массовой выгрузки списка пригодится команда вывода в табличный документ: выделите строки, затем в меню Ещё найдите пункт вывода списка — он открывает данные как табличный документ, который сохраняется в любой из форматов выше.
Один и тот же отчёт можно сохранить в несколько форматов подряд — окно сохранения открывается каждый раз заново, поэтому выгрузите сначала xlsx для правок, затем pdf для подписи и отправки. Для документа-основания (например, печать акта из самого документа) кнопка сохранения живёт в окне предпросмотра печати, а не в списке.
Если нужен именно Excel с живыми формулами, а не «картинка» таблицы, выбирайте xlsx, а не mxl. Формат mxl открывается только в 1С. В xlsx каждая область печати становится отдельным листом книги.
Запись файла кодом на встроенном языке
Когда файл нужно собрать программно, выбирают объект под тип данных. Код выполняется на сервере или на клиенте — об этом разница в путях ниже в разделе про клиент и сервер.
Текстовый файл. Для небольшого текста — ТекстовыйДокумент, для построчной записи большого объёма — ЗаписьТекста:
// Весь текст сразу
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст("Отчёт за период" + Символы.ПС + "Итого: 150000");
ТекстовыйФайл.Записать("C:\Обмен\otchet.txt", КодировкаТекста.UTF8);
// Построчно, экономно по памяти
Запись = Новый ЗаписьТекста("C:\Обмен\log.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Строка 1");
Запись.ЗаписатьСтроку("Строка 2");
Запись.Закрыть();
Объект ЗаписьТекста обязательно закрывайте методом Закрыть() — иначе файл останется заблокированным, а часть данных не попадёт на диск из буфера. У ЗаписьТекста есть режим добавления в конец существующего файла — он удобен для журналов и логов, когда дописывать нужно, не перезаписывая уже накопленное.
Разница по месту исполнения здесь ключевая. Процедура с директивой &НаКлиенте в толстом и тонком клиенте пишет на диск пользователя — путь C:\Обмен\... окажется у него. Процедура &НаСервере создаёт файл на сервере. Поэтому прежде чем писать путь, решите, чей это диск.
Excel или PDF из данных. Соберите ТабличныйДокумент (например, макетом) и запишите его:
ТабДок.Записать("C:\Обмен\price.xlsx", ТипФайлаТабличногоДокумента.XLSX);
ТабДок.Записать("C:\Обмен\price.pdf", ТипФайлаТабличногоДокумента.PDF);
Произвольные двоичные данные. Если у вас уже есть ДвоичныеДанные (картинка, вложение, результат из хранилища), сохраняйте напрямую:
ДвоичныеДанные.Записать("C:\Обмен\image.png");
Для временного файла, который удалится сам, не придумывайте имя — возьмите его у платформы:
ИмяВрем = ПолучитьИмяВременногоФайла("csv");
Форматы обмена: XML, JSON и CSV
Для передачи данных другой системе файл собирают в структурированном формате. Выбор диктует получатель: банки и госсистемы чаще принимают XML, веб-сервисы — JSON, простые выгрузки в Excel-совместимом виде — CSV.
XML пишут потоково объектом ЗаписьXML:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Обмен\tovary.xml", "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьАтрибут("Код", "000123");
ЗаписьXML.ЗаписатьТекст("Бумага А4");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
JSON собирают через ЗаписьJSON и глобальную функцию ЗаписатьJSON, которой можно сразу отдать структуру или соответствие:
Данные = Новый Структура("Код, Наименование", "000123", "Бумага А4");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Обмен\tovar.json");
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();
CSV — это обычный текст с разделителями, отдельного объекта под него нет. Собирают строки через ЗаписьТекста, разделяя значения точкой с запятой (российский Excel ждёт именно ;, а не запятую):
Запись = Новый ЗаписьТекста("C:\Обмен\vygruzka.csv", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Код;Наименование;Цена");
Для Каждого Строка Из ТаблицаТоваров Цикл
Запись.ЗаписатьСтроку(Строка.Код + ";" + Строка.Наименование + ";"
+ Формат(Строка.Цена, "ЧГ=0; ЧДЦ=2"));
КонецЦикла;
Запись.Закрыть();
Число при сборке строки всегда оборачивайте в Формат(...) с параметром ЧГ=0 — иначе в файл попадут неразрывные пробелы-разделители групп разрядов, и получатель не разберёт сумму.
Для кодировки учитывайте получателя: многие старые банковские и обменные форматы требуют windows-1251 (в коде — КодировкаТекста.ANSI или строка "windows-1251" для XML), а не UTF-8.
Ещё один нюанс CSV — значения с разделителем внутри. Если в наименование товара попала точка с запятой или перенос строки, такое значение берут в двойные кавычки, иначе колонки «съедут». Проверяйте данные перед записью и оборачивайте «подозрительные» поля.
Когда нужно выгрузить не произвольную структуру, а объект базы (документ, элемент справочника) для последующей загрузки в другую базу 1С, применяют сериализацию: платформа сама превращает объект в XML и обратно. Это надёжнее ручной сборки тегов, потому что сохраняется вся структура реквизитов и табличных частей.
Где появляется файл: клиент, сервер и веб-клиент
Это главный источник путаницы. Путь в коде — это диск того компьютера, где код исполняется. Процедура с директивой &НаСервере создаёт файл на сервере 1С, а не на машине пользователя. В клиент-серверной базе пользователь такой файл на своём C:\ не найдёт.
Правило простое:
- Файл для пользователя — отдавайте через временное хранилище. Сервер кладёт данные в хранилище, клиент получает их диалогом сохранения.
- Файл для сервера (обмен с другой системой на том же сервере, каталог на сетевом диске) — пишите в
&НаСервере, указывая путь, доступный службе 1С.
Передача файла пользователю из серверного кода выглядит так:
&НаСервере
Функция ПодготовитьФайлНаСервере()
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст("Содержимое");
ИмяВрем = ПолучитьИмяВременногоФайла("txt");
ТекстовыйФайл.Записать(ИмяВрем);
ДД = Новый ДвоичныеДанные(ИмяВрем);
Возврат ПоместитьВоВременноеХранилище(ДД, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура Сохранить(Команда)
Адрес = ПодготовитьФайлНаСервере();
ПолучитьФайл(Адрес, "otchet.txt", Истина);
КонецПроцедуры
Веб-клиент работать с диском напрямую не может — браузер запрещает. ПолучитьФайл здесь вызывает штатное окно загрузки браузера, и файл падает в папку «Загрузки». Чтобы читать и писать по заданным путям в вебе, нужно один раз установить расширение
работы с файлами (платформа сама предложит это при первой операции с файлами). В тонком клиенте расширение не требуется — он имеет доступ к файловой системе.
Из этого следует универсальный приём: формируйте файл серверным кодом, кладите во временное хранилище и отдавайте через ПолучитьФайл. Такая связка одинаково работает и в тонком, и в веб-клиенте — вам не придётся писать разный код под разные режимы запуска.
Создание файлов по расписанию
Регулярную выгрузку (ночной обмен, ежедневный CSV для банка) автоматизируют регламентным заданием. Сам обработчик — экспортная процедура в общем модуле, которая собирает и пишет файл серверным кодом. В конфигураторе создаётся объект «Регламентное задание» с расписанием и привязкой к этой процедуре.
Как задание выполняется — зависит от типа базы:
| Тип базы | Как работают регламентные задания |
|---|---|
| Клиент-серверная | Автоматически на сервере 1С, пользователь не нужен |
| Файловая | Только пока запущен сеанс, где включён механизм регламентных заданий |
Для файловой базы это значит: чтобы ночная выгрузка сработала, на машине должен оставаться запущенным сеанс 1С с активированными заданиями. Если его нет — задание просто не запустится.
Для разового запуска «прямо сейчас, но в фоне, не держа пользователя» подходит фоновое задание — его ставит в очередь метод ФоновыеЗадания.Выполнить(...) с тем же обработчиком.
Путь, куда пишет регламентное задание, должен быть доступен учётной записи, под которой работает служба сервера 1С (чаще это USR1CV8, а не ваш пользователь Windows). Для сетевой папки это самая частая причина отказа — у службы нет прав на каталог.
Внутри обработчика предусмотрите запись в журнал регистрации при ошибке: регламентное задание работает без пользователя, и если выгрузка упадёт, узнать об этом можно будет только из журнала. Оберните запись файла в попытку и логируйте исключение — тогда сбой ночного обмена не останется незамеченным.
Архивы ZIP, пароль и шифрование
Большие выгрузки и пакеты файлов удобно отдавать архивом. ZIP платформа умеет из коробки объектом ЗаписьZipФайла:
Архив = Новый ЗаписьZipФайла("C:\Обмен\vygruzka.zip");
Архив.Добавить("C:\Обмен\tovary.xml");
Архив.Добавить("C:\Обмен\price.xlsx");
Архив.Записать();
По умолчанию в архив попадают только имена файлов без папок. Если выгружаете дерево каталогов и структуру нужно сохранить, у метода Добавить есть режим сохранения путей — указывайте его явно, иначе при распаковке все файлы лягут в один уровень.
Архив с паролем создаётся тем же объектом — пароль передаётся в конструктор. Это защита от случайного открытия, но стойкость zip-шифрования невысока, для чувствительных данных её недостаточно:
Архив = Новый ЗаписьZipФайла("C:\Обмен\secret.zip", "P@ssw0rd");
Архив.Добавить("C:\Обмен\dannye.csv");
Архив.Записать();
Для настоящего шифрования под обмен с госорганами применяют криптографию на сертификатах — объект КриптоМенеджер (шифрование и подпись по ГОСТ через установленный криптопровайдер). Это отдельная большая тема, здесь важно одно: пароль на ZIP и криптографическая защита — разные вещи, не путайте их.
Выгрузку «в облако» 1С делает не записью на диск, а отправкой готового файла по сети — через HTTPСоединение на веб-сервер, WebDAV-хранилище или по API облачного диска. То есть сначала собираете файл во временном каталоге сервера, затем отправляете его HTTP-запросом. Конкретные адреса и заголовки зависят от сервиса — смотрите его документацию.
Типичные ошибки при создании файлов
&НаСервере) — файл лёг на диск сервера, а не пользователя. Отдавайте файл через временное хранилище и ПолучитьФайл.USR1CV8) нет прав на каталог. Выдайте права на папку или пишите в доступный службе путь.КодировкаТекста.UTF8, для старых обменных форматов — windows-1251.Закрыть() у ЗаписьТекста, ЗаписьXML или ЗаписьJSON. Закрывайте объект сразу после записи.Формат(Число, "ЧГ=0") — в значение попали разделители разрядов. Форматируйте числа перед записью.ПолучитьФайл) или установите расширение работы с файлами.Отдельно про путь: проверяйте, что каталог существует, — платформа не создаёт недостающие папки автоматически и запись в несуществующий путь завершится ошибкой. Если каталог может отсутствовать, создавайте его перед записью методом создания каталога, а не полагайтесь на то, что папка уже есть.
Ещё одна неочевидная ситуация — запись поверх открытого файла. Если выгрузка xlsx падает с ошибкой доступа, а прав на папку хватает, проверьте, не открыт ли этот файл в Excel: Windows держит его заблокированным, и перезапись не пройдёт.
Частые вопросы
Как создать файл в 1С без программирования?
Главное меню → Файл → Сохранить как, выбрав формат (xlsx, pdf, txt). Код не нужен.Почему созданный файл не появился на моём компьютере?
ПолучитьФайл.