Столкнулся недавно с необходимостью администрировать сервер 1С. После того, как поднял и развернул базы, задался вопросами резервных копий. И вот здесь Инфостарт предложил просто море вариантов, но все они по тем или иным причинам не подошли… А может быть, я плохо искал и наваял очередной баян:(
В общем, SQL был не мой и в нем постоянно что-то подкручивали, писать и править скрипты тоже было проблематично. В общем, не буду распространяться про то, как тяжело ужиться двум администраторам на одном сервере, скажу лишь, что платить за готовое решение на базе 1С я не стал (и рекламировать его здесь не буду), а вместо этого сел и написал свою конфигурацию.
Почему так сложно и не ограничился простой обработкой? Хотелось гибко управлять свойствами бэкапов, расписаниями выгрузок, правилами хранения, серверами, кластерами, базами и самое главное — мимо всяких шедулеров воспользоваться фоновыми заданиями самого 1С сервера.
Писалось и отлаживалось все на 1С Сервере, но потом добавил возможность работы для файловых версий самой базы управления бэкапами и резервируемых баз.
К нстоящему времени серверная версия работает уже без малого 3 месяца, и баги достаточно придавлены. Недели 3 уже я туда не совался, а новые выгрузки исправно делаются, и старые нормально удаляются по правилам. Файловый вариант в силу его практической ненадобности я потестил денек, но боюсь, что за недостатком времени какие-то функции все-таки не дотестил и какие-то ситуации не прогнал.
Да и сама работа в файловом варианте не столь удобна, так как связана с обработчиком ожидания, а, следовательно, требует постоянно открытого клиента предприятия. С другой стороны, не серверные варианты работы все еще популярны и потратить несколько часов свободного времени на благо файловых пользователей я счел не лишним. Потратить времени больше не смог (не захотел и т.д.), так что не обижайтесь, если что:)
В любом случае конфигурация открыта — можете править как и что хотите. Можете заказать исправления и доработки мне. Если кто-то допишет/перепишет сам и под себя, возражать не буду. Единственное требование: при любых публикациях и размещениях продуктов, основанных на данной разработке, делать ссылку на эту статью.
Вопросы и пожелания прошу в комменты и в личку.
UP: Вариант 8(23) проверен на совместимость с 8.2 и 8.3. Не заменил изначальную версию потому, что пришлось добавить кучу костылей, а функциональность не изменилась совершенно. Код стал сложнее и тяжелее и я не вижу смысла использовать это решение на 8.3 когда есть оптимизировання версия. Также первоначальная версия может работать в немодальном режиме. Для экономии $m и имея 2 платформы для 8.3 можно использовать вторую версию, а если у Вас 8.3 в чистом виде, то лучше первоначальная.
Конфигурация отключает пользователей и устанавливает блокировку сеансов перед началом выгрузки?
(1) qwinter, да, конечно. Если конфа стандартная сначала пробует стандартные средства, если после периода ожидания (он настраивается в правилах выгрузки) база не освободилась то для серверных баз разрываются соединения с сервером. Для файловых — ничего не сделать, пойдёт новая попытка в новом фоновом задании. Так что файловые базы без гарантии.
Есть возможность подтянуть список баз и настройки подключения из файла ibase.v8i?
Мою лень можно понять если баз великое множество.
Возможно скажу банальность, но dt — это не бэкап. Гарантировать, что из dt восстановиться база вы не можете.
(3) ya.Avoronov, Нет такой возможности. У меня всего 4-5 баз. Вам не завидую:)
При первом запуске ругается:
{РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(14,21)}: Тип не определен (ОписаниеОповещения)
Оповещение = Новый <<?>>ОписаниеОповещения(«ПослеЗакрытияВопроса», ЭтаФорма, ИмяФайлаУдаленнойЗаписи);
{РегистрСведений.ЛогВыгрузок.Форма.ФормаСписка.Форма(27,21)}: Тип не определен (ОписаниеОповещения)
Оповещение = Новый <<?>>ОписаниеОповещения(«ПослеЗакрытияВопросаДляСписка», ЭтаФорма);
Тоже самое происходит при нажатии на кнопку: «Рабочий стол»
(7) Светлый ум, Платформа 8.2 у Вас. Да моя недоработка. Писал и использовал на 8.3, выставил совместимость с 8.2, но ОписаниеОповещения это тип из 8.3, а проверка модулей этого косяка не нашла.
Обновляться не собираетесь? Или подождите. Я через день-два исправлю эту проблему.
(7) Светлый ум, $m я Вам сейчас верну. Раз уж так получилось.
P.S. Не нашел где теперь переводы делаются — скачал Ваш отчет.
а все базы на одном сервере? а бэкап этой базы решен?
Могли не возвращать…) Помимо Sql БекАпов, хотел запустить раз в неделю ДТ — поправляйте, через 2 недели еще раз скачаю.
Да базы на одном сервере.
ошибка : {ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.5.1383)
(13) webresurs, Может быть что-то с обновлением? Попробуйте перерегистрировать компоненту comcntr.dll.
RedSvr32 «С:Progrаm files… (По адресу папки bin для нужной версии платформы)comcntr.dll»
Например: Regsvr32 «C:Program Files1cv838.3.5.1383incomcntr.dll»
(14)
сделал regsvr32 ,
удалил папку «8.3.5.1119»
все равно ошибка «{ОбщийМодуль.УправлениеБлокировками.Модуль(40)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.5.1383)»
(15) webresurs, Это какая-то админская беда. Если есть сисадмин лучше обсудить с ним. Если нет попробую предложить еще варианты:
1. Перезагрузка.
2. Есть подозрение, что лежит не свежая dll-ка. На картинке у меня ситуация — версия dll и платформы совпадают. Проверьте у себя. Если версия dll библиотеки 8.3.5.1119 то нужно найти и скопировать с заменой dll версии 8.3.5.1383 (у меня к сожалению ее нет). Это если не хочется переустанавливать платформу, так как бок вылез скорее всего из-за установки, когда при обновлении версии ядра не обновилась библиотека COM соединения.
Подскажите на 8.2 работать будет?
Спасибо.
(17) PAPIruss, (6) Светлый ум, Добавил совместимую с 8.2 версию. Почему не заменил — в статье. Можете пользоваться:)
Подскажите если стоит несколько серверов 1с и на разных портах работать будет ?!
(19) pandemic, Будет. В справочнике серверов необходимо задавать в этом случае полный идентификатор сервера с портом через «:»
Например: «serv1Cfirst:1540», «serv1Csecond:1620» и т.д.
Подробнее смотрите в СП по теме «Менеджер COM-соединений (COM connector), ConnectAgent (ConnectAgent)»
(2) если архивируемая база на sql и при этом нет галки «стандартная», то никаких блокировок не устанавливается — бэкап не делается.
(21) TMV, Спасибо за замечание. Сейчас нет времени разбираться с причинами. Флаг «Стандартная» означает лишь то, что перед жестким отключением от 1С сервера буде предпринята попытка разослать оповещение стандартным механизмом. То есть можете его ставить смело и для «нестандартных» конфигураций баз. А когда исправлю данную проблему отпишусь дополнительно и обновлю публикацию.
(21) TMV, Знаете, как и предполагалось, выгрузка работает и без галочки «стандартная конфигурация». Только что проверил. Советую проверить введены ли у Вас (и правильно ли) имя пользователя и пароль юзера имеющего права на установку блокировки (как правило администратора). Это в общем-то первая и очевидная причина почему выгрузка не срабатывает.
(23) неверно. У меня регл.задания работают, а у вас выгрузка начинается только при следующей итерации цикла, а не сразу после отключения сеансов. дело в том, что блокировку вы не устанавливаете.
(24) TMV, Честно говоря, не понял Вас. Выгрузка начинается не после отключения сеансов (команды на отключение), а после того как все сеансы будут реально отключены. Так как способы отключения разные: где-то пользователям предлагается выйти стандартными оповещениями, где-то идет команда серверу на завершение сеансов и т.д. В данном случае, когда высвобождение баз происходит не непосредственно в результате команды кода фоновой процедуры, а во вне этой процедуры (пользователями или сервером 1С) я счел вполне логичным и правильным рассылать такие требования на завершение сеансов во вне, а потом дожидаться их исполнения, проверяя высвобождение баз в некотором цикле. Имхо, такой подход вполне оправдан. С другой стороны если даже нам не удается дождаться завершения сеансов в текущей процедуре, то можно установить период болокировки базы в правилах выгрузки. То есть если в текущем задании освободить базы не удалось, то все равно устанавливается блокировка, период которой можно настроить так, чтобы она длилась между вызовами фоновой процедуры выгрузки и к новой попытке выгрузиться база была гарантированно свободной благодаря все еще длящейся блокировке.
И вот здесь я Вас и не понял. Вы предлагаете изменить логику исполнения задачи… Но как будет правильнее? Я изложил как мог свое видение алгоритма. Давайте обсудим Ваш если хотите. Но дайте немного подробностей:)
(25) Мне кажется вы не поняли о чем речь. Вот кусок кода, о котором говорю:
Показать
База для архивирования на SQL и без галочки стандартная. Комментарием «итерация №» отмечено на какой итерации внешнего цикла сюда попадет выполнение кода. Так вот у меня между 2й итерацией и 3й успевают стартануть регл.задания, т.к. блокировка регл.заданий не установлена ни в итерации 1, ни в итерации 2.
(26) TMV, Теперь понял Вашу проблему, спасибо. Ну раз уж вы разобрали код на винтики может попробуете подкрутить размер паузы между итерациями? Или направить перенаправить код в нужную итерацию безусловным переходом. Мне чего-то лезть и ковыряться в работающем продукте не хочется, но в любом случае — спасибо за Ваши замечания. Постараюсь их обязательно учесть, когда появится возможность вернуться к доработкам данного продукта.
(27) еще отмечу, что в свойствах ИБ в консоли сервера есть 2 галочки: «Блокировка сеансов» и «Блокировка регл.заданий». Так вот вторую галку вы вообще нигде не ставите. Видимо, у вас базы хоть и серверные, но в них регл.задания отключены, раз вы не сталкивались с такой проблемой.
Еще обнаружена проблема, если путь для архивирования содержит пробелы — каталог преобразуется в файл.
Большое спасибо автору за весьма комплексное решение и можно маленький вопрос: будет ли осуществляться «бэкапирование» базы, когда в ней работают юзеры, или нужно всех выгонять ?
имел в виду файловый вариант базы )
(30) xten, Для файловых вариантов в стандартных конфигурациях будет попытка выгнать пользователей стандартным механизмом, сначала вежливо попросив, а потом через обработчик ожидания. Но стандарт стандарту рознь, поэтому в каких конкретно конфигурациях будет работать, а в каких нет не скажу, нужно пробовать на месте. Если же база нестандартная и файловая — то предварительный разгон пользователей обязателен, что в принципе сводит на нет все преимущества автоматизации, потому что коль уж разгонять руками, то и выгрузку после этого можно сделать руками.
(6) Светлый ум, у меня была подобная ошибка «Тип не определен (ОписаниеОповещения)» — долго не мог понять почему не работает, выяснил что «ОписаниеОповещения» — доступен только на клиенте, а я пытался на сервере.
Добрый день, у меня пишет что у пользователя не достаточно полномочий для работы с базой данных, в чем может быть проблема?
(33) refarm, Добрый день. Хотелось бы знать где и когда пишет, но рискну предположить, что пользователь от имени которого Вы пытаетесь подключиться к базе и сделать бэкап не обладает правами администратора.
Добрый день. При ручном старте задачи пишет:
Возврат Запрос.Выполнить().Выгрузить()[0].ДатаЧислом;
по причине:
Ошибка выполнения запроса
по причине:
У пользователя недостаточно прав на исполнение операции над базой данных.
У пользователя полные права. Клиент-серверная база, стандартная конфигурация.
{ОбщийМодуль.ОбработкаЗаданий.Модуль(34)}: Ошибка при вызове метода контекста (Run)
по причине:
Произошла исключительная ситуация (0x80070002)
вот такую ошибку выдает, в чем может быть причина?
(36) white_sochi, та же беда
(36) white_sochi, (37) tehas, Похоже юзеру сервера запрещен запуск скриптов на том же сервере. Копайте права.
Добрый день! Почему-то не получается отключить сеансы перед началом копирования. Подскажите, может где забыли настроить?
Здравствуйте! Пытались настроить копирование sql-баз (УПП). При попытке запуска из файловой базы копирование согласно логу начинается, но не заканчивается. А если запускать из серверной версии, то ничего не происходит, только выскакивают сообщения о подключениях. Версия платформы 8.3.7.1860
(40) AfipNPZ, Добрый день. Не знаю что Вам и сказать… Если исключить банальные ошибки типа неправильно введенных данных для подключения, то на ум ничего не приходит. Дело в том, что я уже больше года не заглядывал в код этой конфигурации и почти все забыл. И сейчас, я вполне счастливый человек тем, что базы мои бэкапятся sql сервером, и я вообще этим не занимаюсь. Данная конфигурация осталась на прежней работе и разворачивать ее здесь у меня нет ни желания ни необходимости . А тем более не хочется телепатически пытаться сообразить где же могут у Вас возникнуть заморочки.
Код совершенно открыт и я советую Вам обратиться к своему программисту, для того, чтобы он нашел и пофиксил проблему. Никаких ограничений я на Вас не накладываю и претензий тоже иметь не буду.
(4) pumbaE, формат DT является стандартом 1С и он позволяет абстрагироваться от СУБД. Т.е. этот вариант для организаций, в которых имеются сложный набор учётных систем. Тем более если отбросить фанатизм, то копия с MS SQLя примерно в 4 раза дольше восстанавливается на постгре и то при условии, что звёзды сложились нормально и выгрузка была без битых транзакций.