Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос. Создается этот объект вызовом конструкции Новый Запрос. Запрос удобно использовать, когда требуется получить сложную выборку данных, сгруппированную и отсортированную необходимым образом. Классический пример применения запроса - получение сводки по состоянию регистра накопления на определенный момент времени. Так же, механизм запросов позволяет легко получать информацию в различных временных разрезах.
Текст запроса – это инструкция, в соответствии с которой должен быть выполнен запрос. В тексте запроса описывается:
таблицы информационной базы, используемые в качестве источников данных запроса;
поля таблиц, которые требуется обрабатывать в запросе;
правила группировки;
сортировки результатов;
и т. д.
Инструкция составляется на специальном языке – языке запросов и состоит из отдельных частей – секций, предложений, ключевых слов, функций, арифметических и логических операторов, комментариев, констант и параметров.
Язык запросов платформы 1С очень похож на синтаксис других SQL-языков, но имеются отличия. Основными преимуществами встроенного языка запросов являются: разыменование полей, наличие виртуальных таблиц, удобная работа с итогами, нетипизированные поля в запросах.
Рекомендации по написанию запросов к базе данных на языке запросов платформы 1С:
1) Текст запроса может содержать предопределенные данные конфигурации, такие как:
значения перечислений;
предопределенные данные:
справочников;
планов видов характеристик;
планов счетов;
планов видов расчетов;
пустые ссылки;
значения точек маршрута бизнес-процессов.
Также текст запроса может содержать значения системных перечислений, которые могут быть присвоены полям в таблицах базы данных: ВидДвиженияНакопления, ВидСчета и ВидДвиженияБухгалтерии. Обращение в запросах к предопределенным данным конфигурации и значениям системных перечислений осуществляется с помощью литерала функционального типа ЗНАЧЕНИЕ. Данный литерал позволяет повысить удобочитаемость запроса и уменьшить количество параметров запроса.
Пример использования литерала ЗНАЧЕНИЕ:
ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.Москва)
ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка)
ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ГДЕ ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.БизнесПроцесс1.ТочкаМаршрута.Действие1
2) Использование инструкции АВТОУПОРЯДОЧИВАНИЕ в запросе может сильно время выполнения запроса, поэтому, если сортировка не требуется, то лучше вообще ее не использовать. Во большинстве случаях лучше всего применять сортировку с помощью инструкции УПОРЯДОЧИТЬ ПО.
Автоупорядочивание работает по следующим принципам:
Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО, то каждая ссылка на таблицу, находящаяся в этом предложении, будет заменена полями, по которым по умолчанию сортируется таблица (для справочников это код или наименование, для документов – дата документа). Если поле для упорядочивания ссылается на иерархический справочник, то будет применена иерархическая сортировка по этому справочнику.
Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО, но есть предложение ИТОГИ, тогда результат запроса будет упорядочен по полям, присутствующим в предложении ИТОГИ после ключевого слова ПО, в той же последовательности и, в случае если итоги рассчитывались по полям – ссылкам, то по полям сортировки по умолчанию таблиц, на которые были ссылки.
Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ, но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса будет упорядочен по полям, присутствующим в предложении, в той же последовательности и, в случае если группировка велась по полям – ссылкам, то по полям сортировки по умолчанию таблиц, на которые были ссылки.
В случае же, если в запросе отсутствуют предложения и УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет упорядочен по полям сортировки по умолчанию для таблиц, из которых выбираются данные, в порядке их появления в запросе.
В случае, если запрос содержит предложение ИТОГИ, каждый уровень итогов упорядочивается отдельно.
3) Что бы избежать повторного запроса к базе данных при выводе результата запроса пользователю (например, построение запроса или отображение результата запроса с помощью табличного документа) полезно использовать инструкцию ПРЕДСТАВЛЕНИЕССЫЛКИ, которая позволяет получать представление ссылочного значения. Пример:
Так же возможно использование инструкции ПРЕДСТАВЛЕНИЕ - предназначена для получения строкового представления значения произвольного типа. Отличие этих инструкций в том, что в первом случае, если инструкции передать ссылку, результатом будет строка, В остальных случаях результатом будет значение переданного параметра. Во втором случае, результатом инструкции всегда будет строка!
4) Если в запросе имеется поле с составным типом, то для таких полей возникает необходимость привести значения поля к какому-либо определенному типу с помощью инструкции ВЫРАЗИТЬ, что позволит убрать лишние таблицы из левого соединения с полем составного типа данных и ускорить выполнение запроса. Пример:
Имеется регистра накопления ОстаткиТоваров, у которого поле Регистратор имеет составной тип. В запросе выбираются Дата и Номер документов ПоступлениеТоваров, при этом при обращении к реквизитам документа через поле Регистратор не происходит множество левых соединений таблицы регистра накопления с таблицами документов-регистраторов.
Если приведение типа считается не осуществимым, то результатом приведения типа будет значение NULL.
5) Не стоит забывать про инструкцию РАЗРЕШЕННЫЕ, которая означает, что запрос выберет только те записи, на которые у текущего пользователя есть права. Если данное слово не указать, то в случае, когда запрос выберет записи, на которые у пользователя нет прав, запрос отработает с ошибкой.
6) В случае, если в запросе используется объединение, и в некоторых частях объединения присутствуют вложенные таблицы (документ с табличной частью), а в некоторых нет, возникает необходимость дополнения списка выборки полями – пустыми вложенными таблицами. Делается это при помощи ключевого слова ПУСТАЯТАБЛИЦА, после которого в скобках указываются псевдонимы полей, из которых будет состоять вложенная таблица. Пример:
7) Что бы в результат запроса не попали повторяющиеся строки, следует использовать инструкцию РАЗЛИЧНЫЕ, потому что так нагляднее и понятнее, а инструкция СГРУППИРОВАТЬ ПО применяется для группировки с помощью агрегатных функций. Ксати, при использовании агрегатных функций предложение СГРУППИРОВАТЬ ПО может быть и не указано совсем, при этом все результаты запроса будут сгруппированы в одну единственную строку. Пример:
8) Инструкция СГРУППИРОВАТЬ ПО позволяет обращаться к полям верхнего уровня, без группировки результатов по этим полям, если агрегатные функции применены к полям вложенной таблицы. Хотя в справке 1С написано, при группировке результатов запроса в списке полей выборки обязательно должны быть указаны агрегатные функции, а помимо агрегатных функций в списке полей выборки допускается указывать только поля, по которым осуществляется группировка. Пример:
9) Инструкция ЕСТЬNULL предназначена для замены значения NULL на другое значение, но не забываем, что второй параметр будет преобразован к типу первого в случае, если тип первого параметра является строкой или числом.
10) При обращении к главной таблице можно в условии обратиться к данным подчиненной таблицы. Такая возможность называется разыменование полей подчиненной таблицы.
Пример (поиск документов, содержащих в табличной части определенный товар):
Преимущество этого запроса перед запросом к подчиненной таблице Приходная.Товары в том, что если есть дубли в документах, результат запроса вернет только уникальные документы без использования ключевого слова РАЗЛИЧНЫЕ.
11) Интересный вариант оператора В - это проверка вхождения упорядоченного набора в множество таких наборов (Поле1, Поле2, ... , ПолеN) В (Поле1, Поле2, ... , ПолеN).
Пример:
12) При любой возможности используйте виртуальные таблицы запросов. При создании запроса система предоставляет в качестве источников данных некоторое количество виртуальных таблиц - это таблицы, которые так же являются результатом запроса, который система формирует в момент выполнения соответствующего участка кода.
Разработчик может самостоятельно получить те же самые данные, которые система предоставляет ему в качестве виртуальных таблиц, однако алгоритм получения этих данных не будет оптимизирован, так как:
Все виртуальные таблицы параметризованы, т. е. разработчику предоставляется возможность задать некоторые параметры, которые система будет использовать при формировании запроса создания виртуальной таблицы. В зависимости от того, какие параметры виртуальной таблицы указаны разработчиком, система может формировать РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной таблицы, причем они будут оптимизированы с точки зрения переданных параметров.
Не всегда разработчик имеет возможность получить доступ к тем данным, к которым имеет доступ система.
13) В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется. В большинстве случаев эти правила не оказывают влияния на выполнение запроса, но бывают случаи, когда для выполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Чтобы избежать такой ошибки, не рекомендуют использовать функцию ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ().
14) С осторожностью используйте ИЛИ в конструкции ГДЕ, так как использование условия с ИЛИ может значительно "утяжелить" запрос. Решить проблему можно конструкцией ОБЪЕДИНИТЬ ВСЕ. Пример:
15) Условие НЕ В в конструкции ГДЕ увеличивает время исполнения запроса, так как это своего рода НЕ (ИЛИ1 ИЛИ2 ... ИЛИn), поэтому для больших таблиц старайтесь использовать ЛЕВОЕ СОЕДИНЕНИЕ с условием ЕСТЬ NULL. Пример:
16) При использовании Временных таблиц нужно индексировать поля условий и соединений в этих таблицах, НО, при использовании индексов запрос может выполняться еще медленнее. Поэтому необходимо анализировать каждый запрос с применением индекса и без, замерять скорость выполнения запроса и принимать окончательное решение.
Если вы помещаете во временную таблицу данные, которые изначально индексированы по некоторым полям, то во временной таблице индекса по этим полям уже не будет.
17) Если вы не используете Менеджер временных таблиц, то явно удалять временную таблицу не требуется, она будет удалена после завершения выполнения пакетного запроса, иначе следует удалить временную таблицу одним из способов: командой УНИЧТОЖИТЬ в запросе, вызвать метод МенеджерВременныхТаблиц.Закрыть().
Периодически во встроенном языке возникает необходимость изменения текста запроса в зависимости от разных алгоритмических условий. Раньше подобная задача решалась путём непосредственного формирования нужного текста запроса в виде строки. А это не всегда удобно и зачастую очень громоздко.
Теперь во встроенном языке мы реализовали объектную модель схемы запроса. Вы можете создать пустую схему запроса конструктором и загрузить в неё имеющийся текст запроса. После этого отдельные элементы текста запроса будут доступны вам как свойства объектной модели.
На рисунке ниже стрелки показывают, в каких объектах встроенного языка будут доступны те или иные элементы простого запроса, загруженного в схему:
Редактирование текста запроса с помощью объектной модели позволяет вам проще и понятнее модифицировать имеющиеся запросы. Или даже создавать их во встроенном языке «с нуля». А затем просто получать готовый текст запроса из схемы методом ПолучитьТекстЗапроса().
Если Вы работаете с одной таблицей, то Вам нет необходимости использовать объединение. Совсем другое дело, когда Вы работаете с несколькими таблицами и Вам, например, нужно получить данные, и по покупкам и по продажам товаров.
Для объединения используется предложение ОБЪЕДИНИТЬ. На самом деле происходит объединение результатов запросов, то есть каждый запрос собирает данные независимо друг от друга, а затем эти результаты объединяются в один. И только над последним запросом выполняются остальные операции, например, упорядочивание и расчет итогов.
При объединении запросов происходит "вертикальное склеивание" результатов, то есть сначала идут строки результата первого запроса, затем второго.
Перейдём к практике:
Результат этого запроса следующий:
Номенклатура Количество Сумма
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
В итоге мы получим две таблицы, которые будут соединены друг с другом. Трудно увидеть, где кончается документ Приходная и начинается документ Расходная. Но мы сделаем кое-что, чтобы понять это:
Как видно из текста запроса мы задали для каждого документа разные псевдонимы для количества и суммы. Также на место тех полей, где мы будем получать значения суммы и количества, поставим нули. Это нужно, чтобы пустые значения количества и суммы заменялись нулями.
Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
Набор офисный 1 1 105
Файл прозрачный 1 820
Стикеры 500л 1 610
Теперь нам нужно из результат запроса убрать дублирующиеся элементы. У нас два запроса и если мы будем сворачивать, каждый отдельно, чтобы исключить дублирующиеся элементы, то у нас ничего не получится. Поэтому мы приведём запрос к следующему виду:
Итак, мы видим, что весь наш запрос заключён в скобки и назван как ВложенныйЗапрос. Это сделано для того, чтобы мы смогли сгруппировать записи из обоих подзапросов и исключить дублирующиеся элементы. Такая конструкция называется вложенным запросом. Результат этого запроса следующий:
Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880 1 610
Набор офисный 5 4 100 1 1 105
Файл прозрачный 8 8 840 1 820
В итоге получаем сгруппированную таблицу, в которой данные из вложенных подзапросов приведены к понятному виду. Количество вложенных запросов не должно превышать 255. Мы использовали здесь четыре подзапроса.
Если мы хотим оставлять в запросе только уникальные значения записей при этом, не используя группировку. Нужно писать предложение ОБЪЕДЕНИТЬ без ключевого слова ВСЕ.
Конструктор запроса состоит из следующих закладок:
1. «Таблицы и поля» - на закладке три иерархических списка:
a. «База данных» - перечислены все доступные объекта, к которым можно сделать за-прос. Также кнопка «Отображать таблицы изменений» , с помощью которой можно получить доступ к таблицам изменений объектов ИБ, если они регистрируются для какого либо плана обмена.
b. «Таблицы» - список выбранных таблиц, к которым будет выполнен запрос. Также в этом окне можно удалить таблицу, переименовать или заменить таблицу, а также добавить внутренний запрос.
Для виртуальных таблиц можно назначать параметры, нажав на кнопку «Параметры виртуальных таблиц»:
Рекомендуется активно использовать параметры виртуальных таблиц для отборов по тем или иным измерениям, поскольку при этом увеличивается скорость выполнения запроса. В параметрах можно использовать внешние переменные, название которых предваряется знаком «&».
c. «Поля» - список полей, которые выбираются из таблиц. Также можно добавить вычисляемые поля, для этого при нажатии кнопки «Добавить» открывается конструктор произвольного выражения:
Слева окно с доступными в выражении полями. Справа подсказку используемых функций. Внизу конструируемое произвольное выражение. В выражениях можно использовать внешние параметры, для их обозначения используется знак «&», например: &Период, &ДатаНач Нужно быть внимательным, если в окне будет набрано длинное и сложное выра-жение, в котором будет небольшая синтаксическая ошибка, то после нажатия кноп-ки «ОК» система выдаст предупреждение и закроет окно. Весь набранный код бу-дет потерян, поэтому рекомендую, если нет уверены в правильности выражения, то перед закрытием конструктора всегда сохраняйте содержимое в буфер обмена (Ctrl-C).
2. «Связи» - на закладке указываются связи между таблицами.
В таблице указываются связываемые таблицы, отношение между связываемыми таблицами и усло-вие связи. Если условие связи сложно, то можно указать некое вычисляемое выражение, при этом откроется конструктор произвольного поля.
3. «Группировка» - на закладке указываются, какие поля группируются, а какие агрегируются (суммируются).
4. Закладка «Условия» - перечисляются условия которые накладываются на запрос.
В условиях тоже можно писать сложные выражения с помощью конструктора простых выражения и ис-пользованием внешних переменных:
5. «Дополнительно»
Дополнительные параметры, накладываемые на запрос
6. «Объединения и псевдонимы»
На этой закладке можно назначать псевдонимы для полей , а также управлять запросами которые соединяется через конструкции «ОБЪЕДИНИТЬ» или «ОБЪЕДИНИТЬ ВСЕ»
7. «Порядок»
В каком порядке будут выводиться получаться результаты запроса
Внимание! В низу закладки можно видеть галочку «Автоупорядочивание» - в текущей версии 1С 8.1 в СКД она бесполезна, более того при установленной галочке при записи СКД выдает ошибку, так что ею пользоваться не стоит.
8. «Компоновка данных»
Закладка, в которой определятся служебные поля для СКД. Играет примерно такую же роль, что и закладка «Построитель отчета» в обычном конструкторе отчетов.
a. На закладке «Таблицы» - перечислены таблицы, используемые в запросе, можно указать обязательность включения таблицы в запрос, галочкой «Обязательная». Т.е. если никакие поля в выборку не попадают, то данная таблица в запросе вообще не участвует. Также можно указать параметры для таблиц.
В процессе настройки СКД, мы задаем, какие либо отборы, то все значения отборов будут подставлены в параметры виртуальных таблиц, что снова нам поможет оптимизировать и ускорить запрос.
b. На закладке «Поля» - перечислены поля и их псевдонимы, которые будут добавляться в список полей СКД.
c. «Условия» - в случае указания отборов в настройках СКД, все значения отборов будут добавляться как дополнительные условия, в условия можно также добавлять сложные выражения.
9. «Характеристики»
Закладка, не имеющая аналога в обычном конструкторе выходной фор-мы.
Даная закладка обеспечивает расширение работы запросов с характеристиками. Таблица на закладке состоит из нескольких полей:
a. «Тип значения» - тип для которого будут выбираться характеристики. Например если указать «СправочникСсылка.Номенклатура», то в запросе будут выбираться все характеристики для номенклатуры.
b. «Источник» - источник для свойств видов характеристик, может быть запрос или таблица. В данном поле мы можем написать запрос выборки только тех свойств, которые нам нужны.
c. «Список характеристик» - поле в котором указывается источник для свойств характери-стик. Чаще всего это план видов характеристик или запрос. Также нужно указать поля, которые отвечают за «Идентификатор», «Имя» и «Тип» свойства.
d. «Источник» - следующее поле, в котором указываем источник значений характеристик, тоже может быть или таблица или запрос.
e. «Значение характеристик» - таблица или запрос, которые получает значения характери-стик. Например, таблицей значений характеристик может служить регистр сведений «ЗначенияСвойствОбъектов». Мы также должны указать те поля из таблицы (или запро-са), что отвечают за «Объект», «Свойство» и «Значение» характеристики.
После редактирования запроса, текст запроса можно видеть в окне под список полей. Ниже галочкой «Автозаполнение» мы можем регулировать заполнение дополнительных параметров для полей определенных в запросе. Следует обратить внимание, что состав полей определяется только в самом запросе.
Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять. В этом случае другое соединение будет ожидать освобождения этих данных уже в момент считывания внутри транзакции, т.е. не сможет прочесть заблокированные данные до тех пор, пока не будет завершена транзакция, наложившая блокировку. Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения ДЛЯ ИЗМЕНЕНИЯ. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята. Если запрос выполняется вне транзакции, то в нем могут быть считаны и заблокированные данные.
Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение ДЛЯ ИЗМЕНЕНИЯ игнорируется.
В случае если после предложения ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут считанные данные из всех таблиц, задействованных в запросе. В случае указания конкретных таблиц будут блокироваться только данные из перечисленных таблиц. Для блокировки можно указывать только таблицы верхнего уровня (т.е. не табличные части), участвующие в запросе. Должны приводиться именно имена таблиц, а не их псевдонимы, определенные в запросе. В случае указания виртуальной таблицы будут блокированы данные из всех таблиц, задействованных в виртуальной таблице. При указании виртуальной таблицы следует записывать ее имя без параметров.
Пример использования предложения ДЛЯ ИЗМЕНЕНИЯ можно посмотреть в типовой конфигурации "Управление торговлей" в модуле документа РеализацияТоваров, в функции СформироватьЗапросПоШапке(Режим), которая вызывается из обработчика проведения документа. В этой функции, в случае оперативного проведения выполняется запрос, в котором накладывается блокировка на регистр остатков:
Данные, которые определяют логику функционирования системы на базе 1С:Предприятия, относятся к информационной базе. Хранение информационной базы осуществляется в базе данных с виде набора таблиц, для чего 1С:Предприятие 8.1 может использовать одну из четырех систем управления базами данных (СУБД): * Встроенную в 1С:Предприятие 8.1 (файловый вариант информационной базы). В этом случае все данные информационной базы хранятся в файле с именем 1Cv8.1CD. Этот файл имеет двоичный формат и по сути является базой данных для встроенной в 1С:Предприятие 8.1 СУБД. * Microsoft SQL Server (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных Microsoft SQL Server. * PostgreSQL (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных PostgreSQL. * IBM DB2 (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных IBM DB2.
На уровне объектов базы данных (таблиц, полей, индексов и т. п.) как файловый так и клиент-серверный вариант информационной базы имеют сходный формат (отличающийся несущественными деталями). Некоторая информация об этом формате содержится ниже.
Вся информационная база представляется в базе данных в виде набора таблиц. Среди них есть несколько таблиц, которые обязательно присутствуют в представлении любой информационной базы:
* Config - основная конфигурация информационной базы. Эта конфигурация соответствует реальной структуре данных и используется 1С:Предприятием 8.0 в режиме Предприятия. * ConfigSave - конфигурация, редактируемая Конфигуратором. Конфигурация из ConfigSave переписывается в Config при выполнении "Обновления конфигурации базы данных" в Конфигураторе, а наоборот - при выполнении в Конфигураторе операции "Конфигурация - Конфигурация базы данных - Вернуться к конфигурации БД". * Files содержит служебную информацию, например, о работе с хранилищем конфигурации. * Params содержит параметры информационной базы. Среди них: => Список пользователей информационной базы. => Национальные настройки информационной базы. => Таблица соответствия объектов метаданных и объектов базы данных (таблиц, полей, индексов). => Некоторая другая информация. * _YearOffset - смещение дат в базе данных. Эта таблица создается только при использовании Microsoft SQL Server. * DBSchema содержит информацию о структуре базы данных 1С:Предприятия и определяет другие объекты базы данных, используемые данной информационной базой.
При старте 1С:Предприятие проверяет наличие в информационной базе перечисленных таблиц и в случае отсутствия какой-нибудь из них выдается сообщение "информационная база разрушена". Отсутствие всех перечисленных таблиц означает, что информационная база пустая. В последнем случае эти таблицы будут созданы.
Перечень и структура других таблиц базы данных определяется конкретной конфигурацией, а именно, определенными в ней объектами метаданных. Имя каждой таблицы состоит из буквенного префикса и следующего за ним номера. Префикс определяет назначение таблицы, а номер позволяет различать таблицы одинакового назначения, относящиеся к разным объектам метаданных. Если в качестве СУБД используется IBM DB2, то описанную структуру имеют не имена таблиц, а их псевдонимы.
Если в конфигурации определен хотя бы один план обмена с установленным флагом "Распределенная информационная база", то будут созданы следующие таблицы:
* _ConfigChangeRec - таблица регистрации изменений объектов конфигурации. * _ConfigChangeRec_ExtProps - таблица имен файлов измененных внешних свойств объектов конфигурации.
Ниже перечислены различные объекты метаданных, которым могут соответствовать те или иные таблицы.
* Константы => _Consts содержит текущие значения всех констант, определенных в конфигурации. => _ConstsChangeRec - таблица регистрации изменений констант. Создается, если хотя бы одна константа участвует хотя бы в одном плане обмена. * Планы обмена => _Node<n> - таблица плана обмена. => _Node<n>_VT<k> - табличная часть плана обмена, создается для каждой табличной части. * Справочники => _Reference<n> - таблица справочника. => _Reference<n>_VT<k> - табличная часть справочника - для каждой табличной части. => _ReferenceChangeRec<n> - таблица регистрации изменений справочника. Создается, если справочник участвует хотя бы в одном плане обмена. * Документы => _Document<n> - таблица документов для каждого объекта метаданных "документ". => _Document<n>_VT<k> - табличная часть документа - для каждой табличной части каждого документа. => _DocumentChangeRec<n> - таблица регистрации изменений объекта метаданных типа "документ". Создается для каждого объекта метаданных типа "документ", если он участвует хотя бы в одном плане обмена. * Последовательности документов => _Sequence<n> - таблица регистрации документов - для каждой последовательности. => _SequenceBoundary<n> - таблица границ последовательности - для каждой последовательности. => _SequenceChangeRec<n> - таблица регистрации изменений последовательности. Создается для каждой последовательности, которая участвует хотя бы в одном плане обмена. * Журналы документов. => _DocumentJournal<n> - таблица журнала документов, создается для каждого журнала документов. * Перечисления => _Enum<n> - таблица перечисления - по одной для каждого перечисления. * Планы видов характеристик => _Chrc<n> - основная таблица плана видов характеристик. => _Chrc<n>_VT<k> - табличная часть плана видов характеристик - для каждой табличной части. => _ChrcChangeRec<n> - таблица регистрации изменений плана видов характеристик. Создается, если план видов характеристик участвует хотя бы в одном плане обмена. * Планы счетов => _Acc<n> - основная таблица плана счетов. => _Acc<n>_ExtDim<k> - таблица видов субконто плана счетов, создается для плана счетов в том случае, если максимальное количество субконто больше нуля. => _Acc<n>_VT<k> - табличная часть плана счетов, создается для каждой табличной части плана счетов. => _AccChangeRec<n> - таблица регистрации изменений плана счетов. Создается, если план счетов участвует хотя бы в одном плане обмена. * Планы видов расчета => _CalcKind<n> - основная таблица плана видов расчета. => _CalcKind<n>_BaseCK - таблица базовых видов расчета, создается для плана видов расчета в случае, если его свойство "Зависимость от базы" имеет значение, отличное от "Не зависит". => _CalcKind<n>_DisplacedCK - таблица вытесняемых видов расчета, создается для плана видов расчета в случае, если у него установлен флаг "Использует период действия". => _CalcKind<n>_LeadingCK - таблица ведущих видов расчета - для каждого плана видов расчета. => _CalcKindDN<n> - вспомогательная таблица для порядка вытеснения, создается, если у плана видов расчета установлен флаг "Использует период действия". => _CalcKind<n>_VT<k> - табличная часть плана видов расчета, создается для каждой табличной части. => _CalcKindChangeRec<n> - таблица регистрации изменений плана видов расчета. Создается, если план видов расчета участвует хотя бы в одном плане обмена. * Регистры сведений => _InfoReg<n> - таблица движений регистра сведений. => _InfoRegChangeRec<n> - таблица регистрации изменений регистра сведений. Создается, если регистр сведений участвует хотя бы в одном плане обмена. * Регистры накопления => _AccumReg<n> - таблица движений регистра накопления. => _AccumRegTotals<n> - таблица итогов регистра накопления, если регистр поддерживает остатки. => _AccumRegTurnovers<n> - таблица оборотов регистра накопления, если регистр поддерживает обороты. => _AccumRegChangeRec<n> - таблица регистрации изменений регистра накопления. Создается, если регистр накопления участвует хотя бы в одном плане обмена. => _AccumRegOptions - таблица настроек хранения итогов регистров накопления одна на все регистры накопления. * Регистры бухгалтерии => _AccntReg<n> - таблица движений регистра бухгалтерии. => _AccntRegED<n> - таблица значений субконто регистра бухгалтерии, создается в том случае, если он ссылается на план счетов, у которого максимальное количество субконто больше нуля. => _AccTtl0<n> - таблица итогов по счету. => _AccTtl<i><n> - где i от 1 до максимального количества субконто. Таблица итогов по счету с количеством видов субконто равным i. => _AccTtlC<n> - таблица итогов оборотов между счетами, только для регистра бухгалтерии поддерживающего корреспонденцию. => _AccntRegChangeRec<n> - таблица регистрации изменений регистра бухгалтерии. Создается, если регистр бухгалтерии участвует хотя бы в одном плане обмена. => _AccntRegOptions - таблица настроек хранения итогов одна на все регистры бухгалтерии. * Регистры расчета => _CalcReg<n> - таблица движений регистра расчета. => _CalcRegActPer<n> - таблица фактических периодов действия для регистра расчета, создается, если у регистра расчета установлен флаг "Период действия". => _CalcRegChangeRec<n> - таблица регистрации изменений регистра расчета. Создается для каждого регистра расчета, участвующего хотя бы в одном плане обмена. => _CalcRegRecalc<n> - таблица перерасчета регистра расчета, создается для каждого перерасчета. => _CalcRegRecalcChangeRec<n> - таблица регистрации изменений перерасчета. Создается, если перерасчет участвует хотя бы в одном плане обмена. * Бизнес-процессы => _BPRoutePoint<n> - таблица точек маршрута бизнес-процесса для каждого бизнес-процесса. => _BusinessProcess<n> - основная таблица бизнес-процесса. => _BusinessProcess<n>_VT<k> - табличная часть бизнес-процесса для каждой табличной части. => _BusinessProcessChangeRec<n> - таблица регистрации изменений бизнес-процесса. Создается для каждого бизнес-процесса, участвующего хотя бы в одном плане обмена. * Задачи => _Task<n> - основная таблица задачи. => _Task<n>_VT<k> - табличная часть задачи для каждой табличной части. => _TaskChangeRec<n> - таблица регистрации изменений в задачах. Создается для каждого объекта метаданных типа "задача", который участвует хотя бы в одном плане обмена.
При использовании IBM DB2 префиксы псевдонимов таблиц начинаются не с символа подчеркивания, а сразу с буквенной части.
Количество этих таблиц зависит от функциональности конфигурации и может быть достаточно большим. В штатном режиме 1С:Предприятие не выполняет проверку их наличия, а также целостности и непротиворечивости содержащихся в них данных. Поэтому важно, чтобы база данных, в которой размещена информационная база 1С:Предприятия 8.1, была защищена от несанкционированного доступа и ее модификация выполнялась только средствами 1С:Предприятия. Для проверки необходимо использовать функцию "Администрирование - Тестирование и исправление", встроенную в конфигуратор.
Важно также, чтобы резервное копирование и восстановление базы данных, хранящей информационную базу, выполнялось только целиком. С этой целью рекомендуется использование средств резервного копирования баз данных, встроенных в в используемую СУБД. Резервное сохранение файлового варианта информационной базы может быть выполнено копированием файла 1Cv8.1CD.
В конфигураторе есть специальная функция: Администрирование - Выгрузить информационную базу. С ее помощью можно выгрузить в указанный файл (файл выгрузки) все данные, относящиеся к информационной базе, и больше никакие. Обратная ей функция "Загрузить информационную базу" позволяет в текущую информационную базу вместо существующих загрузить все данные из файла выгрузки. Эти функции также можно использовать для резервного копирования данных информационной базы как в файловом так и в клиент-серверном варианте. Как просмотреть структуру таблиц информационной базы?