Подсистема "COMExchange": «прямые» запросы к базе 1С через ADO или как простые элементы сделать “предопределёнными”.

08.02.13

Разработка - Запросы

На примере нестандартной задачи, связанной со структурой данных, продемонстрированы возможности подсистемы для выполнения «прямых» запросов к базе 1С клиент-серверной версии.
 
 
Мюллер битый час судорожно просматривал журнал регистрации и ни как 
не мог понять, каким образом Штирлицу удается удалять секретные
счет-фактуры рейхканцелярии, не оставляя при этом ни каких следов.
...то, что Штирлиц это делает знали все, но никто не знал, как это доказать.
  

Подсистема «COMExchange» позволяет выполнять запросы через ADO к любым источникам данных при наличии провайдера или драйвера данных, обеспечивающего доступ.
Это в полной мере относится к самой базе 1С клиент-серверной версии.  

Для файловой базы, к сожалению,  эта возможность остаётся не доступной. Конечно, если у вас имеется информация,
где взять нужный провайдер данных, то вы можете воспользоваться  своими «тайными» знаниями и проверить эту статью на файловой базе Smile.
Правда имеется возможность низкоуровневого доступа к файловой базе через ВК 1CDLib.dll (© andrewks), рекомендуемая автором только
для восстановления разрушенных информационных баз.

В целом прямой доступ к базе данных 1С не приветствуется разработчиками платформы.  На это есть определённые причины. 
«Прямые» запросы на чтение данных для платформы 8.х сложны для составления и не дают выигрыша по производительности.
Использование же «прямых» запросов на запись несёт в себе опасность повреждения данных,
но в некоторых случаях они могут оказаться полезны:

  1. Для выполнения «хирургических» операций для исправления данных, так как штатная процедура тестирования-исправления становится неадекватной
    поставленной задаче для большого размера базы (длится неприемлемо долго);
  2. При реорганизации данных (заполнения новых атрибутов объектов);
  3. Для решения нестандартных задач на уровне структуры базы данных;

Подобное использование «прямых» запросов на запись к базе данных 1С для версии 7.7 описано в статье «Последний тюнинг известной обработки 1CQA (консоль прямых запросов 1С++) для 1С:Предприятие-77» .

В любом случае использовать «прямые» запросы на запись нужно очень осмотрительно, чтобы не нарушить целостность данных.
Например, при удалении записей из основной таблицы  объекта, также должны удаляться записи из связанных с ней таблиц (таблиц табличных частей, таблиц регистрации изменений и т.д.).

Для прямого доступа к базе 1С нужно создать и заполнить соответствующим образом узел плана обмена «Обмен данными COM»
Это можно сделать вручную, но удобнее воспользоваться формой автоматического заполнения (Рис.1) и создать стандартный узел «ЭтаБазаADO».
При этом потребуется указать информацию, необходимую для аутентификации на сервере 1С (чтобы считать настройки SQL базы данных).

И так задача:
Сделать все простые элементы «предопределёнными» в справочнике «Виды оплат чека ККМ» (входит в состав конфигураций УТ-10.3, УПП),
чтобы ни один пользователь, включая «обычных» программистов 1С, не мог их удалить или пометить на удаление.

Решается она просто:
Надо установить значение 0x1 в поле _IsMetadata в основной таблице справочника.

Пример запроса (Рис.2), выполняющего это действие, можно взять из файла ..Sampels\!ПрямойДоступ1СчерезADO.selx архива комплекта поставки подсистемы.
Кроме установки флага _IsMetadata в этом файле есть примеры запросов, выполняющих другие действия:

  1. Пометка элементов справочника на удаление (Рис.3);
  2. Непосредственное удаление элементов справочника (Рис.4);
  3. Запросы, выполняющие очистку периодического регистра сведений;

Для выполнения примеров запросов из файла требуется:

  1. Установить подсистему «COMExchange» (включая подсистему «ViewValues», входящую в комплект поставки);
  2. Выполнить автоматическое заполнение плана обмена «Обмен данными COM». При этом обязательно нужно заполнить стандартный узел «ЭтаБазаADO», используемый в запросах;
  3. Открыть файл с запросами в обработке «Консоль запросов 1С + ADO» в составе подсистемы;
  4. Заменить слово «ИстинноеИмяСправочника» или «ИстинноеИмяРегистра» на внутреннее имя таблицы в базе.
    Как это сделать прямо из формы консоли, показано на Рис.5, Рис.6 и Рис.7 (для этого потребуется подсистема «ViewValues»);
  5. Указанные примеры запросов написаны для MS SQL (на T-SQL). Если сервер базы данных другой, то возможно в текст запроса потребуется внести изменения.

Комментарии о выполнении "прямого" запроса:

  1. На Рис.8 показан список справочника до выполнения "прямого" запроса.
  2. Результат выполнения "прямого"запроса в консоли показан на Рис.9.
  3. На Рис.10 показан список после выполнения " прямого" запроса. На рисунке хорошо видно, что простые элементы стали выглядеть и вести себя как вполне «предопределённые».  
  4. На Рис.11 и Рис.12 показана безуспешная попытка программного удаления такого «предопределённого» элемента из консоли запросов через меню спец-действий.
  5. Следует отметить, что тестирование-исправление базы в конфигураторе оставляет такие «предопределённые» элементы без изменения. 
    Более того, они остаются без изменения даже при реструктуризации таблицы справочника при обновлении конфигурации,
    если не изменялись предопределённые данные объекта метаданных.

Заключительные замечания:

Во избежание недоразумений, хочется заострить внимание на том, слово "предопределенный" выше по тексту везде используется с кавычками.

Дело в том, что одна установка флага 
_IsMetadata еще не делает элемент "по настоящему" предопределенным, при этом у элемента
не появляется идентификатор, по которому к нему можно обратиться из кода. 

Чтобы сделать элемент собственно предопределенным нужно в конфигурации базы прописать соответствие идентификатора с ссылкой на элемент.
Это можно сделать с помощью многофункционального инструмента
"Enterprise Integrator" (© German).
Что при этом делается с базой можно прочитать в этой статье.

Комментарии

Хочется выразит благодарность Magister за полезное обсуждение этой темы.

 

 

 

 

 

 

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159730    876    399    

862

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9965    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5213    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    7957    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2409    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8741    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3400    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. yuraos 1003 06.02.13 21:41 Сейчас в теме
Всем доброго времени суток!
Сразу хочется отметить, что обсуждаемая в статье задача несколько надуманная
и носит чисто демонстрационный характер.
Примеры запросов для очистки данных также не идеальны
(покрайней мере не очищаются связаные записи в таблицах регистрации изменений)
и также служат для демонстрационных целей.
2. Magister 134 06.02.13 22:53 Сейчас в теме
Если так создавать предопределенные элементы - то к ним нельзя обратиться из кода.
Это "ненастоящие" предопредеденные.
Правильный механизм описывал German в статье о Enterprise Integrator, за что ему большое спасибо (приходилось вполне успешно применять).
yuraos; German; +2 Ответить
3. yuraos 1003 07.02.13 05:59 Сейчас в теме
(2) Magister, если ты заметил, там слово "предопределенный" везде стоит в кавычках
:)
Ну а Герман безусловно дока в этих делах.
6. yuraos 1003 07.02.13 19:53 Сейчас в теме
(2) Magister, а можно ссылочку,
где можно прочитать или даже услышать
про "правильный механизм" именно превращения простых элементов в "настоящие" предопределенные.

я полазил по публикациям о Enterprise Integrator,
полазил по его сайту
и что-то не нашел прямых указаний как это можно там сделать.

Возможно что-то есть в платной версии EI (как говорится среди недокументированных возможностей) ...

Просто самому любопытно, как говорится без всяких задних мыслей.
Эта тема на самом деле не совсем надуманная. Я на нее наткнулся на форуме nowa.cc
7. Magister 134 07.02.13 22:47 Сейчас в теме
(6) Пожалуйста: http://main.1c-ei.ru/Articles/ismeta
Это я проделывал ещё тогда, когда Enterprise Integrator был бесплатным.
9. yuraos 1003 08.02.13 07:25 Сейчас в теме
(7) Magister, спасибо за информацию.
Ссылочку пропишу в публикации в близжайшее время,
дабы "не вводить" новичков "во заблуждение".
;)
10. yuraos 1003 10.02.13 18:25 Сейчас в теме
(2)(9)Magister,
разяснение (для кого неясна суть вопроса) и ссылка вставлены в текст публикации.
11. Magister 134 10.02.13 20:05 Сейчас в теме
(10) Ок, теперь когда мои претензии удовлетворены - сменил минус на плюс :)
4. МихаилМ 07.02.13 09:32 Сейчас в теме
При тии предопределенность,сделаная по вашей методе, пропадет. мог бы поставил "-" , зато что людей вводите в заблуждение.
5. yuraos 1003 07.02.13 18:49 Сейчас в теме
(4) МихаилМ,
"тии" - это надо полагать тестирование-и-исправление?

А вы лично проверяли, пропадает такая "предопределенность" при тестировании-исправлении или нет ?
Или так безапелляционно утверждаете, полагаясь на совершенство платформы ???

Так вот, я спецально проверил это как на платформе 8.1, так и на 8.2 (для справочников).
И правда заключается в том, что тестирование такую "предопределенность" не исправляет.

По моим сведениям она исчезает только в одном случае - при реструктуризации справочника в ходе обновления конфигурации и только тогда, когда изменяются предопределенные данные объекта метаданных. О чем и сообщил в статье.

Впрочем ... для новичка, конечно, такая поспешность в суждениях конечно простительна...
:)
8. andrewks 1375 07.02.13 23:06 Сейчас в теме
насчёт низкоуровневой работы с файловой базой - http://infostart.ru/public/166557/
запись значений полей тоже будет реализована в ближайшее время
Оставьте свое сообщение