Фактическая длина файла отличается от указанной в таблице как исправить
Некоторые особенности устройства и работы файловой базы данных «1С:Предприятия 8»
В данном разделе рассматриваются некоторые особенности внутреннего устройства и работы механизмов файловой базы данных «1С:Предприятия 8», которые не освещены в документации, но могут быть интересны пользователям и разработчикам прикладных решений на платформе «1С:Предприятие 8». Приведенное описание соответствует платформе «1С:Предприятие» версии 8.3.4.
Устройство файла *.1CD
На самом нижнем уровне файл *.1CD или файл базы данных содержит внутри своего рода файловую систему, включающую в себя так называемые внутренние файлы. Файл *.1CD имеет страничную организацию, то есть состоит из страниц размером 4096 байт (4 К). Размер файла *.1CD всегда кратен 4 К.
Каждая из остальных страниц может либо принадлежать какому-либо из внутренних файлов, либо находиться в списке свободных страниц.
Внутренние файлы
- корневая страница,
- индексные страницы,
- страницы данных.
Эти страницы образуют дерево, корнем которого является корневая страница, промежуточными узлами являются индексные страницы, а листьями – страницы данных.
Корневая страница содержит служебную информацию внутреннего файла, такую как длина файла, номер версии данных файла и т. п. Кроме того, на корневой странице содержится до 1018 номеров индексных страниц.
Индексные страницы образуют промежуточный уровень дерева. Индексная страница содержит число страниц данных, адресуемых данной индексной страницей, и до 1023 номеров страниц данных.
Из сказанного выше следует, что внутренний файл может включать не более чем 1 041 414 (1018 * 1023) страниц данных. Следовательно, максимальный размер внутреннего файла не может превышать 4 265 631 744 (1018 * 1023 * 4096) байта. Для адресации отдельных байтов внутреннего файла используются 4-байтовые целые числа без знака.
Для представления внутреннего файла нулевой длины достаточно одной только корневой страницы. Если размер внутреннего файла составляет от 1 до 4096, то он представляется тремя страницами: одной корневой, одной индексной и одной страницей данных. При дальнейшем росте размера файла добавляются новые страницы данных, и их номера помещаются в индексную страницу. Как только индексная страница перестает вмещать номера страниц данных, добавляется новая индексная страница и ее номер добавляется в корневую страницу. И так далее.
Внутренние файлы не имеют имен. Для идентификации внутренних файлов используются номера их корневых страниц.
Список свободных страниц
При необходимости увеличения размера или создании нового внутреннего файла по возможности используются страницы из списка свободных страниц.
Устройство базы данных
Внутренние файлы в конечном счете предназначены для хранения базы данных. База данных представляет собой совокупность таблиц. Каждой таблице может соответствовать от двух до четырех внутренних файлов:
- файл описания таблицы,
- файл данных,
- файл индексов,
- файл данных неограниченной длины.
Файл описания и файл данных присутствуют обязательно для каждой таблицы. Файл индексов присутствует, если в таблице определен хотя бы один индекс. Файл данных неограниченной длины присутствует, если в структуре таблицы определена хотя бы одна колонка неограниченной длины.
Кроме того, имеется файл описания базы данных. Данный файл содержит информацию о локали базы данных, а также номера корневых страниц внутренних файлов описания для каждой из таблиц базы данных.
Таблицы
Файл описания таблицы
Файл описания таблицы содержит полное описание таблицы, которое включает:
- имя таблицы;
- перечень колонок таблицы, включая их имена и типы;
- перечень индексов таблицы, включая их имена и индексируемые колонки;
- номера корневых страниц внутренних файлов данных, индексов и данных неограниченной длины.
При открытии базы данных считывается файл описания базы данных и адресуемые им файлы описания таблиц. На основании этой информации инициализируются внутренние структуры данных, необходимые во время выполнения. Прочие файлы таблиц на этом этапе не открываются. Их открытие выполняется по мере обращения к таблицам. Это сделано из соображения ускорения процесса открытия, а также из предположения, что в данном сеансе могут быть обращения не ко всем таблицам базы данных.
Файл данных
Файл данных содержит записи таблицы. Каждая запись содержит значения всех колонок таблицы, кроме значений колонок неограниченной длины. Записи имеют фиксированную длину. Поэтому адрес записи может быть легко вычислен по номеру записи (N) и длине (L) как N * L .
Номера записи представлены 4-байтовыми целыми числами. Запись с номером 0 используется для служебных целей. Номера «настоящих» записей начинаются с 1.
Длина записи может быть вычислена как сумма длин всех колонок плюс от 1 до 17 байт служебной информации. Ограничений на длину записи не накладывается.
Ниже приведена информация о типах данных и соответствующем размере колонок:
Десятичное число с фиксированной точкой. Хранится в десятичном виде по две десятичные цифры на один байт. Зарезервировано место для знака. Размер может быть вычислен по формуле:
(p + 1) / 2 + ( p + 1) % 2
Строка фиксированной длины, состоящая из n однобайтовых символов. Размер колонки равен n .
Строка Unicode фиксированной длины, состоящая из n символов в кодировке UTF-16. Размер колонки равен n * 2 .
Двоичные данные фиксированной длины. Размер колонки равен n .
Строка переменной длины, состоящая не более чем из n однобайтовых символов. Размер колонки равен n + 2 байта. Дополнительные 2 байта используются для хранения фактической длины.
Строка Unicode переменной длины, состоящая не более чем из n символов в кодировке UTF-16. Размер колонки равен n * 2 + 2 . Дополнительные 2 байта используются для хранения фактической длины.
Двоичные данные переменной длины не более n байт. Размер колонки равен n + 2 байта. Дополнительные 2 байта используются для хранения фактической длины.
Значение логического типа (true или false). Размер колонки равен одному байту.
Дата без времени. Размер колонки – 4 байта.
Дата и время. Размер колонки – 7 байт.
Текст неограниченной длины, состоящий из однобайтовых символов. В структуре записи колонка занимает два 4-байтовых целых числа: фактическая длина значения и адрес в файле данных неограниченной длины. Фактические значения хранятся в файле данных неограниченной длины.
Текст Unicode неограниченной длины, состоящий из символов в кодировке UTF-16. В структуре записи колонка занимает два 4-байтовых целых числа: фактическая длина значения и адрес в файле данных неограниченной длины. Фактические значения хранятся в файле данных неограниченной длины.
Двоичные данные неограниченной длины. В структуре записи колонка занимает два 4-байтовых целых числа: фактическая длина значения и адрес в файле данных неограниченной длины. Фактические значения хранятся в файле данных неограниченной длины.
Кроме того, к размеру колонок, которые могут содержать NULL, добавляется еще один байт.
Файл индексов
В файле индексов находятся все индексы, определенные для таблицы. Детальное рассмотрение структуры индексов не входит в цели данной статьи. Отметим только, что индекс представляет собой сбалансированное дерево. С точки зрения использования файловой базы данных важным является то, что, в отличие от размера записи, на длину ключа индекса наложено ограничение: длина не может превышать 1920 байт. Ключ представляет собой конкатенацию значений всех индексируемых колонок записи плюс 4-байтовый номер записи.
Индексироваться могут колонки типов Numeric, Char, NChar, Binary, VarChar, NVarChar, VarBinary, Logical, Date и DateTime. Значение каждой из индексируемых колонок типов Numeric, Binary, VarBinary, Logical, Date и DateTime помещается в ключ как есть. Соответственно, каждая из таких колонок добавляет к длине ключа свой собственный размер. А вот для колонок типов Char, NChar, VarChar и NVarChar вместо самой строки в ключ помещается ее ключ сортировки (collation key). Поэтому вклад колонок указанных типов в длину ключа определяется как n * 3 + 2 для колонок, не чувствительных к регистру букв. И n * 4 + 3 для колонок, чувствительных к регистру.
Файл данных неограниченной длины
В файле данных неограниченной длины хранятся фактические значения колонок типов Text, NText и Image. Для хранения таких значений файл организован как набор блоков длиной 256 байт. Каждое значение хранится как односвязный список блоков. В каждом блоке содержатся:
- адрес следующего блока (4 байта);
- число используемых байт данных в данном блоке (2 байта);
- полезные данные (250 байт).
Блок с адресом 0 используется для служебных нужд, а если точнее он содержит адрес списка свободных блоков. В список свободных блоков помещаются освободившиеся блоки, которые могут быть использованы в дальнейшем.
Работа с базой данных
Чтение данных
Следует различать чтение данных, выполняемое вне транзакции, и чтение в рамках транзакции. Операция чтения (например, SQL-запрос SELECT), выполняемая вне транзакции, получает данные, соответствующие состоянию базы данных на момент выполнения операции. При использовании SELECT вне транзакции поведение файловой базы данных подобно поведению версионных СУБД, таких как Oracle. То есть все данные, полученные запросом SELECT, относятся к одному согласованному состоянию базы данных, имевшему место на начало выполнения операции. Чтение данных не может быть заблокировано никакой другой операцией чтения или записи. Но нужно понимать, что состояние, имевшее место на начало чтения, может быть изменено. Соответственно, считываемые данные могут оказаться устаревшими.
Если чтение выполняется в рамках транзакции, то гарантируется, что считанные данные не могут быть изменены никем другим до завершения транзакции. Для обеспечения этой неизменности используется механизм транзакционных блокировок. При первом обращении к таблице на чтение в рамках транзакции на таблицу накладывается Read-блокировка. И эта блокировка не снимается до завершения транзакции.
Запись данных
Запись данных всегда предполагает наличие транзакции. Если операция записи была вызвана вне объемлющей транзакции, то транзакция будет создана неявно в процессе выполнения операции. При выполнении операции записи на таблицы, в которые вносятся изменения, накладывается транзакционная Write-блокировка, препятствующая чтению или записи, выполняемой другими соединениями.
Если на таблицу уже была наложена Read-блокировка, то выполняется ее эскалация до Write-блокировки.
Операции записи данных, выполняемые в рамках транзакции, не приводят к немедленной записи изменений в файл *.1CD. Изменения, вызванные операциями записи, накапливаются в кеше модифицированных страниц и сбрасываются в файл базы данных при фиксации (commit) транзакции.
Таким образом, если в процессе выполнения транзакции, до ее фиксации, произойдет сбой и/или падение приложения, то все изменения, произведенные в транзакции, окажутся потерянными и файл базы данных останется в неизмененном состоянии.
Кеширование данных
Кеш считанных страниц
Для повышения эффективности операций чтения механизмы файловой базы данных стараются кешировать считанные данные и тем самым минимизировать число физических операций чтения из файла базы данных. Кеш считанных страниц содержит прочитанные страницы данных внутренних файлов. Общий размер кеша для каждого из соединений с файловой базой данных является ограниченным и может в зависимости от различных условий составлять от 2 до 200 Мбайт. Кеш наибольшего размера создается при работе с файлом базы данных, расположенным на сетевом диске.
Кеш организован по принципу LRU. То есть страницы, к которым дольше всего не было обращений, могут быть вытеснены из кеша вновь считанными страницами.
Другой причиной, по которой страницы могут быть исключены из кеша, является его обновление. Каждое зафиксированное состояние данных внутреннего файла имеет соответствующий номер версии. Все кешируемые страницы внутреннего файла соответствуют определенной версии внутреннего файла. Процесс обновления состоит в том, что из файла базы данных считывается текущая версия внутреннего файла и сравнивается с версией кешируемых страниц. Если выясняется, что версия кешируемых страниц устарела, то страницы соответствующего внутреннего файла исключаются из кеша.
Для каждой операции чтения, выполняемой вне транзакции, обновление кеша производится для внутренних файлов данных, индексов и данных неограниченной длины каждой из таблиц, задействованных в операции чтения.
В рамках транзакции обновление кеша производится непосредственно после наложения на таблицу Read-блокировки. В дальнейшем до завершения транзакции кеш остается актуальным, так как таблица не может быть модифицирована другими транзакциями. Соответственно, для последующих операций чтения в той же транзакции обновления кеша не требуется.
Следует также заметить, что в исключительном режиме доступа к базе данных кеш считанных страниц всегда остается актуальным и его обновление не производится.
Еще одной причиной для исключения страницы из кеша считанных страниц является попадание страницы в кеш модифицированных страниц.
Модификация данных и кеш модифицированных страниц
При запросе на чтение данных из внутреннего файла соответствующая страница сначала ищется в кеше модифицированных страниц. Если не найдена, то производится поиск в кеше считанных страниц. И если не найдена там, то производится считывание страницы из файла с помещением в кеш считанных страниц.
Сброс кеша модифицированных страниц в файл производится только при выполнении фиксации (commit) транзакции. При фиксации транзакции все измененные страницы всех внутренних файлов собираются в общий массив, упорядоченный по номерам страниц в файле базы данных, и запись в файл базы данных производится от больших номеров страниц к меньшим. Это делается из следующих соображений:
- Если запись страницы с самым большим номером должна привести к увеличению файла базы данных, а на диске недостаточно места, то эта операция завершится аварийно. Таким образом, ни одно изменение не будет записано, транзакция будет отменена и файл *.1CD останется в неизмененном состоянии.
- При записи от больших номеров страниц к меньшим статистически сначала будут записываться изменения в страницах данных, затем изменения в индексных страницах и только потом изменения в корневых страницах внутренних файлов. В результате минимизируется риск фатальных разрушений во внутренней структуре файла базы данных, если успешно завершится только часть операций записи.
Время жизни кеша модифицированных страниц ограничено временем выполнения транзакции. После завершения транзакции кеш полностью освобождается.
На размер кеша модифицированных страниц не накладывается никаких ограничений. Единственным ограничителем является размер свободной оперативной памяти.
Блокировки
Для обеспечения согласованности и целостности данных при разделенном режиме доступа к базе используются блокировки. Так как механика файловой базы данных работает в режиме файл-сервер, то есть отсутствует выделенный сервер баз данных, то блокировки в базе данных реализованы с использованием функций блокировки участков файла. Для блокировок используется файл с расширением .1CL.
Транзакционные блокировки
Этот вид блокировок уже упоминался выше. Транзакционные блокировки предназначены главным образом для обеспечения логической целостности и изоляции транзакций. Транзакционные блокировки бывают двух видов:
Read-блокировки не конфликтуют между собой, но конфликтуют с Write-блокировками. Write-блокировки конфликтуют с любыми блокировками: Read и Write. Единицей блокировки является таблица. Единица довольно крупная, особенно с учетом того, что в большинстве современных СУБД поддерживаются блокировки на уровне записи. Однако реализация блокировки на уровне записи потребовала бы большого числа файловых блокировок, что привело бы к существенному снижению производительности.
Транзакционные блокировки накладываются с ожиданием. По умолчанию время ожидания транзакционной блокировки равно 20 сек.
Блокировки фиксации состояния
Также имеется ряд блокировок фиксации состояния. Данный вид блокировок относится к системным блокировкам и предназначен для обеспечения согласованного доступа к файлу базы данных на физическом уровне. При использовании файловой базы данных крайне редко приходится сталкиваться с какими-либо внешними проявлениями, связанными с этим видом блокировок. В данной статье они упоминаются главным образом для полноты картины.
Поясним место этих блокировок на примере фиксации транзакции. Как было сказано выше, при фиксации результатов транзакции все изменения записываются в файл базы данных. Естественно, что пока процесс записи изменений не завершен, файл базы данных находится в рассогласованном состоянии. Соответственно, попытка чтения приведет к получению рассогласованных данных. Но записываемые данные относятся не ко всем таблицам, а только к измененным. Соответственно, нужно сделать так, чтобы никакие данные, имеющие отношение к модифицируемым таблицам, не считывались, пока запись изменений не завершена. Для обеспечения этого предусмотрена блокировка фиксации таблицы для записи и для чтения.
На время записи изменений, произведенных транзакцией, устанавливается фиксация для записи всех модифицированных транзакцией таблиц. А на время чтения данных, связанных с таблицей, устанавливается фиксация для чтения. Фиксация для записи конфликтует с фиксацией для чтения. Фиксации для чтения не конфликтуют между собой, но конфликтуют с фиксацией для записи. Соответственно, гарантируется, что, пока запись не завершена, никакие операции чтения не могут быть выполнены. А также, пока не завершено чтение, запись изменений не может быть начата.
Всем привет. У меня приключилась беда и нужна ваша помощь.
Админ на работе решил переименовать папку с файловой базой 1с в тот момент когда в ней находились активные пользователи.
В результате этих действий нет возможности зайти в 1с ни в режиме конфигуратора, предприятия. Запускаешь 1с, она спрашивает, логин и пароль после ввода пишет "Ошибка формата потока". Обычно я не заморачиваюсь беру бекапы, но на эту базу, по сколько она чужая бекапов у меня соответственно нет.
Запускал chdbfl на базе, но она пишет, что "Ошибок не обнаружено".
Попробовал Tool_1CD.
В программе база открылась без проблем. Сделал тест формата потока, Программа обнаружила 3 ошибки ("Фактическая длинна файла отличается от указанной в таблице."). Все 3 ошибки в таблице PARAMS. Исправил ошибки исправлением таблицы, поставил длину 0. Но это к сожалению не помогло. При запуске все также ругается.
Попробовал сохранить конфигурацию через Tool_1CD. Создал новую базу и загрузил cf фаил.
Через Tool_1CD выдрал таблицу PARAMS, после чего потребовалось загрузить еще два десятка таблиц с данными которых не было в исходной конфигурации.
В конечном итоге после танцев с бубном база запустилась, размер вроде соответствует нормальному. Но база оказалась пустая :( Полагаю, что в новой таблице PARAMS нет связи со старыми таблицами.
Помогите плиз решить проблему.
попробую описать весь алгоритм по действиям
1) выгрузить таблицы данных из нерабочей базы (Tools 1C) - Кнопка экспорт таблиц данных в отдельную папку
2) выгрузить служебные таблицы (V8Users , UsersWorkHistory, FrmDtSetting) ( кнопка экспорт текущей таблицы)
3) Создать чистую базу из cf файла выгруженного с помощью Tools 1CD
4) Экспортировать таблицы данных из рабочей базы в отдельную папку (экспорт таблиц данных)
5) Сопоставить таблицы из нерабочей базы с таблицами рабочей базы - заменить файл описания таблиц (descr) в нерабочей базе из рабочей - как это сделать решайте сами я лично делал через компоненту 1СLib
6) удалить таблицы из новой базы кроме некоторых служебных (Config,Configsave,params,Dbshema,ibVersion) - удобнее сделать через 1сlib
7) Импорт и создание таблиц в новой базе из таблиц данных неработающей базы с замененный файлом описания descr - Через tools 1cd кнопка импорт и создания таблиц
(39) да , именно в обработке надо читать 2 файла получать их таблицы данных и по таблицам получать метаданные и сравнивать метаданные по наименованию. В обработке см. функцию "ПолучитьПредставлениеТаблицы" - вот ее немного надо переделать - она получает один параметр имя таблицы , и использует глобальную переменную FileDB , так вот если открываются 2 базы (FileBd1,FileBD2) от глобальной переменной стоит отказаться и передавать данный объект в качестве параметра этой функции
Первоначальная нерабочая база осталась без ваших изменений ? Посмотрите через Tools_1CD там есть данные по таблицам ?
Можете выложить файл с вашей нерабочей базы(базы без ваших изменений ). Попробую один способ. Просто тут объяснять долго
3. user596149_gruzdevostashkov 26.03.17 15:45 Сейчас в теме
Да в базе не какие изменения не делал. Только на копии. По таблицам полазил данные присутствуют. Не уверен полноте конечно.
4. user596149_gruzdevostashkov 26.03.17 15:46 Сейчас в теме
Базу проблемно кидать. За данные меня подвесят на ближайшем суку. ;(
5. user596149_gruzdevostashkov 26.03.17 15:48 Сейчас в теме
Завтра на работе смогу сравнить по таблицам со старой базой. Что бы все таблицы хотя бы были
Какая версия платформы? Попробуйте вначале обновить платформу, и запустить с нее так, чтобы никто в ней еще не сидел
7. user596149_gruzdevostashkov 26.03.17 15:56 Сейчас в теме
8. user596149_gruzdevostashkov 26.03.17 15:58 Сейчас в теме
1с 8.3.8.1652. На данном компьютере. Пробовал на разных платформах.
10. user596149_gruzdevostashkov 26.03.17 16:08 Сейчас в теме
Через tools_1CD - надо экспортировать таблицы данных
Попробую. Поставлю 1с такогоже релиза. Или возьму базу годичной давности. В принципе мысль понял спасибо.
Но так как таблиц много и наименование таблиц будут отличаться необходимо как-то сопоставить эти таблицы. При скачивании компоненты 1cLib в поставку входит обработка по демонстрации работы с этой компонентой. Обработка позволяет читать структуру файла 1сd выгружать , удалять и восстанавливать таблицы. Еще один плюс этой обработке она имеет доступ к метаданным файлам и может по имени таблицы определить объект метаданных. т.е. с помощью этой обработки есть возможность сопоставить имена таблиц , с таблицами базы , а если знать что например таблице поврежденной базе _ACC16 соответствует таблица рабочей базы _ACC19 , то опять же средствами 1с можно скопировать нужный файл из одной папки в другую.
Прежде всего скажем, что речь здесь пойдет о файловых системах FAT и NTFS, как наиболее распространенных, и ничего не будет сказано о файловых системах, используемых в не-Windows системах, поскольку такие системы лежат вне сферы интересов автора. А теперь – к делу.
Казалось бы, какая неоднозначность может быть, если говорить о размере файла. Сколько в него данных записали, такой и размер (или длина). Сколько в нем есть байтов от начала до конца (и это число записано в файловой системе в качестве размера файла), такой и размер, не так ли? Как говорил Шельменко-денщик, так то оно так, да только трошечки не так.
Проведите эксперимент. Возьмите любой исполняемый файл и выполните его копирование командой
copy что-то.exe что-то-другое.exe
Если вы раньше с этим сталкивались, то уже знаете, что результирующий файл получится намного короче исходного и не будет копией. Причина простая: программа copy, запущенная без параметра /b, копирует файл до тех пор, пока не встретит байт с кодом 27h, этот символ называется «конец файла».
Итак, у нас уже есть два разных признака конца файла – по числу, записанному в файловой системе, и по специальному байту в теле файла. Правда, стоит отметить, что второй признак остался с тех времен, когда файлы были преимущественно текстовыми и сейчас практически не применяется.
В файловых системах, использующих кластеры, а FAT и NTFS относятся именно к таким ФС, есть еще третий размер – размер файла на диске, то есть суммарный размер кластеров, отведенных этому файлу. В файловых системах FAT этот размер больше размера собственно файла или равен ему. Разница между размерами, если она есть, – так называемый хвост файла – это напрасно пропадающее место на диске, плата за размещение файлов по кластерам, а не встык друг за другом, хотя файловые системы с таким размещением файлов тоже существуют.
Впрочем, иногда это место используется. В частности, во времена дискет существовали программы, которые позволяли записывать данные в хвосты файлов, чтобы скрытно передать на таких дискетах информацию. Ведь стандартными средствами получить доступ к хвостам файлов нельзя.
Если включить в рассмотрение NTFS, то картина дополнится новыми штрихами.
Прежде всего, размер файла на диске может оказаться меньше собственно размера файла.
Если тело файла помещается в свободную область файловой записи MFT, то этот файл не занимает на диске ни одного кластера.
Максимальный размер такого файла зависит от размера записи и составляет примерно 600 байтов для записи мелкого размера (1 Кб) и 3600 – для записи крупного размера (4 Кб). Следует, впрочем, отметить, что до недавнего времени Windows показывала размер такого файла на диске равным одному кластеру, хотя фактически ни одного кластера файлу не выделено.
Если файл сжат, то его размер на диске может быть заметно меньше собственно длины файла (количества данных в нем).
Дополнительно усложняют картину так называемые разреженные файлы. В них полезные данные содержаться только в определенных участках файла, а остальная часть файла не используется вовсе. Возьмем в качестве примера файл журнала изменений \$Extend\$UsnJrnl, имеющийся почти на каждом компьютере (не пытайтесь увидеть его в проводнике или других диспетчерах файлов, не получится).
Он может иметь длину несколько гигабайт, но значимых данных содержит при этом обычно только 32 мегабайта в самом конце. А остальная часть вообще никаких данных не содержит, места на диске не занимает, и при попытке прочитать данные из этой части система выдаст набор нулей, даже не обращаясь к диску.
Если у читателя возникнет желание поэкспериментировать с разреженными файлами, такой файл можно создать с помощью команды fsutil sparse. А на досуге можно обдумать, какова же настоящая длина файла, если система записала в соответствующую графу число 4 Гб, а реальных данных в файле только 32 Мб и на диске он занимает тоже 32 Мб.
И, наконец, расскажем еще об одной длине: длине действительных данных (valid data). Эта длина и устанавливающие ее функции представляют интерес почти исключительно для программистов, тем не менее изредка с ней могут столкнуться и обычные пользователи.
В файловых системах FAT такого понятия не существует, и функции, которые используют эту величину, записывают в тело файла на соответствующих местах нули. В NTFS эта длина является характеристикой файла.
Попробуем пояснить, о чем идет речь, на примере. Возьмите флешку (флешка используется для наглядности, поскольку она медленнее жесткого диска работает с большими объемами данных) размером от гигабайта, отформатированную в FAT32, и создайте на ней большой файл командой
fsutil file createnew k:\пробный.txt 900000000
Теперь отформатируйте флешку в NTFS, для чистоты эксперимента лучше взять ту же самую, и повторите создание файла. На этот раз операция пройдет практически моментально. Записывать нули в тело файла уже не надо, достаточно распределить место под файл и установить для него длину действительных данных равной нулю. В теле файла останется «мусор», который был записан в этих секторах, но при чтении данных обращения к этим данным не произойдет – обнаружив, что длина действительных данных равна нулю, все, что дальше этого нуля, система читать не станет – ведь эти данные недействительны. Их можно сделать действительными, если изменить значение длины действительных данных.
Рассмотрим это на примере. Создайте новый файл на одном из рабочих дисков, отформатированном в NTFS. Сотни мегабайт совершенно не обязательны, десятка-другого килобайт будет вполне достаточно:
fsutil file createnew C:\пробный.txt 10000
Теперь откройте его с помощью любого просмотрщика файлов, например FAR.
Как видим, в файле действительно нули. Но если посмотреть на этот файл с помощью какого-либо редактора дисков, обращающегося к секторам напрямую, например dmde, то картина будет другая.
Если мы откроем том С как логическое устройство и посмотрим на содержимое файла, то увидим те же самые нули.
Но если открыть диск как физическое устройство, то в том же самом секторе (обратите внимание на номера LBA – разница в 63 возникла из-за того, что начало раздела сдвинуто относительно начала диска) увидим данные, которые ранее были записаны в какой-то позже удаленный файл.
И если мы увеличим длину действительных данных, то увидим эти данные в файле. Установим эту длину равной 300 байт:
fsutil file setvaliddata C:\пробный.txt 300
Обратите внимание что параметр в этой команде нельзя задавать произвольно, но должен быть не меньше текущего значения длины действительных данных и не больше размера файла. Уменьшить длину действительных данных этой командой нельзя.
Теперь снова посмотри на содержимое файла. Заметьте, что никаких данных мы в него не записывали!
Чисто случайно получилось, что в этом файле довольно много осмысленного текста, что делает картину более наглядной. 300 десятичных байтов – это 12c шестнадцатиричных, и как раз на этом байте обрывается текст и начинаются нули. Если сдвинуть границу действительных данных еще дальше, то «проявятся» и следующие строки.
Подведем итоги
Имеется две физических длины файла – это размер файла, записанный в файловой системе и место, занимаемое на диске. Также имеется две логических длины файла – это признак конца файла (байт EOF – 27h) и длина действительных данных. Как составную часть логической длины можно рассматривать и пустые области в разреженных файлах – вспомните \$Extend\$UsnJrnl, где большой массив отсутствующих данных завершается тридцатью двумя мегабайтами действительных.
Итак, обычно, когда говорят о длине файла, имеют в виду число, хранящееся в файловой системе. Но, как видите, возможны варианты!
Тестирование и исправление информационной базы
В процессе работы системы 1С: Предприятие могут возникать различные внештатные ситуации - отключение питания компьютера «зависание» операционной системы, сбои оборудования и прочее. Такие ситуации, возникшие в процессе записи изменений в таблицы информационной базы системы 1С: Предприятие, могут привести к некорректному состоянию информационной базы. Внешние проявления некорректного состояния информационной базы могут быть различными, вплоть до невозможности запуска 1С: Предприятия.
Процедура «Тестирование и исправление информационных баз» предназначена для диагностики и устранения ошибочных состояний информационных баз, имеющих как формат DBF, так и формат MS SQL Server 6.5, при любом составе установленных компонент системы 1С: Предприятие.
Принципы работы процедуры тестирования
Все проверки состояния информационной базы, выполняемые процедурой, можно условно разделить на три логических уровня.
Все таблицы, входящие в состав информационной базы можно условно разбить на две группы - базовые и производные .
Записи в базовых таблицах образуются, модифицируются и удаляются в результате работы пользователей, исполнения модулей.
Содержание производных таблиц определяется состоянием базовых и полностью может быть восстановлено при выполнении процедур пересчета итогов. Во время выполнения тестирования второго уровня происходит сканирование записей базовых таблиц, и проверка содержимого полей на корректность с точки зрения системы 1С: Предприятия, а не управления базами данных в dbf-формате, как это происходило на предыдущем уровне. Например, поле, объявленное в заголовке dbf-файла как строковое, может рассматриваться системой 1С: Предприятие как ссылка на конкретный элемент конкретного справочника. Содержимое такого поля формируется по правилам, определяемым системой 1С: Предприятие. Естественно, содержание такого поля имеет более существенные ограничения, чем способна наложить система управления базами данных, и тестирование содержимого на этом уровне представляет собой отдельную задачу. По окончании сканирования всех записей таблицы происходит ее реиндексация. Также на этом уровне происходит проверка логической связки «журнал документов — документ - табличная часть документа».
Логическая целостность таблиц, входящих в состав информационной базы, осуществляется совокупностью проверок третьего уровня. На этом уровне тестируются внутренние связи таблиц, определяемые системой 1С: Предприятие, проверяется фактическое существование элементов данных, на которые имеются ссылки в полях записей. Также па этом уровне происходит анализ записей о периодических реквизитах справочников и бухгалтерских счетов (если установлена компонента «Бухгалтерский учет»).
По окончании проверок производится полный пересчет итогов. Конкретный состав пересчитываемых итогов зависит от состава установленных компонент и набора типов используемых тестируемой информационной базой объектов.
Запуск процедуры
В диалоге устанавливаются режим и параметры тестирования информационной базы.
Рекомендуется перед исправлением информационной базы провести ее тестирование, на основе которого выбирать способы исправления информационной базы.
По умолчанию установлены все этапы тестирования кроме сжатия таблиц информационной базы. Установки можно изменить.
Этапы тестирования можно производить независимо друг от друга, устанавливая любые флажки. Правда, в случае, если восстановление физической целостности базы нарушило ее индексную структуру, реиндексация будет проведена независимо от того, установлен ли соответствующий флажок.
ВНИМАНИЕ. Все изменения, сделанные в таблицах информационной базы в процессе тестирования, будут необратимыми. Поэтому перед запуском процедуры рекомендуется сделать резервную копию информационной базы на случай, если ее выполнение не приведет к желаемому результату и потребуется помощь специалиста.
Для запуска процедуры нужно в меню «Администрирование» выбрать пункт «Тестирование и исправление ИБ. ».
После чего появится окно «Тестирование и исправление информационной базы».
Процедура тестирования и исправления информационной базы служит для диагностики и устранения ошибочных состояний информационных баз, имеющих различный формат хранения данных ( файловой или клиент - серверной ).
Процедура позволяет выбирать проверки и режимы, которые должны быть выполнены для текущей информационной базы. Для баз использующих клиент – серверный вариант, возможна проверка логической целостности данных и пересчет итогов. Для баз, использующих файловый вариант в дополнение к этим проверкам, может быть выполнена реиндексация таблиц и сжатие информационной базы.
Имеется возможность выполнять тестирование или тестирование с исправлением. Причем возможен выбор нескольких вариантов исправления конфликтующих ситуаций.
Следует заметить что тестирование и исправление информационной базы может выполняться только в моментальном режиме (то есть работа пользователей с информационной базой в процессе тестирования и исправления не возможна ).
На данной форме расположено:
Группа переключателей "Режим проверки"
Позволяет сделать выбор между режимом, производящим только проверку информационной базы и режимом, производящим коррекцию обнаруженных ошибок.
Проверки и режимы:
- Реиндексация таблиц информационной базы
- Проверка логической целостности информационной базы
- Проверка ссылочной целостности информационной базы
- Пересчет итогов
- Сжатие таблиц информационной базы
- Реструктуризация таблиц информационной базы
Также можно выбрать пункты:
1. Только тестирование
2. Тестирование и исправление
3. Продолжить прерванное ранее тестирование - позволяет продолжить прерванное ранее выполнение операций тестирования и исправления информационной базы.
4. Прервать выполнение проверки через/часов/мин - позволяет задать время выполнения тестирования и исправления. По истечении заданного промежутка времени выполнение будет прервано.
Г руппа переключателей "При наличии ссылок на несуществующие объекты"
Группа переключателей определяет, должна ли программа при обнаружении ссылок на несуществующие объекты создавать эти объекты или удалять ссылки. Можно также отказаться от исправлений ошибок этого типа.
При наличии ссылок на несуществующие объекты:
- Создавать объекты
- Очищать ссылки
- Не изменять
Группа переключателей "При частичной потере данных объектов"
Группа переключателей задает поведение программы, если было обнаружено, что данные объектов были частично потеряны, но оставшихся данных достаточно для того, чтобы восстановить потерянные.
При частичной потере данных объектов:
- Создавать объекты
- Очищать ссылки
- Не изменять
Для запуска процесса тестирования информационной базы следует нажать кнопку «Выполнить».
В процессе тестирования информационной базы строка состояния используется процедурой для вывода информации о выполняемой в данный момент проверке.
После нажатия кнопки «Выполнить» появится:
Проверка физической целостности
Объяснение
Не является самостоятельной ошибкой. Сигнализирует о том, что в результате обнаруженных ранее ошибок дальнейшее тестирование информационной базы бессмысленно
Открытие доступа к таблице
Объяснение
Выдается в режиме тестирования и исправления, если отсутствует файл таблицы
Не удалось открыть файл
Проверка заголовка файла таблицы
Объяснение
Неверная длина заголовка dbf-файла
Длина записи не соответствует ожидаемой
Ошибка в имени поля <номер>
Ошибка в типе поля
Длина файла не соответствует количеству и длине записей
Длина файла таблицы не соответствует вычисленной на основании длины заголовка, количества и длины записей. В режиме тестирования и исправления предпринимается попытка привести в соответствие длину файла и количество записей
Не сошлось наименование поля <номер>
Не сошлись типы полей <номер>
Не сходится количество полей
Проверка содержимого записи
Объяснение
Неверный признак удаленности записи
Флаг удаленности записи имеет недопустимое значение. В режиме тестирования и исправления записи ставится признак «удалена»
Проверка содержимого поля
Объяснение
Неверное содержимое поля Numeric
Неверное содержимое логического поля
Неверное содержимое поля даты
Содержимое поля неверно с точки зрения текстового поля хранения в таблице значений определенного типа. В режиме тестирования и исправления содержимое поля «очищается» в соответствии с типом хранимого значения.
Проверка таблиц(ы) XX
Объяснение
Запись YYY. Поле ZZZ.
Содержимое поля не соответствует типу поля
Ссылка на несуществующий элемент метаданных
При проверке таблицы констант — обнаружена запись о периодическом реквизите справочника, который не определен в метаданных. При проверке таблицы журнала документов — обнаружена запись о документе, который не определен в метаданных. Такие записи уничтожаются
Нет в журнале документов
Существует запись о заголовочной части документа, у которой нет соответствующей записи в журнале документов
Нет ответной заголовочной части
Существует запись в журнале документов, у которой нет соответствующей записи о заголовочной части документа
Проверка значений констант
Объяснение
Удалена запись о константе
Было только значение константы, но ее самой не было в списке констант
Удалена дублирующая запись о константе
Было два или более значений у одной непериодической константы
Проверка периодических реквизитов
Объяснение
Справочник XXX. Элемент YYY. Реквизит ZZZ. Значение на DDD.
Счет XXX. Реквизит ZZZ. Значение на DDD.
В информационной базе отсутствует объект, являющийся значением данного реквизита
Справочник XXX. Элемент YYY. Реквизит ZZZ. Значение на DDD. Очищен признак изменения документом
Не было соответствующего документа
Проверка содержания справочников
Объяснение
Перенесен на 1-й уровень
Отсутствовал элемент, на который данный элемент ссылается, как на элемент первого (верхнего) уровня; обнаружено зацикливание по родительскому элементу (ссылки образовали замкнутую цепочку); превышение допустимого уровня вложенности элементов
Убран признак группы
Элемент, находящийся на максимальном (нижнем) уровне вложенности, имел признак группы
Элемент подчиненного справочника, находящийся на нижнем уровне, был подчинен не тому элементу, которому подчинен элемент верхнего уровня; элемент подчиненного справочника был подчинен отсутствующему элементу в справочнике-родителе. Подчинение изменяется следующим образом: начиная с верхнего уровня вложенности подчиненного справочника его элементы понижающихся уровней вложенности подчиняются тем же элементам справочника-родителя, которым подчинены элементы верхних уровней
Справочник не является подчиненным, а справочник-родитель был указан
Элемент XXX. Реквизит YYY
Элемент XXX. Реквизит YYY. Значение на DDD
Проверка уникальности внутреннего идентификатора в справочнике
Объяснение
Проверка содержимого документов
Объяснение
Номер XXX. Реквизит YYY
П роверка уникальности внутреннего идентификатора документов
Объяснение
Проверка содержимого движения регистров
Объяснение
Удалена запись о движении регистра
Имелась запись о движении, вызванном отсутствующим документом
Документ XXX не проводился. Удалена запись о движении регистра
Имелась запись о движении, вызванном не проведенным документом
Документ XXX. Измерение YYY
Проверка содержимого планов счетов
Объяснение
Не принадлежит ни одному плану счетов
Неверно указана принадлежность к плану счетов
Удален признак принадлежности к метаданным
Была неверно указана принадлежность к метаданным
Изменен признак XXX счета в соответствии с метаданными
Свойства счета различались с указанными в метаданных
Не соответствует маске плана счетов
Код счета не соответствовал маске плана счетов (формату, определенному для данного плана счетов). Счет удаляется
Субсчет содержал ссылку на отсутствующий в информационной базе счет-родитель. Такой субсчет удаляется
Изменен признак XXX
Счет и субсчет имели различные свойства. Признак XXX субсчета устанавливается таким, как у его счета-родителя
Для счета (субсчета) был указан неверный уровень. Запись об уровне счета/субсчета исправлена по коду
Счет XXX. Реквизит YYY
Счет XXX. Реквизит YYY. Значение на DDD
Изменен список субконто
Конфликт состава субконто у счета и субсчета. Состав субсчета приводится в соответствие с составом счета
Проверка уникальности внутреннего идентификатора счетов
Объяснение
Нарушена уникальность внутреннего идентификатора счетов. Исправляется только вручную.
П роверка содержимого проводок
Объяснение
Информационная база не содержала информации о документе и/или операции, которому/которой принадлежит проводка (в зависимости от настроек процедуры программа или создает документ и/или операцию, или уничтожает проводку)
Документ XXX не имеет проводок
У документа, на который ссылается проводка, отсутствовал признак, что он имеет проводки. Такая проводка уничтожается
Неверно указан счет дебета или кредита. Проводка уничтожается
Не указан ни один из счетов. Проводка уничтожается
Счета с различным признаком забалансовости
Счета из разных планов счетов
Счет не имеет признака забалансовости
Простая проводка в единственной корреспонденции содержит счет, не имеющий признака забалансовости. Проводка удаляется
Исправлены параметры проводки в соответствии с параметрами счетов
Был конфликт между данными проводки и параметрами счетов
Счет XXX. Субконто YYY
Проверка операций
Объяснение
Информационная база не содержит информации о документе, которому принадлежит операция. В зависимости от режима работы, удаляется операция или создается документ
Документ XXX не имеет операции
У документа, на который ссылается операция, отсутствует признак, что он имеет операцию. Проводка удаляется
Документ и операция имели различную дату или время
Исправлена нумерация проводок
Была нарушена нумерация принадлежащих операции проводок
Сделана простой, остальные удалены
Главная проводка сложной проводки имела и дебетовую, и кредитовую части
Изменен счет в соответствии с главной проводкой
Изменены субконто в соответствии с главной проводкой
Конфликт данных подчиненной проводки, являющейся частью сложной проводки, с главной проводкой
Изменена сумма главной проводки
Не были равны суммы главной и подчиненных корреспонденции сложной проводки
Исправлен признак про
У простой проводки не был установлен стой проводки соответствующий признак
Проверка корректных проводок
Объяснение
Изменены коды счетов
Неверно указан(ы) код(ы) счета(ов)
Проверка типовых операций
Объяснение
Изменен шаблон типовой операции
Некритичная ошибка. Как правило, вы- звана несоответствием форматов хранения типовой операции различными релизами 1С:Предприятия
Перенесена на 1-й уровень
Была нарушена иерархия в списке типовых операций
Изменен список прав
Был неверно указан список прав доступа к типовой операции
Исправлена нумерация проводок
Неверная нумерация проводок в типовой операции
Проверка содержания журналов расчетов
Объяснение
Ссылка на несуществующий алгоритм
Ссылка на не описанный в метаданных алгоритм. Запись удаляется
Ссылка на несуществующий элемент связанного справочника
Ссылка на элемент справочника, отсутствующего в информационной базе. Запись удаляется
Ссылка на несуществующий документ
Ссылка на несуществующий родительский документ
Ссылка на документ, отсутствующий в информационной базе. Запись удаляется
Ссылка на несуществующую пересчитываемую строку
Ссылка на строку, отсутствующую в - журнале расчетов. Запись удаляется
Указанный приоритет не соответствовал указанному для алгоритма
Читайте также: