Андрей Луконькин
Информационная база «1С:Предприятие 7.7».
Взгляд изнутри
Заглянув в каталог информационной базы, неподготовленный человек вряд ли увидит там что-то интересное, нужное и полезное. Скорее испугается обилия файлов и каталогов. Но обладая необходимыми знаниями, разобраться, оказывается, совсем не сложно!
Информационная база «1С:Предприятие 7.7» в файл-серверном варианте работы представляет собой набор файлов, имена большинства которых состоят из префикса и числа. В клиент-серверном варианте данные находятся на сервере SQL в виде таблиц (см. рис. 1).
Рисунок 1. Каталог информационной базы в файл-серверном варианте работы
Чтобы узнать, что именно хранится в конкретной таблице, достаточно открыть файл 1cv7.DD (расширение Data Dictionary – словарь данных), представляющий собой простой текстовый файл с описанием всех таблиц информационной базы и их полей (см. рис. 2). Для клиент-серверного варианта это файл 1cv7.dds, располагающийся в каталоге SQL-базы.
Рисунок 2. Фрагмент файла 1cv7.DD, описывающий таблицу констант
Все элементы этого дерева имеют сквозную нумерацию, повторяющихся кодов нет.
Полистав файл 1cv7.DD, можно выявить некоторые закономерности:
- в таблицах, имя которых начинается на «SC», хранятся справочники;
- «DH» – шапки документов;
- «DT» – табличные части документов;
- «1SJOURN» – таблица документов (общих и системных реквизитов);
- «1SCRDOC» – таблица подчиненных документов;
- «RG» – таблица остатков;
- «RA» – таблица движений.
Рассмотрим теперь подробнее структуру информационной базы.
Таблица 1SCONST – константы
Предназначена для хранения значений констант и периодических реквизитов справочников.
Таблица 1SCRDOC – ссылки документов
Предназначена для хранения ссылок подчиненных документов и граф отборов реквизитов документов. Для хранения ссылок документов в подчиненном документе должен быть реквизит (поле), в котором будет ссылка на документ-родитель. Без такой ссылки документ не считается подчиненным.
Таблица 1SJOURN – журналы
Предназначена для хранения списка всех документов. Именно эта таблица является узким местом при работе большого числа пользователей (так как она блокируется полностью каждым пользователем в момент проведения документов).
Таблица 1SDNLOCK – номера документов
Предназначена для хранения информации о зарезервированных номерах документов, т.е. тех номерах документов, которые вводятся в данный момент в систему, но еще не сохранены (не записаны в таблицу журналов 1SJOURN).
Таблица 1SSTREAM – последовательности документов
Предназначена для хранения информации о последовательностях.
Таблица 1SSYSTEM – системная таблица
Предназначена для хранения информации о датах точки актуальности и рассчитанного периода бухгалтерских итогов, также в таблице хранится информация о параметрах УРБД.
Таблица 1SUIDCTL – уникальности
Предназначена для хранения информации о последнем ID коде документов и справочников.
Таблица 1SUSERS – соединения
Предназначена для хранения информации о наличии подключенных пользователей. В таблице всегда одна запись, которая создается при подключении первого пользователя в текущем сеансе и удаляется при корректном завершении работы последнего пользователя. В случае аварийного завершения работы с базой данных запись остается. Именно по наличию этой записи в таблице 1С судит об аварийном завершении программы и предлагает переиндексировать информационную базу, если она в файл-серверном варианте работы.
Также в файле 1Cv7.DD можно увидеть описание и других таблиц, используемых в работе: 1SACCS (счета), 1SOPER (операции), 1SENTRY (проводки) и множество других.
Документы
В системе «1С:Предприятие 7.7» документы всегда хранятся максимум в 2 таблицах (т.е. табличная часть может быть только одна, и все данные табличной части хранятся в этой таблице). Исключение составляют общие реквизиты, которые хранятся в одной общей таблице.
DH – таблицы документов (реквизитов шапки)
Создаются при первом добавлении реквизита шапки в документ. На каждый реквизит отведено минимум одно поле таблицы (может быть и 2 в случае реквизита неопределенного типа). Также в этой таблице хранятся данные по некоторым реквизитам табличной части.
DT – таблицы документов (реквизитов табличной части)
Создаются при первом добавлении реквизита табличной части в документ. Хранятся данные реквизитов табличной части (каждый реквизит – минимум одно поле таблицы плюс системное поле LINENO – номер строки документа).
Регистры
Физически регистры остатков состоят из двух таблиц: таблица остатков RGххх и таблица движений RAххх. В таблице движений хранятся все движения документов по регистрам. Список документов, которые сделали движения по регистру, можно получить, выбрав записи из таблицы журналов _1SJOURN, с условием равенства поля RFxxx 1 (или не равно 0).
В таблицу RA записываются все движения документов с учетом флага прихода или расхода. То есть в таблице RA хранятся сведения о всех движениях документов, которые сделали движения по этому регистру.
Для того чтобы не производить громоздких пересчетов, разработчики системы «1С» организовали регистры остатков таким образом, что они состоят из двух таблиц.
1 – RA (хранятся все движения с флагом прихода или расхода), 2 – RG для хранения промежуточных итогов (как бы заблаговременно подсчитанные итоги по таблице RA за определенный период).
Зачем нужны эти знания?
Казалось бы, система работает, и хорошо, зачем залезать глубоко? Но бывают случаи, когда разработчику приходится обращаться к структуре базы данных. Причины могут быть разнообразными – от восстановления данных до оптимизации работы системы.
Зная структуру хранения, можно получать данные напрямую из таблиц «1С», минуя программу «1С:Предприятие». Конечно, для этого нужно уметь обращаться с SQL Server Enterprise Manager и SQL Server Query Analyzer, и если владение этими инструментами для вас не проблема, то можно оперировать данными базы гораздо эффективнее, чем это происходило раньше.
Возможно получение записей справочников, выборки элементов, получение списка документов по определенному условию отбора, итогов и остатков регистров и многое другое.
Приведу лишь самые простые примеры запросов к базе данных «1С:Предприятие 7.7», с их помощью можно оценить преимущества скорости обработки и получения данных.
Пример 1
Получение записей только не помеченных на удаление элементов справочника из таблицы SC19 (кроме периодических реквизитов).
SELECT *FROM SC19WHERE ISFOLDER = 0 AND ISMARK = 0
Здесь ISMARK – это флаг пометки элемента (или группы) на удаление, ISFOLDER – признак группы справочника.
Пример 2
Получение списка только проведенных документов. Для отбора только проведенных документов можно воспользоваться значением поля CLOSED таблицы _1SJOURN.
SELECT TabJ.*, Tab1.*FROM DH14 As Tab1INNER JOIN _1SJOURN As TabJ ON (Tab1.IDDOC = TabJ.IDDOC)WHERE TabJ.CLOSED&1 = 1
Пример 3
Получение итогов на ТА или на конец периода.
Получение итогов на ТА или на конец периода.
SELECT TabRegOst.SP20 As Товар, Sum(TabRegOst.SP21) As КвоКонОстFROM RG13 As TabRegOstWHERE TabRegOst.PERIOD = @PERIODRGROUP BY TabRegOst.SP20ORDER BY TabRegOst.SP20
Здесь @PERIODR – переменная типа DateTime, условие по которой служит для получения результата запроса на тот период, который нам необходим.
Также возможно использование так называемых прямых запросов непосредственно из системы «1С:Предприятие», но уже с подключением внешних компонентов (таких как 1sqlite, 1С++, SpellSQL, Rainbow, ToySQL и других). Тогда код программы будет выглядеть примерно так:
RS = СоздатьОбъект("ODBCRecordset");RS.УстБД1С();ТекстЗапроса = "|SELECT| Спр.Code as Код,| Спр.Descr as Наименование|FROM| sc433 as Спр";ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);ТЗ.ВыбратьСтроку();
Работа с прямыми запросами позволит ускорить выполнение некоторых операций (таких как пересчет итогов, формирование объёмных отчетов) в буквальном смысле в несколько раз.
Заключение
Таким образом, ознакомление со структурой базы – это первый путь к оптимизации и увеличению производительности, что довольно актуально для баз на платформе «1С:Предприятие 7.7». Исследуйте, экспериментируйте, ведь всегда существуют пути для улучшения существующей ситуации!
- http://www.metaprog.co.ua/secrprog.
- http://www.script-coding.info/v77tables.html.
- http://www.gendin.ru/budni/b25.html.
- http://1csql.ru/materials/articles/develop.html.