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

В  1С:Предприятии 8.2  есть ограничение на выгрузку базы в формате DT. Выгрузить базу можно, только  если в ней нет активных пользователей. В этой статье поделюсь способом, как обойти это ограничение и сделать невозможное.

Этот способ работает только в клиент-серверном варианте. Тип СУБД при этом не важен. Используется только настройки сервера 1С.

В приведенном примере используется  платформа  1С:Предприятие 8.2.17.169 и СУБД PostgreSQL  9.2-1.1C.

На сервере 1С есть база с именем «fin». В PostgreSQL  она называется точно так же.

Создаем новую информационную базу на сервере 1С и называем её «fin2». В настройках прописываем имя базы на сервере баз данных:  «fin».

В итоге получаем 2 разные базы 1С, но физически это одна база на сервере баз данных.

В базе «fin» работают пользователи.

В базе «fin2» активных пользователей нет и можно выполнять любые действия в монопольном режиме. Например, выгрузить базу в формате DT или запустить второй Конфигуратор.

Этим приемом нужно пользоваться очень осторожно, потому что 1С может непредсказуемо повести себя с базой данных на сервере СУБД.  Поэтому экспериментировать с этой возможностью я не стал, только несколько раз успешно использовал её для снятия архива больших баз, где ведется круглосуточная работа.

Если есть желание поэкспериментировать и поделится опытом, то пишите в комментариях к этой статье. Будет интересно узнать, что об этом думают пользователи «Инфостарта» и как ещё можно использовать эту возможность.   

54 Comments

  1. vcv

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

    Если у вас SQL-сервер, что мешает сделать гарантированно целостный бэкап базы средствами Sql?

    Reply
  2. kapustinag

    Тем более что, если база клиент-серверная, значит, размер ее не очень маленький, а в этом случае SQL-бэкап сделается однозначно быстрее, чем выгрузка в DT. И последующая загрузка из SQL-бэкапа будет быстрее, чем из DT.

    Reply
  3. Tahallus

    Следующая статья «Как обновить конфигурацию, не выгоняя пользователей» ))

    Reply
  4. yurega

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

    Цель статьи не в том, что бы рассказать как делать бэкапы базы 1С. Для этого есть стандартные способы. Цель в том, что бы поделиться приемом работы с базами на сервере 1С. Может быть, для кого-то это будет полезная информация.

    В моем случае была необходимость развертывания тестовой файловой базы и нужен был DT-шник. Для этой задачи такой способ подходит.

    Если обновлять конфигурацию таким способом, то, скорее всего, база данных не выживет после этого. Лучше даже не пробовать 🙂

    Reply
  5. yuraos

    забавно,

    но описанный фокус с выгрузкой клона базы канает.



    (4)

    а вот обновить конфигурацию просто так на халяву не удастся.

    (см. вложение)

    Reply
  6. yuraos

    (5)

    pardon…проканало!!!



    не в том конфигураторе нажал «обновить конфигурацию базы»



    пожалуй плусану

    🙂 — за хакерский склад ума…

    Reply
  7. DmitryKishkin

    На предыдущей работе делал так, тоже для получения файловой. Ставил Postgres к себе на локальную машину. Кста, применял для обновления (было очень много мелких типовых баз, при «нормальном» обновлении память на серваке быстро фрагментировалась — юзера жаловались на замедление работы). Стал обновлять «через себя» — жалобы прошли. Только надо аккуратно выгнать юзеров из «основной» базы перед обновлением конфигурации.

    Была еще одна мысль — не успел опробовать (работу сменил 😉 ). Что если «сервер» на своей машинке запускать с ключом -debug . Не позволит ли это нормально отлаживать серверные модули в рабочих базах без получения копий ? Может, кто пробовал ?

    Reply
  8. DmitryKishkin

    (7) Чуть-чуть описАлся 😉 Ставил на локальную машину не Postgres, конечно, а сервер 1С, и прописывал соединение с Postgres-базой на серваке 😉

    Reply
  9. mr.Samuelson

    Сомнительный способ какой-то )

    Reply
  10. Famza

    Пусть способ и стремный, но знать его просто обязательно — хотя бы для того чтобы избежать непредвиденных ситуёвин потом. +1

    Reply
  11. Evgen.Ponomarenko

    (10) Famza,

    Способ, не только хакерский, но и очень стремный! (Хотя за идею +).

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

    Во вторых, можно легко нарваться на непредсказуемое поведения SQL серверов разных производителей, под разные OS. Эффект, на фоне огромных объемов данных, может превзойти любые Ваши ожидания.

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

    Надежнее пользоваться стандартными механизмами SQL для архивации на лету. Либо разворачивать ночную копию базу в тестовый экземпляр и в ручную переносить оперативные данные.

    Reply
  12. Famza

    (11) Evgen.Ponomarenko, я не тот же смысл в (10) высказал? Тогда спасибо за расшифровку

    Reply
  13. Evgen.Ponomarenko

    (12) Famza,

    Его нужно знать, но вот его применение как раз и может привести к непредвиденным ситуевинам.

    Я расшифровал в виду, того, что в вашем сообщении, первая и вторая части имеют противоречивую следственную связь. Может Вы опечатались, не верно выразились, думали одно — написали другое…

    В результате получилось то, что получилось… не хотел обидеть, если чего ам сорри.

    Reply
  14. DERL

    Способ конечно очень интересный, но «Славик, чот я очкуюсь…» :):):)

    Reply
  15. Ibrogim
    Поэтому экспериментировать с этой возможностью я не стал

    Это ли не эксперимент:

    только несколько раз успешно использовал её

    для снятия архива больших баз, где ведется круглосуточная работа.

    Плюс за отчаянность автору.

    Reply
  16. q_i

    imho1: описанная возможность — ошибка (ну в крайнем случае не очень хорошая фича) платформы, т.к. при создании новой ИБ должна быть проверка не зарегистрирована ли уже база с такой же БД.

    imho2: более надёжный способ — создать «нормальную» базу fin2, из fin средствами sql выгрузить бэкап, загрузить его в fin2, а потом из fin2 выгрузить так сильно желаемый dt-шник.

    Reply
  17. asved.ru

    В случае клиент-серверной БД не вижу смысла использовать нестандартный функционал при наличии стандартного.

    BACKUP DATABASE [ut-glass] TO  [userbases-E] WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N’ut-glass-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    GO
    USE [master]
    RESTORE DATABASE [ut-glass1] FROM  [userbases-E] WITH  FILE = 1,  MOVE N’ut-glass’ TO N’D:sqldbSQL1Cut-glass1.mdf’,  MOVE N’ut-glass_log’ TO N’D:sqldbSQL1Cut-glass1_log.ldf’,  NOUNLOAD,  REPLACE,  STATS = 10
    GO
    Reply
  18. gr0ck

    Админы как-то создали базы для разработки, при этом в 2-х ИБ указали одну и ту же базу. Заметили случайно, когда мой код «волшебным образом» появлялся у коллеги)) Немного поигрались и грохнули вторую базу, ибо рискованно это, пользоваться такой «особенностью» платформы

    Reply
  19. anig99

    Опасно и глупо при наличии более удачных альтернативных способов.

    Reply
  20. tango

    Однозначно плюс за раскрытие темы «трехзвенки» в терминах понятиях 1с

    Reply
  21. AlX0id

    Да уж. А просто бэкапнуть средствами SQL никак? )

    Reply
  22. xxxxxxpupkinxxxxxx

    Как всегда, все гениальное просто. =) Плюс без сомнений.

    Reply
  23. cleaner_it

    Я как-то раз на заре рабочей карьеры (в запарке) таким образом заменил рабочую базу на копию… При работающих пользователях. Благо, бэкап SQL был полный, и бэкап логов. Урок на всю жизнь.

    Reply
  24. DmitryKishkin

    Ну, вот небольшая база. И хочется получить с нее файловую, НЕ для бэкапа, а чтобы поиграться — поотлаживать и т.д. И плевать, что какие-то данные в ней будут не согласованы. На файловой это может быть гораздо удобнее, чем на серверной…

    Reply
  25. PolAlex2

    на партнерском форуме уже вовсю обсуждают :))

    «Мой сотрудник нашел способ работать с базрй в серверном варианте нежелательным способом. Считаю, что это дыра в платформе. Статья

    «Как выгрузить базу средствами 1С, не выгоняя пользователей. Делаем невозможное.» на инфостарте от 16.09.2013.»

    Reply
  26. PolAlex2

    а вот это — http://infostart.ru/public/22419/ ?

    Ну не считая что нужна обязательно Enterprise Edition

    Reply
  27. skyp

    Очень ценная подсказка! Хотя, конечно нуждается в проверке, но однозначно спасет кому-то много нервов!

    Reply
  28. yuraos

    (19) anig99,

    вообще-то это явная ДЫРА в платформе.

    накладываются какие-то блокировки на что-то важное



    а хранятся и проверяются эти блокировки не в БАЗЕ ДАННЫХ,

    а где-то там … в ИНФОРМАЦИОННОЙ БАЗЕ.

    :)))

    Reply
  29. DrAku1a

    Пользоваться можно. Но крайне осторожно и только для слива рабочей базы в файловый бекап.

    Вариант «Сделать копию средствами SQL и выгрузить её в файловый бекап» — несколько дольше по времене, но всё-же безопаснее.

    Решать вам. Лично я выбираю второй вариант…

    Reply
  30. Just

    Мне тоже кажется, что «Сделать копию средствами SQL и выгрузить её в файловый бекап», намного проще и безопаснее, учитывая кучу порой неясных вылетом, типо «Ошибка формата потока». Из-за сомнительной экономии времени, можно потом неделю пытаться восстановить рабочую базу. За информацию, конечно плюс, я этого не знал.

    Reply
  31. svad1

    Интересно))). Думаю это дыра в 1с. Я всегда делаю средствами sql, безопаснее.. Автору + за находчивость)

    Reply
  32. LineykaSBK

    (30) Just, А если один сервак скуля, подскажите как вы востанавливаете скулевскую копию на этом серваке средствами скуля, мне выдает что имя базы не совпадает с копией и восстановление не возможно, и понятное дело что две базы с одним именем не возможно держать на серваке, в запросах может нужно где указать чтобы не учитывало имя базы в копии и имя в восстанавливаемой базе ?

    Reply
  33. МимохожийОднако

    А если создать на SQL вторую базу и в неё средствами SQL скопировать рабочую базу? Потом прописать к ней путь и .. в путь? Фишка в том, чтобы отказаться от использования SQL? Вот такие вопросы возникли.

    По большому счету для кодирования достаточно выгрузить конфигурацию и заполнить её своими данными.

    Reply
  34. Just

    (32) LineykaSBK, вот как бы человек уже написал или это была шутка

    А если создать на SQL вторую базу и в неё средствами SQL скопировать рабочую базу? Потом прописать к ней путь и .. в путь?

    Есть на скуле 2 база, типо «Тест», делаете копию рабочей базы в скуле, потом в тестовой указываете из какой базы или файла восстановить архив, в параметрах указываете путь восстановления фалов тестовой кнопка ОК. Вроде бы всё, проблем не должно быть, можно создать «план обслуживания», который будет делать копию рабочей и разворачивать в тестовую. одним нажатием. На больших базах это гораздо быстрее выгрузки/загрузки в ДТ. Как-то так … или я чего не понял в вопросе…

    Reply
  35. alsoftik

    Автору плюс конечно, но блин я бы за копию не был бы уверен, что она будет нормальной?, хотя надо попробовать.

    Reply
  36. Den_D

    (32)LineykaSBK,

    (34)Just,

    возможно еще надо поставить галочку overwrite the existing database на второй закладке options она на самом верху, а также в табличном поле указать файлы тестовой базы <имя тестовой базы>.mdf <имя тестовой базы>.ldf

    Reply
  37. kereo

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

    Reply
  38. Al-X

    Автору + !! Копии буду делать по старому ))))))))))) !!!

    Reply
  39. f0min

    Каждый метод хорош для своих задач)

    Автору благодарность за идею

    Reply
  40. i.kovtun

    Странно, вроде известная особенность (еще с 8.0), с известной рекомендацией так не делать:).

    Reply
  41. tango

    (40) i.kovtun, ссылочку не кинете на известную инфу?

    Reply
  42. i.kovtun

    tango, ну на вскидку нашел презентацию Гилева по серверу 1С:

    https://docs.google.com/presentation/d/15qz55PbOaDeQ2BYexEMqY2lbx2XN0NSNuG3w6dbW­C84/edit#slide=id.i191

    14 слайд

    P.S. Правда тут про два кластера, которые могут друг о друге не знать. Пожалуй, проконтролировать наличие двух ИБ в кластере, которые ссылаются на одну БД для вендора было бы не сложно и полезно:).

    Reply
  43. DoctorRoza

    Вот уж что ни говори, а опасно все это! Если СУБД еще куда ни шло, а 1С может упасть на ровном месте. ИМХО, лучше тупо копировать файлы базы, пусть хоть и весят они под 200 гигов, без всяких архивов и бэкапов! А если работа ведется круглосуточно, то организовывать РИБ и настраивать обмен по ситуации.

    Reply
  44. teller

    чего распереживались?

    за целостность транзакций отвечает субд, за полученную копию отвечает сам админ,

    если ему для тестовой конфигурации — то пусть пользуется с учетом возможной несогласованности на уровне логики 1с.

    Reply
  45. zaoallat

    Я бы не стал так рисковать так как если база больше 100 гигов и работают одновременно больше 100 пользователей когда база навернется медным тазам на востанновление работоспособности уйдет некоторое время. Я создал копию на уровне SQL и прописал в 1с сервере копия и работаю без проблем.

    Reply
  46. free-lancer-2018

    Найден очередной баг 1с 🙂

    Reply
  47. tango

    (42) i.kovtun,

    Правда тут про два кластер

    да, и это, не умаля новизны сабжа, придает 1с-трехзвенке еще больше очарования 🙂

    **

    возвращаясь на десяток лет назад: 7.8 предпочтительнее 8.0 с точки зрения пользователей. но не разработчика вендора

    Reply
  48. vicmos

    а backup средствами SQL? я бы не пользовался — стремно как-то

    Reply
  49. webester

    Не дотягивается рука до курка если ствол ружья, вставлен в рот? Нажимайте ногой! Прекрасный рецепт, нечего сказать 🙂

    Reply
  50. Ivon

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

    Reply
  51. AndrewUs

    Существуют некоторые программы, которые сами архивируют базы, главное настроить правильно, и ничего придумывать не придётся, хотя yurega молодец. И потом никто не заставляет этим методом пользоваться. Каждый делает как умеет.

    Reply
  52. u_n_k_n_o_w_n

    Я думаю это больше похоже на глюк ПО — который естественно разработчики должны устранять.

    Reply
  53. dmitry1c1991

    средствами SQL backup сделать сложно ?? Очередная статья для тех кто хочет похерить себе базу .

    Reply
  54. CyberMuesli

    «Как выгрузить базу средствами 1С, не выгоняя пользователей

    Или мракобесие и его роль в генезисе, диагностике и клинической картине острого геморроя»

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *