пятница, 29 июля 2011 г.

Хранилище 1С

Оригинал взят с http://infostart.ru/public/63841/

Заметка про Хранилище конфигурации 1С:8.х

 "Неочевидные" и "невероятные" методики для чайников :)
Пара общих строк. Зачем это нужно?
- Если Вам надоело выгонять пользователей для того, чтоб внести изменение в конфигурацию..
- Если Вы хотите видеть, что, как и кем менялось в конфигурации с течением времени..
- Если Вы хотите иметь представление об объемах работы по изменению конфигурации каждого конкретного программиста (к сожалению, внешние обработки и отчеты туда не поместишь)
- Если над изменениями конфигурации работает несколько программистов и Вы хотите избежать ситуации, когда один из них перезатирает работу другого..
- Если нужно организовать слаженную работу географически удаленных разработчиков..
- Если Вы хотите иметь возможность откатить отдельные изменения отдельных объектов конфигурации, например, после неудачной правки или после неудачного обновления (неприятная ситуация, когда проморгали какие либо перезатертые обновлением нужные Вам изменения конфигурации.. порой даже и не вспомнить, что именно)..
.. то Вам может помочь организация работы с использованием Хранилища.
В мире "большого" программирования т.н. Конфигурационное управление используется очень давно и многие проекты, представленные в каталогах бесплатного ПО, просто не смогло бы появится без использования данного подхода. И в мире 1С это так-же не могло не возникнуть, учитывая возрастающую сложность конфигураций и необходимость их групповой разработки и поддержки.
Итак.. Создание Хранилища.
В режиме Конфигуратора, в меню Конфигурация/Хранилище конфигурации выберем Создать хранилище... , укажем каталог хранилища, пользователя/пароль (не связано с пользователями БД) и выгрузим ТЕКУЩЕЕ состояние конфигурации в него..
Что нужно сделать дополнительно: Даже если Вы планируете работать с Хранилищем в одиночку - сразу после создания создайте ЕЩЕ одного пользователя хранилища с административными правами и одного с параметрами по умолчанию - пункт Администрирование хранилища в том же меню.
Зачем: бывают случаи, когда пользователь "зависает" в Хранилище - и войти в него невозможно. Тогда будет возможность зайти под вторым логином и "снять" зависшего пользователя (т.е. себя же) - после чего можно продолжить работу в обычном порядке. Пользователь с обычными правами нужен для повседневной работы..
У нас есть хранилище. И наша текущая (как правило - рабочая) БД к нему уже подключена. Причем под именем того пользователя, от имени которого Хранилище было создано..
Неочевидный аспект: имейте ввиду, что теперь этот пользователь будет "закреплен" за Рабочей БД, от имени другого пользователя, открыв рабочую БД в конфигураторе, соединится с Хранилищем не удастся!
Как вести разработку:
- Для (каждого) программиста (обычно, локально, на его компьютере) создается пустая БД. Из основной БД делается выгрузка с данными (если она не сильно объемная - файл *.dt) или выгружается просто конфигурация (если БД сильно большая - файл *.cf). - В созданную локально базу заружают копии основной БД (можно без этого обойтись, но так быстрее, чем.. "не так" - этот пункт отсутствует в документации, по стандарту, его можно пропустить).
- Теперь нужно соединить нашу локальную БД с Хранилищем - выберем в том же меню, что упоминалось выше, пункт Подключиться к хранилищу.. , где укажем путь/адрес хранилища, пользователя с "обычными" правами (если программистов много - то для каждого должна быть заведена его учетная запись в Хранилище) и жмем OK.Происходит сравнение конфигурации Хранилища и Вашей локальной копии и подключение к Хранилищу.
ПРИ ЭТОМ ЕСЛИ ЕСТЬ РАЗНИЦА - ВАША ЛОКАЛЬНАЯ КОНФИГУРАЦИЯ БУДЕТ ЗАТЕРТА КОНФИГУРАЦИЕЙ ХРАНИЛИЩА
Данные локальной БД, при этом, останутся целыми.. можете считать, что произошло Объединение конфигураций с приоритетом конфигурации Хранилища.
"Неочевидное": а что делать если мы уже вели разработку в локальной БД? Как сохранить все "нажитое непосильным трудом"??
"Невероятное": выход есть. ПЕРЕД тем, как соединить локальную БД с Хранилищем, СДЕЛАЕМ ВЫГРУЗКУ локальной конфигурации в файл *.cf
После этого свяжем БД с Хранилищем и затрем свои изменения. Затем выполним операцию Захватить в хранилище.. (рекурсивно, если мы одни и никто не работает над изменением объектов) над корневым элементом в дереве Конфигурации.
После этого объединим локальную конфигурацию с конфигурацией из файла с приоритетом последнего и отправим все НАШИ ИЗМЕНЕНИЯ в Хранилище (операция Поместить в хранилище..).
Все в порядке. Оттуда эти наши изменения можно отправлять в основную БД!
Если программистов много - то изменения каждого нужно отправлять в Хранилище поочереди, ПРЕДВАРИТЕЛЬНО выгрузив у всех работу во внешние файлы с конфигурацией локальной БД и (если объединение делается с разных рабочих мест), не забывая перед каждым объединением ОБНОВЛЯТЬ локальные БД из Хранилища - до последней версии, с присутствующим там изменениями ранее подключенных товарищей не забывая перед каждым объединением выполнять РЕКУРСИВНЫЙ захват корневого элемента конфигурации, в ходе которого в т.ч. происходит обновление конфигурации из Хранилища до последней версии.. А после каждого объединения выпонять РЕКУРСИВНЫЙ возврат корневого элемента для обновления конфигурации в Хранилище.
А теперь можно начинать продуктивную работу..
====
***

..
В работе хранилища действительно очень много неочевидных вещей, поэтому мои дополнения:
1. Если работают несколько программистов, то как вариант,
рабочий день обычно начинается со следущего:
запускаем свою базу в конфигураторе, на корне конфигурации правой кнопкой мышки - получить из хранилища, включаем галочку "рекурсивно", жмем ОК. После этого в конфигурацию получаем все, что наработали другие из хранилища. САМУ БД НЕ ОБНОВЛЯЕМ!!!
Далее желаем "сравнить конфигурацию с конфигурацией БД" - и видим список все изменений сделанных другими программистами группы за предыдущий день. Если есть вопросы по изменениям- обращаемся к тому, кто их делал.
После того, как все разобрали - сохраняем в БД.
Почему не сравнить с конфигурацией хранилища - во-первых чтобы не показывались те объекты, над которым сам работаешь, во-вторых это работает быстрее.
2. В середине дня: срочные изменения (для динамического обновления) отправляем в хранилище сразу. Не срочные - после того, как изменим все связанные объекты. (см. пояснение ниже)
3. В конце дня (а если надо делать полное обновление базы - то перед ним) сдаем в хранилище все что можно.
Это не обязательный порядок, но весьма удобный.

4. Почему не помещаем сразу:
потому что целостность изменений контролируется 1С только там где есть ссылка. То есть если например вы сделали справочник "Автомобили клиентов" и добавили ссылку на него в "расходную накладную", то поместить "Расходную накладную" в хранилище Вы сможете только после (или одновременно) со справочником "Автомобили клиентов". Но если Вы например использовали этот справочник в процедуре общего модуле, которая вызывается при проведении расходной накладной, то этот общий модуль в хранилище спокойно поместиться без помещения справочника. Если после этого другой программист получит этот модуль из хранилища, то в его базе расходные накладные проводиться перестанут. (А если обновить основную базу - то и там перестанут).
И то еще хороший случай - так как возникает просто ошибка. А вот если Вы например изменили тип реквизита в документе со строки на текст и в процедуре общего модуля была проверка Если Реквизит = "1" а стала Если Реквизит = 1 и модуль в хранилище поместили а документ - нет, то ошибки не будет (привет отсутствию контроля типов), а значит у тех кто такой модуль получит документы будет неправильно проводиться, (и хорошо если это будет не основная база). Поэтому изменения лучше сдавать в хранилище "полным пакетом" (все измененные по одной теме объекты), если что-то нужно Вам для другой задачи - можно сразу же захватить по новой или просто, помещая в хранилище, "оставить захваченным".

В этом плане я не совсем понял:
Цитата
Если программистов много - то изменения каждого нужно отправлять в Хранилище поочереди, ПРЕДВАРИТЕЛЬНО выгрузив у всех работу во внешние файлы с конфигурацией локальной БД и (если объединение делается с разных рабочих мест), не забывая перед каждым объединением ОБНОВЛЯТЬ локальные БД из Хранилища - до последней версии, с присутствующим там изменениями ранее подключенных товарищей..

Странно, не было никаких проблем когда несколько человек сразу изменения помещали, разве что подтормаживало малость. На то захват объектов и предусмотрен, чтобы 2 человека сразу одно и то же не исправили. Причем было замечено, что: если 1 разработчик изменил документ, скажем "Авансовый отчет", а затем второй "получения" не делал, а сразу его захватывает (например, объект только что помещен в хранилище), то 1С это отследит и сама даст ему уже новую - измененную версию. (Так прикольно бывает - смотришь на документ - 5 реквизитов, захватываешь - уже 15).

И зачем работу во внешние файлы выгружать тоже не понял.

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

5. Если нужно добавить новый объект (документ, справочник и пр), то захватите корень конфигурации, добавьте его, добавьте минимум реквизитов (совсем "пустые" объекты не всегда сохраняется), сдайте корень в хранилище (этот объект тоже сдастся при этом) и заберите объект опять. (Чтобы не держать корень долго захваченным - он и другим нужен).

6. Если Вы хотите исправить права доступа на объект, захватили его - а права доступа по прежнему недоступны - захватите соответствующую роль.

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

8. Когда делаем "получить все из хранилища" (п. 1) бывает, что 1с выдает кучу сообщений а потом пишет, что "не удалось" (список объектов при этом меняется). Значит давно не получали изменения. Ничего страшного, жмем ОК по новой и так до тех пор, пока не сработает, как надо.

9. Иногда 1С отказывается сохранять полученные из хранилища изменения, причем сообщение выдает абсолютно невнятное. Виновниками обычно являются "регистры сведений". Выясняем, у какого регистра сведений менялась структура, удаляем из него в своей базе все записи, после этого все обновится как надо.

10. Поскольку рабочие базы делаются из основной, то названия конфигураций совпадают и их легко перепутать и потом начинаются непонятки, когда пользователе говорит что у него в отчете 100 руб, а у Вас - 100,000 руб. Как вариант, добавляем в модуль приложения строчку, проверяющую при запуске программы что это за база и если не основная - выводящую это в заголовке программы 1С (например "РАБОЧАЯ БАЗА ПРОГРАММИСТА ИВАНОВА")

11. Когда база подключена к хранилищу, но при запуске не удалось к нему подключиться по любым причинам, то может выдаться сообщение "Не удалось подключиться, выполнить отключение от хранилища" (а у Вас есть захваченные объекты) - тут ОТВЕЧАЙТЕ "НЕТ". Но если случайно ответить "да" то - не пытайтесь подключиться по новой!!! Сначала сохраните конфигурацию в файл!!! Так как когда подключаемся к хранилищу, то вся конфигурация базы заменяется на конфигурацию хранилища. После этого загружаем изменения из сохраненного файла и работаем дальше.