А) введение
Б) публикация на IIS, исправление ошибок, настройка браузера
В) Автоматизация процесса согласования и доработка:
в1) Этапы согласования
в2) Скопировать\вставить файлы, “ввод на основании” Внутреннего документа из Задачи с переносом прикрепленных файлов
в3) Другие доработки
P.S. Изначально я хотел написать только про пункт в2, но статья получилась очень маленькой и пришло в голову такое решение.
1. Начало
Есть на работе база ДО, в которой работают несколько человек и заносят договоры и прикрепляют к ним файлы. Реестр договоров в общем. Появилась задача автоматизировать процесс согласования договоров по всем отделам.
Знакомство с ДО началось с обновления 1.2.4.3 до 2.1.10.2 - Начало!
В итоге обновление пошло по следующей схеме:
1.2.4.3 > 1.2.8.1 (21.02.2013) > 1.4.8.3 (19.02.2015) > 1.4.13.1 (09.09.2015) > 2.1.10.2 (30.03.2017)
После перехода на другую редакцию, визуально конечно кардинально все поменялось в плане интерфейса и функционала, а также приятно менялась заставка запуска:
1.2.4.3
1.4.8.3
2.1.10.2
Далее тестирование и исправление, после чего больше ошибок не было и получилась нормальная рабочая база последнего релиза (видимо повезло). Сделал это для того чтобы приходили различные уведомления из 1с на почту сотрудникам. Ибо в версии 1.2.4.3 по каким-то причинам это не получилось настроить. Не хотело работать и все тут.
Далее нужно было сделать возможность работать в web интерфейсе из любого места.
2. Публикация 1с на web-сервере IIS
2.1 Публикация
Настроить как в публикации //infostart.ru/public/275820/?ID=275820 и похожим способом у меня по каким то причинам не вышло и решение было следующим. Публикуем на веб-сервере IIS с использованием компоненты webinst от 1с.
Справка по webinst:
Для публикации на удаленном компьютере можно также использовать утилиту webinst. Данная утилита должна запускаться из каталога двоичных файлов платформы (для ее запуска требуется наличие динамических библиотек, входящих в состав платформы):
Публикация:
webinst [-publish] websrv -wsdir VirtualDir -dir Dir -connstr connStr [-confPath confPath] [-osauth]
Удаление публикации:
webinst -delete websrv -wsdir VirtualDir [-dir Dir] [-connstr connStr] [-confPath confPath]
-publish – опубликовать (ключ по умолчанию);
-delete – удалить публикацию;
websrv – тип веб-сервера. Может принимать следующие значения:
• iis – публикация веб-клиента для IIS;
• apache2 – публикация веб-клиента для Apache 2.0;
• apache22 – публикация веб-клиента для Apache 2.2;
-wsdir VirtualDir – виртуальный каталог;
-dir Dir – физический каталог, в который будет отображен виртуальный каталог;
-connstr connStr – строка соединения информационной базы;
-confPath confPath – полный путь к конфигурационному файлу Apache (только для публикации на Apache);
-osauth – использование Windows авторизации (только для IIS);
–descriptor <путь к vrd файлу> – указывает новый файл-дескриптор публикации. При публикации существующий vrd файл полностью переписывается указанным. Если в вызове утилиты указаны также ключи –wsdir и/или –connstr, их значения перекрывают значения полей vrd-файла base и ib соответственно. Если указан ключ –delete, ключ –descriptor используется для получения имени публикации (поле base vrd-файла) и проверки строки соединения (проверка, что по этому имени опубликована требуемая база). Должен использоваться именно файл-дескриптор публикации.
Через командную строку необходимо перейти в каталог с файлом webinst:
cd C:\Program Files (x86)\1cv8\8.3.9.2170\bin
Далее вводим команду:
webinst -publish -iis -wsdir Base1C -dir c:\inetpub\wwwroot\Base1C\ -connstr "Srvr=192.168.2.3;Ref=Base1C;"
Почти все готово. Но кое-что нужно сделать еще.
2.2 Появляются ошибки в web-клиенте «Обнаружено потенциально опасное значение Request.Path, полученное от клиента» и «Runtime Error»
Решение изложено вот тут http://forum.infostart.ru/forum9/topic72212/ , а именно
Алгоритм решения проблемы следующий:
1. Открываем Диспетчер служб IIS.
2. Открываем наш «сайт»
3. Идем в сопоставления обработчиков
4. Ищем ISAPI-dll, выделяем строку.
5. Справа нажимаем «Изменить»
6. Меняем путь запроса с «*.dll» на «*», Исполняемый файл (у Вас может быть другая версия 1С) — «C:\Program Files (x86)\1cv8\8.3.5.1248\bin\wsisapi.dll» :
7. Ок
8. Все работает.
2.3 Настройка браузера
- В браузере нужно отключить блокировку всплывающих окон что бы не возникало ошибок при уведомлениях 1с.
- так же можно установить “Расширение для работы с 1с” для Яндекс браузера и Google Chrome https://chrome.google.com/webstore/detail/extension-for-working-wit/pbhelknnhilelbnhfpcjlcabhmfangik?hl=ru&gl=RU
Вот теперь все заработало как надо.
3. Автоматизация процесса согласования и доработка
Тут я опишу этапы согласования и доработки по ходу рассказа.
В итоге, утвержденный руководством регламент выглядит следующим образом:
В общем поехали.
1 – Инициатор(сотрудник отдела) в программе создает процесс согласования по настроенному шаблону:
Непосредственный руководитель автора процесса и Начальник юридического отдела по очереди. И прикрепляет перечень учредительных документов к процессу.
Это первый этап согласования договора. Инициатор согласовывает заявку на договор с Руководителем отдела. После подтверждения Руководителем, согласование автоматически передается Начальнику юридического отдела для дальнейших действий.
2 – Начальник юр. отдела в моем случае либо одобряет и создает внутренний документ, либо перенаправляет задачу своему подчиненному (ответственный юр. отдела).
Тут встала задача автоматизировать этот этап, потому что много времени уходит на ручной перенос прикрепленных файлов из задачи в договор.
Понадобилось реализовать следующую идею: из задачи согласование нужно создать внутренний документ(договор) и перенести прикрепленные файлы задачи. Что то вроде "ввода на основании" с переносом прикрепленных файлов.
Были добавлены кнопки Создать договор, Скопировать и Вставить файлы в форму ФормаЗадачиИсполнителя (Бизнес-процессы > Согласование). А так же соответствующие им команды.
Далее в модуле формы пишем следующий код для кнопок:
// РАБОТА С ФАЙЛАМИ И СОЗДАНИЕ ДОГОВОРА С ВЛОЖЕНИЯМИ ИЗ ЗАДАЧИ
// ЭТО КНОПКА СОЗДАТЬ ДОГОВОР
&НаКлиенте
Процедура СоздатьДоговор(Команда)
// Нажмем на кнопку "Согласовано" и напишем комментарий в задаче
Если Объект.РезультатВыполнения = "" Тогда
Объект.РезультатВыполнения = "Предварительный договор рассмотрен.";
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения(
"ПродолжениеВыполненияЗадачиСогласованоПослеВыбораФактическогоИсполнителя", ЭтаФорма);
РаботаСБизнесПроцессамиКлиент.ВыбратьИсполнителяЗадачи(
ЭтаФорма,
Объект.Исполнитель,
ТекущийПользователь,
ФактическийИсполнительЗадачи,
ОписаниеОповещения);
//-------------------------------------------
НовыйВнутреннийДокумент = ПереносФайловНаСервере();
ПараметрыФормы = Новый Структура("Ключ", НовыйВнутреннийДокумент);
ФормаНовогоВнутреннегоДокумента = ОткрытьФорму("Справочник.ВнутренниеДокументы.ФормаОбъекта",ПараметрыФормы);
ФормаНовогоВнутреннегоДокумента.Открыть();
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
&НаСервере
Функция СоздатьДоговорНаСервере()
// Создаем новый договор
НовыйВнутреннийДокумент = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
НовыйВнутреннийДокумент.Заголовок = "Договор: " + ЭтаФорма.Объект.Наименование;
НовыйВнутреннийДокумент.Наименование = НовыйВнутреннийДокумент.Заголовок;
НовыйВнутреннийДокумент.Ответственный = ЭтаФорма.Объект.Автор;
НовыйВнутреннийДокумент.Подготовил = ТекущийПользователь;
Если Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("Договоры") <> Неопределено И
Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Договор") <> Неопределено Тогда
НовыйВнутреннийДокумент.Папка = Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("Договоры");
НовыйВнутреннийДокумент.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Договор");
КонецЕсли;
НовыйВнутреннийДокумент.Состояние = Перечисления.СостоянияДокументов.НаСогласовании;
НовыйВнутреннийДокумент.ДатаРегистрации = ТекущаяДата();
НовыйВнутреннийДокумент.Записать();
Для Каждого ИдентификаторСтроки Из Элементы.ДеревоПриложений.ВыделенныеСтроки Цикл
КопируемаяСтрока = ДеревоПриложений.НайтиПоИдентификатору(ИдентификаторСтроки);
СсылкаНаФайл = КопируемаяСтрока.Ссылка.ПолучитьОбъект();
СсылкаНаФайл.ВладелецФайла = НовыйВнутреннийДокумент.Ссылка;
СсылкаНаФайл.Записать();
КонецЦикла;
Возврат НовыйВнутреннийДокумент.Ссылка;
КонецФункции // ПереносФайловНаСервере()
// ЭТО КНОПКА СКОПИРОВАТЬ ФАЙЛЫ
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
ЧислоФайлов = 0;
СкопироватьСтрокиНаСервере(ЧислоФайлов);
Если ЧислоФайлов <> 0 Тогда
ПолноеОписание = СтрШаблон(
НСтр("ru = 'Файлы (%1 шт) скопированы в буфер обмена.'"), ЧислоФайлов);
ПоказатьОповещениеПользователя(
НСтр("ru = 'Копирование в буфер'"),
,
ПолноеОписание,
БиблиотекаКартинок.Информация32);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СкопироватьСтрокиНаСервере(ЧислоФайлов)
ЧислоФайлов = Элементы.ДеревоПриложений.ВыделенныеСтроки.Количество();
ОбщегоНазначения.СкопироватьФайлыВБуферОбменаИзТаблицыФайлы(ДеревоПриложений, Элементы.ДеревоПриложений.ВыделенныеСтроки);
Элементы.ВставитьСтроки.Доступность = Истина;
КонецПроцедуры
// ЭТО КНОПКА ВСТАВИТЬ ФАЙЛЫ
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если Модифицированность Тогда
Если НЕ Записать() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ЧислоФайлов = 0;
ВставитьСтрокиНаСервере(ЧислоФайлов);
Если ЧислоФайлов <> 0 Тогда
ПолноеОписание = СтрШаблон(
НСтр("ru = 'Файлы (%1 шт) вставлены из буфера обмена.'"), ЧислоФайлов);
ПоказатьОповещениеПользователя(
НСтр("ru = 'Вставка из буфера'"),
,
ПолноеОписание,
БиблиотекаКартинок.Информация32);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВставитьСтрокиНаСервере(ЧислоФайлов)
Если ОбщегоНазначения.ПустойБуферОбмена() Тогда
Возврат;
КонецЕсли;
ДанныеИзБуфераОбмена = ОбщегоНазначения.СтрокиИзБуфераОбмена();
МассивФайлов = ДанныеИзБуфераОбмена.Данные;
ЧислоФайлов = МассивФайлов.Количество();
РаботаСФайламиВызовСервера.СкопироватьФайлВПриложенных(МассивФайлов, Объект.Ссылка);
ЗаполнитьСписокФайлов();
Модифицированность = Ложь;
КонецПроцедуры
// Заполняет список файлов в карточке документа
//
// Параметры
// ЗаполнитьПризнакОригинал - Булево - если Истина, то будет заполнен признак оригинала
//
&НаСервере
Процедура ЗаполнитьСписокФайлов(ЗаполнитьПризнакОригинал = Ложь)
Делопроизводство.ЗаполнитьСписокФайловДокумента(ЭтаФорма, ЗаполнитьПризнакОригинал);
КонецПроцедуры
3 – Дальнейшие действия: заполнить договор необходимой информацией (контрагент, сумма и т.д.).
Так как Инициатор договора должен контролировать процесс изменения договора и процесса согласования, то в карточке Ответственный заполняется из задачи автоматически. Нужно только его подписать на договор.
Тут сделал просто, на форму вынес кнопку Подписать, по нажатию на которую происходит следующее:
Автоматически подставляется Инициатор из договора(ответственный), а так же проставляются необходимые события для контроля(в моем примере "Изменился внутренний документ"):
Процедура Подписаться(Команда)
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрыФормы = Новый Структура("ОбъектПодписки", Объект.Ссылка);
ФормаПодписки = ОткрытьФорму("ОбщаяФорма.ПодпискаНаУведомленияПоОбъекту", ПараметрыФормы);
// Ponomarev -->
Если ЗначениеЗаполнено(ЭтаФорма.Объект.Ответственный) Тогда
ФормаПодписки.Заголовок = "Инициатор для контроля договора: " + ЭтотОбъект.Объект.Ответственный;
ФормаПодписки.Элементы.Пользователь.Родитель.Родитель.Пользователь = ЭтаФорма.Объект.Ответственный;
Для Каждого Строка из ФормаПодписки.ПодпискиУведомлений Цикл
Если Строка.Представление = "Изменился внутренний документ" Тогда
// значения(1-да, 2-нет). Тип - число
Строка.ПоПочте = 1;
Строка.Окном = 1;
// надпись (Да или Нет). Тип - строка
Строка.ПоПочтеСтрокой = Истина;
Строка.ОкномСтрокой = Истина;
КонецЕсли;
КонецЦикла;
Иначе
// ФормаПодписки.Закрыть();
// Сообщить("Обязательно укажите Инициатора в карточке договора для подписки на уведомления.");
КонецЕсли;
// <-- Ponomarev
КонецЕсли;
КонецПроцедуры
4 – Ответственный юр. отдела начинает процесс согласования нового договора по шаблону и при необходимости добавляет\удаляет участников.
В процессе Согласование добавил кнопку Подписать и реквизит Ответственный(Инициатор), который должен заполниться автоматически, но пока не сделал!
Код кнопки такой же как выше, только отмечаем все события:
&НаКлиенте
Процедура Подписаться(Команда)
// Ponomarev
//Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
// ПараметрыФормы = Новый Структура("ОбъектПодписки", Объект.Ссылка);
// ОткрытьФорму("ОбщаяФорма.ПодпискаНаУведомленияПоОбъекту", ПараметрыФормы);
//КонецЕсли;
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрыФормы = Новый Структура("ОбъектПодписки", Объект.Ссылка);
ФормаПодписки = ОткрытьФорму("ОбщаяФорма.ПодпискаНаУведомленияПоОбъекту", ПараметрыФормы);
Если ЗначениеЗаполнено(ЭтаФорма.Объект.Ответственный) Тогда
ФормаПодписки.Заголовок = "Инициатор для контроля договора: " + ЭтотОбъект.Объект.Ответственный;
ФормаПодписки.Элементы.Пользователь.Родитель.Родитель.Пользователь = ЭтаФорма.Объект.Ответственный;
Для Каждого Строка из ФормаПодписки.ПодпискиУведомлений Цикл
// значения(1-да, 2-нет). Тип - число
Строка.ПоПочте = 1;
Строка.Окном = 1;
// надпись (Да или Нет). Тип - строка
Строка.ПоПочтеСтрокой = "Да";
Строка.ОкномСтрокой = "Да";
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
5 – После завершения процесса согласования Ответственный юр. отдела передает распечатанный договор и Лист согласования(печатает его из Процесса или из карточки договора, в прикрепленных файлах есть внешние ПФ(печатается с историей если есть)) офис менеджеру. Измененный Лист согласования выглядит так:
Офис менеджер меняет статус договора(На утверждении) и передает Генеральному директору на подпись.
Потом меняет статус(Утвержден) и указывает кем подписан договор.
Если договор не подписан со стороны Контрагента ставиться статус(Отправлен контрагенту), а если обе стороны подписали, то статус(Отправлен в архив).
Тут пришлось добавить эти статусы в перечисления СостоянияДокументов и изменить код модуля формы элемента внутреннего документа:
// Список состояний
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.Проект);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.НаСогласовании);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.Согласован);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.НеСогласован);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.НаУтверждении);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.Утвержден);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.НеУтвержден);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.НаРегистрации);
// Ponomarev -->
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.ОтправленКонтрагенту);
СписокСостояний.Добавить(Перечисления.СостоянияДокументов.ОтправленВАрхив);
// <-- Ponomarev
На этом процесс согласования завершен.
4. Другие доработки
1) Захотелось добавить больше информационных данных во внутренний документ. Решено было добавить реквизит Код затрат, таблицу Коды проекта, которую вынес в список внутренних документов. Данные берутся из добавленных справочников КодЗатрат и КодПроекта, причем последний должен синхронизироваться со справочником из бухгалтерской базы(БП). Теперь обо всем поподробнее:
КодПроекта:
Реквизиты: КодИзБП(Строка,9); GUID(Строка,50); Комментарий(Строка,100)
Формы: ФормаЭлемента, ФормаСписка, ФормаВыбора
Добавил общий модуль ПодргузкаИзБП, а в нем Процедуру ПодгрузитьКодПроекта, с помощью которой происходит подсоединение к базе по COM и сравнивнение GUID в базе-приемнике с GUID в базе-источнике и если такого нет, то создается новый элемент. В моем случае нужно было синхронизовать справочник КодПроекта и ПодразделенияОрганизации из БП 2.0:
Процедура ПодгрузитьКодПроекта()Экспорт
cntr = Новый COMObject("V83.COMConnector");
КаталогБазыДанных = "\\---\Buh2014";
Пользователь = "Админ";
Пароль = "----";
TheConnectionString = "file='" + КаталогБазыДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "'";
connection = cntr.Connect(TheConnectionString);
Запрос = connection.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| ПодразделенияОрганизаций.Ссылка,
| ПодразделенияОрганизаций.Наименование,
| ПодразделенияОрганизаций.Код,
| ПодразделенияОрганизаций.Родитель
|ИЗ
| Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
|ГДЕ
| НЕ ПодразделенияОрганизаций.ПометкаУдаления";
РезультатЗапроса = Запрос.Выполнить();
СпрОбъект = РезультатЗапроса.Выбрать();
ТабЗн = Новый ТаблицаЗначений;
ТабЗн.Колонки.Добавить("Ссылка");
ТабЗн.Колонки.Добавить("Код",Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(9)));
ТабЗн.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100)));
ТабЗн.Колонки.Добавить("GUID",Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
ТабЗн.Колонки.Добавить("Родитель",Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100)));
Пока СпрОбъект.Следующий() Цикл
НоваяСтрока = ТабЗн.Добавить();
НоваяСтрока.Ссылка = СпрОбъект.ref;
НоваяСтрока.Код = СпрОбъект.code;
// НоваяСтрока.Родитель = Connection.String(СпрОбъект.ref.Parent);
НоваяСтрока.Родитель = СпрОбъект.Parent.Description;
НоваяСтрока.Наименование = СпрОбъект.description;
НоваяСтрока.GUID = Connection.String(СпрОбъект.ref.UUID());
КонецЦикла;
connection = Неопределено;
ТабДог.Сортировать("Родитель Возр");
Запрос2 = новый Запрос;
Запрос2.Текст = "ВЫБРАТЬ
| Таб.Код КАК Код,
| Таб.Родитель КАК Родитель,
| Таб.Наименование КАК Наименование,
| Таб.GUID КАК GUID
|ПОМЕСТИТЬ ВТДанные
|ИЗ
| &Данные КАК Таб
|;
|
|//////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КодПроекта.GUID,
| КодПроекта.Родитель
|ПОМЕСТИТЬ ВТ_КП
|ИЗ
| Справочник.КодПроекта КАК КодПроекта
|;
|
|//////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_КП.GUID,
| ВТДанные.Код КАК Код,
| ВТДанные.Наименование КАК Наименование,
| ВТДанные.GUID КАК GUID1,
| ВТДанные.Родитель КАК Родитель
|ИЗ
| ВТДанные КАК ВТДанные
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КП КАК ВТ_КП
| ПО ВТДанные.GUID = ВТ_Дог.GUID";
Запрос2.УстановитьПараметр("Данные",ТабЗн);
Результат = Запрос2.Выполнить();
Выборка = Результат.Выбрать();
кол = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.GUID = Null Тогда
Спр = Справочники.КодПроекта.СоздатьЭлемент();
Спр.КодИзБП = Выборка.Код;
Спр.Наименование = Выборка.Наименование;
Спр.GUID = Выборка.GUID1;
Спр.Родитель = Выборка.Родитель;
Спр.Комментарий = Выборка.Родитель;
Спр.Записать();
Сообщить(Спр.Наименование);
кол = кол + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Всего загружено: " + кол + " элементов");
КонецПроцедуры
Код кнопки:
&НаСервере
Процедура ЗагрузкаКодовПроектаНаСервере()
ПодгрузкаИзБП.ПодгрузитьКодПроекта();
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузкаКодовПроекта(Команда)
ЗагрузкаКодовПроектаНаСервере();
КонецПроцедуры
Далее я сделал Решламентное задание ПодгрузкаНовыхКодовПроектаИзБП, указав Имя метода ПодгрузкаИзБП.ПодгрузитьКодПроекта и установил галочку Предопределенное, что бы мое задание появилось в списке заданий в базе. Справочник выглядит вот так:
Для того, чтобы показать таблицу Коды проекта в списке внутренних документов(ВнутренниеДокументы > ФормаСпискаСПапками), нужно изменить запрос:
В итоге получим вид:
2) Далее начальству пришла в голову мысль, чтобы у руководителей отделов на кнопке вместо согласовано было написано рассмотрено. Ок. Добавил роль ЗаменаСогласованоНаРассмотрено и изменил код двух модулей и заодно создал еще одну роль СогласоватьИСоздатьДоговор, которую прицепил к сотрудникам юр. отдела что бы только они видели кнопку Создать договор(об этом речь шла выше):
- Бизнес-Процессы --> Согласование --> форма ФормаЗадачиИсполнителя --> Модуль
// Ponomarev -->
&НаСервере
Процедура ПриОткрытииНаСервере()
Если РольДоступна("ЗаменаСогласованоНаРассмотрено") Тогда
ЭтотОбъект.Элементы.СогласованоСЗамечаниями.Заголовок = "Рассмотрено с замечаниями";
ЭтотОбъект.Элементы.Согласовано.Заголовок = "Рассмотрено";
ЭтотОбъект.Элементы.НеСогласовано.Заголовок = "Не рассмотрено";
КонецЕсли;
Если РольДоступна("СогласоватьИСоздатьДоговор") Тогда
ЭтаФорма.Элементы.ВРаботу.Видимость = Истина;
ЭтаФорма.Элементы.ГруппаРаботаСФайлами.Доступность = Истина;
ЭтаФорма.Элементы.Help.Видимость = Истина;
Иначе
ЭтаФорма.Элементы.ВРаботу.Видимость = Ложь;
ЭтаФорма.Элементы.ГруппаРаботаСФайлами.Доступность = Ложь;
ЭтаФорма.Элементы.Help.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры // <-- Ponomarev
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Оповестить("ОбновитьСписокПоследних");
Если ЭтотОбъект.Элементы.ОтменитьВыполнение.Видимость = Истина Тогда
ЭтотОбъект.Элементы.ВРаботу.Видимость = Ложь;
ЭтотОбъект.Элементы.Help.Видимость = Ложь;
КонецЕсли;
ПриОткрытииНаСервере(); // Ponomarev
КонецПроцедуры
- Задачи --> форма ЗадачиМне --> Модуль (тут делаем по аналогии)
// Ponomarev -->
&НаСервере
Процедура ПриОткрытииНаСервере()
Если РольДоступна("ЗаменаСогласованоНаРассмотрено") Тогда
ЭтотОбъект.Элементы.СогласованоСЗамечаниями.Заголовок = "Рассмотрено с замечаниями";
ЭтотОбъект.Элементы.Согласовано.Заголовок = "Рассмотрено";
ЭтотОбъект.Элементы.НеСогласовано.Заголовок = "Не рассмотрено";
КонецЕсли;
КонецПроцедуры // <-- Ponomarev
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьТекущееЗначениеГруппировкиЗадачМне();
#Если Не ВебКлиент Тогда
УстановитьАвтообновлениеФормы();
#КонецЕсли
ЗаполнитьПараметрыСохраненияКомментарияЗадачи(ЭтаФорма);
ПриОткрытииНаСервере(); // Ponomarev
КонецПроцедуры
3) Изменена форма Задачи мне – для удобства добавлена кнопка Ход согласования.
Кнопка:
&НаКлиенте
Процедура История(Команда)
Если ЭтаФорма.ТекущийЭлемент.ТекущиеДанные = НЕОПРЕДЕЛЕНО
ИЛИ ЭтотОбъект.ТекущийЭлемент.ТекущаяСтрока = 0 Тогда
Сообщить("Выберите в списке задачу. Бизнес процесс задачи не определен.");
Иначе
ЗадачаСсылка = ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока;
БизнесПроцессСсылка = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные.БизнесПроцесс;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗадачаСсылка", ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока);
ЭтаФорма.ТолькоПросмотр = Истина;
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
Если ТипЗнч(БизнесПроцессСсылка) = Тип("БизнесПроцессСсылка.Согласование") Тогда
ФРМ = ПолучитьФорму("БизнесПроцесс.Согласование.Форма.ФормаИсторияСогласования", ПараметрыФормы);
ДанныеФормы = ФРМ.ЭтотОбъект;
ФРМ.Открыть();
Иначе
Сообщить("это не Согласование, а " + ТипЗнч(БизнесПроцессСсылка));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4) Изменена форма Все задачи – добавлена информация о договоре и кнопка ход согласования(Код такой же как выше).
Для возможности добавить информацию о договоре, нужно изменить запрос(Задачи > ФормаСписка). После этого нужно добавить необходимые поля на форму. Я не стал здесь показывать что и где нужно изменить, можете скачать конфигурацию и посмотреть все изменения.
После всего этого в базе стало работать много сотрудников что отразилось на производительности. Спас web-интерфейс, благодаря которому не наблюдается тормозов 1с.
В итоге получилась вроде бы нормальная автоматизация, отвечающая утвержденному регламенту. На этом все.
Надеюсь данная статья и доработки будут кому нибудь интересны и полезны.
P.S.S. В прикрепленных файлах если кому пригодится – руководство по согласованию для новичков(потому что пришлось детально все описать для пользователей, которые 1с никогда не видели), конфигурация и две ВПФ Лист согласования(работают в ПРОФ и КОРП 2.1).
Для справки, сервер из себя представляет следующую конфигурацию:
- Intel® Core™ 2 Quad CPU Q8200 2.33 GHz; 4 Gb RAM
- Windows Server 2008 R2 Standard
- MS SQL Server 2008 + 1с 8.3.9.2170 + одна база ДО (~ 15 ГГ)
Спасибо за внимание!
Обновление 26.04.2018:
- Добавлены еще 2 печатные формы в архив для процесса(1 - заголовок берется из процесса; 2 - с колонкой срок выполнения и просрочка)
- У печатных форм добавил Размещение при регистрации и изменил имена файлов в архиве что бы не путаться.
P.S. Печатные формы на последних релизах тоже работают.