Условия разработки и проверки проверки:
СУБД - 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С. С иностранцами сложнее – скорее всего научить полностью англоязычной конфигурации его можно. Но нам с вами большей частью приходится работать с тем, что написано кириллицей, а это ощутимый барьер даже для тех, кто овладел разговорным языком. И тут решать вам – как построить совместную работу. Возможно где-то удобнее отложить задачу, но потом сделать все по уму. А где-то не грех и принять стороннюю помощь.
И если взвесив все за и против, Вы все-таки решили для своей компании использовать разработку средствами СУБД, или же кто-то успел её попользовать еще до Вас, то эта обработка может быть Вам полезной.