Обработчик автоматической регистрации документа 1С:Документооборот после утверждения и автозаполнения файла по шаблону

Дополнительный обрабочик для 1С:Документооборот, позволяющий выполнять автоматическую регистрацию внутреннего документа после его утверждения и автоматическое заполнение прикрепленного шаблонного файла.

Обработчик позволяет без изменения конфигурации дополнить функционал по регистрации и автозаполнению файла по шаблону.

Может рассматриваться вообще как пример использования функционала бизнес-событий 1С:Документооборота.

1. Создаем дополнительный обработчик «Автоматическая регистрация при утверждении»

// Регистрация
Задача = Событие.Источник;

Выполнять = Ложь;

Если ТипЗнч(Задача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Утверждение") Тогда
Если Задача.БизнесПроцесс.РезультатУтверждения = Перечисления.РезультатыУтверждения.Утверждено Тогда
Если Задача.Предмет <> Неопределено Тогда
Объект = Задача.Предмет.ПолучитьОбъект();

Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
Если (СокрЛП(Объект.ВидДокумента) = "Служебная записка") ИЛИ
(СокрЛП(Объект.ВидДокумента) = "Служебная записка на оплату") Тогда

Нумератор = Нумерация.ПолучитьНумераторДокумента(Объект.ВидДокумента);

Если Не ЗначениеЗаполнено(Объект.РегистрационныйНомер) Тогда
Если ЗначениеЗаполнено(Нумератор) Тогда
//Атоматическая регистрация возможна
//еще не зарегистрирован
Выполнять = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;

КонецЕсли;
КонецЕсли;

КонецЕсли;

Если Выполнять Тогда
ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь();

Объект.ДатаРегистрации = ТекущаяДатаСеанса();

// формируем числовой номер
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ВидДокумента",         Объект.ВидДокумента);
СтруктураПараметров.Вставить("Организация",          Объект.Организация);
СтруктураПараметров.Вставить("ДатаРегистрации",     Объект.ДатаРегистрации);
СтруктураПараметров.Вставить("Ссылка",                 Объект.Ссылка);

Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, Объект.ЧисловойНомер);

// формируем строковый номер
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ЧисловойНомер",         Объект.ЧисловойНомер);
СтруктураПараметров.Вставить("ДатаРегистрации",     Объект.ДатаРегистрации);
СтруктураПараметров.Вставить("ВидДокумента",         Объект.ВидДокумента);
СтруктураПараметров.Вставить("Организация",          Объект.Организация);
СтруктураПараметров.Вставить("НоменклатураДел",     Объект.НоменклатураДел);
СтруктураПараметров.Вставить("ВопросДеятельности",     Объект.ВопросДеятельности);
СтруктураПараметров.Вставить("Подразделение",         Объект.Подразделение);
СтруктураПараметров.Вставить("Корреспондент",         Объект.Корреспондент);
СтруктураПараметров.Вставить("Ссылка",                 Объект.Ссылка);

ОписанияОшибок = Новый СписокЗначений;
Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, Объект.РегистрационныйНомер, ОписанияОшибок);

Для Каждого ОписаниеОшибки Из ОписанияОшибок Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ОписаниеОшибки.Представление,,
ОписаниеОшибки.Значение,
"Объект");
КонецЦикла;


Если ЗначениеЗаполнено(Объект.РегистрационныйНомер) Тогда // успешно сформирован номер
Объект.Зарегистрировал = ТекущийПользователь;
Иначе
//Объект.ДатаРегистрации = '00010101';
КонецЕсли;

Делопроизводство.ЗаписатьСостояниеДокумента(Задача.Предмет, ТекущаяДатаСеанса(), Перечисления.СостоянияДокументов.Зарегистрирован, ТекущийПользователь);

Объект.Записать();

// автозаполнение файлов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Файлы.Ссылка
|ИЗ
|    Справочник.Файлы КАК Файлы
|ГДЕ
|    Файлы.ВладелецФайла = &ВладелецФайла
|    И Файлы.ШаблонОснованиеДляСоздания <> ЗНАЧЕНИЕ(Справочник.Файлы.ПустаяСсылка)
|    И Файлы.Редактирует = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
|    И НЕ Файлы.ПометкаУдаления";

Запрос.УстановитьПараметр("ВладелецФайла", Объект.Ссылка);

Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеВыполнения = АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца(
Истина,    Выборка.Ссылка, Истина);
КонецЦикла;
КонецЕсли;

КонецЕсли; 

Дорабатываем код согласно используемым Вами документам.

 

2. На вкладке подписки добавляем новую подписку с видом события «Задача выполнена» и этим обработчиком.

3. Включаем обработчик и проверяем по справочнику Произошедшие бизнес-события, документам, отсутствию ошибок.

Фоновое задание «Обработка произошедших бизнес-событий» должна работать.

 

Работает на Документооборот 1.2.8.1 Корп. Думаю должно работать и на других версиях.

14 Comments

  1. dpagon

    Регистрация работает, а вот с заполнение файлов беда. Релиз 1.3.1.5. При вызове функции АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца возникает ошибка:

    {ОбщийМодуль.АвтозаполнениеШаблоновФайловКлиентСервер.Модуль(60)}: Ошибка при вызове метода контекста (Add)

    Док = WordApp.Documents.Add(ПутьКФайлуНаДиске);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Недостаточно памяти. Немедленно сохраните документ.

    Насколько я понимаю проблема в том что нет доступа к каталогу ПутьКФайлуНаДиск, по факту C:UsersUSR1CV82AppDataLocalTempv8_923E_1a2.doc. Копал по настройкам DCOM, но пока бесполезно.

    Reply
  2. Killgur

    (1) dpagon,

    Надо посмотреть права к папке с файлом и еще уточнить где работает автозаполнение файла (за константа отвечающая за это). Хотя сам 1.3.1.5. пока не обновлялся.

    Reply
  3. fifka555

    (1) dpagon, как решили?

    Reply
  4. uri1978

    Спасибо за

    Задача = Событие.Источник;

    Не знал как достучаться до объекта.

    А вот процедуру регистрации документа взял с конфигурации:

    Если Выполнять Тогда
    
    Нумератор = Нумерация.ПолучитьНумераторДокумента(ДокументОбъект);
    
    Если ЗначениеЗаполнено(Нумератор) Тогда // автоматическая нумерация
    
    ДатаРегистрации = ТекущаяДата();
    ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь();
    
    ДокументОбъект.ДатаРегистрации = ДатаРегистрации;
    
    // сформируем текущий номер
    СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(ДокументОбъект);
    Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, ДокументОбъект.ЧисловойНомер);
    
    ОписанияОшибок = Новый СписокЗначений;
    СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(ДокументОбъект);
    Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, ДокументОбъект.РегистрационныйНомер, ОписанияОшибок);
    
    ДокументОбъект.Зарегистрировал = ТекущийПользователь;
    ДокументОбъект.Записать();
    
    Делопроизводство.ЗаписатьСостояниеДокумента(
    ДокументОбъект.Ссылка,
    ДатаРегистрации,
    Перечисления.СостоянияДокументов.Зарегистрирован,
    ТекущийПользователь);
    
    КонецЕсли;
    
    КонецЕсли;
    

    Показать

    Reply
  5. luda33

    А в документообороте есть автоматическая регистрация при создании внутреннего документа?

    Reply
  6. uri1978

    (5) luda33,

    По-умолчанию нет, эта статья как раз и показывает как это реализовать. Хотя я столкнулся с проблемами. Например, пользователь записывает внутренний документ и продолжает его редактирование. При этом через минуту происходит автоматическая регистрация и пользователь уже не может сохранить изменения которые он вносил.

    Reply
  7. luda33

    (6) uri1978, как так получается?

    у нас тоже — пользователи не регистрируют ничего, им это не надо — а доки оказываются зарегистрированными

    как так не знаю

    уже отключили запрет менять документы после регистрации

    а сейчас возникла необходимость регистрировать при создании документа, — что бы номер сразу при заполнении попадал в файл (из шаблона)

    видимо придется воспользоваться этим обработчиком, только не при утверждении

    Reply
  8. Killgur

    (6) uri1978,

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

    Мое применение как раз и было нацелено, что регистрация происходит когда изменения уже не нужны.

    (7) luda33,

    Посмотрите изменение состояний документа. Там есть информация о том кто и когда зарегистрировал.

    Регистрация при создании документа — скорее всего без изменения конфигурации не получится.

    Reply
  9. uri1978

    (8)

    У меня внутренний документ, который должен быть зарегистрирован, не проходит бизнес процессов. Т.е. по нему нет утверждений или согласований. Соответственно я его могу регистрировать только при записи. И по этой причине и происходит «коллизия».

    Reply
  10. graser

    на 8.3 не работает, затыкается вот здесь Объект = Задача.Предмет.ПолучитьОбъект();

    У задачи предмет описан как Список

    Reply
  11. lavdeenko

    Ошибка — 3. Включаем обработчик и проверяем по справочнику Произошедшие бизнес-события.

    Надо — 3. Включаем обработчик и проверяем по регистру сведений Произошедшие бизнес-события

    Reply
  12. Kontakt

    Ребят подскажите, когда происходит автозаполнение файла? Вроде как все настроил, проверил. Все заполняется. Когда ввожу новый документ, автозаполнение не срабатывает в файле. В файле выходят служебные теги при просмотре.

    Reply
  13. CyberBob

    (12)Автоматом, должно заполняться при записи документа. Можно ручками ткнуть на автозаполняемый файл правой кнопкой и выбрать «заполнить файл данными документа».

    Reply
  14. user780057

    1с:Документооборот 2.1 КОРП

    Привет! Кто нибудь знает как зарезервировать номер для договора,без регистрации документа? Например, есть договор который еще не подписан и не отработан, не оплачен и т.д., но клиент просит номер договора, а его соответственно еще нет.

    Идея такая делаем «Волшебную кнопку» нажимаем — резервируем номер сохраняем документ, при этом нумерация договоров продолжается со следующего номера. А этот документ доступен для редактирования. Как можно реализовать по другому, есть идеи?

    Ну и моя идея реализуема вообще?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *