Мюллер битый час судорожно просматривал журнал регистрации и ни как
не мог понять, каким образом Штирлицу удается удалять секретные
счет-фактуры рейхканцелярии, не оставляя при этом ни каких следов.
...то, что Штирлиц это делает знали все, но никто не знал, как это доказать.
Подсистема «COMExchange» позволяет выполнять запросы через ADO к любым источникам данных при наличии провайдера или драйвера данных, обеспечивающего доступ.
Это в полной мере относится к самой базе 1С клиент-серверной версии.
Для файловой базы, к сожалению, эта возможность остаётся не доступной. Конечно, если у вас имеется информация,
где взять нужный провайдер данных, то вы можете воспользоваться своими «тайными» знаниями и проверить эту статью на файловой базе .
Правда имеется возможность низкоуровневого доступа к файловой базе через ВК 1CDLib.dll (© andrewks), рекомендуемая автором только
для восстановления разрушенных информационных баз.
В целом прямой доступ к базе данных 1С не приветствуется разработчиками платформы. На это есть определённые причины.
«Прямые» запросы на чтение данных для платформы 8.х сложны для составления и не дают выигрыша по производительности.
Использование же «прямых» запросов на запись несёт в себе опасность повреждения данных,
но в некоторых случаях они могут оказаться полезны:
- Для выполнения «хирургических» операций для исправления данных, так как штатная процедура тестирования-исправления становится неадекватной
поставленной задаче для большого размера базы (длится неприемлемо долго); - При реорганизации данных (заполнения новых атрибутов объектов);
- Для решения нестандартных задач на уровне структуры базы данных;
Подобное использование «прямых» запросов на запись к базе данных 1С для версии 7.7 описано в статье «Последний тюнинг известной обработки 1CQA (консоль прямых запросов 1С++) для 1С:Предприятие-77» .
В любом случае использовать «прямые» запросы на запись нужно очень осмотрительно, чтобы не нарушить целостность данных.
Например, при удалении записей из основной таблицы объекта, также должны удаляться записи из связанных с ней таблиц (таблиц табличных частей, таблиц регистрации изменений и т.д.).
Для прямого доступа к базе 1С нужно создать и заполнить соответствующим образом узел плана обмена «Обмен данными COM».
Это можно сделать вручную, но удобнее воспользоваться формой автоматического заполнения (Рис.1) и создать стандартный узел «ЭтаБазаADO».
При этом потребуется указать информацию, необходимую для аутентификации на сервере 1С (чтобы считать настройки SQL базы данных).
И так задача:
Сделать все простые элементы «предопределёнными» в справочнике «Виды оплат чека ККМ» (входит в состав конфигураций УТ-10.3, УПП),
чтобы ни один пользователь, включая «обычных» программистов 1С, не мог их удалить или пометить на удаление.
Решается она просто:
Надо установить значение 0x1 в поле _IsMetadata в основной таблице справочника.
Пример запроса (Рис.2), выполняющего это действие, можно взять из файла ..Sampels\!ПрямойДоступ1СчерезADO.selx архива комплекта поставки подсистемы.
Кроме установки флага _IsMetadata в этом файле есть примеры запросов, выполняющих другие действия:
- Пометка элементов справочника на удаление (Рис.3);
- Непосредственное удаление элементов справочника (Рис.4);
- Запросы, выполняющие очистку периодического регистра сведений;
Для выполнения примеров запросов из файла требуется:
- Установить подсистему «COMExchange» (включая подсистему «ViewValues», входящую в комплект поставки);
- Выполнить автоматическое заполнение плана обмена «Обмен данными COM». При этом обязательно нужно заполнить стандартный узел «ЭтаБазаADO», используемый в запросах;
- Открыть файл с запросами в обработке «Консоль запросов 1С + ADO» в составе подсистемы;
- Заменить слово «ИстинноеИмяСправочника» или «ИстинноеИмяРегистра» на внутреннее имя таблицы в базе.
Как это сделать прямо из формы консоли, показано на Рис.5, Рис.6 и Рис.7 (для этого потребуется подсистема «ViewValues»); - Указанные примеры запросов написаны для MS SQL (на T-SQL). Если сервер базы данных другой, то возможно в текст запроса потребуется внести изменения.
Комментарии о выполнении "прямого" запроса:
- На Рис.8 показан список справочника до выполнения "прямого" запроса.
- Результат выполнения "прямого"запроса в консоли показан на Рис.9.
- На Рис.10 показан список после выполнения " прямого" запроса. На рисунке хорошо видно, что простые элементы стали выглядеть и вести себя как вполне «предопределённые».
- На Рис.11 и Рис.12 показана безуспешная попытка программного удаления такого «предопределённого» элемента из консоли запросов через меню спец-действий.
- Следует отметить, что тестирование-исправление базы в конфигураторе оставляет такие «предопределённые» элементы без изменения.
Более того, они остаются без изменения даже при реструктуризации таблицы справочника при обновлении конфигурации,
если не изменялись предопределённые данные объекта метаданных.
Заключительные замечания:
Во избежание недоразумений, хочется заострить внимание на том, слово "предопределенный" выше по тексту везде используется с кавычками.
Дело в том, что одна установка флага _IsMetadata еще не делает элемент "по настоящему" предопределенным, при этом у элемента
не появляется идентификатор, по которому к нему можно обратиться из кода.
Чтобы сделать элемент собственно предопределенным нужно в конфигурации базы прописать соответствие идентификатора с ссылкой на элемент.
Это можно сделать с помощью многофункционального инструмента "Enterprise Integrator" (© German).
Что при этом делается с базой можно прочитать в этой статье.
Комментарии
Хочется выразит благодарность Magister за полезное обсуждение этой темы.