Знакомство с 1С:Документооборот. История автоматизации и доработок. Печатная форма Лист согласования

22.05.20

Разработка - Механизмы типовых конфигураций

Документооборот 2.1.10.2 ПРОФ, КОРП. История автоматизации и доработок. Ввод на основании внутреннего документа из задачи согласование с переносом прикрепленных файлов(копировать и вставить файлы). ПФ Лист согласования для процесса Согласование и для справочника Внутренние документы(печатается с историей). Автоматическая загрузка справочника по com-соединению из другой базы. Печатные формы работают и на последнем релизе 2.1.20.5.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Четыре ПФ Лист согласования: для справочника ВнутренниеДокументы и для Процесса(3 шт.) с историей
.zip 63,40Kb
46
46 Скачать (1 SM) Купить за 1 850 руб.
Конфигурация с описанными изменениями и Руководство по работе с программой и процесс согласования договора
.7z 53,65Mb
18
18 Скачать (2 SM) Купить за 2 150 руб.

А) введение

Б) публикация на 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. Печатные формы на последних релизах тоже работают.

Копирование вставка и перенос файлов Документооборот Лист согласования Визы загрузка данных из другой базы по com соединению webinst

См. также

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    1738    PROSTO-1C    0    

18

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    1747    Vidz    0    

11

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1106    olja-ljaaa    0    

3

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Статистическая выборка сценариев и точек изменения отчетов на общей форме ФормаОтчета в типовых конфигурациях. Примеры кода.

03.06.2024    4891    Serg2000mr    32    

108

Механизмы типовых конфигураций Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

Продолжение темы вынесения кусков повторно-используемого кода в запрос. В прошлый раз мы сделали это с вычислением пользовательских формул. Здесь замахнулись на формулы, задаваемые пользователем запросами.

1 стартмани

11.04.2024    1058    tango    5    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. botokash 394 04.07.17 13:49 Сейчас в теме
то пришлось поискать на просторах интернета обновления

На сайте партнера 1С звучит не комильфо)
5. SPonomareff 94 05.07.17 10:28 Сейчас в теме
(1) За это извиняюсь. Но не оказалось подписки, а делать что то нужно было.
2. ilya.rudziak 34 04.07.17 14:05 Сейчас в теме
Скрины из 1.3 а какая версия БД в
"Конфигурация с описанными изменениями и Руководство по работе с программой и процесс согласования договора" ?
4. SPonomareff 94 05.07.17 10:25 Сейчас в теме
(2) Я делал все изменения на версии 2.1.10.2 ПРОФ и руководство по ней писал. Может случайно скришоты не те вставил.
6. SPonomareff 94 05.07.17 15:07 Сейчас в теме
(2) Совсем забыл написать - у конфигурации включен режим совместимости интерфейса с 8.2
3. пользователь 05.07.17 09:23
Сообщение было скрыто модератором.
...
7. user766040 14.11.17 13:27 Сейчас в теме
Приветствую! Ваша разработка будет работать в ДО 2.1.10.2 КОРП?
9. SPonomareff 94 15.11.17 12:26 Сейчас в теме
(7) Добрый день!

Разработки и печатные формы будут работать и на ПРОФ и на КОРП. На данный момент у меня работает на КОРП 2.1.11.5.
Если будут какие то вопросы, то пишите. С радостью помогу.
8. CyberBob 4 15.11.17 11:59 Сейчас в теме
Особенно понравилась кнопка "Не рассмотрено".)
10. rti30 25.04.18 11:55 Сейчас в теме
SPonomareff,
Платформа 8.3.10.2580, редакция 2.1.11.5, режим совместимости 8.3.8 на поддержке. Будут внешние ПФ формы листа согласования открываться? ФормуЗадачиИсполнителя и изменения в Общем модуле вы через "расширение" реализовали?
13. SPonomareff 94 26.04.18 10:23 Сейчас в теме
(10) Добрый день!

Только что все перепроверил. В типовой конфигурации печатные формы работают.

Думаю над расширением.
11. SPonomareff 94 25.04.18 21:48 Сейчас в теме
Добрый вечер!

Все было реализовано именно изменением типовой конфигурации и до сих пор продолжает работать.

Печатные формы протестирую с Вашей конфигурацией и если что подкорректирую и завтра сообщю. Вообще должно все работать если убрать вывод в ПФ табличную часть Код проекта.

Я давно хотел сделать именно расширение. Если подождете, то я в майские праздники( или до них) попробую сделать расширение.
12. SPonomareff 94 25.04.18 21:56 Сейчас в теме
Хотя нет. Должно все работать и так! Я не выкладывал ПФ с учетом изменений. Но все равно завтра проверю.
14. user636714_elizarov.aleksey 25.05.18 18:07 Сейчас в теме
у меня начальство подобный "ход согласования" требует. и найти не могу кто бы взялся. пример того что нужно сделать




или может у кого есть готовый вариант. куплю!)))

код как по мне так слишком замудреный в ДО
15. SPonomareff 94 25.05.18 21:17 Сейчас в теме
Доброго времени суток!
Через час смогу посмотреть и сразу отвечу.
16. Gorislav 21.05.20 19:36 Сейчас в теме
Добрый вечер. В последнем релизе ДО печатные формы также работают?
17. SPonomareff 94 21.05.20 23:05 Сейчас в теме
(16) Добрый вечер!
Завтра поставлю последний релиз ДО и посмотрю. Если что не работает, то переделаю.
18. SPonomareff 94 22.05.20 09:46 Сейчас в теме
(16)
Доброе утро!
На релизе 2.1.20.5 все работает, проверил.
19. yurikmellon 6 07.07.20 11:16 Сейчас в теме
(18) Добрый день.
Скачал Ваши печатные формы и столкнулся с проблемой. В web-интерфейсе они не заработали. Формы, которые печатаются из процесса намертво вешают приложение. А форма для справочника Внутренние документы просто не формируется с сообщением "Печатная форма недоступна". Есть какие то особенности с работой этих внешних печатных форм через браузер?
З.Ы. Платформа 8.3.16.1063 Документооборот КОРП 2.1.14.4
20. SPonomareff 94 23.07.20 21:43 Сейчас в теме
(19) Добрый день!
Прошу прощения за долгий ответ.
Проблем не было с веб-интерфейсом точно, но платформа была при тестировании в веб-интерфейсе намного ниже 8.3.16. Возможно дело в этом. Проверю в выходные и отпишусь Вам.
21. zabaluev 464 06.07.22 08:39 Сейчас в теме
Ошибка в ПФ:

Запрос невозможно исполнить
В условиях соединения запроса не допускается обращение к табличным частям. (1)
{ВнешняяОбработка.ЛистСогласованияЗаголовокПроцесса.МодульОбъекта(211)}: Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
{ВнешняяОбработка.ЛистСогласованияЗаголовокПроцесса.МодульОбъекта(94)}: УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
{ОбщийМодуль.УправлениеПечатью.Модуль(1652)}: ВнешняяОбработкаОбъект.Печать(
{ОбщаяФорма.ПечатьДокументов.Форма(517)}: УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
{ОбщаяФорма.ПечатьДокументов.Форма(43)}: КоллекцияПечатныхФорм = СформироватьПечатныеФормы(Параметры.ИменаМакетов, Отказ);
{ОбщийМодуль.УправлениеПечатьюСлужебныйКлиент.Модуль(236)}: ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, Форма);
{ОбщийМодуль.УправлениеПечатьюКлиент.Модуль(143)}: ВыполнитьОбработкуОповещения(ОписаниеПроцедурыЗавершения, СписокДокументов);
{ОбщийМодуль.УправлениеПечатьюСлужебныйКлиент.Модуль(32)}: УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыНазначения, Форма);
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(482)}: МодульУправлениеПечатьюСлужебныйКлиент.ВыполнитьОткрытиеПечатнойФормы(
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(260)}: ВыполнитьОткрытиеПечатнойФормы(ВыполняемаяКоманда, Форма, ВыполняемаяКоманда.ОбъектыПечати);
{ОбщийМодуль.УправлениеПечатьюСлужебныйКлиент.Модуль(95)}: МодульДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуПечати(ОписаниеКоманды, Форма);
{ОбщийМодуль.УправлениеПечатьюСлужебныйКлиент.Модуль(20)}: ВыполнитьПодключаемуюКомандуПечатиЗавершение(Истина, ПараметрыВыполнения);
{ОбщийМодуль.ПодключаемыеКомандыКлиент.Модуль(251)}: ВыполнитьОбработкуОповещения(Обработчик, ПараметрКоманды);
{ОбщийМодуль.ПодключаемыеКомандыКлиент.Модуль(64)}: ПродолжитьВыполнениеКоманды(ПараметрыВыполнения);
{Справочник.ВнутренниеДокументы.Форма.ФормаЭлемента.Форма(6330)}: ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);

по причине:
Ошибка выполнения запроса
по причине:
Запрос невозможно исполнить
В условиях соединения запроса не допускается обращение к табличным частям. (1)

1С:Предприятие 8.3 (8.3.18.1661)
Документооборот 8 КОРП, редакция 2.1 (2.1.29.17)
22. SPonomareff 94 26.07.22 23:39 Сейчас в теме
(21) Добрый день!
Для релиза 2.1.29.17 видимо нужно дорабатывать. Сейчас на это нет времени.
Оставьте свое сообщение