Условия разработки и проверки проверки:
СУБД — MS SQL Server 2008 R2, Платформа 1С — 8.3.9.2170, Конфигурация — УПП 1.3.107.2 (пригодно для любой конфигурации, имеющей в своём составе стандартные функции и процедуры для работы со строками)
Предисловие
Так сложилось, что среди программистов 1С не принято работать с данными базы на уровне СУБД без особой на то надобности. И действительно – а зачем, если платформа, выполняя роль посредника, умеет представить структуру базы в более удобном для разработки виде и избавляет от многой части рутины. У многих такая особая надобность вообще не наступает, у многих ограничивается операциями по восстановлению поврежденных баз. Однако остается пара случаев, не укладывающихся в общую картину. Во-первых это интеграция с базами данных, не 1С происхождения, выполняемая опять же не со стороны 1С. (т.е. база 1С служит исключительно источником данных). Во-вторых — встречающийся временами подвид разработчика, который здорово ориентируется в СУБД и имеет минимальное представление об 1С. И совсем не обязательно это фанатик, действующий согласно собственных предубеждений. Такой сумрачный гений, например, может просто быть иностранцем из мест более далеких, чем СНГ, со всем вытекающими — непониманием текстов типовых конфигураций для России и СНГ еще на уровне букв. Скорее всего, если таковой появился у Вас, он делегирован головной компанией для выполнения первого пункта, но попутно может кодить и что-то, что способен сделать и нормальный 1С-ник, не покидая привычной платформы, но нет времени / непрофильная область / руководитель любит Excel и косо смотрит на 1С или же на классические базы данных как таковые. В общем отказываться от помощи наотрез было бы глупо.
Как работают те, кто пользует базу 1С на уровне СУДБ? Обычно такой мастер вооружается обработкой, раскрывающей структуру хранения таблиц, опционально – консолью запросов и SQL Server Profiler (или его аналогом, если речь все-таки не о SQL Server) . Нельзя не признать, что такой подход дает свои плоды. Толи свежая, оторванная от 1С, голова, толи особенности используемых инструментов позволяют решить часть проблем, до которых у нас 1С-ников или не доходили руки, или не хватало знаний и умений для их решения. Все бы хорошо, но через некоторое время…
Глава 1. Перечисления
Рано или поздно, копающийся в SQL разработчик натыкается на такую штуку как перечисление. Внутри платформы это то, что не вызывает каких-либо затруднений. Для 1С-ника один из самых удобных в работе объектов, все значения предопределены и замечательно отображаются в интерфейсе. И даже в запросах можно прикручивать их прямо в тексте не пользуя для сего параметры. А что если поступить как СУБД-шник. Находим в структуре хранения базы какое-нибудь перечисление, находим таблицу в SQL, открываем содержимое и… видим что-то вроде этого:
Очевидно, что для отображения в отчетах оно не годится. Дальнейшее изучение вопроса дает понять, что текстовые значения находятся где-то в недрах конфигурации и добывать их оттуда крайне неудобно. Есть вариант жестко влепить в коде разрабатываемого приложения соответствие ссылок или номеров привычным пользователю наименований. Но если перечислений требуется много от этого занятия можно заработать тремор.
Предлагаемое решение – собрать значения из базы данных и поместить в какую-либо таблицу вне 1С, после чего вылавливать представления перечислений из нее путем использования банального JOIN. Идея в общем-то не новая и на просторах сети неоднократно мелькала. Я предлагаю только свой инструмент для реализации этого действа, непосредственно из базы 1С, без посредничества COM-соединений и анализа содержимого dbo.Config сторонними средствами.
Для начала в SQL создаем вспомогательную базу данных (или используем уже имеющуюся), а в ней таблицу, в которой запишем связь между хранимыми значениями перечислений и их текстовым представлением.
В 1С полезно подключить эту таблицу как необъектную таблицу внешнего источника данных:
А теперь готовим содержимое и пишем в эту самую таблицу. Опционально – можно просто сохранить собранные значения в файл, а вопрос его загрузки / обработки предоставить Вашему сумрачному гению.
На что стоит обратить внимание – чтобы получить значение бинарной ссылки на уровне СУБД в таком же виде, как она хранится в базе 1С туда приходится передавать Уникальный идентификатор с переставленными относительно записанного значения блоками символов. Т.к. разработка утилиты велась для SQL-сервера 2008 R2, а проверить на чем-либо еще возможность не представилось, гарантий, что для других СУБД алгоритм перестанова точно такой же, нет.
Глава 2. Новая база
Представьте себе, что у вас есть две базы схожей конфигурации, когда-то развернутых франчами в лохматые годы и еще без вашего участия. Обращение к структуре их хранения говорит, что в общем и целом она идентична, если опустить имеющиеся доработки. Гений СУБД слепил отчет, который склеивает данные этих двух баз и базы данных СКУД (электронных пропусков, если кто-то не в теме). Со временем руководство решает, что юрлиц маловато, вы создаете такую же третью базу сами из соответствующего шаблончика, пытаетесь ее интегрировать и … обнаруживаете, что ее структура хранения коренным образом отличается от первых друх, а совпадение заветных цифр в именах полей и таблиц это исключение, а не правило. Поиск и замена соответствующих значений превращается в очень увлекательное занятие, способное убить немалую часть и без того ограниченного времени.
И снова обращаемся к внешним источникам. Создаем в SQL таблицу и подключаем к нашим базам:
Поочередно в каждой из них формируем перечень полей и таблиц структуры хранения и пишем во внешний источник, не забывая про идентификатор базы (По умолчанию этот реквизит заполняется ее именем) и пишем во внешний источник.
После того как информация о структуре хранения обеих баз помещена во внешний источник их можно более-менее удобно сравнить:
Но если у нас получилось узнать какие таблицы хранения обеих баз соответствуют именам таблиц в конфигураторе, ничто не мешает нам поэкспериментировать с рефакторингом запросов на уровне СУБД. К сожалению, как часы эта опция не работает, тем не менее от рутинных операций это избавляет. Для проверки у меня оказались под рукой два актуальных запроса. В режиме из структуры базы 1 в структуру базы 2 отработало на ура.
Сложнее оказалось с приведением к формату 1С. Результат позволяет понять о каких объектах идет речь, но запускаться и работать в консоли запросов просто так не хочет. Если задача стоит именно в том, чтобы перенести чужие труды в 1С, придется еще поработать руками:
Вместо заключения
Писать эту обработку мне пришлось когда наш знаток и поклонник SQL-Server нашел работу поближе к дому и убыл на родину. Время от времени его наследие нуждается в поддержке, но энтузиазма это ни у кого не вызывает. Поэтому совет – по мере возможностей не работайте с базами 1С на уровне СУБД. Платформа это умеет гораздо лучше. Если ковырнуть SQL без причины лезет русскоговорящий коллега – смело беритесь за его перевоспитание и снабжайте литературой и видеоуроками по 1С. С иностранцами сложнее – скорее всего научить полностью англоязычной конфигурации его можно. Но нам с вами большей частью приходится работать с тем, что написано кириллицей, а это ощутимый барьер даже для тех, кто овладел разговорным языком. И тут решать вам – как построить совместную работу. Возможно где-то удобнее отложить задачу, но потом сделать все по уму. А где-то не грех и принять стороннюю помощь.
И если взвесив все за и против, Вы все-таки решили для своей компании использовать разработку средствами СУБД, или же кто-то успел её попользовать еще до Вас, то эта обработка может быть Вам полезной.
Есть сторонние программы, которые отлично сравниваю ms sql базы. А вы каким инструментом пользуйтесь для сравнения баз?
И действительно, фирма 1С не рекомендует изменять структуру бд на уровне сервера ms sql.
Наверно, вы всё приведете к типовой конфигурации или вы никогда не планируете обновлять ваши базы?
(1) разве речь идет о том, чтобы привести все к типовой конфигурации или не обновляться? Речь о любителях отчетов и прочих разработок на уровне SQL с использованием данных 1С и их нелегкой жизни.
А чтобы на уровне SQL не добавлять в 1С-ную базу лишних таблиц — предлагаю использовать дя этого отдельную вспомогательную базу, к 1С не подключенную. И для сравнения структуры баз использую этот инструмент, уже пару раз выручило. Естественно, что время от времени наборы записей во вспомогательной базе нуждаются в освежении ввиду того, что доработки и изменения никто не отменял.
Позволю себе небольшую поправку 🙂
Интеграционные задачи разработчикам БД доверять нельзя: получится конструкция, не подлежащая поддержке.
(3) Скорее получается конструкция, которую способен поддерживать только автор и его подмастерья. SQL-разработчик, впервые встретивший 1С, часто испытывает шок от циферок, по которым нереально понять ожидаемое содержание таблицы, поэтому смена лиц на поддержке сего затрудняется, но совсем невозможной не назовешь.
Согласен, что интегрироваться со стороны 1С как минимум в СНГ проще. Но часто условия по интеграции головной компанией ставятся примерно так: «нам нужны данные, в нашем приложении Вам делать нечего, поэтому слепите запрос чтобы мы могли их взять, а дальше сами разберемся». Если удается увести задачу в сторону веб-сервисов хорошо, не удается — приходится ловить запросы в SQL-профайлере и передавать тем, кто требует.
(4)
Сама готовность разработчика делать такие «решения» — очень плохой признак.