gifts2017

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

Опубликовал Andrey Smirnov (dusha0020) в раздел Администрирование - Архивирование (backup)

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

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

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

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

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

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
BackUpConf
.cf 268,98Kb
22.01.15
93
.cf 268,98Kb 93 Скачать
BackUpConf_8(23)Ed
.cf 269,90Kb
05.02.15
53
.cf 1.02 269,90Kb 53 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Павел Алексеенко (qwinter) 24.01.15 09:30
Конфигурация отключает пользователей и устанавливает блокировку сеансов перед началом выгрузки?
2. Andrey Smirnov (dusha0020) 24.01.15 11:35
(1) qwinter, да, конечно. Если конфа стандартная сначала пробует стандартные средства, если после периода ожидания (он настраивается в правилах выгрузки) база не освободилась то для серверных баз разрываются соединения с сервером. Для файловых - ничего не сделать, пойдёт новая попытка в новом фоновом задании. Так что файловые базы без гарантии.
3. Александр Воронов (ya.Avoronov) 26.01.15 14:56
Есть возможность подтянуть список баз и настройки подключения из файла ibase.v8i?
Мою лень можно понять если баз великое множество.
4. Евгений Сосна (pumbaE) 26.01.15 15:24
Возможно скажу банальность, но dt - это не бэкап. Гарантировать, что из dt восстановиться база вы не можете.
5. Andrey Smirnov (dusha0020) 26.01.15 15:32
(3) ya.Avoronov, Нет такой возможности. У меня всего 4-5 баз. Вам не завидую:)
6. Константин Куликов (Светлый ум) 27.01.15 07:15
При первом запуске ругается:

{РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(14,21)}: Тип не определен (ОписаниеОповещения)
Оповещение = Новый <<?>>ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, ИмяФайлаУдаленнойЗаписи);
{РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(27,21)}: Тип не определен (ОписаниеОповещения)
Оповещение = Новый <<?>>ОписаниеОповещения("ПослеЗакрытияВопросаДляСписка", ЭтаФорма);
7. Константин Куликов (Светлый ум) 27.01.15 07:17
Тоже самое происходит при нажатии на кнопку: "Рабочий стол"
8. Andrey Smirnov (dusha0020) 27.01.15 10:39
(7) Светлый ум, Платформа 8.2 у Вас. Да моя недоработка. Писал и использовал на 8.3, выставил совместимость с 8.2, но ОписаниеОповещения это тип из 8.3, а проверка модулей этого косяка не нашла.
Обновляться не собираетесь? Или подождите. Я через день-два исправлю эту проблему.
9. Andrey Smirnov (dusha0020) 27.01.15 10:45
(7) Светлый ум, $m я Вам сейчас верну. Раз уж так получилось.
P.S. Не нашел где теперь переводы делаются - скачал Ваш отчет.
10. Andrey Moskvin (mmoozzgg) 27.01.15 13:56
а все базы на одном сервере? а бэкап этой базы решен?
11. Константин Куликов (Светлый ум) 27.01.15 14:23
Могли не возвращать...) Помимо Sql БекАпов, хотел запустить раз в неделю ДТ - поправляйте, через 2 недели еще раз скачаю.
12. Константин Куликов (Светлый ум) 27.01.15 14:24
Да базы на одном сервере.
13. Leo Po (webresurs) 27.01.15 20:07
ошибка : {ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты 'comcntr' (8.3.5.1119) отличается от версии корневого модуля 'core83' (8.3.5.1383)
14. Andrey Smirnov (dusha0020) 28.01.15 09:30
(13) webresurs, Может быть что-то с обновлением? Попробуйте перерегистрировать компоненту comcntr.dll.
RedSvr32 "С:\Progrаm files... (По адресу папки bin для нужной версии платформы)\comcntr.dll"
Например: Regsvr32 "C:\Program Files\1cv83\8.3.5.1383\bin\comcntr.dll"
15. Leo Po (webresurs) 28.01.15 14:13
(14) dusha0020,
сделал regsvr32 ,
удалил папку "8.3.5.1119"
все равно ошибка "{ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты 'comcntr' (8.3.5.1119) отличается от версии корневого модуля 'core83' (8.3.5.1383)"
16. Andrey Smirnov (dusha0020) 28.01.15 14:48
(15) webresurs, Это какая-то админская беда. Если есть сисадмин лучше обсудить с ним. Если нет попробую предложить еще варианты:
1. Перезагрузка.
2. Есть подозрение, что лежит не свежая dll-ка. На картинке у меня ситуация - версия dll и платформы совпадают. Проверьте у себя. Если версия dll библиотеки 8.3.5.1119 то нужно найти и скопировать с заменой dll версии 8.3.5.1383 (у меня к сожалению ее нет). Это если не хочется переустанавливать платформу, так как бок вылез скорее всего из-за установки, когда при обновлении версии ядра не обновилась библиотека COM соединения.
Прикрепленные файлы:
17. Артем Герасимов (PAPIruss) 04.02.15 14:07
Подскажите на 8.2 работать будет?
Спасибо.
18. Andrey Smirnov (dusha0020) 05.02.15 12:47
(17) PAPIruss, (6) Светлый ум, Добавил совместимую с 8.2 версию. Почему не заменил - в статье. Можете пользоваться:)
19. Николай Суханов (pandemic) 17.03.15 15:28
Подскажите если стоит несколько серверов 1с и на разных портах работать будет ?!
20. Andrey Smirnov (dusha0020) 17.03.15 17:35
(19) pandemic, Будет. В справочнике серверов необходимо задавать в этом случае полный идентификатор сервера с портом через ":"
Например: "serv1Cfirst:1540", "serv1Csecond:1620" и т.д.
Подробнее смотрите в СП по теме "Менеджер COM-соединений (COM connector), ConnectAgent (ConnectAgent)"
21. TMV 31.03.15 07:12
(2) dusha0020, если архивируемая база на sql и при этом нет галки "стандартная", то никаких блокировок не устанавливается - бэкап не делается.
22. Andrey Smirnov (dusha0020) 31.03.15 11:06
(21) TMV, Спасибо за замечание. Сейчас нет времени разбираться с причинами. Флаг "Стандартная" означает лишь то, что перед жестким отключением от 1С сервера буде предпринята попытка разослать оповещение стандартным механизмом. То есть можете его ставить смело и для "нестандартных" конфигураций баз. А когда исправлю данную проблему отпишусь дополнительно и обновлю публикацию.
23. Andrey Smirnov (dusha0020) 31.03.15 12:14
(21) TMV, Знаете, как и предполагалось, выгрузка работает и без галочки "стандартная конфигурация". Только что проверил. Советую проверить введены ли у Вас (и правильно ли) имя пользователя и пароль юзера имеющего права на установку блокировки (как правило администратора). Это в общем-то первая и очевидная причина почему выгрузка не срабатывает.
24. TMV 01.04.15 15:15
(23) dusha0020, неверно. У меня регл.задания работают, а у вас выгрузка начинается только при следующей итерации цикла, а не сразу после отключения сеансов. дело в том, что блокировку вы не устанавливаете.
25. Andrey Smirnov (dusha0020) 02.04.15 09:28
(24) TMV, Честно говоря, не понял Вас. Выгрузка начинается не после отключения сеансов (команды на отключение), а после того как все сеансы будут реально отключены. Так как способы отключения разные: где-то пользователям предлагается выйти стандартными оповещениями, где-то идет команда серверу на завершение сеансов и т.д. В данном случае, когда высвобождение баз происходит не непосредственно в результате команды кода фоновой процедуры, а во вне этой процедуры (пользователями или сервером 1С) я счел вполне логичным и правильным рассылать такие требования на завершение сеансов во вне, а потом дожидаться их исполнения, проверяя высвобождение баз в некотором цикле. Имхо, такой подход вполне оправдан. С другой стороны если даже нам не удается дождаться завершения сеансов в текущей процедуре, то можно установить период болокировки базы в правилах выгрузки. То есть если в текущем задании освободить базы не удалось, то все равно устанавливается блокировка, период которой можно настроить так, чтобы она длилась между вызовами фоновой процедуры выгрузки и к новой попытке выгрузиться база была гарантированно свободной благодаря все еще длящейся блокировке.
И вот здесь я Вас и не понял. Вы предлагаете изменить логику исполнения задачи... Но как будет правильнее? Я изложил как мог свое видение алгоритма. Давайте обсудим Ваш если хотите. Но дайте немного подробностей:)
26. TMV 02.04.15 17:08
(25) dusha0020, Мне кажется вы не поняли о чем речь. Вот кусок кода, о котором говорю:
	Пока ОкончаниеВыполненияЗадания > ТекущаяДата() Цикл //Внешний цикл. Попытки и ожидания блокировок
		Для Каждого Задание Из мЗаданий Цикл
			Если НЕ Задание.ОжиданиеБлокировкиВключено И УправлениеБлокировками.НаличиеСеансовПредприятия(Задание.ИнформационнаяБаза) Тогда
				Если Задание.ИнформационнаяБаза.СтандартнаяКонфигурация Тогда
					Рез = Ложь;
					УправлениеБлокировками.ВыполнитьОтключениеПользователейСтандартнойКонфигурации(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения, Рез);
					Если НЕ Рез Тогда
						УправлениеБлокировками.ПринудительнаяБлокировкаФайловойБазы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения);
					КонецЕсли;
					УстановитьПериодОжиданияБлокировки(Задание);
				ИначеЕсли Задание.ИнформационнаяБаза.Файловая Тогда
					УправлениеБлокировками.ПринудительнаяБлокировкаФайловойБазы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения);
					УстановитьПериодОжиданияБлокировки(Задание,Истина);
				Иначе
					//итерация 1
					УстановитьПериодОжиданияБлокировки(Задание);
				КонецЕсли;
				Задание.ОжиданиеБлокировкиВключено = Истина;
			Иначе
				Если УправлениеБлокировками.НаличиеСеансовПредприятия(Задание.ИнформационнаяБаза) И НЕ Задание.ВыгрузкаНачата = 1 Тогда
					Если НЕ ОжидатьБлокировкуБазыПоЗаданию(Задание) И НЕ Задание.ИнформационнаяБаза.Файловая тогда
						//итерация 2
						Сервер1С.ЗавершитьСеансы(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения.БлокироватьСеансы);
						Пауза(8000);
					КонецЕсли;
				ИначеЕсли Задание.ВыгрузкаНачата = 0 Тогда
					//итерация 3
					ИмяФайлаВыгрузки = "";
					WShell = Новый COMОбъект("WScript.Shell");
					WShell.Run(ПолучитьСтрокуКомандыВыгрузки(Задание.ИнформационнаяБаза, Задание.ПравилоРазмещения, ИмяФайлаВыгрузки));
					ЗаписатьНачалоЗаданияВЛог(Задание, ?(ИмяФайлаВыгрузки = "", "Пусто для базы " + Задание.ИнформационнаяБаза, ИмяФайлаВыгрузки));
					Задание.ВыгрузкаНачата = 1;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		
		ЗапущеноВыгрузок = 0;
		Для Каждого Элем Из мЗаданий Цикл
			ЗапущеноВыгрузок = ЗапущеноВыгрузок + Элем.ВыгрузкаНачата;
		КонецЦикла;
		
		Если мЗаданий.Количество() = ЗапущеноВыгрузок Тогда Прервать КонецЕсли;
		
		ОчиститьЛогИфайловыеБлокировки();
		Пауза(5000);
	КонецЦикла;
...Показать Скрыть

База для архивирования на SQL и без галочки стандартная. Комментарием "итерация №" отмечено на какой итерации внешнего цикла сюда попадет выполнение кода. Так вот у меня между 2й итерацией и 3й успевают стартануть регл.задания, т.к. блокировка регл.заданий не установлена ни в итерации 1, ни в итерации 2.
27. Andrey Smirnov (dusha0020) 03.04.15 10:11
(26) TMV, Теперь понял Вашу проблему, спасибо. Ну раз уж вы разобрали код на винтики может попробуете подкрутить размер паузы между итерациями? Или направить перенаправить код в нужную итерацию безусловным переходом. Мне чего-то лезть и ковыряться в работающем продукте не хочется, но в любом случае - спасибо за Ваши замечания. Постараюсь их обязательно учесть, когда появится возможность вернуться к доработкам данного продукта.
28. TMV 04.04.15 16:58
(27) dusha0020, еще отмечу, что в свойствах ИБ в консоли сервера есть 2 галочки: "Блокировка сеансов" и "Блокировка регл.заданий". Так вот вторую галку вы вообще нигде не ставите. Видимо, у вас базы хоть и серверные, но в них регл.задания отключены, раз вы не сталкивались с такой проблемой.
Еще обнаружена проблема, если путь для архивирования содержит пробелы - каталог преобразуется в файл.
29. Сергей Иванов (xten) 11.04.15 00:43
Большое спасибо автору за весьма комплексное решение и можно маленький вопрос: будет ли осуществляться "бэкапирование" базы, когда в ней работают юзеры, или нужно всех выгонять ?
30. Сергей Иванов (xten) 11.04.15 00:44
имел в виду файловый вариант базы )
31. Andrey Smirnov (dusha0020) 14.04.15 09:16
(30) xten, Для файловых вариантов в стандартных конфигурациях будет попытка выгнать пользователей стандартным механизмом, сначала вежливо попросив, а потом через обработчик ожидания. Но стандарт стандарту рознь, поэтому в каких конкретно конфигурациях будет работать, а в каких нет не скажу, нужно пробовать на месте. Если же база нестандартная и файловая - то предварительный разгон пользователей обязателен, что в принципе сводит на нет все преимущества автоматизации, потому что коль уж разгонять руками, то и выгрузку после этого можно сделать руками.
32. kainder 18.09.15 16:13
(6) Светлый ум, у меня была подобная ошибка "Тип не определен (ОписаниеОповещения)" - долго не мог понять почему не работает, выяснил что "ОписаниеОповещения" - доступен только на клиенте, а я пытался на сервере.
33. Ренат Муртазин (refarm) 24.09.15 17:29
Добрый день, у меня пишет что у пользователя не достаточно полномочий для работы с базой данных, в чем может быть проблема?
34. Andrey Smirnov (dusha0020) 25.09.15 09:48
(33) refarm, Добрый день. Хотелось бы знать где и когда пишет, но рискну предположить, что пользователь от имени которого Вы пытаетесь подключиться к базе и сделать бэкап не обладает правами администратора.
35. Олег С (slimuz) 20.10.15 09:08
Добрый день. При ручном старте задачи пишет:

Возврат Запрос.Выполнить().Выгрузить()[0].ДатаЧислом;
по причине:
Ошибка выполнения запроса
по причине:
У пользователя недостаточно прав на исполнение операции над базой данных.

У пользователя полные права. Клиент-серверная база, стандартная конфигурация.
36. pallid *** (white_sochi) 10.11.15 14:59
{ОбщийМодуль.ОбработкаЗаданий.Модуль(34)}: Ошибка при вызове метода контекста (Run)
по причине:
Произошла исключительная ситуация (0x80070002)

вот такую ошибку выдает, в чем может быть причина?
37. Максим Евсенкин (tehas) 16.03.16 12:48
38. Andrey Smirnov (dusha0020) 18.03.16 13:00
(36) white_sochi, (37) tehas, Похоже юзеру сервера запрещен запуск скриптов на том же сервере. Копайте права.
39. Виталий Кокориков (AfipNPZ) 15.06.16 16:53
Добрый день! Почему-то не получается отключить сеансы перед началом копирования. Подскажите, может где забыли настроить?
40. Виталий Кокориков (AfipNPZ) 16.06.16 22:43
Здравствуйте! Пытались настроить копирование sql-баз (УПП). При попытке запуска из файловой базы копирование согласно логу начинается, но не заканчивается. А если запускать из серверной версии, то ничего не происходит, только выскакивают сообщения о подключениях. Версия платформы 8.3.7.1860
41. Andrey Smirnov (dusha0020) 17.06.16 10:06
(40) AfipNPZ, Добрый день. Не знаю что Вам и сказать... Если исключить банальные ошибки типа неправильно введенных данных для подключения, то на ум ничего не приходит. Дело в том, что я уже больше года не заглядывал в код этой конфигурации и почти все забыл. И сейчас, я вполне счастливый человек тем, что базы мои бэкапятся sql сервером, и я вообще этим не занимаюсь. Данная конфигурация осталась на прежней работе и разворачивать ее здесь у меня нет ни желания ни необходимости . А тем более не хочется телепатически пытаться сообразить где же могут у Вас возникнуть заморочки.
Код совершенно открыт и я советую Вам обратиться к своему программисту, для того, чтобы он нашел и пофиксил проблему. Никаких ограничений я на Вас не накладываю и претензий тоже иметь не буду.
42. Сергей (strange2007) 05.09.16 21:03
(4) pumbaE, формат DT является стандартом 1С и он позволяет абстрагироваться от СУБД. Т.е. этот вариант для организаций, в которых имеются сложный набор учётных систем. Тем более если отбросить фанатизм, то копия с MS SQLя примерно в 4 раза дольше восстанавливается на постгре и то при условии, что звёзды сложились нормально и выгрузка была без битых транзакций.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа