tormozit / RDT1C

Подсистема "Инструменты разработчика" для платформы 1С 8
http://devtool1c.ucoz.ru
92 stars 9 forks source link

Расширение функционала инструмента "Структура хранения БД" для работы с СУБД PostgresSQL #246

Closed MelenchukEvgeniy closed 2 years ago

MelenchukEvgeniy commented 2 years ago

Для клиент-серверного варианта работы хочется иметь возможность указывать параметры подключения не только к СУБД MSSQL, но и к PostgreSQL. Соответственно, при работе с PostgreSQL, хочется видеть реальные размеры таблиц - колонки "Размер данные", "Размер индексы" и "Размер общие".

tormozit commented 2 years ago

Какая у тебя клиентская ОС?

MelenchukEvgeniy commented 2 years ago

Windows 10 Pro.

tormozit commented 2 years ago

Открой консоль запросов ИР, выбери тип запроса ADO, на странице ADO выбери драйвер Postgre, заполни параметры. Добейся тут подключения к СУБД и выполнения простейшего запроса. Если на этом пути ты будет устанавливать какие то программы/драйверы или делать настройки в ODBC (например как тут https://infostart.ru/public/978816/ ), то фиксируй их, чтобы я потом их подсказывал пользователю. В итоге мне нужна твоя успешная строка соединения, которую сообщает кнопка "Проверка подключения". Очень надеюсь что стандартная подойдет.

MelenchukEvgeniy commented 2 years ago

Сделаю. Я ограничен по времени? На работе у меня нет прав на установку любого ПО.

tormozit commented 2 years ago

Время не критично. Но какая то экономия времени конечно была бы, если бы я знал некоторые вещи про Postrge сразу.

MelenchukEvgeniy commented 2 years ago

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

MelenchukEvgeniy commented 2 years ago

Подключился. Соединение установлено. Фактическая строка соединения: Provider=MSDASQL.1;Persist Security Info=False;User ID=postgres;Data Source=PostgreSQL35W;Initial Catalog=upp Запрос, который ты мне прислал, выполнился, но не дал никаких результатов. В следующем комментарии распишу свои шаги. Запрос по таблице документа, где есть одна запись, вывел одну строку в результат с данными этой самой записи.

tormozit commented 2 years ago

Проверь вариант со стандартным для консоли провайдером PostgreSQL OLE DB Provider. Это - вроде бы его бесплатный вариант. Он не требует создания DSN ("квест" который проходят немногие). Далее цитата из его документации: In order to install this software, copy PGOLEDB.DLL and LIBPQ.DLL into your system directory. Next, as administrator, run "regsvr32 PGOLEDB.DLL". You should get a dialog message saying "registration succeeded".

Проверь такой запрос

SELECT
    pretty_sizes.table_name AS TableName,
    pretty_sizes.tabname AS tabname,
    pretty_sizes.tabschema AS tabschema,
    pretty_sizes.table_size AS DataKB,
    pretty_sizes.indexes_size AS IndexKB,
    pretty_sizes.total_size AS total_size,
    c.reltuples::integer AS Rows,
    '' as IndexType,
    0 as ReservedKB,
FROM
    (SELECT
        all_tables.table_name AS table_name,
        all_tables.tabname AS tabname,
        all_tables.tabschema AS tabschema,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM
        (SELECT
            ('"'
                OR table_schema
                OR '"."'
                OR table_name
                OR '"') AS table_name,
            table_name AS tabname,
            table_schema AS tabschema
        FROM
            information_schema.tables AS tables
        WHERE table_schema LIKE 'public') AS all_tables) AS pretty_sizes
    LEFT JOIN pg_class AS c
    ON c.oid = tabname::regclass::oid
MelenchukEvgeniy commented 2 years ago
  1. Через утилиту "Application Stack Builder" установил сначала драйвер "psqlODBC (64 bit)". Эффекта не дало - проверял через "Администратор источника данных ODBC" (исполняемый файл "odbcad32.exe" в директории "C:\Windows\SysWOW64"). В этом "Администраторе" нажимал "Добавить" на закладке "Пользовательский DSN" - в списке доступных драйверов не было PostgreSQL.
  2. Повторил шаг 1, только с установкой 32-разрядного драйвера "psqlODBC (32 bit)". В "Администраторе источника данных" добавил новый источник с указанием драйвера "PostgreSQL ODBC Driver (Unicode)". Настройки источника показать бы скриншотом, но я не могу понять, как их здесь прикреплять!?
  3. В консоли запросов выбрал платформу "PostgreSQL ч/з OLEDB", указал сервер БД, имя базы, пользователя и пароль. Стандартную строку соединения заменил на "Driver={PostgreSQL Unicode};Server=host;Port=port;Database=db_name;Uid=user;Pwd=password;STMT=utf8" - взял отсюда: https://1c-programmer-blog.ru/programmirovanie/postgresql-iz-1s.html
  4. После шага 3 нажал троеточие в реквизите "Строка соединения".
  5. Открылось окно "Свойства канала передачи данных". На закладке "Поставщик данных" выбрал "Microsoft OLE DB Providers for ODBC Drivers", на закладке "Соединение" выбрал источник, созданный в шаге 2, указал пользователя, пароль, начальный каталог (имя БД). После нажатия "ОК" сформировалась нужная строка соединения.
tormozit commented 2 years ago

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

Просто вставляй из буфера обмена

MelenchukEvgeniy commented 2 years ago

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

tormozit commented 2 years ago

Добавил поддержку Postgre с указанным мной провайдером, которого надо вручную устанавливать. Пробуй новое расширение https://drive.google.com/file/d/1rsnuX8ALaxLILqHbeGwK1584SHptoQvl/view?usp=sharing

tormozit commented 2 years ago

Создал задачу https://www.hostedredmine.com/issues/942055

MelenchukEvgeniy commented 2 years ago

Жду, пока скачают. У меня нет доступа к облачным хранилищам. А то, что ты вчера писал, пробовать надо? Я с утра ещё пока админов не смог застать.

tormozit commented 2 years ago

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

MelenchukEvgeniy commented 2 years ago

Да, я уже осознал. Тогда дай мне чуть времени. Без админов ничего не могу.

MelenchukEvgeniy commented 2 years ago

У меня не взлетело. Библиотеки скопировал, регистрация прошла успешно. Даже перезагрузился. Ошибка "Не удаётся найти указанный поставщик".

tormozit commented 2 years ago

У меня не взлетело. Библиотеки скопировал, регистрация прошла успешно. Даже перезагрузился. Ошибка "Не удаётся найти указанный поставщик".

Вероятно у тебя провайдер зарегистрирован в разделе реестра одной разрядности, а клиентское приложение ты используешь другой разрядности. У меня этот провайдер обнаруживается при использовании в 32-разрядном клиентском приложении 1С. Также после регистрации COM компонент достаточно перезапускать приложение, т.к. эта ветка реестра кэшируется в процессе ОС. Перезагрузка ОС не требуется.

MelenchukEvgeniy commented 2 years ago

Попробую поставить 32-разрядную платформу и проверить ещё раз.

MelenchukEvgeniy commented 2 years ago

Результаты после установки 32-разрядной платформы.

  1. Настройка подключения к СУБД в расширении: настройка в расширении
  2. Ошибка в расширении: ошибка в расширении.docx
  3. Успешное подключение через консоль: успех в консоли
  4. Ошибка при попытке открыть конструктор запроса в консоли: ошибка в консоли.docx
MelenchukEvgeniy commented 2 years ago

DLL файлы скопировал в папку C:\Windows\SysWoW64. Регистрировал утилитой regsvr32.exe из папки C:\Windows\System32

tormozit commented 2 years ago

Попробуй выполнить в консоли запрос SELECT * FROM _CommonSettings LIMIT 1 для обоих методов соединения (OLEDB и ODBC). Похоже у OLEDB какие то проблемы с преобразованием типов данных.

MelenchukEvgeniy commented 2 years ago

Для OLEDB: Ошибка ADO: Произошла исключительная ситуация (PgOleDB): Query returned unhandled type 16425

tormozit commented 2 years ago

А такой OLEDB выполняет? SELECT 1, 'Федя'

MelenchukEvgeniy commented 2 years ago

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

MelenchukEvgeniy commented 2 years ago

А такой OLEDB выполняет? SELECT 1, 'Федя'

Да, выполняется. Одна строка с колонками "column" (значение 1) и "_column_1"(значение Федя)

tormozit commented 2 years ago

Найди в моем расширении конфигурации в общем модуле ирОбщий строку SELECT * FROM _CommonSettings WHERE _SettingsKey И замени в ней звездочку на 1.

MelenchukEvgeniy commented 2 years ago

Это ты про расширение, которое прислал?

MelenchukEvgeniy commented 2 years ago

Небольшой перерыв и я вернусь.

tormozit commented 2 years ago

Выходит этот OLEDB провайдер не умеет BINARY типы обрабатывать. Для самых полезных задач в ИР это не проблема. А вот для исследования данных в таблицах СУБД прямыми запросами из консоли запросов ИР - конечно будет проблемой. Но тот кто до этого дойдет, сможет и источник ODBC настроить и подключить.

tormozit commented 2 years ago

По поводу конструктора запроса ИР. Этот провайдер OLEDB скорее всего не предоставляет нужной функциональности, т.к. у него в описании упомянуто про это. Но можешь попробовать в точке останова на проблемной строке показать свойства переменной "Конфигурация".

MelenchukEvgeniy commented 2 years ago

Найди в моем расширении конфигурации в общем модуле ирОбщий строку SELECT * FROM _CommonSettings WHERE _SettingsKey И замени в ней звездочку на 1.

Сделал. Настройки соединения с СУБД проглатывает. При установке реквизита "Показывать размеры" - ошибка: SQL Server не существует, или доступ запрещён.

tormozit commented 2 years ago

Пробуй новое расширение https://drive.google.com/file/d/1A0TDj7ppieD5oySNMlQC762Yyc5bTMgw/view?usp=sharing

MelenchukEvgeniy commented 2 years ago

По поводу конструктора запроса ИР. Этот провайдер OLEDB скорее всего не предоставляет нужной функциональности, т.к. у него в описании упомянуто про это. Но можешь попробовать в точке останова на проблемной строке показать свойства переменной "Конфигурация".

Переменная Конфигурация.xls

Ошибочное место при открытии конструктора

MelenchukEvgeniy commented 2 years ago

Новое расширение скачал и установил. Ошибка при открытии инструмента "Структура хранения БД": ошибка нового расширения

Текст запроса в новом расширении.xls

tormozit commented 2 years ago

Ты не тот запрос отловил. Эта строка кода выполняет ВСЕ запросы к ADO. Ты отловил первый запрос, но мы уже его ранее проверили. И в нем меньше 100 символов. А в ошибке указано на 301-й символ, т.е. точно другой запрос.

tormozit commented 2 years ago

Нашел ошибку. Убери лишнюю запятую

изображение

MelenchukEvgeniy commented 2 years ago

Да, я тоже нашёл. Долго соображал, где текст запроса у тебя находится. Теперь ошибка на символе 584: ... FROM (SELECT ('"' OR...

invalid input syntax for type boolean: """ Это 21 строка запроса - ('"' Тут у меня не хватает соображалки, что это за конструкция и как должно быть.

tormozit commented 2 years ago

Тут идет соединение частей строки. Замени все OR на ||. В оригинале там || было. А замена произошла при форматировании моим конструктором.

MelenchukEvgeniy commented 2 years ago

Взлетело. Размеры таблиц показываются.

tormozit commented 2 years ago

Единицы измерения размера адекватные? Команду "Очистка таблиц СУБД" хорошо бы тоже протестировать.

MelenchukEvgeniy commented 2 years ago

Не, рано радовался. Погоди, я скрины сделаю.

MelenchukEvgeniy commented 2 years ago

В списке таблиц сначала идёт такой блок, где указаны размеры, но нет "человеческих" имён таблиц:

структура хранения 1

Потом идёт блок с "человеческими" названиями, но без размеров: структура хранения 2

tormozit commented 2 years ago

Попробуй такой запрос

SELECT
    pretty_sizes.table_name AS fullTableName,
    pretty_sizes.tabname AS TableName,
    pretty_sizes.tabschema AS tabschema,
    pretty_sizes.table_size/1024 AS DataKB,
    pretty_sizes.indexes_size/1024 AS IndexKB,
    pretty_sizes.total_size/1024 AS TotalKB,
    c.reltuples::integer AS Rows,
    '' as IndexType,
    0 as ReservedKB
FROM
    (SELECT
        all_tables.table_name AS table_name,
        all_tables.tabname AS tabname,
        all_tables.tabschema AS tabschema,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM
        (SELECT
            ('"'||table_schema||'"."'||table_name||'"') AS table_name,
            table_name AS tabname,
            table_schema AS tabschema
        FROM
            information_schema.tables AS tables
        WHERE table_schema LIKE 'public') AS all_tables) AS pretty_sizes
    LEFT JOIN pg_class AS c
    ON c.oid = tabname::regclass::oid
MelenchukEvgeniy commented 2 years ago

Единицы измерения размера адекватные? Команду "Очистка таблиц СУБД" хорошо бы тоже протестировать.

Ты же вроде в обёртку pretty_size оборачивал? Должно быть адекватно. Я посмотрю чуть позже. Очистка таблиц сделает базу пустой?

tormozit commented 2 years ago

Для очистки ТАБЛИЦ просто выбери пустую таблицу. Хочется проверить что сгенерированный запрос корректно выполнится. Выбранную таблицу он очистит, если получится.

MelenchukEvgeniy commented 2 years ago

Не очищает. очистка таблиц 1 очистка таблиц 2 очистка таблиц 3 Сформированный текст запроса для очистки таблиц: очистка таблиц 4

MelenchukEvgeniy commented 2 years ago

Попробуй такой запрос

SELECT
  pretty_sizes.table_name AS fullTableName,
  pretty_sizes.tabname AS TableName,
  pretty_sizes.tabschema AS tabschema,
  pretty_sizes.table_size/1024 AS DataKB,
  pretty_sizes.indexes_size/1024 AS IndexKB,
  pretty_sizes.total_size/1024 AS TotalKB,
  c.reltuples::integer AS Rows,
  '' as IndexType,
  0 as ReservedKB
FROM
  (SELECT
      all_tables.table_name AS table_name,
      all_tables.tabname AS tabname,
      all_tables.tabschema AS tabschema,
      pg_table_size(table_name) AS table_size,
      pg_indexes_size(table_name) AS indexes_size,
      pg_total_relation_size(table_name) AS total_size
  FROM
      (SELECT
          ('"'||table_schema||'"."'||table_name||'"') AS table_name,
          table_name AS tabname,
          table_schema AS tabschema
      FROM
          information_schema.tables AS tables
      WHERE table_schema LIKE 'public') AS all_tables) AS pretty_sizes
  LEFT JOIN pg_class AS c
  ON c.oid = tabname::regclass::oid

Теперь хорошо. И размеры теперь похожи на правду. До этого было неправильно. На той же таблице Reference53 проверил. В твоём инструменте - 51 928 КБ, в PgAdmin запрос показывает 51 МБ по этой таблице. Сходится)

MelenchukEvgeniy commented 2 years ago

Колонка "Размер общий" пустая по всем строкам! Не обратил внимания на неё сразу, извини.

tormozit commented 2 years ago

Не очищает.

Нужен полный текст ошибки.