Вебинар | День открытых дверей Клуба Академии Документооборота | 31 июля в 15:00 Подробнее →
Вебинар | День открытых дверей Клуба Академии Документооборота | 31 июля в 15:00 Подробнее →
Вебинар | День открытых дверей Клуба Академии Документооборота | 31 июля в 15:00 Подробнее →
Главная → База знаний → ЮЗЭДО и электронные подписи → Как избежать появления дублирующихся документов при интеграции Контур.Диадок с 1С:Документооборот
Как избежать появления дублирующихся документов при интеграции Контур.Диадок с 1С:Документооборот
Авторы: Данир Аллабердин и Виктория Буркова | Опубликовано: 24 июля 2026 | 🕐 ~11 мин.чтения
Многие организации используют операторов ЭДО, например Контур.Диадок, для обмена юридически значимыми электронными документами. Чтобы сотрудники могли выполнять все операции в одном интерфейсе, компании все чаще стремятся организовать работу с такими документами непосредственно в 1С:Документооборот.
Именно такую возможность предоставляет Академическая ГиперИнтеграция ЭДО (АГИ) — решение, которое позволяет работать с различными операторами электронного документооборота непосредственно из 1С:Документооборот. Сегодня АГИ используется во многих организациях. Одни компании внедряют продукт самостоятельно, используя наши инструкции, другие обращаются к специалистам Академии за помощью в рамках проекта внедрения.
Практика показывает, что каждый проект имеет свои особенности. Иногда заказчики ставят задачи, которые выходят за рамки типового сценария работы. Если найденное решение оказывается полезным для большинства пользователей, мы включаем его в стандартную поставку продукта.
В этой статье рассмотрим именно такой пример. На одном из проектов мы столкнулись со следующей ситуацией. К моменту получения подписанного документа (например, договора с поставщиком) через Контур.Диадок в 1С:Документооборот уже существовала карточка этого документа — ее заранее создавали для согласования до подписания. Это нормальный рабочий сценарий.
Однако реквизиты карточки, созданной в 1С:Документооборот, могли отличаться от реквизитов документа, поступившего через Контур.Диадок. В результате система не могла автоматически сопоставить эти документы и создавала новую карточку. Так в системе появлялись дубли, что усложняло дальнейшую работу пользователей.
Разберем, почему возникает такая ситуация, почему полностью автоматическое объединение документов не всегда возможно, и как был реализован этот механизм. Впоследствии он вошел в стандартную поставку Академической ГиперИнтеграции ЭДО (АГИ).
Содержание
Почему появляются дубли документов при интеграции
Почему отказались от автоматического объединения и как решили эту задачу
Как реализовано объединение документов
Настройка решения в 1С:Документооборот
Шаг 1. Добавление дополнительного реквизита
Шаг 2. Создание бизнес-события
Шаг 3. Создание детектора бизнес-события
Шаг 4. Доработка Академической ГиперИнтеграции ЭДО
Как работает пользователь после настройки
Приложение 1. Скрипт обработчика бизнес-события
Скрипт обработчика для 1С:Документооборот 2.1
Скрипт обработчика для 1С:Документооборот 3.0
Приложение 2. Скрипт детектора бизнес-события
Скрипт детектора для 1С:Документооборот 2.1
Почему появляются дубли документов при интеграции
Клиент планировал использовать Академическую ГиперИнтеграцию ЭДО (АГИ) для интеграции 1С:Документооборот с оператором Контур.Диадок при работе в редакции 2.1. Описанный в статье подход также применим к редакции 3.0.
На момент реализации проекта стандартный сценарий работы АГИ с исходящими документами предусматривал подписание и отправку документов через Контур.Диадок непосредственно из карточки документа в 1С:Документооборот, а также получение информации о состоянии электронного документооборота.
При получении входящего документа от контрагента через Контур.Диадок АГИ автоматически создавала соответствующую карточку в 1С:Документооборот. Такой сценарий был логичным и полностью устраивал предыдущие проекты.
Однако у данного заказчика входящий документ мог уже существовать в системе к моменту его получения через Контур.Диадок. В результате создавалась еще одна карточка того же документа, и в 1С:Документооборот появлялись дубли.
Возникла необходимость объединять входящий документ, полученный через Контур.Диадок, с уже существующей карточкой в 1С:Документооборот, сохраняя при этом файлы, электронные подписи и возможность дальнейшей работы через Контур.Диадок.
Почему отказались от автоматического объединения и как решили эту задачу
На первый взгляд может показаться, что документы можно сопоставлять автоматически. Однако такой подход не гарантирует корректный результат.
Мы не можем гарантировать правильность автоматического сопоставления входящих документов. На практике достаточно часто встречаются ситуации, когда номер документа в 1С:Документооборот отличается от номера документа, полученного через Контур.Диадок. Кроме того, в карточке документа в 1С:Документооборот может быть заполнена сумма, тогда как в документе, поступившем через оператора ЭДО, она отсутствует. В подобных случаях автоматически сопоставить документы невозможно, в результате система создаст новую карточку документа в 1С:Документооборот.
Именно поэтому было принято решение отказаться от полностью автоматического объединения документов.
После анализа задачи аналитик и программист предложили решение, которое впоследствии было согласовано с заказчиком.
Вместо полностью автоматического объединения было решено предоставить пользователю возможность самостоятельно указать документ 1С:Документооборот, с которым необходимо объединить документ, полученный через Контур.Диадок.
Такой подход позволил сохранить контроль за сопоставлением документов и исключить вероятность их ошибочного объединения.
После этого все остальные действия система выполняет автоматически:
- переносит полученные файлы;
- переносит электронные подписи;
- перепривязывает идентификатор документа;
- выполняет необходимые изменения для дальнейшей корректной работы через Контур.Диадок.
Таким образом, пользователь участвует только в принятии решения о сопоставлении документов, а все последующие действия система выполняет автоматически. Такой подход практически исключает вероятность ошибочного объединения документов и при этом не усложняет работу пользователей.
Как реализовано объединение документов
При реализации решения мы, как и в большинстве проектов, стремились максимально использовать типовой функционал 1С:Документооборот. Это позволило избежать изменений в самой конфигурации системы: все необходимые доработки были выполнены только в Академической ГиперИнтеграции ЭДО.
В результате решение удалось реализовать с использованием стандартных инструментов 1С:Документооборот и небольшой доработки расширения АГИ.
В основе механизма лежит следующий принцип:
Пользователь определяет, что полученный через Контур.Диадок документ уже существует в системе.
Указывает существующую карточку документа, с которой необходимо выполнить объединение.
Система автоматически переносит файлы, электронные подписи и выполняет перепривязку идентификатора документа для дальнейшей работы через Контур.Диадок.
Далее рассмотрим, какие настройки потребовалось выполнить для реализации этого сценария.
Настройка решения в 1С:Документооборот
Для использования описанного сценария достаточно выполнить несколько настроек в 1С:Документооборот. Все необходимые изменения в Академической ГиперИнтеграции ЭДО уже включены в стандартную поставку.
Шаг 1. Добавление дополнительного реквизита
В вид документа, используемый для входящих документов из Контур.Диадок, был добавлен дополнительный реквизит «Переместить в договорный документ» с типом значения «Внутренний документ».
Если вы планируете использовать приведенные в статье скрипты, сразу задайте для реквизита имя разработчика ПереместитьВДоговорныйДокумент.
Настройка дополнительного реквизита для выбора существующего документа.
Этот реквизит позволяет пользователю указать существующий документ 1С:Документооборот, с которым необходимо объединить полученный через Контур.Диадок документ.
Шаг 2. Создание бизнес-события
Далее был создан вид бизнес-события «Переместить в договорный документ».
Для этого бизнес-события был добавлен дополнительный обработчик.
Именно этот обработчик выполняет все необходимые действия по переносу данных и изменению реквизитов, обеспечивая дальнейшую корректную работу документа через Контур.Диадок.
Текст скрипта для 1С:Документооборот редакций 2.1 и 3.0 приведен в Приложении 1.
Шаг 3. Создание детектора бизнес-события
Следующим этапом был создан детектор бизнес-события, реагирующий на заполнение дополнительного реквизита во входящем документе.
Именно этот детектор запускает процедуру объединения документов.
Текст скрипта для редакций 2.1 и 3.0 приведен в Приложении 2.
Шаг 4. Доработка Академической ГиперИнтеграции ЭДО
На завершающем этапе была доработана Академическая ГиперИнтеграция ЭДО. Изменения касались переноса файлов входящего документа из Контур.Диадок, включая электронные подписи, а также перепривязки идентификатора документа для дальнейшего корректного взаимодействия с оператором ЭДО.
На сегодняшний день эта доработка уже включена в стандартную поставку АГИ, поэтому данный сценарий можно использовать без дополнительной разработки — достаточно выполнить описанную выше настройку.
Как работает пользователь после настройки
После выполнения описанных настроек необходимо ознакомить пользователей с новым сценарием работы. При этом для пользователя процесс объединения документов остается максимально простым и практически не отличается от привычной работы.
Входящий документ (в нашем примере — с видом «Договор»), полученный через Контур.Диадок, автоматически загружается в 1С:Документооборот с помощью Академической ГиперИнтеграции ЭДО и создается в виде отдельной карточки документа. Если соответствующий документ уже существует в системе, пользователь может объединить эти карточки, используя описанный механизм.
Пользователю необходимо открыть созданную карточку документа и заполнить дополнительный реквизит «Переместить в договорный документ», указав внутренний документ 1С:Документооборот, с которым требуется выполнить объединение.
Это единственное дополнительное действие, которое необходимо выполнить пользователю.
Если пользователь считает, что соответствующего документа в системе нет, дополнительный реквизит заполнять не требуется. В этом случае объединение выполняться не будет, а документ продолжит обрабатываться по стандартному сценарию.
После того как пользователь укажет документ для объединения, регламентное задание обработает изменения: детектор зафиксирует бизнес-событие, а дополнительный обработчик выполнит перенос файлов, электронных подписей и перепривязку идентификатора документа.
После этого дальнейшая работа с документом ничем не отличается от стандартного сценария. Подписание, отправка документов и получение информации о состоянии обмена через Контур.Диадок будут выполняться уже для документа, с которым было произведено объединение.
Если в организации используется Академическое ГиперРасширение для 1С:Документооборот (АГР), дополнительно можно настроить НДПС для данного реквизита (в том числе в редакции 2.1). Это позволяет снизить вероятность случайного указания неверного документа при объединении.
При необходимости скрипт обработчика можно дополнить и другими действиями, например автоматически помечать карточку-дубль на удаление или корректировать отдельные реквизиты документа.
Итоги проекта
В рамках данного проекта был реализован новый сценарий работы Академической ГиперИнтеграции ЭДО, позволяющий объединять входящие документы, полученные через Контур.Диадок, с уже существующими документами в 1С:Документооборот.
После успешной реализации решение было включено в стандартную поставку АГИ и теперь доступно всем пользователям продукта как для 1С:Документооборот редакции 2.1, так и для редакции 3.0.
Для использования данного сценария достаточно выполнить описанную в статье настройку 1С:Документооборот. Для удобства пользователей в приложениях приведены готовые скрипты для редакций 2.1 и 3.0.
Если у вас возникнут вопросы по настройке или применению описанного решения, специалисты Академии Документооборота готовы помочь с его внедрением и адаптацией под особенности вашей организации.
Приложение 1. Скрипт обработчика бизнес-события
Ниже приведен текст скрипта дополнительного обработчика бизнес-события, выполняющего объединение документов. Скрипт подготовлен для 1С:Документооборот редакций 2.1 и 3.0 и может использоваться в качестве основы при настройке аналогичного сценария.
Скрипт обработчика для 1С:Документооборот 2.1
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 РАЗЛИЧНЫЕ ВнутренниеДокументыДР.Ссылка КАК Документ, ВнутренниеДокументы.Ссылка КАК НовыйДокумент |ИЗ | Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ВнутренниеДокументыДР | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы | ПО ВнутренниеДокументы.Ссылка = ВнутренниеДокументыДР.Значение | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Диадок_Документы КАК Диадок_Документы | ПО ВнутренниеДокументыДР.Ссылка = Диадок_Документы.Документ |ГДЕ НЕ ВнутренниеДокументыДР.Ссылка.ПометкаУдаления | И ВнутренниеДокументыДР.Свойство.Имя = ""ПереместитьВДоговорныйДокумент"""; //Результат = НЕ Запрос.Выполнить().Пустой(); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Документ = ВыборкаДетальныеЗаписи.Документ; НовыйДокумент = ВыборкаДетальныеЗаписи.НовыйДокумент; ДокументДД = Неопределено; Если ЗначениеЗаполнено(НовыйДокумент) тогда Выборка = Справочники.Диадок_ПакетыДокументов.Выбрать(,, Новый Структура("Документ", Документ)); Пока Выборка.Следующий() цикл Об = Выборка.ПолучитьОбъект(); Об.Документ = НовыйДокумент; Об.Записать(); КонецЦикла; Выборка = Справочники.Диадок_Документы.Выбрать(,, Новый Структура("Документ", Документ)); Пока Выборка.Следующий() цикл Об = Выборка.ПолучитьОбъект(); Об.Документ = НовыйДокумент; Об.Записать(); ДокументДД = Выборка.Ссылка; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Файлы.Ссылка КАК Ссылка |ИЗ | Справочник.Файлы КАК Файлы |ГДЕ | Файлы.ВладелецФайла = &ВладелецФайла"; Запрос.УстановитьПараметр("ВладелецФайла", Документ); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Об = Выборка.Ссылка.ПолучитьОбъект(); Об.ВладелецФайла = НовыйДокумент; Об.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); Об.Записать(); КонецЦикла; Если ЗначениеЗаполнено(ДокументДД) тогда РегистрыСведений.СостояниеДокументовПоЭДО.Удалить(Документ); НаимПеречисления = "СостоянияЭДОДокументооборот"; Если Метаданные.Перечисления.Найти("СостоянияВерсийЭДДО") <> Неопределено тогда НаимПеречисления = "СостоянияВерсийЭДДО"; КонецЕсли; Если Метаданные.Перечисления.Найти("СостоянияДокументовЭДО") <> Неопределено тогда НаимПеречисления = "СостоянияДокументовЭДО"; КонецЕсли; СостояниеЭДО = Неопределено; НовыеДанныеСостояния = РегистрыСведений.СостояниеДокументовПоЭДО.НовыеДанныеСостоянияДляДобавления(); НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОбменЗавершен; НовыеДанныеСостояния.Направление = Перечисления.НаправленияЭДО.Исходящий; Если ДокументДД.Направление = "Входящее" тогда НовыеДанныеСостояния.Направление = Перечисления.НаправленияЭДО.Входящий; КонецЕсли; Если ДокументДД.Статус = "Требуется подписать и отправить" тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяОтправка; ИначеЕсли СтрНайти(ДокументДД.Статус, "Требуется подпись") > 0 тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; ИначеЕсли ДокументДД.Статус = "Ожидается подпись контрагента" ИЛИ ДокументДД.Статус = "Ожидается подпись контрагента. Ожидается извещение о получении" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Отправлен; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; ИначеЕсли СтрНайти(ДокументДД.Статус, "Отказано в подписи контрагенту") = 1 тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ЗакрытСОтклонением; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ЗакрытСОтклонениемПриглашения; ИначеЕсли ДокументДД.Статус = "Контрагент отказал в подписи" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОтклоненПолучателем; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ЗакрытСОтклонениемПриглашения; ИначеЕсли ДокументДД.Статус = "Ожидается аннулирование" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОжидаетсяПодтверждениеАннулирования; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ОжидаетсяПодтверждениеАннулирования; ИначеЕсли ДокументДД.Статус = "Требуется аннулирование" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ТребуетсяАннулировать; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписаниеАннулирования; ИначеЕсли ДокументДД.Статус = "Требуется подписать извещение" тогда РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); ИначеЕсли ДокументДД.Статус = "Подписан" ИЛИ ДокументДД.Статус = "Подписан. Требуется подписать извещение" //ИЛИ //ДокументДД.Статус = "Подписан контрагентом" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Подписан; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; ИначеЕсли ДокументДД.Статус = "Аннулирован" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Аннулирован; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].Аннулирован; ИначеЕсли //ДокументДД.Статус = "Подписан" ДокументДД.Статус = "Документооборот завершен" ИЛИ ДокументДД.Статус = "Подписан контрагентом" тогда Если ДокументДД.Статус = "Подписан контрагентом" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Подписан; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); КонецЕсли; Если ДокументДД.Статус = "Документооборот завершен" тогда //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.ОбменЗавершен; СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; Иначе Если ДокументДД.Направление = "Входящее" тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.Подписан; Иначе //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.ОбменЗавершен; СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; КонецЕсли; КонецЕсли; КонецЕсли; НЗ = РегистрыСведений.ДанныеВнутреннихДокументов.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(Документ); НЗ.Прочитать(); Если НЗ.Количество() = 1 тогда НЗ.Получить(0).СостояниеЭДО = Перечисления[НаимПеречисления].ПустаяСсылка(); КонецЕсли; НЗ.Записать(); Если ЗначениеЗаполнено(СостояниеЭДО) тогда НЗ = РегистрыСведений.ДанныеВнутреннихДокументов.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(НовыйДокумент); НЗ.Прочитать(); Если НЗ.Количество() = 1 тогда НЗ.Получить(0).СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяОтправка; КонецЕсли; НЗ.Записать(); КонецЕсли; НЗ = РегистрыСведений.Диадок_ОчередьОбновленияДанных.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(ДокументДД); НЗ.Прочитать(); Если НЗ.Количество() = 0 тогда Стр = НЗ.Добавить(); Стр.Документ = ДокументДД; Стр.Дата = ТекущаяДата(); НЗ.Записать(Истина); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
Скрипт обработчика для 1С:Документооборот 3.0
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 РАЗЛИЧНЫЕ ДокументыПредприятияДР.Ссылка КАК Документ, ДокументыПредприятия.Ссылка КАК НовыйДокумент |ИЗ | Справочник.ДокументыПредприятия.ДополнительныеРеквизиты КАК ДокументыПредприятияДР | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДокументыПредприятия КАК ДокументыПредприятия | ПО ДокументыПредприятия.Ссылка = ДокументыПредприятияДР.Значение | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Диадок_Документы КАК Диадок_Документы | ПО ДокументыПредприятияДР.Ссылка = Диадок_Документы.Документ |ГДЕ НЕ ДокументыПредприятияДР.Ссылка.ПометкаУдаления | И ДокументыПредприятияДР.Свойство.Имя = ""ПереместитьВДоговорныйДокумент"""; //Результат = НЕ Запрос.Выполнить().Пустой(); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Документ = ВыборкаДетальныеЗаписи.Документ; НовыйДокумент = ВыборкаДетальныеЗаписи.НовыйДокумент; ДокументДД = Неопределено; Если ЗначениеЗаполнено(НовыйДокумент) тогда Выборка = Справочники.Диадок_ПакетыДокументов.Выбрать(,, Новый Структура("Документ", Документ)); Пока Выборка.Следующий() цикл Об = Выборка.ПолучитьОбъект(); Об.Документ = НовыйДокумент; Об.Записать(); КонецЦикла; Выборка = Справочники.Диадок_Документы.Выбрать(,, Новый Структура("Документ", Документ)); Пока Выборка.Следующий() цикл Об = Выборка.ПолучитьОбъект(); Об.Документ = НовыйДокумент; Об.Записать(); ДокументДД = Выборка.Ссылка; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Файлы.Ссылка КАК Ссылка |ИЗ | Справочник.Файлы КАК Файлы |ГДЕ | Файлы.ВладелецФайла = &ВладелецФайла"; Запрос.УстановитьПараметр("ВладелецФайла", Документ); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Об = Выборка.Ссылка.ПолучитьОбъект(); Об.ВладелецФайла = НовыйДокумент; Об.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); Об.Записать(); КонецЦикла; Если ЗначениеЗаполнено(ДокументДД) тогда РегистрыСведений.СостояниеДокументовПоЭДО.Удалить(Документ); НаимПеречисления = "СостоянияЭДОДокументооборот"; Если Метаданные.Перечисления.Найти("СостоянияВерсийЭДДО") <> Неопределено тогда НаимПеречисления = "СостоянияВерсийЭДДО"; КонецЕсли; Если Метаданные.Перечисления.Найти("СостоянияДокументовЭДО") <> Неопределено тогда НаимПеречисления = "СостоянияДокументовЭДО"; КонецЕсли; СостояниеЭДО = Неопределено; НовыеДанныеСостояния = РегистрыСведений.СостояниеДокументовПоЭДО.НовыеДанныеСостоянияДляДобавления(); НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОбменЗавершен; НовыеДанныеСостояния.Направление = Перечисления.НаправленияЭДО.Исходящий; Если ДокументДД.Направление = "Входящее" тогда НовыеДанныеСостояния.Направление = Перечисления.НаправленияЭДО.Входящий; КонецЕсли; Если ДокументДД.Статус = "Требуется подписать и отправить" тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяОтправка; ИначеЕсли СтрНайти(ДокументДД.Статус, "Требуется подпись") > 0 тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; ИначеЕсли ДокументДД.Статус = "Ожидается подпись контрагента" ИЛИ ДокументДД.Статус = "Ожидается подпись контрагента. Ожидается извещение о получении" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Отправлен; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; ИначеЕсли СтрНайти(ДокументДД.Статус, "Отказано в подписи контрагенту") = 1 тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ЗакрытСОтклонением; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ЗакрытСОтклонениемПриглашения; ИначеЕсли ДокументДД.Статус = "Контрагент отказал в подписи" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОтклоненПолучателем; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ЗакрытСОтклонениемПриглашения; ИначеЕсли ДокументДД.Статус = "Ожидается аннулирование" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ОжидаетсяПодтверждениеАннулирования; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ОжидаетсяПодтверждениеАннулирования; ИначеЕсли ДокументДД.Статус = "Ожидается аннулирование" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.ТребуетсяАннулировать; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписаниеАннулирования; ИначеЕсли ДокументДД.Статус = "Требуется подписать извещение" тогда РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); ИначеЕсли ДокументДД.Статус = "Подписан" ИЛИ ДокументДД.Статус = "Подписан. Требуется подписать извещение" //ИЛИ //ДокументДД.Статус = "Подписан контрагентом" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Подписан; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; ИначеЕсли ДокументДД.Статус = "Аннулирован" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Аннулирован; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); СостояниеЭДО = Перечисления[НаимПеречисления].Аннулирован; ИначеЕсли //ДокументДД.Статус = "Подписан" ДокументДД.Статус = "Документооборот завершен" ИЛИ ДокументДД.Статус = "Подписан контрагентом" тогда Если ДокументДД.Статус = "Подписан контрагентом" тогда НовыеДанныеСостояния.Состояние = Перечисления.СостоянияЭДОДокументооборот.Подписан; РегистрыСведений.СостояниеДокументовПоЭДО.Добавить(НовыйДокумент, НовыйДокумент.Контрагент, НовыеДанныеСостояния); КонецЕсли; Если ДокументДД.Статус = "Документооборот завершен" тогда //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.ОбменЗавершен; СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; Иначе Если ДокументДД.Направление = "Входящее" тогда СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяПодписание; //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.Подписан; Иначе //СостояниеЭДО = Перечисления.СостоянияВерсийЭДДО.ОбменЗавершен; СостояниеЭДО = Перечисления[НаимПеречисления].ОбменЗавершен; КонецЕсли; КонецЕсли; КонецЕсли; НЗ = РегистрыСведений.ДанныеДокументовПредприятия.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(Документ); НЗ.Прочитать(); Если НЗ.Количество() = 1 тогда НЗ.Получить(0).СостояниеЭДО = Перечисления[НаимПеречисления].ПустаяСсылка(); КонецЕсли; НЗ.Записать(); Если ЗначениеЗаполнено(СостояниеЭДО) тогда НЗ = РегистрыСведений.ДанныеДокументовПредприятия.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(НовыйДокумент); НЗ.Прочитать(); Если НЗ.Количество() = 1 тогда НЗ.Получить(0).СостояниеЭДО = Перечисления[НаимПеречисления].ТребуетсяОтправка; КонецЕсли; НЗ.Записать(); КонецЕсли; НЗ = РегистрыСведений.Диадок_ОчередьОбновленияДанных.СоздатьНаборЗаписей(); НЗ.Отбор.Документ.Установить(ДокументДД); НЗ.Прочитать(); Если НЗ.Количество() = 0 тогда Стр = НЗ.Добавить(); Стр.Документ = ДокументДД; Стр.Дата = ТекущаяДата(); НЗ.Записать(Истина); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
Приложение 2. Скрипт детектора бизнес-события
Ниже приведен текст скрипта детектора бизнес-события, реагирующего на заполнение дополнительного реквизита и запускающего процедуру объединения документов. Скрипт подготовлен для 1С:Документооборот редакций 2.1 и 3.0.
Скрипт детектора для 1С:Документооборот 2.1
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 РАЗЛИЧНЫЕ ВнутренниеДокументыДР.Ссылка КАК Документ, ВнутренниеДокументы.Ссылка КАК НовыйДокумент |ИЗ | Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ВнутренниеДокументыДР | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы | ПО ВнутренниеДокументы.Ссылка = ВнутренниеДокументыДР.Значение | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Диадок_Документы КАК Диадок_Документы | ПО ВнутренниеДокументыДР.Ссылка = Диадок_Документы.Документ |ГДЕ НЕ ВнутренниеДокументыДР.Ссылка.ПометкаУдаления | И ВнутренниеДокументыДР.Свойство.Имя = ""ПереместитьВДоговорныйДокумент"""; Результат = НЕ Запрос.Выполнить().Пустой();
Скрипт детектора для 1С:Документооборот 3.0
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 РАЗЛИЧНЫЕ ДокументыПредприятияДР.Ссылка КАК Документ, ДокументыПредприятия.Ссылка КАК НовыйДокумент |ИЗ | Справочник.ДокументыПредприятия.ДополнительныеРеквизиты КАК ДокументыПредприятияДР | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДокументыПредприятия КАК ДокументыПредприятия | ПО ДокументыПредприятия.Ссылка = ДокументыПредприятияДР.Значение | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Диадок_Документы КАК Диадок_Документы | ПО ДокументыПредприятияДР.Ссылка = Диадок_Документы.Документ |ГДЕ НЕ ДокументыПредприятияДР.Ссылка.ПометкаУдаления | И ДокументыПредприятияДР.Свойство.Имя = ""ПереместитьВДоговорныйДокумент"""; Результат = НЕ Запрос.Выполнить().Пустой();
Другие статьи
Добавление сертификата электронной подписи в 1С:Документооборот для работы с ЭДО. Как настроить сертификат и где проверить его статус в системе.
Зачем проверять подпись? ПЭП, УКЭП и УНЭП — не просто разные аббревиатуры. Без правильного выбора ЭП сделки не состоятся. Вся правда о типах электронных подписей — и почему без них любой бизнес обречён на провал.
авторизуйтесь