Продвинутый курс. Домашнее задание №6

Новое задание по 1-му блоку продвинутого курса.

Для выполнения рекомендуется изучить следующие главы 1-го курса.
Глава 1. Базовые приемы работы в конфигураторе.
Раздел справки о параметрах запуска приложения должен подсказать нужные ключи.

В этой же теме необходимо написать отчет о выполнении задания.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментарий 21 на “Продвинутый курс. Домашнее задание №6”

  1. Задание сделал. Обратил внимание на кодирование кавычек. Очень полезно замечание по завершению собственного сеанса.

  2. Хочу заметить что запуск регламентных задач непосредственно из 1С редкий случай. Чаще это делает виндовс планировщик, и при переходе с 8.1 на 8.2  заметил что для пакетного запуска лучше не использовать 1cestart.exe так как  запускаемый процесс сразу запускает другой процесс – в моем случае exe файл последний платформы, следовательно я не могу отследить завершения процесса, поэтому я жестка использую exe конкретного релиза.

  3. Задание выполнил. Практически все как у всех. Также мучался с файлом вывода, даже когда после /RunEnterprise переопределил /Out с другим именем, все равно пришлось помучится с ним (почему-то перезаписывался: появлялась информация о работе в конфигураторе, а после запуска Предриятия он очищался, для этого использовал параметр -NoTruncate, а уже в режиме Предприятия програмно удалял его) . Для вывода информации о результате работы в /RunEnterprise передавал параметр /C “ВывестиЛог”, а дальше уже  ПриОтрытии() обработки анализировал ПараметрЗапуска и показывал содержимое файла вывода.

  4. ДЗ выполнил, сложностей не возникла, узнал для себя новое, до этого делал все через КД.

  5. Задание выполнил.
    Создал внешнюю обработку с кнопками для выполнения синтаксического контроля, создания резервной копии базы и тестирования и исправления информационной базы.
    В первую очередь проверяется что с базой работает только один пользователь (текущий). Для этого используется функция модуля формы обработки:
    <code>
    &НаСервереБезКонтекста
    Функция ПроверитьСеансы()
                    Сеансы = ПолучитьСеансыИнформационнойБазы();
                    Если Сеансы.Количество() > 1 Тогда
                                   Сообщение = Новый СообщениеПользователю;
                                    Сообщение.Текст = “С базой работают пользователи! Операция не возможна.”;
                                   Сообщение.Сообщить();
                                   Возврат Ложь;
                    КонецЕсли;
                    Возврат Истина;
    КонецФункции
    </code>
     
    Затем запускается конфигуратор с соответствующими ключами командной строки и ключами /Out для вывода результата в файл и  /RunEnterprise, текущий сеанс закрывается. При этом после завершения операций в конфигураторе, запускается база в пользовательском режиме и открывается наша обработка (для этого используется ключ /Execute). При открытии обработки пользователю выводится сообщение с текстом из файла с результатом, после этого файл удаляется.
    <code>
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
                    // инициализируем переменные модуля форма
                    ИмяФайлаВывода = “D:\Temp\out.txt”;
                     ВыводВФайл = ” /Out “”” + ИмяФайлаВывода + “”””  + ” -NoTruncate”;
                     СтрокаЗапуска = ” /RunEnterprise “” /Execute “”””E:\1C\Kursy\AdvCourse\ДЗ\6\Администрирование.epf”””” /Out “”””D:\Temp\out1.txt”””” “” “;
                    Файл = Новый Файл(ИмяФайлаВывода);
                  Если Файл.Существует() Тогда
                               РезультатПроверки = Новый ИзвлечениеТекста(ИмяФайлаВывода);
                               Сообщить(РезультатПроверки.ПолучитьТекст());
                              УдалитьФайлы(ИмяФайлаВывода);
                 КонецЕсли;
                Файл = “”;
    КонецПроцедуры
    </code>
    При нажатии на кнопки формы вызываются процедуры:
    <code>
    &НаКлиенте
    Процедура СинтаксическийКонтроль(Команда)
                    ПроверкаМодулей = ” /CheckModules -ThinClient -WebClient -Server -ExternalConnection -ThickClientOrdinaryApplication”;
                    ВыполнитьОперацию(ПроверкаМодулей);
    КонецПроцедуры
     
    &НаКлиенте
    Процедура РезервнаяКопия(Команда)
                    ИмяФайла = “D:\Temp\база.dt”;
                    ВыполнитьОперацию(” /DumpIB ” + ИмяФайла);
    КонецПроцедуры
     
    &НаКлиенте
    Процедура ТестированиеИсправление(Команда)
                    СтрокаТестирования = ” /IBCheckAndRepair -ReIndex -LogAndRefsIntegrity -RecalcTotals -Rebuild -BadRefCreate”;
                    ВыполнитьОперацию(СтрокаТестирования);
    КонецПроцедуры
    </code>
    Одинаковый код вынесен в отдельные процедуру и функию:
    <code>
    &НаКлиенте
    Функция ПолучитьКоманднуюСтроку()
                    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
                    СтрокаСоединения = СтрЗаменить(СтрокаСоединения, “”””, “”””””);
                    СтрокаКоманды = “””C:\Program Files (x86)\1cv82\common\1cestart.exe”” DESIGNER /IBConnectionString “”” + СтрокаСоединения + “”” /N Администратор”;
                    Возврат СтрокаКоманды;
    КонецФункции // ПолчитьКоманднуюСтроку()
     
    &НаКлиенте
    Процедура ВыполнитьОперацию(ВидОперации)
                    Если ПроверитьСеансы() Тогда
                                   СтрокаКоманды = ПолучитьКоманднуюСтроку();
                                   СтрокаКоманды = СтрокаКоманды + ВыводВФайл + ВидОперации + СтрокаЗапуска;
                                   ЗапуститьПриложение(СтрокаКоманды);
                                   ЗавершитьРаботуСистемы(Ложь);
                    КонецЕсли;
    КонецПроцедуры // ВыполнитьОперацию()
    </code>
     

  6. Задание выполнено.
    Жертв нет, хотя клава была на грани раскола :)

    Сделал обработку с 3 кнопками и текстовым полем для вывода сообщений из лог файла.

    Использовал приемы аналогичные описанным предыдущими участниками. Повторяться не буду. От себя замечу, что в процессе выполнения данного ДЗ количество нервных клеток заметно поубавилось. Как ни пытался я задействовать ключ /@, чтобы остальные параметры вынести во внешний файл – ничего не получилось, при старте через ЗапуститьСистему() ключ напрочь игнорился.
    Немного крышу стало сносить от передоза кавычками. Чтобы хоть как-то улучшить читабельность загнал кавычку в  переменную: Кавычка = Символ(34) и дальше использовал ее.
    После мытарств с ЗапуститьСистему() (чтобы не указывать параметры подключения к ИБ), все время получал ошибку блокировки лог файла, несмотря на то, что переопределял его после ключа /RunEnterprise. Решил-таки юзать ЗапуститьПриложение() с указанием всех параметров (использовал функцию КаталогПрограммы() и  ключ /IBConnectionString) .

  7. Задание выполнено.
    Создал обработку с тремя, соответствующими заданию, кнопками и полем текстового документа, куда вывожу результаты выполнения обработки. Обработка не выполняется, если количество соединений к ИБ > 1. Строку соединения использую как параметр для ключа /IBConnectionString при формировании командной строки запуска в режиме конфигуратора. В секцию DESIGNER помимо ключей, необходимых по заданию, добавил также : /DumpResult , /Out -NoTruncate. При открытии обработки информация из служебных файлов загружается в соотв.поле, после чего они удаляются. После этого в командную строку добавил ключ /RunEnterprise, где в кавычках написал командную строку для запуска в режиме предприятия, в которой указал ключ /Execute для открытия обработки при перезапуске приложения. Кстати было замечено, что если обработкой дважды перезапустить Предприятие, то меняется тип клиента. Если изначально он был тонкий, то после двойного перезапуска – толстый. Чтобы такого не происходило, добавил ключ /AppAutoCheckMode. Выполнение всех команд выполняется процедурой ЗавершитьРаботуСистемы(Ложь, Истина, КоманднаяСтрока).

  8. ДЗ выполнено.

    Создал обработку с тремя командами: СинтаксическийКонтроль, РезервнаяКопия и РеглОперации.

    Как рекомендовано в условии, для получения строки соединения информационной базы использую функцию СтрокаСоединенияИнформационнойБазы(). Полученную строку указываю для ключа IBConnectionString при запуске 1С в режиме конфигуратора. Т.к. строка соединения содержит кавычки, пришлось содержащиеся внутри кавычки удвоить.

    После ключа DumpResult указал имя файла, в который будут записаны результаты работы конфигуратора.
    После ключа Out указал имя файла, в который будут записываться служебные сообщения.

    Для проверки пользовательских соединений вызываю в серверной процедуре функцию ПолучитьСоединенияИнформационнойБазы() и проверяю возвращаемый массив. Кстати тут вероятно нужно обрабатывать и Неопределено, в случае если к БД подсоединяется пользователь еще не зарегистрированный в БД. Если проверка показала, что активных сеансов нет, выполняю завершение работы системы через ЗавершитьРаботуСистемы(ложь,Истина,”/Execute <имя файла внешней обработки>”), дальше дело техники.

  9. Параметры командной строки пакетного режима запуска конфигуратора хорошо описаны во встроенной справке. Для запуска вне зависимости от режима (файлового или клиент-серверного) оказалось, удобно использовать не отдельные ключи /F или S, а ключ /IBConnectionString, использование которого с функцией СтрокаСоединенияИнформационнойБазы() позволяет не заморачиваться с отличиями разных режимов.
    Для пользователя проверяю наличие право доступа на выполнение Административных функций с использованием функции ПравоДоступа, но здесь столкнулся со следующей проблемой, для пользователя у которого нет права на выполнение Административных функций при выполнении функции вида ПравоДоступа(“Администрирование”, Метаданные, ПользовательИБ); получаю ошибку времени выполнения «Нарушение прав доступа», странная на мой взгляд ситуация. Ошибку обошел, заменив проверяемое право на «МонопольныйРежим» не совсем то, но логичного объяснения ситуации с правом “Администрирование”, найти не мог.
    Если у пользователя нет соответствующего права, то на форме становятся видимыми поля для ввода имени того пользователя (и пароля) у которого такие права есть.
    Для проверки, что с базой нет других соединений использовал условие вида ПолучитьСоединенияИнформационнойБазы().Количество()=1.
    Основной интерес в работе состоял в том, как вывести результат выполнения команд пользователю. Данную задачу решил следующим образом. При формировании команды запуска с помощью параметра /Out, результат выполнение сохранял в файле лога, в конце создания командной строки с помощью параметра /RunEnterprise, я указывал на необходимость перезапуска системы после окончания выполнения команды. Для того чтобы при перезапуске платформы сразу снова открывалась моя обработка после параметра /RunEnterprise я использовал параметр /Execute после которого указал полное имя файла обработки. Это имя я получил с помощью свойства ИспользуемоеИмяФайла объекта обработки. В процедуре ПриОткрытии я проверял наличие файла лога и с помощью  ЧтениеТекста построчно считывал файл лога и выводил его пользователю, после этого файл лога удалял.
    В этой схеме есть один ньюанс, заключается он в том, что при перезапуске платформы она использует все параметры предыдущего запуска и таким образом файл лога блокируется для чтения и естественно для удаления. Поэтому после параметра /RunEnterprise я еще раз использовал параметра /Out и «подсовывал» временный файл лога для избегания блокировки основного.

  10. Задание выполнил!
    Т.к. по заданию обработка должна работать как файловом так и в кл-серв варианте решил запуск конфигуратора делать через параметр /IBConnectionString , а строку для этого параметра получал через СтрокаСоединенияИнформационнойБазы(). Пришлось конечно помучаться с заменой кавычек в данной строке .
    Создал обработку добавил 3 кнопки (Синтаксический контроль, Резервная копия, Регл.операции) добавил текстовое поле в которое вывожу результат работы конфигуратора.
    Результаты получаю параметрами /DumpResult c:\temp\result.txt /Out c:\temp\msg.txt.
    При резервном копировании вначале проверяю на количество соединений к базе, если оно более одного тогда выдается предупреждение, иначе делаю завершение приложения : ЗавершитьРаботуСистемы(,Истина,”/Execute C:\1C8\8-2\Курсы\ДЗ\Блок1\УтилитаАдминистрирования.epf”); с параметром повторного запуска и доп параметром запуска утилиты администрирования, т.о. сохраняется логическая целостность процедуры.

  11. Выполнил.
    1.Сделал обработку с 3 кнопками по 1 на 1 действие.
    2.В модуле формы сделал проверку насервере на: текущий пользователь хоть в из ролей имеет административные права(работа с метадаными) и кол-во пользователей = 1 (цикл для каждого из ПолучитьСоединенияИнформационнойБазы()).
    3.Из клиента вызываю проверку на сервере и если ок – ЗавершитьРаботуСистемы с разными параметрами в зависимости от команды.
     
    Есть несколько вопросов: а это задание действительно к главе 1 блока 1?
    Делал при тесте и тесте/испарвлении ИБ одновременно DumpResult и  Out и если с оутом всё понятно, то что имеет в виду дампрезульт под “я╗┐0” или “я╗┐101” (так вижу из фара из блокнота 0 и 101 соответственно), что какой-то код как-бы понимаю, но вот остальное – что это за шифровка?
     
     

    • Да, это задание первого блока.
      Что касается DumpResult – вопрос интересный.
      Первые символы относятся к кодировке текста, поэтому просматривайте файл с помощью блокнота.
      Вообще результат должен быть только таким: 1 или 0. 0 – ошибок нет, 1 – ошибка.
      Каких-то кодов ошибки в файл не пишется.
      То что у вас получилось 101 – загадочное поведение.
      К сожалению, этот момент не документирован нигде.

      • Может быть не очень удачна подобраны набор опций?
        “CONFIG /DumpResultC:\log_test.dmp /OutC:\log_test.txt /CheckModules -ThinClient -WebClient -Server -ExternalConnection -ThickClientOrdinaryApplication”
        или старая платформа (8.2.11.235)
        ну естественно что-бы был интересней результат в функцию общего модуля добавил строку которая заведомо не пройдёт синтаксический контроль.

        • Да, действительно воспроизводится.
          Будем разбираться…

          • Ну может решили сделать информативно: 0 -Ок, не 0 – код ошибки. Как-бы так более информативно, не есть проблемма а проблемма в том-то. Точно так-же в cpm/ms-dos/… возвращался код резульатат перрывания по работе с дисковой подсистемой (int 13h, int 21h …). Сделали а проанонсировать забыли…

            • Возможно, постараемся прояснить у разработчиков.

  12. а блок 1 для скачивания выкладываться не будет?

  13. Антон К. 24.02.2011 в 11:14

    Добрый день, видео-файлы для просмотра можно скопировать с диска, чтобы просматривать их с помощью вашей конфигурации? (помню, недавно вы давали на скачивание 3-ий блок)

    • 1-ый блок продвинутого выложим на скачивание только на след. неделе.
      А вообще можете скопировать файлы с компакт-диска.