В каком формате документы в 1с

Обновлено: 07.07.2024

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

Для начала опишем варианты файлов:

Данный вид файлов представлен, как правило, документами в виде изображений с расширениями *.pdf/*.jpg/*.tif и пр.

Используется такой файл исключительно для присоединения к объектам конфигурации* и их дальнейшей отправкой либо хранения в составе вложения.

Данный вид файлов представлен расширениями различного типа *.mxl/*.xls/*.txt и пр.

Используется для загрузки данных в ИБ через внешние и внутренние обработки 1С.

Подобные файлы имеют расширения *.epf у внешних обработок и *.erf у внешних отчётов соответственно.

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

В эту группу можно отнести файлы расширения *.dt/*.1cd/*.log/*.pff/ *.v8i и пр.

Эти файлы необходимы 1С для корректного функционирования.

*В виде документов учёта, произвольным ЭД в сервисе 1С-ЭДО, письмам в сервисе 1С-Отчётность и прочее.

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

Прикрепление скана договора с контрагентом к первичному документу учёта



Не все формы документов учёта поддерживают возможность прикрепления вложений.

Файл обмена с банком формата *.txt, содержащий данные по движениям по счёту при загрузке в 1С


Или через встроенную в типовую конфигурацию обработку «Обмен с банком», которую можно открыть в «Банковских выписках» через «Ещё».


Файл отчётности, сформированный в другой БД или ПО в *.xml формате, для загрузки и отправки через сервис 1- Отчётность


Разовое открытие обработки можно сделать из «Главного меню» – «Файл» – «Открыть»


Некоторые организации предоставляют внешние обработки для интеграции 1С со сторонним ПО. Для открытия подобных файлов у пользователя 1С в настройках прав должна стоять отметка на «Открытии внешних отчётов и обработок».

Более подробно по открытию внешних отчётов и обработок можно узнать на сайте ИТС .

Пользователи 1С могут столкнуться с необходимостью переноса БД или её созданию и добавлению в список баз. В файловом варианте работы БД файл 1cv8.1cd является самой БД, остальные файлы в общей с ней папке носят вспомогательный характер.


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

С появлением сервиса 1С:ФРЕШ выгрузка БД также может быть представлена файлом data_dump.zip, содержащий лишь данные, введённые в БД в пользовательском режиме, с описанием структуры метаданных, но без их непосредственного наличия.

Выгрузка данных из локальной версии БД в облачную


Загрузка данных из локальной версии БД в облачную




В данной статье мы рассмотрели наиболее частые варианты работы с файлами в 1С. Если вопросы всё же остались, мы будем рады вам помочь. Вам всего лишь нужно обратиться на Линию консультаций 1С компании «Что делать Консалт». Первая консультация совершенно бесплатная!


ИНСТРУКЦИЯ 1С 8 → перейти в меню [СТАТЬИ И ИНСТРУКЦИИ]


*.cf - файл содержит только конфигурацию(код и структура) без пользовательских данных. Создаётся из конфигуратора 1С 8.х: «Конфигурация -> Сохранить конфигурацию в файл» или «Конфигурация -> Поставка конфигурации -> Создать файл поставки и обновление конфигурации -> признак «Создать файл поставки»».

*.cfu - файл содержит только обновление конфигурации. Например файл 1cv8.cfu. Создать конфигурацию из этого файла невозможно, так как он содержит в себе только отличия новой конфигурации от предыдущей. Создаётся из конфигуратора 1С 8.х: «Конфигурация -> Поставка конфигурации -> Создать файл поставки и обновление конфигурации -> признак «Создать файл обновления конфигурации»».

*.cfe - файл-расширение, предназначенный для доработки конфигурации без её изменения. При использовании расширений 1С (*.cfe) - доработанная конфигурация может полноценно обновляться и с поддержки не снимается.

*.dt - файл содержит конфигурацию вместе с пользовательской базой данных. Это специализированный формат архива 1С 8. Создаётся из конфигуратора 1С 8.х: «Администрирование -> Выгрузить информационную базу».

*.epf (*.erf) – файл внешней обработки (отчёта). Любую обработку (отчёт) из конфигурации можно сохранить внешней. Создаётся из конфигуратора 1С 8.х: «Конфигурация -> Открыть конфигурацию -> становимся на нужную обработку (отчёт) -> выделяем правой кнопкой мыши -> Сохранить как внешнюю обработку, отчёт…».

*.1cd – файл полноценной базы данных. Представление имени по умолчанию: 1Cv8.1CD. Включает в себя конфигурацию, базу данных, пользовательские настройки. Открывается платформой 1С 8.x. Создаётся для разработки новой конфигурации автоматически по кнопке «Добавить» при выборе пункта «Создание новой информационной базы».

*.log, *.lgf, *.lgp, *.elf - лог файлы, которые собирают информацию (регистрируют данные) в 1С 8.0 8.1, 8.2, 8.3. Например, файл 1Cv8.lgf (в каталоге 1Cv8Log ) содержит информацию журнала регистрации.

*. cdn - файл с таким расширением ( 1Cv8.cdn) служит для ручной или автоматической блокировки базы данных 1С Предприятия восьмой версии .

*.mxl - файлы печатных форм используются, в том числе и в 1С. Являются как печатными формами документов, справочников, отчётов, так и различными накопителями данных для различных классификаторов. Открывается через Конфигуратор или в режиме 1С:Предприятии через «файл -> открыть». Создаётся точно так же: в режиме Конфигуратор или в 1С:Предприятии через «файл -> новый». Так же файлы с такими расширениями могут служить правилами переноса, например, из 1С 7.7 в 8.2 ( acc77_82.xml и вспомогательная обработка exp77_82.ert) - находятся они обычно в папке ExtForms.

*.efd - это архивный файл 1С, используется для установки конфигурации. Содержит или конфигурацию 1с или обновление к ней. Запускается с помощью вспомогательного исполняющего файла setup.exe (должен находиться в одной папке).

*.mft – вспомогательный файл для создания конфигурации из шаблона. Содержит информацию о конфигурации, описание, пути, название. Используется непосредственно самой платформой при создании информационной базы 1С из шаблона.

*.grs - файлы графических схем в специализированном формате 1С. Открывается через Конфигуратор или в режиме 1С:Предприятии через «файл -> открыть». Создаётся точно так же: в режиме Конфигуратор или в 1С:Предприятии через «файл -> новый».

*.geo - файлы географических схем в специализированном формате 1С. Открывается через Конфигуратор или в режиме 1С:Предприятии через «файл -> открыть». Создаётся точно так же: в режиме Конфигуратор или в 1С:Предприятии через «файл -> новый».

*.st - файлы шаблонов текстов. Используются в основном 1С разработчиками.

*.pff - файл с сохраненными замерами производительности. Используются системными администраторами и специалистами 1С.

*.pfl - файл содержащий различные параметры для старта и работы с 1С:

. 1Cv8.pfl - параметры для компьютера/информационной базы/пользователя (в т.ч. пароли пользователей, настройки текстового редактора, настройки глобального поиска по текстам конфигурации, список переменных для быстрого просмотра в отладчике ). Настройки модулей в конфигураторе хранятся в файле 1Cv8.pfl . Этот файл обычно находится в каталоге настроек пользователя C:\Users\<ИмяПользователя>\AppData\Roaming\1C\1cv8.


Раньше и не верилось, например, что бухгалтерию можно вести в телефоне, а теперь — пожалуйста, загрузил специальное приложение и вперед! Разработчики постоянно совершенствуют программу 1С. Так, начиная с релиза 3.0.81, в неё в пилотном режиме добавлена возможность создания документов «Акт», «Накладная», «Счет-фактура» с помощью загрузки по фотографии или сканированному варианту. Как это делается, расскажем в статье.

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

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

Начнем с первого варианта — загрузка по фото или скану.

Загрузка документов в 1С из скана (фото)

Имеем сфотографированный телефоном документ и отправленный пользователю на электронную почту: акт об оказании услуг на сумму 2750 руб. от контрагента ИП Кругловой О.А. Услуги оказаны ООО «Василек». Контрагент и услуга новые, в 1С не внесены.

Шаг 1. Перейдите в раздел «Покупки» — «Поступления (Акты, накладные, УПД)».

В журнале документов нажмите кнопку «Загрузить» и выберите команду «Из скана (фото)».


Шаг 2. Для добавления фото в 1С нажмите кнопку «Добавить файлы».


Шаг 3. В модуле «Распознавание документов» нажмите «Добавить». В открывшемся окне выберите файл фотографии документа или сканированное фото. В нашем случае прикрепляем файл, присланный на электронную почту.


Шаг 4. После переноса файла в 1С выделите его и нажмите «Распознать».


Далее действия выполняются автоматически. Документ отобразится в правой части окна.

Дождитесь окончания обработки, пока статус документа не изменится на «Распознанный» — значок в виде буквы «А» и не появится «синяя стрелочка».

В строке отображаются данные документа:


  • тип — в нашем примере «Акт об оказании услуг»;
  • имя файла и наименование документа;
  • автор — в данном примере это пользователь 1С;
  • организация, чей документ загружается. В нашем примере ООО «Василек».

Шаг 5. Щелкните дважды мышкой на строке. Откроется форма ввода документа в 1С с заполненными по возможности реквизитами. А те данные, которые не сопоставлены, обозначены как ошибки.

Так как контрагент, договор и номенклатура ранее не использовались в программе, то программа не может их сопоставить с распознанными данными фото. Эти поля помечены красным.


Пройдемся по ошибкам и дозаполним форму.

Ошибка первая: не сопоставлен контрагент

Шаг 6. Щелкните на поле «Контрагент». В сканированном эскизе фото программа автоматически покажет нужный распознанный фрагмент и предложит создать нового контрагента, т.к. он отсутствует в базе.

Нажмите на выпадающую ссылку «Создать: Индивидуальный предприниматель Круглова Ольга Александровна». Наименование контрагента считано с фото документа.


Шаг 7. В открывшемся окне подтвердите создание контрагента — кнопка «Создать».


Вид контрагента 1С определит автоматически.

При возможности использовании сервиса 1С-Контрагент программа предложит им воспользоваться. Согласимся на предложение.


Ошибка вторая: нет договора

Шаг 9. Поле «Договор» в нашем примере мы заполнили вручную, указав «Без договора». Но при указанном в документе договоре его также можно внести с помощью используемой обработки.

Ошибка третья: не сопоставлена номенклатура

Шаг 10. Щелкните на поле «Номенклатура» и создайте новый элемент, нажав на всплывающую «подсказку».


Шаг 11. В окне заполнения данных о номенклатуре укажите «Вид номенклатуры». Наименование и единица измерения заполнятся из фото документа.


Шаг 12. Заполнив данные, нажмите кнопку «Создать» и выберите нужный вид документа. В нашем примере это «Услуги (акт)».


Из рабочего места «Распознавание документов», окошка «Распознанные», наш документ исчезнет и переместится в «Обработанные». Если нажмем одноименную кнопку, отобразятся документы, на основании которых созданы «Акты» или «Накладные».


Шаг 13. Откройте журнал «Поступления (Акты, накладные, УПД)» и увидите сформированный обработкой документ из нашего фото.


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

Рассмотрим еще один вариант переноса документов — с помощью фото, но используя мобильное приложение «1С — Сканер документов».

Передача документов в 1С: Бухгалтерию предприятия ред. 3.0 с помощью приложения «1С: Сканер документов». Установка приложения «1С: Сканер документов»

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

Сделать это можно из рабочего места в разделе «Продажи» или «Покупки» — подраздел «Сервис» — «Загрузить документы из сканов (фото)».

Это тоже рабочее место, что мы рассмотрели выше.


Шаг 1. Перейдите в рабочее место и нажмите кнопку «Мобильные приложения».



Шаг 3. Используя QR-код, загрузите мобильное приложение. Оно доступно в двух вариантах операционных систем телефона:

  • для пользователей Android;
  • для пользователей Apple iOS.


В нашем примере мы установим на телефон приложение для Android, используя приложение Google play.

Шаг 4. Найдите приложение и нажмите «Установить»


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

Шаг 5. Для добавления «клиента» загрузки нажмите кнопку «Добавить».


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

В окне создания «клиента» — «пользователя» задайте его наименование.

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


Синхронизируем нового клиента с его приложением.

Шаг 6. Запустите приложение на телефоне. Автоматически оно предложит войти в систему. Вы можете ввести ключ пользователя (при удаленном расположении клиента) или отсканировать QR-код, нажав на него.


Если у вас пока нет кода или ключа, можно воспользоваться для ознакомления «Демо-режимом».

Загрузка фото через приложение «1С: Сканер документов» и синхронизация с его с 1С

Интерфейс программы прост. Он имеет только раздел «Мои документы». Добавить документы можно:

  • выбрав готовый файл с телефона;
  • выбрав действие — Сделать фото.

Воспользуемся вторым вариантом.


Шаг 8. Как только файл фото попадает в приложение, происходит его обработка. Приложение автоматически его отправит в 1С.


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


Для примера сфотографирован и передан еще раз этот же документ «Акт об оказании услуг».

Шаг 9. Перейдите в 1С. В рабочем месте «Распознавание документов» автоматически появился переданный из приложения документ.

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

У строки документа имеется пиктограмма — «листик со скрепкой». Нажав на нее можно перейти к документу и посмотреть прикрепленное вложение.


Далее действуем также, как и при загрузке фото (скана) с компьютера.

Шаг 10. Щелкните дважды на строке документа и откроется его форма.


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

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

Шаг 11. Проверьте документ на наличие ошибок (незаполненных полей).

Обратите внимание на гиперссылку — «Связанные документы». Нажав на нее, пользователь видит, что имеются дубли распознанного документа и в системе уже сформирован документ «Поступление (Акт, накладная, УПД)».



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

Так как мы рассматриваем пример загрузки, нажмем «Создать новый».

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


Шаг 12. Перейдите в журнал документов по поставщикам — «Поступление (акты, накладные, УПД). В журнале два документа. Первый загруженный с помощью фото с компьютера, через кнопку «Загрузить». Второй — с помощью мобильного приложения «1С: Сканер документов».


Обратите внимание на значок «скрепка» у каждого загруженного нами документа. Это означает, что имеются прикрепленные файлы.

Выделив документ, нажмите «кнопку-скрепку» на панели инструментов журнала. Откроется окно «Присоединенные файлы», где хранится наша фотография документа или его скан.


Дополнительные настройки рабочего места «Распознавание документов»

В рабочем месте «Распознавание документов» у нас два документа со статусом «Отработанные».

Посмотрим, какие настройки рабочего места еще имеются.

  • «Кнопка-картинка» — «Показать миниатюры файлов» / «Скрыть миниатюры файлов» — отображает фото документа в нижней части рабочего стола.
  • «Кнопка-скрепка» — «Показать панель с документами» / «Скрыть панель с документами» — отображает связанные документы и файлы с правой стороны рабочего места.


При нажатой кнопке «Загружено» в списке отображаются все документы, сгруппированные по датам загрузки. Пользователь может установить отбор по контрагенту или организации, нажав одноименные кнопки.


Обратите внимание на «кнопку-шестеренку» на панели задач.


Здесь пользователь может задать дополнительные настройки, которые включают:

  • настройки распознавания документов;
  • настройки заполнения документов;
  • настройки обработки документов;
  • прочие настройки.

Для изменения настроек установите галочку или переместите переключатель в нужное положение.


По гиперссылке «Соответствие распознанных строк» можно посмотреть, как сопоставлялись значения справочников


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

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

Однако, хорошей, добротной документации на этот формат, к сожалению, совсем немного. На написание данной статьи меня надоумила публикация глубокоуважаемого awa, который подробно, во всех деталях описал структуру формата файловой ИБ 1С:Предприятия (*.1CD).

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

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

Предыстория

Как уже говорилось выше, структура формата давно известна и в сети есть информация по его структуре (хотя, довольно скудная). Мне эта информация понадобилась п ри разработке программы V8Viewer, работая над которой, я опирался на следующие материалы:

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

Терминология

Перейдем непосредственно к теме нашего обсуждения.

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

Во-первых, в этом формате создаются не только файлы конфигурации, но также файлы внешних отчетов и обработок. В интернете мне попадалось название Compound-файл. Возможно, оно является устоявшимся среди старожилов 1С, но мне оно не очень нравится.

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

Смотрим внутрь

Логической единицей хранения данных внутри контейнера является документ. Документ, это осмысленный законченный набор данных, который можно прочитать и каким-то образом интерпретировать. Я специально не пользуюсь термином «файл», поскольку, это название я приберегу для другой сущности, о которой чуть позже.

Итак, в общих чертах, файл CF (EPF/ERF) представляет собой контейнер, в котором хранятся документы.


Каждый документ внутри контейнера может быть разбит на блоки. Минимальной физической единицей хранения данных является блок, но осмысленной логической единицей является документ. Иными словами, документы внутри контейнера могут лежать в виде разрозненных кусочков (блоков) и для того, чтобы прочитать содержимое документа, все его кусочки нужно собрать и объединить.


Структура контейнера

Контейнер включает в себя следующие части (по порядку):

  1. Заголовок контейнера
    1. Адрес первого пустого блока, в который можно добавлять данные
    2. Размер блока по умолчанию
    3. Количество файлов в контейнере

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

    Структура блока

    Блок состоит из заголовка и тела. В заголовке указывается общий размер всего документа, размер текущего блока и адрес (позиция в файле) следующего блока. Сразу за заголовком идет тело блока – собственно, те данные, которые нам нужны. Тело блока имеет ровно ту длину (в байтах), которая указана в заголовке.

    Внутри контейнера тут и там встречается волшебная константа, обозначающая некую «пустоту» – это число 0x7fffffff.

    Когда мы собираем документ из блоков, то смотрим в заголовке на адрес следующего блока. Если он равен 0x7fffffff, то «следующего» блока нет, этот – последний.

    Константа 0x7fffffff - это значение INT_MAX, т.е. максимальное значение 4-байтового целого числа со знаком.

    Логические «файлы»

    Я упоминал, что термин «файл» я приберегу до лучших времен. Эти времена настали :)

    Вся конфигурация хранится в контейнере в виде файлов. Если мы вспомним школьный курс информатики, то вспомним, что «файл», говорили нам – это именованный документ.

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

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

    Компоненты файла

    Каждый файл состоит из двух документов:

    1. Документ атрибутов, который содержит имя файла и даты создания/изменения
    2. Документ содержимого, который содержит собственно тело файла

    Оглавление контейнера

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

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

    1. Адрес (смещение в файле) документа атрибутов
    2. Адрес (смещение в файле) документа содержимого
    3. Число 0x7fffffff (маркер конца записи).


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

    Запись оглавления представляет собой 2 значащих числа INT32. Первое число – это адрес документа атрибутов файла. По этому адресу мы попадем на начало 1-го блока документа атрибутов. Из документа атрибутов мы можем узнать имя файла. Второе число – адрес документа содержимого файла. По этому адресу мы попадем на начало 1-го блока документа содержимого, откуда будем читать непосредственно данные файла.

    Особенности сжатия данных.

    Контейнер может содержать самые разные файлы. Как правило, это текстовые файлы в кодировке UTF-8. Однако среди файлов контейнера могут встречаться другие файлы-контейнеры. Проще всего провести аналогию с файловой системой. Контейнер – это директория, а файлы внутри контейнера – это ее содержимое. Директория может содержать другие директории.

    Корневой каталог этой «файловой системы» - это сам файл *.CF. Внутри него могут быть другие файлы-контейнеры, по сути – вложенные директории, которые считываются ровно по тому же самому алгоритму и имеют ровно ту же самую структуру.

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

    Цепочка свободных блоков

    В результате удаления каких-либо данных из контейнера в нем могут образовываться пустые места. Эти свободные места связываются в цепочку и образуют этакий «документ», данные которого отсутствуют. Иными словами, свободные блоки связаны друг с другом по тому же принципу, по которому связаны друг с другом блоки документов. Адрес первого свободного блока указывается в самом начале заголовка контейнера. Если адрес свободного блока равен INT_MAX, то это значит, что в середине контейнера нет свободных (пустых) блоков.

    Краткий итог по теоретической части

    1. Файл CF(EPF/ERF) записан в формате «контейнера»
    2. Контейнер начинается с заголовка
    3. Все содержимое контейнера, за исключением заголовка, записано в виде «документов»
    4. Документ может быть разбит на блоки
    5. Документ начинается с заголовка блока, по которому можно узнать, как прочитать весь документ целиком
    6. Сразу за заголовком контейнера идет документ оглавления
    7. Оглавление, это набор записей, которые указывают на «файлы» внутри контейнера
    8. Каждый файл состоит из двух документов – документа атрибутов, где указано имя этого файла и документа содержимого, где, собственно, расположены данные файла.
    9. Каждая запись оглавления содержит 2 адреса. Первый – адрес документа атрибутов файла, второй – адрес документа содержимого.
    10. Контейнер может содержать вложенные контейнеры (как бы, вложенные папки)
    11. Файлы внутри корневого контейнера сжаты по алгоритму Deflate, файлы внутри вложенных контейнеров записаны без сжатия.

    Давайте уже пощупаем байты

    Итак, настало время рассмотреть, как конкретно устроены все упомянутые выше сущности.

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

    Чтение документа по блокам

    Каждый документ в контейнере обязательно начинается с заголовка блока. При этом документ может быть разбит на несколько блоков. Для того чтобы прочитать документ, необходимо его «собрать» из блоков.

    Итак, заголовок блока представляет собой строку длиной 31 байт. Строка эта имеет следующий вид:

    [CRLF][Размер всего документа][Пробел][Размер текущего блока][Пробел][Адрес следующего блока] [Пробел] [CRLF], где:

    • CRLF – стандартный перевод строки Windows, пара символов \r\n (0x0D,0x0A)
    • Размер всего документа – общая длина документа в байтах. Записана в виде строкового представления hex-числа. Длина – 8 байт.
    • Пробел – пробел. Символ 0x20
    • Размер текущего блока – длина тела блока в байтах. Записана также в виде строкового представления числа INT32 в hex-формате. Если документ состоит из единственного блока, то размер всего документа либо меньше, либо совпадает с размером текущего блока (что логично)
    • Адрес следующего блока – адрес по которому расположен очередной блок документа. Если адрес следующего блока равен INT_MAX, то это значит, что следующего блока нет. Адрес следующего блока также записан в виде строкового представления числа.

    Сразу за заголовком блока идет тело блока, которое имеет длину, указанную в поле «Размер текущего блока».


    Рассмотрим рисунок: длина всего документа составляет 0x54 байта, красной рамкой выделены эти 0x54 байта. Это данные документа. Длина блока составляет 0x200 байт, т.е. больше чем длина самого документа. По этой причине остальные данные блока составляют "нули" неиспользуемого пространства. Значащие байты - это те, которые отмечены красной рамкой.

    Если длина документа больше длины блока, то нужно прочитать следующий блок. Если в поле «Адрес следующего блока» записано значение, отличное от 0x7fffffff, то необходимо считать текущий блок, затем перейти по этому адресу и считать другой блок. Если в этом блоке также будет задан адрес следующего блока, то надо перейти и туда. Таким образом, формируется «цепочка» блоков, из которых состоит документ.

    Чтение необходимо продолжать до тех пор, пока в поле «Адрес следующего блока» не встретится значение 0x7fffffff или пока не будет считано количество байт, указанное в поле «Размер всего документа».

    Поле «Размер всего документа» имеет смысл только для первого блока. Во всех последующих блоках документа оно имеет значение 0x00000000.

    Формат заголовка контейнера

    Заголовок контейнера имеет длину 16 байт и состоит из следующих полей:

    Поле

    Тип

    Пояснение

    Адрес первого свободного блока

    Смещение, по которому начинается цепочка свободных блоков

    Размер блока по умолчанию

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

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

    Число, отражающее некоторую величину, как правило, совпадающую с количеством файлов в контейнере, однако, коллеги в комментариях считают, что это не совсем так. На алгоритм интерпретации контейнера данное число никак не влияет, его можно игнорировать.

    Всегда равно 0 (всегда ли?)

    Формат записи документа оглавления

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

    Поле

    Тип

    Пояснение

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

    Адрес документа атрибутов файла

    Адрес документа содержимого

    Адрес документа содержимого файлов

    Всегда равно 0x7fffffff

    Формат документа атрибутов файла

    Документ атрибутов описывает имя файла и даты его создания/изменения.

    Поле

    Тип

    Пояснение

    Время создания файла

    Время создания файла, выраженное в количестве 100-микросекундных интервалов, прошедших с начала нашей эры (01.01.0001 00:00:00)

    Время изменения файла

    Всегда равно 0. Возможно, это флаги атрибутов, что-то вроде «только чтение», «скрытый» и т.п. Однако, я не встречал файлов, где это поле бы отличалось от нуля.

    Строка в формате UTF-16

    Занимает все оставшееся тело документа (за вычетом 2-х дат и резервного поля)


    Принцип чтения контейнера

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

    Чтение оглавления

    1. Собрать из блоков документ оглавления и прочитать его
    2. Обойти все записи в документе оглавления и прочитать документы атрибутов (имена) файлов контейнера
    3. Сопоставить каждому полученному имени адрес документа содержимого
    4. На выходе получается соответствие «Имя файла» -> «Адрес содержимого»

    Чтение файлов

    1. По имени файла получить из оглавления адрес документа содержимого
    2. Собрать из блоков документ содержимого
    3. Если это корневой контейнер, то распаковать документ содержимого (он сжат)
    4. Готово. Полученный результат является данными искомого файла.

    Обновление от 25.02.2014

    В статью внесены правки, рекомендованные awa в комментариях.

    В заключение

    Данная статья не является истиной в последней инстанции, вероятно, в ней есть даже ошибки. Тем не менее, если данная тема Вам интересна, то я надеюсь, что эта статья поможет вам в реализации ваших проектов. Удачи!

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