Волшебство
программирования на 1С:Предприятие 7.7 и 8.0
Выпуск
20
/
25.12.2002
Здравствуйте. Сегодня
мы рассмотрим очень актуальную проблему в мире 1С:Предприятие. Практически
каждый разработчик когда-нибудь сталкивался с тем, что невозможно
сохранить конфигурацию, когда в базе работает хотя бы один пользователь.
При этом появляется сообщение "Ошибка блокировки
метаданных. Возможно, метаданные используются другой задачей."
Такое сообщение возникает даже при изменении одного символа в программном
модуле конфигурации! Какая несправедливость!
Если с программой
работает 3 или 5 человек, то это еще терпимо. Наверное, их работу можно
прервать без особых последствий для предприятия. С другой стороны, если с
программой работает 10, 20 или 30 пользователей, то прерывать работу
предприятия крайне нежелательно. Это влечет за собой недовольство
сотрудников, очереди из клиентов, а также может привести к прямым денежным
потерям.
При плохо налаженном
тестировании ошибки и недоработки в программе обнаруживаются довольно
часто, причем большинство из них является довольно простыми, не связанными
со структурой базы данных, например ошибка в условии в программном модуле
или в ячейке отчета. Для исправления таких ошибок просто обидно прерывать
работу всего предприятия. Пока фирма "1С" не осознает важность этой
проблемы для средних и больших предприятий, она никогда не сможет
захватить значительную долю этого рынка.
В данном выпуске я
расскажу, как использовать штатные средства 1С для частичного решения этой
проблемы. Очень часто незначительные ошибки встречаются в отчетах и
обработках. В 1С заложена возможность использования внешних отчетов,
хранящихся отдельно от конфигурации в ert-файлах. Такой отчет
(обработка) может быть запущен из конфигурации с помощью команды
ОткрытьФорму. При этом он будет выполняться в контексте
конфигурации, т.е. ему будут доступны глобальные переменные, а так же
любые объекты конфигурации: справочники, документы и т.д. При запуске
внешнего отчета ему можно передать любые параметры. Используя механизм
внешних отчетов можно организовать обновление конфигурации без прерывания
работы пользователей. К сожалению, не все ошибки могут быть исправлены
таким образом, но около 30% ошибок связано именно с отчетами и
обработками.
Я не призываю все
отчеты конфигурации реализовывать как внешние. Самый лучший вариант, когда
при обнаружении ошибки в отчете, он временно заменяется внешним
ert-отчетом. А когда ошибка будет исправлена и конфигурация будет
обновлена в общем порядке, заплатка в виде ert-отчета уже не нужна и
должна быть удалена. Для работы данного механизма нужно всего лишь
вставить несколько строчек в каждый отчет и обработку в процедуру
ПриОткрытии, а именно:
Процедура
ПриОткрытии()
ПутьВнешнегоОтчета = "";
ИмяФайлаВнешнегоОтчета =
"";
РасположениеФайла(ПутьВнешнегоОтчета,ИмяФайлаВнешнегоОтчета);
Если
ПустоеЗначение(ИмяФайлаВнешнегоОтчета)=1 Тогда //это внутренний
отчет
ПутьВнешнегоОтчета = КаталогИБ() +
"ExtForms\";
ИмяФайлаВнешнегоОтчета =
"Отчет_ДоходыРасходы.ert"; //обратите
внимание!
ПолныйПуть = ПутьВнешнегоОтчета +
ИмяФайлаВнешнегоОтчета;
Если ФС.СуществуетФайл(ПолныйПуть)=1
Тогда
Конт =
Форма.Параметр;
ОткрытьФорму("Отчет",Конт,ПолныйПуть);
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры |
Теперь, если в отчете
обнаруживается ошибка или требуется внести небольшие изменения в модуль,
экранную форму или печатную форму отчета, то нужно сохранить отчет как
внешний под определенным именем и он автоматически будет вызываться при
запуске данного отчета. При этом никто ничего не заметит, все будут
продолжать работать в обычном режиме. Именно то, что нам нужно! Такая
временная заплатка вполне работоспособна до тех пор, пока не появится
возможность обновить конфигурацию в штатном порядке, т.е. используя
команду меню "Загрузить измененную конфигурацию" или "Объединение
конфигураций". Например, поздно вечером или рано утром, а может быть в
обед.
Во внешний отчет можно
передать несколько параметров, используя объект "СписокЗначений",
например,
сз =
СоздатьОбъект("СписокЗначений");
сз.Установить("НачДата",ДатаНачала);
сз.Установить("КонДата",ДатаОкончания);
сз.Установить("Документ",ВыбДоговор);
сз.Установить("Валюта",Рубли);
сз.Установить("РежимОтчета",1);
ОткрытьФорму("Отчет",сз,ПолныйПуть);
|
в процедуре
ПриОткрытии внешнего отчета параметры можно прочитать следующим
образом:
Процедура
ПриОткрытии()
Если
ПустоеЗначение(Форма.Параметр)=0 Тогда
.......Если
ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
сз =
Форма.Параметр;
НачДата =
сз.Получить("НачДата");
КонДата =
сз.Получить("КонДата");
Документ = сз.Получить("Документ");
и т.д.
........КонецЕсли;
КонецЕсли;
КонецПроцедуры |
Есть и другой подход,
который поможет в некоторых случаях. Многие знают, что 1С имеет директиву
"#ЗагрузитьИзФайла". К сожалению данной директивой невозможно хоть
как-нибудь управлять, например, загружать модуль из файла по условию, так
как эта директива должна располагаться в самом начале модуля, еще до
объявления переменных. Чтобы организовать динамическое обновление
конфигурации без прерывания работы пользователей, необходимо все
программные модули хранить в текстовых файлах, что приведет к ужасным
неудобствам в работе программиста. Данную директиву я рекомендую
использовать на этапе опытной эксплуатации для критических модулей, в
которых часто обнаруживаются ошибки и недоработки, а также для глобального
модуля.
В следующем выпуске
рассылки мы рассмотрим несколько вариантов, как ставить заплатки на модули
в справочниках, документах и процедуры глобального модуля. Это позволит
устранять 80% ошибок без прерывания работы пользователей, буквально "на
лету". Если у вас есть какие-нибудь идеи, приглашаю поучаствовать в
решении данной проблемы. Наиболее интересные решения будут опубликованы в
следующем выпуске.
Официальный сайт
рассылки www.mista.ru
Архив
выпусков рассылки находится здесь
http://www.mista.ru/subscribe
Учебник по 1С - http://www.mista.ru/tutor_1c
Курс лекций по 1С - http://www.mista.ru/kurs1c
Статьи про 1С - http://www.mista.ru/articles1c
С
уважением,
Волшебник Станислав
stasmit@mail.ru
<< Предыдущий
выпуск | Список
выпусков |
Следующий выпуск >>
|