1с создать файл программно

Обновлено: 07.07.2024

В 1С 8.3 (8.2) для работы с файлами существует два объекта: Файл и ДиалогВыбораФайла.

Рассмотрим каждый по отдельности.

Объект Файл служит для управления параметрами файлов.

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

Например, прочитаем параметры некоторого файла, находящегося на диске C:

В результате мы получим следующую информацию (если файл найден):

Параметры файла:
Полное имя файла: C:\Работа с файлами\статья.txt
Имя: статья.txt
Имя без расширения: статья
Расширение: .txt
Путь без имени: C:\Работа с файлами\
Размер: 899
Это файл: Да
Изменен: 18.05.2015 16:21:28
Только чтение: Нет
Невидимость: Нет

Запись в файл

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Теперь, когда мы выбрали и открыли файл, можно с ним работать, т.е. прочитать его содержимое или записать в него что-нибудь.
Рассмотрим пример:

Чтение файла в 1С

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

Запись текста из 1С в файл

Заметим, что при записи текстового файла можно установить кодировку.

Копирование файла

Здесь все очень просто

Перемещение

Удаление

Диалог выбора файла

В указанных выше примерах есть одно неудобство. Путь к файлу прописан жестко в коде. Чтобы выбрать файл интерактивно, существует объект ДиалогВыбораФайла, о котором речь пойдет ниже.

Объект ДиалогВыбораФайла служит для открытия файла (файлов), сохранения файла или выбора каталога в диалоге специального вида.

Например, выберем и откроем некоторый файл с расширением txt:
Задаем режим диалога выбора. Доступны три варианта: ВыборКаталога, Открытие, Сохранение


Для работы с текстовыми файлами в 1С предназначен объект ТекстовыйДокумент:

Для добавления строк в конец текстового документа используется метод ДобавитьСтроку. Параметром нужно передать добавляемую строку:

Для записи текстового документа в файл на диск нужно вызвать метод НачатьЗапись и вторым параметром указать путь к файлу:

Пример записи текстового файла с тремя строками:

В результате будет получен следующий файл:


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

ПослеЗаписи = Новый ОписаниеОповещения ( "ПослеЗаписи" , ЭтотОбъект ) ; Процедура ПослеЗаписи ( Результат , ДопПараметры ) Экспорт

Есть аналогичный асинхронный метод ЗаписатьАсинх, который использует асинхронность через обещания:

Для записи текстового файла на сервере используется синхронный метод Записать:

С помощью метода УстановитьТекст можно сразу установить весь текст:

Кодировка текстового файла

По умолчанию текстовый файл записывается в кодировке UTF-8. При необходимости кодировку можно изменить, указав в методе НачатьЗапись третий параметр:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16LE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16BE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "windows-1251" ) ;

Если нужно записать в кодировке UCS-2LE или UCS-2BE, то нужно указать UTF-16LE или UTF-16BE. Это почти что одно и то же.

Список всех возможных кодировок можно посмотреть в синтакс-помощнике.

Кодировку текста можно указать не только строкой, но и с помощью системного перечисления КодировкаТекста:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , КодировкаТекста . Системная ) ;

Возможные значения перечисления:

Чтение текстового файла

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

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

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Кодировка текста определяется автоматически из файла. Если кодировку не получится определить, то будет использоваться кодировка UTF-8. При необходимости можно указать требуемую кодировку третьим параметром:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , "UTF-8" ) ;

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

При чтении файла на сервере можно воспользоваться синхронным методом Прочитать:

С помощью метода КоличествоСтрок можно узнать количество строк текстового файла, а методом ПолучитьСтроку, вызываемом в цикле, можно прочитать файл построчно:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Работа со строками текстового документа

В результате будет получен такой текстовый файл:


Если первым параметром указать номер строки, которой еще не существует в текстовом документе, то строка будет просто вставлена в конец документа.


С помощью метода УдалитьСтроку можно удалить строку из текстового документа. Параметром нужно указать номер удаляемой строки:

Методом Очистить можно полностью очистить текстовый документ:

Интерактивное редактирование текстового файла

После чтения текстового файла можно открыть его для интерактивного редактирования. Для этого используется метод Показать:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

В результате в 1С будет открыт редактор текстового документа:


Первым параметром можно переопределить заголовок окна, а вторым указать имя файла, под которым будет предложено сохранить текстовый файл после его редактирования:

//передаем тектовый документ и имя файла через доп. параметры ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ДопПараметры ) ;

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


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

Разделитель строк

При записи текстового документа средствами платформы 1С символ LF преобразуется в символы CR и LF. При чтении выполняется обратное преобразование CR и LF в LF.

При необходимости преобразования можно переопределить в методах НачатьЗапись и НачатьЧтение:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , , Разделитель ) ;

То есть в методе НачатьЗапись указывается символ, в который будет выполнено преобразование символа LF. А в методе НачатьЧтение указывается символ, который нужно преобразовать в символ LF.

Можно указывать только следующие символы:

Если нужно использовать CR и LF, то параметр можно не указывать.

Последовательный доступ к файлу

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

Для решения данной проблемы можно использовать объекты последовательного доступа к текстовым файлам: ЗаписьТекста и ЧтениеТекста. Данные объекты загружают в память только определенный фрагмент текста, с которым в данный момент идет работа.

Т.к. часто возникают вопросы по программному созданию/копированию/обработке объектов 1С:Предприятие в режиме "Управляемые формы", то решил скомпоновать в данной публикации примеры решения таких задач, с комментариями по каждому действию. Поначалу кажется все достаточно запутанно, но если по шагам все разложить и немного вникнуть, то всё должно встать на свои места.

При переходе с "обычных форм" на "управляемые формы" нужно понимать, что теперь имеем клиент-серверной вариант работы программы.

А это означает что то что мы могли ранее программно напрямую изменять объекты в "обычных формах" и видеть на экране результат наших действий, то в "управляемых формах" объект на сервере и объект на клиенте (видимый пользователю) разделены. Так же частично разделены функции и процедуры которые можно выполнять на сервере и на клиенте. Так например на сервере выполняются в основном сложные вычисления и функции связанные с изменениями в базе данных, а на клиенте выполняются не сложные расчеты и функции юзабилити.

ПРИМЕРЫ:

Ниже я приведу пример как создавать/копировать/изменять документы. Данный пример досконально разобран и позволит понять клиент-серверную архитектуру работы и распространить эти знания на другие объекты 1С (справочники, отчеты. ).

Задача была такая: есть справочник номенклатуры, в которые заведены блюда (общепит). Каждое блюдо имеет свою калькуляцию (состав продуктов). Калькуляции хранятся в периодическом регистре сведений. В форме элемента размещен динамический список с калькуляциями, принадлежащими открытому блюду (это могла быть любая другая таблица данных). Необходимо было добавить две кнопки "Создать калькуляцию" (новую) и "Скопировать калькуляцию" (активную из списка).


Для этого я создал соответствующие команды и разместил их на форме.

1. "Создать калькуляцию".

В данном варианте все просто: мы создаем на клиенте процедуру и все действия выполняем прямо на клиенте, т.к. ничего требующего вызова сервера не делаем. Создаем/получаем форму объекта, передаем в переменную ДанныеФормы Объект формы, выполняем элементарные действия с ДанныеФормы и открываем уже заполненную форму.

2. "Скопировать калькуляцию".

С данной операцией уже немного сложнее, часть процедур выполняется на клиенте, а часть на сервере.

Порядок действий таков: Мы на клиенте создаем форму нужного нам объекта и сразу открываем её (ОткрытьФорму. ). Далее как и ранее мы передаем в переменную ДанныеФормы Объект открытой формы.

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

Уже на сервере мы с помощью функции ДанныеФормыВЗначение() преобразуем ДанныеФормы в привычный нам из "обычных форм" объект документа и работаем с ним с использованием серверных процедур. Копируем данные из другого документа, запускаем экспортные процедуры из модуля объекта, дозаполняем прочие реквизиты.

Функция ДанныеФормыВЗначение() требует указания соответствия (типа получаемого объекта): Тип("ДокументОбъект.Калькуляция").

Далее процедурой ЗначениеВДанныеФормы(Док, ДанныеФормы) выполняем обратную операцию: преобразуем объект Документ в переменную ДанныеФормы - понятную для "клиента".

При этом измененные на сервере ДанныеФормы сами не попадут в нашу созданную и открыую в самом начале форму, поэтому мы выполняем процедуру КопироватьДанныеФормы(ДанныеФормы, Форма.Объект) - тем самым запихаем изменения в видимую для пользователя форму документа Калькуляция (обновим в ней данные) .

Выше приведённые примеры решения задач, не являются единственными и в каждом индивидуальном случае могут быть оптимизированы или решены иным способом.

Думаю, начинающим познавать клиент-серверную архитектуру 1С пригодится данная статья )


Сначала файл помещается во временное хранилище и получается его адрес. Адрес передается на сервер. На сервере файл получается из временного хранилища и записывается на диск компьютера сервера:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПутьКФайлу ) ; Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт Расширение = ОписаниеПомещенногоФайла . СсылкаНаФайл . Файл . Расширение ;

Первый параметр процедуры из описания оповещения имеет тип ОписаниеПомещенногоФайла. Данный объект имеет 3 свойства:

В результате через параметр Адрес можно получить файл из временного хранилища. А через параметр СсылкаНаФайл.Файл можно получить всю необходимую информацию о файле.

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

НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПутьКФайлу , УникальныйИдентификатор ) ;

Если до помещения файла в хранилище известен адрес во временном хранилище, куда нужно поместить файл, то его можно указать четвертым параметром:

НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , Адрес , ПутьКФайлу ) ;

Проверка файла до помещения во временное хранилище

Если до помещения файла во временное хранилище нужно выполнить какие-то проверки, то это можно сделать в специальной процедуре, выполняемой до помещения файла во временное хранилище. Имя этой процедуры нужно указать в описании оповещения, которое указывается третьим параметром в методе НачатьПомещениеФайлаНаСервер:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ПередПомещением = Новый ОписаниеОповещения ( "ПередПомещением" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , ПередПомещением , , ПутьКФайлу ) ;

У данной процедуры должно быть 3 параметра:

Например, можно проверить размер файла и если он слишком большой, то отказаться от помещения во временное хранилище:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ПередПомещением = Новый ОписаниеОповещения ( "ПередПомещением" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , ПередПомещением , , ПутьКФайлу ) ; Процедура ПередПомещением ( ПомещаемыйФайл , ОтказОтПомещенияФайла , ДопПараметры ) Экспорт

Помещение файла во временное хранилище с диалогом выбора

Можно предоставить пользователю самому выбрать файл, который нужно поместить во временное хранилище. В этом случае сначала будет открыт диалог выбора файла, пользователь выберет файл и данный файл будет помещен во временное хранилище.

Для открытия диалога выбора файла нужно пятым параметром вместо пути к файлу указать объект ПараметрыДиалогаПомещенияФайлов. Данный объект схож с объектом ДиалогВыбораФайла, но имеет только 4 свойства:

  • Заголовок
  • МножественныйВыбор
  • Фильтр
  • ИндексФильтра
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов ; ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , , , , ПараметрыДиалога ) ; Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт

В этом случае сначала будет открыто диалоговое окно для выбора файла:


Выбранный файл будет помещен во временное хранилище.

Если пользователь нажмет на кнопку Отмена и откажется от выбора файла, то первый параметр в процедуре, вызываемой после помещения файла во временное хранилище будет равен Неопределено.

Если использовалась процедура, вызываемая до помещения файла во временное хранилище, то она будет вызвана после того как пользователь выберет файл.

Можно вообще не указывать объект ПараметрыДиалогаПомещенияФайлов, в этом случае все равно будет открыт диалог выбора файла:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ;

Прогресс помещения файла во временное хранилище

Если файл большой, то он может долго загружаться во временное хранилище. В этом случае неплохо было бы показать пользователя прогресс помещения файла во временное хранилище. Для этого в метод НачатьПомещениеФайлаНаСервер вторым параметром можно передать описание оповещения с именем процедуры, которая будет периодически вызываться в процессе помещения файла во временное хранилище. У данной процедуры должно быть 4 параметра:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; ХодВыполнения = Новый ОписаниеОповещения ( "ХодВыполнения" , ЭтотОбъект ) ; НачатьПомещениеФайлаНаСервер ( ПослеПомещения , ХодВыполнения , , , ПутьКФайлу ) ; Процедура ХодВыполнения ( ПомещаемыйФайл , Помещено , ОтказОтПомещенияФайла , ДопПараметры ) Экспорт Процедура ПослеПомещения ( ОписаниеПомещенногоФайла , ДопПараметры ) Экспорт

В результате в процессе помещения файла во временное хранилище будет показано окно состояния с прогрессом:


Количество вызовов процедуры ХодВыполнения не определено. Для маленького файла это может быть только 1 раз, для большого даже больше 100.

Если в этой процедуре присвоить параметру ОтказОтПомещенияФайла = Истина, то в процедуре, которая будет вызвана после помещения файла у первого параметра свойство ПомещениеФайлаОтменено тоже будет равно Истина и файл не будет помещен во временное хранилище:

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

Асинхронный метод через обещание

Есть аналогичный метод ПоместитьФайлНаСерверАсинх. Данный метод тоже является асинхронным, но вместо описания оповещения использует обещание.

Параметры данного метода полностью совпадают с параметрами метода НачатьПомещениеФайлаНаСервер, только здесь не используется первый параметр с описанием оповещения с именем процедуры, которая вызывается после помещения файла во временное хранилище. Вместо этого обещание возвращает объект ОписаниеПомещенногоФайла (или Неопределено, если использовался диалог выбора и пользователь отказался от выбора файла):

Обещание = ПоместитьФайлНаСерверАсинх ( , , , ПутьКФайлу ) ; Расширение = ОписаниеПомещенногоФайла . СсылкаНаФайл . Расширение ;

Помещение во временное хранилище нескольких файлов

Параметры данного метода схожи с параметрами метода НачатьПомещениеФайлаНаСервер, только там где был один файл или объект, здесь будет массив файлов/объектов.

Вместо пути к файлу нужно передать массив объектов ОписаниеПередаваемогоФайла. Данный объект имеет 2 свойства:

ПослеПомещения = Новый ОписаниеОповещения ( "ПослеПомещения" , ЭтотОбъект ) ; НачатьПомещениеФайловНаСервер ( ПослеПомещения , , , ПомещаемыеФайлы , УникальныйИдентификатор ) ; Процедура ПослеПомещения ( ПомещенныеФайлы , ДопПараметры ) Экспорт Расширение = ОписаниеФайла . СсылкаНаФайл . Файл . Расширение ;

В данном примере последним параметром был указан уникальный идентификатор формы. Если его не указать, то второй файл не будет записан на сервер. Дело в том, что в данном примере вызов сервера происходит дважды: сначала для первого файла, потом для второго. Если не указан уникальный идентификатор формы, то файл будет удален из временного хранилища после окончания серверного вызова, то есть после записи первого файла. А при втором вызове сервера, для записи второго файла, временное хранилище уже будет пустым.

Поэтому нужно или указывать уникальный идентификатор формы в методе НачатьПомещениеФайловНаСервер или записывать все файлы на сервер за один серверный вызов.

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

Читайте также: