Биты и байты.

Биты и байты.

пятница, 19 сентября 2014 г.

Быстрый доступ к данным 1С

Когда срочно нужны данные из 1С, а программиста 1С под рукой нет, поможет старый добрый SQL запрос.
Так как структура базы сама по себе хитрая (таблицы и поля имеют служебные названия  а-ля  _Document324 , _Reference1961   и  _Field32634)  желательно сначала получить структуру базы,  самый простой способ  с помощью обработки  с Инфостарта, запускать нужно из под тонкого клиента.

P.S Тоже самое можно получить  встроенной функцией  ПолучитьСтруктуруХраненияБазыДанных(,Истина)


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

Можно получить названия SSIS пакетом  используя этот код в отдельную таблицу,  взято с хабра

  CREATE TABLE [dbo].[tbl1CEnums](
    [EnumName] [nvarchar](1024) NULL,
    [EnumValue] [nvarchar](2014) NULL,
    [EnumOrder] [int] NULL
) ON [PRIMARY]

Затем  связать эту таблицу с перечислением

четверг, 11 сентября 2014 г.

Sharepoint изнутри.


Как выглядит  SharePoint со стороны БД?  Ну как то так..
Для человека который первый раз залез под капот тут не все так очевидно как хотелось бы, поэтому попробуем немного разобраться в этом вопросе.
Предупреждение: Любые изменения в SharePoint через СУБД могут нарушить структуру базы и привести к тому что ваш SharePoint перестанет работать.
Все операции выполняются на свой страх и риск, поэтому перед тем как выполнять в боевой базе необходимо детально проверить скрипты на тестовой.

Если немного приглядеться  можно выделить основные таблицы SharePoint и связи между ними

AllLists
Таблица которая содержит списки (библиотеки) для каждого сайта.
ОСНОВНАЯ таблица содержит мета информацию о каждом элементе в списке.
Содержит информацию обо всех документах (и всех элементах списка) для каждой библиотеки и списка.
DocStreams
Содержит сами документы в BLOB поле Content varbinary (max).
NameValuePair
Индексируемые поля для списков.
AllUserDataJunctions
Содержит множественный выбор значений полей.
ContentTypes 
Содержит описание используемых типов
Features 
 Содержит информацию об активированных дополнениях для каждой коллекции сайтов или сайта.
 Содержит информацию о  всех коллекциях сайтов в базе.
 Содержит информацию о сайтах (webs) в каждой коллекции сайта.
 Содержит информацию о пользователях.
Groups
 Содержит информацию о группах пользователей в каждой коллекции сайтов.
Roles
 Содержит роли (уровни доступа) для каждого сайта.
 Содержит информацию о членах групп.
RoleAssignment
 Содержит информацию обо всех пользователях или группах SharePoint которые присвоены ролям.
SchedSubscriptions
 Содержит информацию обо всех настроенных подписках по расписанию
ImmedSubscriptions
 Таблица содержащая информацию обо всех непосредственных подписках.

1.  Информацию о списках Sharepoint  можно получить из таблицы AllLists
SELECT 
       List.tp_SiteId,
       List.tp_WebId,
       List.tp_ID ,   --идентификатор списка
       tp_BaseType ,  --тип списка: Generic List: 0, Document Library: 1, Discussion Board:3, Survey:4,Issue:5
       tp_ServerTemplate, --ex:100-Generic list,101-Document library,102-Survey,103-Links list,104-Announcements list,105-Contacts list,106-Events list, 107-Tasks list,108-Discussion board,109-Picture library
       list.tp_Title , --название списка
       list.tp_Fields ,  --описание полей в библиотеке
       list.tp_ContentTypes  --описание типов в библиотеке
  FROM alllists LIST WHERE lower(LIST.tp_Title) LIKE  N'%входящие%2011%' and (list.[tp_DeleteTransactionId] = 0x )

Поля tp_Fields, tp_ContentTypes  хранятся в сжатом двоичном виде, чтобы распаковать их достаточно использовать функцию ниже


private static string getXmlFromTpFields(byte[] tpFields)
        {
            using (var memoryStream = new MemoryStream(tpFields))
            {
                // пропускаем первые 14 байтов
                for (var index = 0; index <= 13; index++)
                    memoryStream.ReadByte();

                var deflateStream = new DeflateStream(memoryStream, CompressionMode.Decompress);

                using (var destination = new MemoryStream())
                {
                    deflateStream.CopyTo(destination);

                    var streamReader = new StreamReader(destination);
                    destination.Position = 0;
                    return streamReader.ReadToEnd();
                }
            }
        }

четверг, 4 сентября 2014 г.

Навигация в отчетах SSRS.

Когда в  отчёте   больше 100 групп и таблиц то информация на листе отчета может быть абсолютно не читаемой. Для того чтобы привести в читаемый вид используется схема документа с навигацией слева. Видео по ссылке здесь.
Настраивается все очень просто, для таблицы достаточно указать  свойство DocumentMapLabel

About