Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

 

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2022

 

PT for 1C | Выполнение заданий в системе 1С:Предприятие | Обработка файлов

Prev


Выполнение заданий на обработку файлов

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

Обработка нетипизированных двоичных файлов: File1С46

Особенности выполнения заданий на обработку файлов рассмотрим на примере задания File1С46.

File1С46°. Дан файл произвольного типа. Создать его копию с новым именем.

Создание программы-заготовки и знакомство с заданием

Проект-заготовку для решения задания File1C46 можно создать с помощью модуля PT4LoadЮ, входящего в состав базового варианта задачника Programming Taskbook. При этом в конфигуратор среды 1С:Предпритятие будет загружен шаблон, содержащий процедуру Решение, в которую необходимо ввести решение задания. Приведем начальную часть содержимого данного файла:

Процедура Решение(pt)
  pt.Задание("File1С46");

КонецПроцедуры

Эта часть содержит описание процедуры Решение, в которой необходимо запрограммировать решение задания. Процедура Решение уже содержит вызов процедуры Задание, инициализирующей задание File1С46. Файл File1С46.1с содержит также описание стартовой процедуры ПриНачалеРаботыСистемы, в которой производится вызов процедуры Решение. Процедура ПриНачалеРаботыСистемы не требует редактирования при выполнении задания, поэтому приводить ее текст мы не будем.

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

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

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

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

Вернемся к нашей программе, только что запущенной на выполнение. Так как в ней не указаны операторы ввода-вывода, запуск программы считается ознакомительным, проверка решения не производится, а в разделе результатов отображается вкладка «Пример верного решения» с контрольными данными (в нашем случае это числа, которые должны содержаться в результирующем файле при правильном решении задания).

Ввод исходных данных

Добавим в процедуру Решение фрагмент, позволяющий ввести имя исходного файла.

Процедура Решение(pt)
  pt.Задание("File1C46");
        
  ИмяИсходногоФайла = pt.ПолучитьСтроку();
                
КонецПроцедуры

Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе выполняется ввод исходных данных. Так как имя результирующего файла осталось непрочитанным, этот вариант решения будет признан неверным и приведет к сообщению «Введены не все требуемые исходные данные. Количество прочитанных данных: 1 (из 2)».

Создание результирующего файла

Для того чтобы создать результирующий файл, в языке 1С:Предприятие можно использовать процедуру КопироватьФайл(«Имя файла источника», «Имя файла приемника»). Таким образом, для выполнения данного задания достаточно прочесть имена файлов и указать их в процедуре КопироватьФайл:

Процедура Решение(pt)
  pt.Задание("File1c46");
        
  ИмяИсходногоФайла = pt.ПолучитьСтроку();
  ИмяРезультирующегоФайла = pt.ПолучитьСтроку();
  КопироватьФайл(ИмяИсходногоФайла, ИмяРезультирующегоФайла);
        
КонецПроцедуры

После запуска этого варианта программы мы получим сообщение «Верное решение. Тест номер 1 (из 5)», а после пяти подобных запусков — сообщение «Задание выполнено!». С помощью модуля PT4Results из базового варианта задачника Programming Taskbook мы можем вывести на экран окно результатов, в котором будут перечислены все наши попытки решения задания:

File1C46     e24/03 12:08 Ознакомительный запуск.
File1C46     e24/03 12:12 Введены не все требуемые исходные данные.
File1C46     e24/03 12:29 Задание выполнено!

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

   КопироватьФайл(pt.ПолучитьСтроку(), pt.ПолучитьСтроку());

Текстовые файлы: File1С1, File1C21

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

Создание текстового файла

В качестве первого примера задания на текстовые файлы рассмотрим задание File1C1.

File1C1°. Дано имя файла и целые положительные числа N и K. Создать текстовый файл с указанным именем и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).

При запуске программы с созданной заготовкой на экране появится окно задачника следующего вида:

Вначале приведем вариант решения, в котором файл заполняется построчно:

Процедура Решение(pt) 
  pt.Задание("File1c1");
        
  ИмяФайла = pt.ПолучитьСтроку();
  N = pt.ПолучитьЧисло();
  K = pt.ПолучитьЧисло();
                
  стр = "";
  Для инд = 1 по K Цикл
    стр = стр + "*";
  КонецЦикла;
        
  Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
        
  Для инд = 1 по N Цикл
    Текст.ЗаписатьСтроку(стр);
  КонецЦикла;
        
  Текст.Закрыть();
КонецПроцедуры

Следует обратить внимание на то, что при создании переменной-объекта Текст типа ЗаписьТекста необходимо указать не только имя текстового файла, но и используемую в этом файле символьную кодировку. Во всех заданиях текстовые файлы имеют стандартную Windows-кодировку; этой кодировке соответствует значение КодировкаТекста.ANSI, которое следует указать при создании объекта Текст.

В данном решении вначале формируется вспомогательная строка из K символов «*», а затем созданная строка N раз записывается в текстовый файл. Для записи в текстовый файл строки и следующего за ней маркера конца строки в «1С:Предприятие» используется процедура ЗаписатьСтроку(«Строка», «Разделитель») объекта ЗаписьТекста (второй параметр является необязательным). Если после записи строки в файл не требуется записывать маркер конца строки, то в «1С:Предприятие» вместо процедуры ЗаписатьСтроку(«Строка», «Разделитель») надо использовать процедуру Записать(«Строка») объекта ЗаписьТекста.

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

Процедура Решение(pt)
  pt.Задание("File1c1");
        
  ИмяФайла = pt.ПолучитьСтроку();
  N = pt.ПолучитьЧисло();
  K = pt.ПолучитьЧисло();
        
  Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);

  Для инд1 = 1 по N Цикл
    Для инд2 = 1 по K Цикл
      Текст.Записать("*");      
    КонецЦикла;
    Текст.Записать(Символы.ПС);
  КонецЦикла;
                
  Текст.Закрыть();
КонецПроцедуры;

В данном варианте решения после записи очередного символа «*» перехода на новую строку в файле не происходит. После вывода K звездочек в файл добавляем маркер конца строки, для этого вызывается процедура Записать с параметром Символы.ПС. Заметим, что с точки зрения быстродействия предпочтительнее использовать построчную запись в файл.

Преобразование текстового файла

Рассмотрим задание File1C21, в котором требуется не создать новый текстовый файл, а преобразовать уже имеющийся.

File1C21°. Дан текстовый файл, содержащий более трех строк. Удалить из него последние три строки.

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

Процедура Решение(pt) 
  pt.Задание("File1C21");
        
  ИмяИсходногоФайла = pt.ПолучитьСтроку();
  ИмяВспомогательногоФайла = ПолучитьИмяВременногоФайла();
        
  Текст = Новый ЧтениеТекста(ИмяИсходногоФайла, КодировкаТекста.ANSI);
  Текст.Открыть(ИмяИсходногоФайла, КодировкаТекста.ANSI);
        
  стр = Текст.ПрочитатьСтроку();
  к = 0;
  Пока стр <> Неопределено Цикл
    к = к + 1;
    стр = Текст.ПрочитатьСтроку();
  КонецЦикла;
        
  Текст.Закрыть();
        
  Текст.Открыть(ИмяИсходногоФайла, КодировкаТекста.ANSI);
  Результат = Новый ЗаписьТекста(ИмяВспомогательногоФайла, КодировкаТекста.ANSI);
        
  Для инд = 1 по к-3 Цикл
    стр = Текст.ПрочитатьСтроку();
    Результат.ЗаписатьСтроку(стр);
  КонецЦикла;
        
  Текст.Закрыть();
  Результат.Закрыть();
        
  УдалитьФайлы(ИмяИсходногоФайла);
  КопироватьФайл(ИмяВспомогательногоФайла, ИмяИсходногоФайла);
  УдалитьФайлы(ИмяВспомогательногоФайла);
КонецПроцедуры

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

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

Процедура Решение(pt)
  pt.Задание("File1C21");
        
  ИмяИсходногоФайла = pt.ПолучитьСтроку();
  ИмяВспомогательногоФайла = ПолучитьИмяВременногоФайла();
        
  Текст = Новый ЧтениеТекста(ИмяИсходногоФайла, КодировкаТекста.ANSI);
  Текст.Открыть(ИмяИсходногоФайла, КодировкаТекста.ANSI);
        
  Результат = Новый ЗаписьТекста(ИмяВспомогательногоФайла, КодировкаТекста.ANSI);
        
  МассивСтрок = Новый Массив;
  Для инд = 1 по 3 цикл
    МассивСтрок.Добавить(Текст.ПрочитатьСтроку());
  КонецЦикла;

  ном = 0;
  стр = Текст.ПрочитатьСтроку();
  Пока стр <> Неопределено Цикл
    Результат.ЗаписатьСтроку(МассивСтрок[ном]);
    МассивСтрок[ном] = стр;
    стр = Текст.ПрочитатьСтроку();
    ном = (ном + 1) % 3;
  КонецЦикла;   
        
  Текст.Закрыть();
  Результат.Закрыть();
        
  УдалитьФайлы(ИмяИсходногоФайла);
  КопироватьФайл(ИмяВспомогательногоФайла, ИмяИсходногоФайла);
  УдалитьФайлы(ИмяВспомогательногоФайла);
КонецПроцедуры

Прокомментируем приведенное решение. Вначале элементы вспомогательного массива МассивСтрок инициализируются первыми тремя строками из исходного файла (по условию файл содержит не менее трех строк). Для хранения номера текущего элемента массива используется переменная ном.

На каждом итерации цикла Пока во вспомогательный файл записывается строка МассивСтрок[ном], т. е. значение текущего элемента массив МассивСтрок (в этот момент уже известно, что после данной строки в исходном файле содержатся, по крайней мере, три строки: две из этих строк уже прочитаны в массив, а на третьей строке располагается файловый указатель). Затем из исходного файла считывается очередная строка, которая записывается на место только что сохраненного во вспомогательном файле элемента массива МассивСтрок. Наконец, выполняется циклическое изменение номера ном: 0 переходит в 1, 1 — в 2, 2 — в 0 (для этого используется операция % взятия остатка от деления нацело).

После завершения цикла Пока во вспомогательный файл будут записаны все строки исходного файла, кроме последних трех, а эти три последние строки будут содержаться в массиве МассивСтрок. Итак, использовав вспомогательный массив из трех строк, мы получим эффективный однопроходный алгоритм решения задания File1C21.


Prev

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2022