Конфигурация для автоматизации бэкапов



Конфигурация для организации резервного копирования и хранения бэкапов информационных баз во внутреннем формате 1С *.dt

Столкнулся недавно с необходимостью администрировать сервер 1С. После того, как поднял и развернул базы, задался вопросами резервных копий. И вот здесь Инфостарт предложил просто море вариантов, но все они по тем или иным причинам не подошли… А может быть, я плохо искал и наваял очередной баян:(

В общем, SQL был не мой и в нем постоянно что-то подкручивали, писать и править скрипты тоже было проблематично. В общем, не буду распространяться про то, как тяжело ужиться двум администраторам на одном сервере, скажу лишь, что платить за готовое решение на базе 1С я не стал (и рекламировать его здесь не буду), а вместо этого сел и написал свою конфигурацию.

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

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

К нстоящему времени серверная версия работает уже без малого 3 месяца, и баги достаточно придавлены. Недели 3 уже я туда не совался, а новые выгрузки исправно делаются, и старые нормально удаляются по правилам. Файловый вариант в силу его практической ненадобности я потестил денек, но боюсь, что за недостатком времени какие-то функции все-таки не дотестил и какие-то ситуации не прогнал.

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

В любом случае конфигурация открыта — можете править как и что хотите. Можете заказать исправления и доработки мне. Если кто-то допишет/перепишет сам и под себя, возражать не буду. Единственное требование: при любых публикациях и размещениях продуктов, основанных на данной разработке, делать ссылку на эту статью. 

Вопросы и пожелания прошу в комменты и в личку.

UP: Вариант 8(23) проверен на совместимость с 8.2 и 8.3. Не заменил изначальную версию потому, что пришлось добавить кучу костылей, а функциональность не изменилась совершенно. Код стал сложнее и тяжелее и я не вижу смысла использовать это решение на 8.3 когда есть оптимизировання версия. Также первоначальная версия может работать в немодальном режиме. Для экономии $m и имея 2 платформы для 8.3 можно использовать вторую версию, а если у Вас 8.3 в чистом виде, то лучше первоначальная.

42 Comments

  1. qwinter

    Конфигурация отключает пользователей и устанавливает блокировку сеансов перед началом выгрузки?

    Reply
  2. dusha0020

    (1) qwinter, да, конечно. Если конфа стандартная сначала пробует стандартные средства, если после периода ожидания (он настраивается в правилах выгрузки) база не освободилась то для серверных баз разрываются соединения с сервером. Для файловых — ничего не сделать, пойдёт новая попытка в новом фоновом задании. Так что файловые базы без гарантии.

    Reply
  3. ya.Avoronov

    Есть возможность подтянуть список баз и настройки подключения из файла ibase.v8i?

    Мою лень можно понять если баз великое множество.

    Reply
  4. pumbaE

    Возможно скажу банальность, но dt — это не бэкап. Гарантировать, что из dt восстановиться база вы не можете.

    Reply
  5. dusha0020

    (3) ya.Avoronov, Нет такой возможности. У меня всего 4-5 баз. Вам не завидую:)

    Reply
  6. Светлый ум

    При первом запуске ругается:

    {РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(14,21)}: Тип не определен (ОписаниеОповещения)

    Оповещение = Новый <<?>>ОписаниеОповещения(«ПослеЗакрытияВопроса», ЭтаФорма, ИмяФайлаУдаленнойЗаписи);

    {РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(27,21)}: Тип не определен (ОписаниеОповещения)

    Оповещение = Новый <<?>>ОписаниеОповещения(«ПослеЗакрытияВопросаДляСписка», ЭтаФорма);

    Reply
  7. Светлый ум

    Тоже самое происходит при нажатии на кнопку: «Рабочий стол»

    Reply
  8. dusha0020

    (7) Светлый ум, Платформа 8.2 у Вас. Да моя недоработка. Писал и использовал на 8.3, выставил совместимость с 8.2, но ОписаниеОповещения это тип из 8.3, а проверка модулей этого косяка не нашла.

    Обновляться не собираетесь? Или подождите. Я через день-два исправлю эту проблему.

    Reply
  9. dusha0020

    (7) Светлый ум, $m я Вам сейчас верну. Раз уж так получилось.

    P.S. Не нашел где теперь переводы делаются — скачал Ваш отчет.

    Reply
  10. mmoozzgg

    а все базы на одном сервере? а бэкап этой базы решен?

    Reply
  11. Светлый ум

    Могли не возвращать…) Помимо Sql БекАпов, хотел запустить раз в неделю ДТ — поправляйте, через 2 недели еще раз скачаю.

    Reply
  12. Светлый ум

    Да базы на одном сервере.

    Reply
  13. webresurs

    ошибка : {ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.5.1383)

    Reply
  14. dusha0020

    (13) webresurs, Может быть что-то с обновлением? Попробуйте перерегистрировать компоненту comcntr.dll.

    RedSvr32 «С:Progrаm files… (По адресу папки bin для нужной версии платформы)comcntr.dll»

    Например: Regsvr32 «C:Program Files1cv838.3.5.1383incomcntr.dll»

    Reply
  15. webresurs

    (14)

    сделал regsvr32 ,

    удалил папку «8.3.5.1119»

    все равно ошибка «{ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.5.1383)»

    Reply
  16. dusha0020

    (15) webresurs, Это какая-то админская беда. Если есть сисадмин лучше обсудить с ним. Если нет попробую предложить еще варианты:

    1. Перезагрузка.

    2. Есть подозрение, что лежит не свежая dll-ка. На картинке у меня ситуация — версия dll и платформы совпадают. Проверьте у себя. Если версия dll библиотеки 8.3.5.1119 то нужно найти и скопировать с заменой dll версии 8.3.5.1383 (у меня к сожалению ее нет). Это если не хочется переустанавливать платформу, так как бок вылез скорее всего из-за установки, когда при обновлении версии ядра не обновилась библиотека COM соединения.

    Reply
  17. PAPIruss

    Подскажите на 8.2 работать будет?

    Спасибо.

    Reply
  18. dusha0020

    (17) PAPIruss, (6) Светлый ум, Добавил совместимую с 8.2 версию. Почему не заменил — в статье. Можете пользоваться:)

    Reply
  19. pandemic

    Подскажите если стоит несколько серверов 1с и на разных портах работать будет ?!

    Reply
  20. dusha0020

    (19) pandemic, Будет. В справочнике серверов необходимо задавать в этом случае полный идентификатор сервера с портом через «:»

    Например: «serv1Cfirst:1540», «serv1Csecond:1620» и т.д.

    Подробнее смотрите в СП по теме «Менеджер COM-соединений (COM connector), ConnectAgent (ConnectAgent)»

    Reply
  21. TMV

    (2) если архивируемая база на sql и при этом нет галки «стандартная», то никаких блокировок не устанавливается — бэкап не делается.

    Reply
  22. dusha0020

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

    Reply
  23. dusha0020

    (21) TMV, Знаете, как и предполагалось, выгрузка работает и без галочки «стандартная конфигурация». Только что проверил. Советую проверить введены ли у Вас (и правильно ли) имя пользователя и пароль юзера имеющего права на установку блокировки (как правило администратора). Это в общем-то первая и очевидная причина почему выгрузка не срабатывает.

    Reply
  24. TMV

    (23) неверно. У меня регл.задания работают, а у вас выгрузка начинается только при следующей итерации цикла, а не сразу после отключения сеансов. дело в том, что блокировку вы не устанавливаете.

    Reply
  25. dusha0020

    (24) TMV, Честно говоря, не понял Вас. Выгрузка начинается не после отключения сеансов (команды на отключение), а после того как все сеансы будут реально отключены. Так как способы отключения разные: где-то пользователям предлагается выйти стандартными оповещениями, где-то идет команда серверу на завершение сеансов и т.д. В данном случае, когда высвобождение баз происходит не непосредственно в результате команды кода фоновой процедуры, а во вне этой процедуры (пользователями или сервером 1С) я счел вполне логичным и правильным рассылать такие требования на завершение сеансов во вне, а потом дожидаться их исполнения, проверяя высвобождение баз в некотором цикле. Имхо, такой подход вполне оправдан. С другой стороны если даже нам не удается дождаться завершения сеансов в текущей процедуре, то можно установить период болокировки базы в правилах выгрузки. То есть если в текущем задании освободить базы не удалось, то все равно устанавливается блокировка, период которой можно настроить так, чтобы она длилась между вызовами фоновой процедуры выгрузки и к новой попытке выгрузиться база была гарантированно свободной благодаря все еще длящейся блокировке.

    И вот здесь я Вас и не понял. Вы предлагаете изменить логику исполнения задачи… Но как будет правильнее? Я изложил как мог свое видение алгоритма. Давайте обсудим Ваш если хотите. Но дайте немного подробностей:)

    Reply
  26. TMV

    (25) Мне кажется вы не поняли о чем речь. Вот кусок кода, о котором говорю:

     Пока ОкончаниеВыполненияЗадания > ТекущаяДата() Цикл //Внешний цикл. Попытки и ожидания блокировок
    Для Каждого Задание Из мЗаданий Цикл
    Если НЕ Задание.ОжиданиеБлокировкиВключено И УправлениеБлокировками.НаличиеСеансовПредприятия(Задание.ИнформационнаяБаза) Тогда
    Если Задание.ИнформационнаяБаза.СтандартнаяКонфигурация Тогда
    Рез = Ложь;
    УправлениеБлокировками.ВыполнитьОтключениеПользователейСтандартнойКонфигурации(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения, Рез);
    Если НЕ Рез Тогда
    УправлениеБлокировками.ПринудительнаяБлокировкаФайловойБазы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения);
    КонецЕсли;
    УстановитьПериодОжиданияБлокировки(Задание);
    ИначеЕсли Задание.ИнформационнаяБаза.Файловая Тогда
    УправлениеБлокировками.ПринудительнаяБлокировкаФайловойБазы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения);
    УстановитьПериодОжиданияБлокировки(Задание,Истина);
    Иначе
    //итерация 1
    УстановитьПериодОжиданияБлокировки(Задание);
    КонецЕсли;
    Задание.ОжиданиеБлокировкиВключено = Истина;
    Иначе
    Если УправлениеБлокировками.НаличиеСеансовПредприятия(Задание.ИнформационнаяБаза) И НЕ Задание.ВыгрузкаНачата = 1 Тогда
    Если НЕ ОжидатьБлокировкуБазыПоЗаданию(Задание) И НЕ Задание.ИнформационнаяБаза.Файловая тогда
    //итерация 2
    Сервер1С.ЗавершитьСеансы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения.БлокироватьСеансы);
    Пауза(8000);
    КонецЕсли;
    ИначеЕсли Задание.ВыгрузкаНачата = 0 Тогда
    //итерация 3
    ИмяФайлаВыгрузки = «»;
    WShell = Новый COMОбъект(«WScript.Shell»);
    WShell.Run(ПолучитьСтрокуКомандыВыгрузки(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения, ИмяФайлаВыгрузки));
    ЗаписатьНачалоЗаданияВЛог(Задание, ?(ИмяФайлаВыгрузки = «», «Пусто для базы » + Задание.ИнформационнаяБаза, ИмяФайлаВыгрузки));
    Задание.ВыгрузкаНачата = 1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    ЗапущеноВыгрузок = 0;
    Для Каждого Элем Из мЗаданий Цикл
    ЗапущеноВыгрузок = ЗапущеноВыгрузок + Элем.ВыгрузкаНачата;
    КонецЦикла;
    
    Если мЗаданий.Количество() = ЗапущеноВыгрузок Тогда Прервать КонецЕсли;
    
    ОчиститьЛогИфайловыеБлокировки();
    Пауза(5000);
    КонецЦикла;
    

    Показать

    База для архивирования на SQL и без галочки стандартная. Комментарием «итерация №» отмечено на какой итерации внешнего цикла сюда попадет выполнение кода. Так вот у меня между 2й итерацией и 3й успевают стартануть регл.задания, т.к. блокировка регл.заданий не установлена ни в итерации 1, ни в итерации 2.

    Reply
  27. dusha0020

    (26) TMV, Теперь понял Вашу проблему, спасибо. Ну раз уж вы разобрали код на винтики может попробуете подкрутить размер паузы между итерациями? Или направить перенаправить код в нужную итерацию безусловным переходом. Мне чего-то лезть и ковыряться в работающем продукте не хочется, но в любом случае — спасибо за Ваши замечания. Постараюсь их обязательно учесть, когда появится возможность вернуться к доработкам данного продукта.

    Reply
  28. TMV

    (27) еще отмечу, что в свойствах ИБ в консоли сервера есть 2 галочки: «Блокировка сеансов» и «Блокировка регл.заданий». Так вот вторую галку вы вообще нигде не ставите. Видимо, у вас базы хоть и серверные, но в них регл.задания отключены, раз вы не сталкивались с такой проблемой.

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

    Reply
  29. xten

    Большое спасибо автору за весьма комплексное решение и можно маленький вопрос: будет ли осуществляться «бэкапирование» базы, когда в ней работают юзеры, или нужно всех выгонять ?

    Reply
  30. xten

    имел в виду файловый вариант базы )

    Reply
  31. dusha0020

    (30) xten, Для файловых вариантов в стандартных конфигурациях будет попытка выгнать пользователей стандартным механизмом, сначала вежливо попросив, а потом через обработчик ожидания. Но стандарт стандарту рознь, поэтому в каких конкретно конфигурациях будет работать, а в каких нет не скажу, нужно пробовать на месте. Если же база нестандартная и файловая — то предварительный разгон пользователей обязателен, что в принципе сводит на нет все преимущества автоматизации, потому что коль уж разгонять руками, то и выгрузку после этого можно сделать руками.

    Reply
  32. kainder

    (6) Светлый ум, у меня была подобная ошибка «Тип не определен (ОписаниеОповещения)» — долго не мог понять почему не работает, выяснил что «ОписаниеОповещения» — доступен только на клиенте, а я пытался на сервере.

    Reply
  33. Dubrovsky_sv

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

    Reply
  34. dusha0020

    (33) refarm, Добрый день. Хотелось бы знать где и когда пишет, но рискну предположить, что пользователь от имени которого Вы пытаетесь подключиться к базе и сделать бэкап не обладает правами администратора.

    Reply
  35. slimuz

    Добрый день. При ручном старте задачи пишет:

    Возврат Запрос.Выполнить().Выгрузить()[0].ДатаЧислом;

    по причине:

    Ошибка выполнения запроса

    по причине:

    У пользователя недостаточно прав на исполнение операции над базой данных.

    У пользователя полные права. Клиент-серверная база, стандартная конфигурация.

    Reply
  36. pallid

    {ОбщийМодуль.ОбработкаЗаданий.Модуль(34)}: Ошибка при вызове метода контекста (Run)

    по причине:

    Произошла исключительная ситуация (0x80070002)

    вот такую ошибку выдает, в чем может быть причина?

    Reply
  37. tehas

    (36) white_sochi, та же беда

    Reply
  38. dusha0020

    (36) white_sochi, (37) tehas, Похоже юзеру сервера запрещен запуск скриптов на том же сервере. Копайте права.

    Reply
  39. AfipNPZ

    Добрый день! Почему-то не получается отключить сеансы перед началом копирования. Подскажите, может где забыли настроить?

    Reply
  40. AfipNPZ

    Здравствуйте! Пытались настроить копирование sql-баз (УПП). При попытке запуска из файловой базы копирование согласно логу начинается, но не заканчивается. А если запускать из серверной версии, то ничего не происходит, только выскакивают сообщения о подключениях. Версия платформы 8.3.7.1860

    Reply
  41. dusha0020

    (40) AfipNPZ, Добрый день. Не знаю что Вам и сказать… Если исключить банальные ошибки типа неправильно введенных данных для подключения, то на ум ничего не приходит. Дело в том, что я уже больше года не заглядывал в код этой конфигурации и почти все забыл. И сейчас, я вполне счастливый человек тем, что базы мои бэкапятся sql сервером, и я вообще этим не занимаюсь. Данная конфигурация осталась на прежней работе и разворачивать ее здесь у меня нет ни желания ни необходимости . А тем более не хочется телепатически пытаться сообразить где же могут у Вас возникнуть заморочки.

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

    Reply
  42. strange2007

    (4) pumbaE, формат DT является стандартом 1С и он позволяет абстрагироваться от СУБД. Т.е. этот вариант для организаций, в которых имеются сложный набор учётных систем. Тем более если отбросить фанатизм, то копия с MS SQLя примерно в 4 раза дольше восстанавливается на постгре и то при условии, что звёзды сложились нормально и выгрузка была без битых транзакций.

    Reply

Leave a Comment

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