---
title: Подключение к подсистеме Учет оригиналов первичных документов
slug: общие-бсп-подключение-к-подсистемам/подключение-к-подсистеме-учет-оригиналов-первичных-документов
---

## Настройка определяемых типов
Документы, являющиеся поставщиками оригиналов первичных документов, следует указать в составе определяемого типа `ОбъектСУчетомОригиналовПервичныхДокументов`

## Настройка формы списка

Формы списков, в которые должны выводиться команды учета оригиналов первичных документов, следует перечислить в процедуре `ПриОпределенииОбъектовСКомандамиУчетаОригиналов` общего модуля `УчетОригиналовПервичныхДокументовПереопределяемый`, пример:

```bsl
Процедура ПриОпределенииОбъектовСКомандамиУчетаОригиналов(СписокОбъектов) Экспорт
    СписокОбъектов.Добавить("Документ._ДемоРеализацияТоваров.Форма.ФормаСписка");
    СписокОбъектов.Добавить("Документ._ДемоПеремещениеТоваров.Форма.ФормаСписка");
    СписокОбъектов.Добавить("Обработка._ДемоЖурналУчетаОригиналовПервичныхДокументов.Форма.СписокДокументов");
КонецПроцедуры
```

## Определение печатных форм

Подсистема может отслеживать состояния первичных документов по **определенным печатным формам**. 
Необходимо определить состав печатных форм документов, для которых требуется вести учет оригиналов:
> Например, у документа `Отпуск` может быть 4 печатных формы, но только в одной требуется подпись сотрудника и, соответственно, только по ней требуется отслеживать состояние.

Документы, являющиеся поставщиками оригиналов первичных документов, и печатные формы по которым требуется отслеживание необходимо перечислить в процедуре `ЗаполнитьТаблицуУчетаОригиналовмодуля` `УчетОригиналовПервичныхДокументовПереопределяемый`, пример:

```bsl
Процедура ЗаполнитьТаблицуУчетаОригиналов(ТаблицаУчетаОригиналов) Экспорт   
    НоваяСтрока = ТаблицаУчетаОригиналов.Добавить();
    НоваяСтрока.ОбъектМетаданных = Метаданные.Документы._ДемоРеализацияТоваров;
    НоваяСтрока.Идентификатор = "РасходнаяНакладная";
КонецПроцедуры
```

Если документ подключен к подсистеме учета оригиналов и в данном переопределяемой процедуре:
- **ничего не указывать** по этому документу, то состояния будут отслеживаться **по всем печатным формам этого документа**;
- **указать печатные формы**, то состояния будут отслеживаться **только по указанным печатным формам документа**.

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">"Многосотрудниковые" документы</summary>
Поддерживается отслеживание состояний по "многосотрудниковым" документам. Пример см. документ `_ДемоОтпускаСотрудников`, в печатной форме `"Приказ о предоставлении отпуска работникам (T-6a)"` требуется подпись нескольких сотрудников (они хранятся в табличной части документа), поэтому состояния для таких документов отслеживается и в разрезе сотрудников.

Для подключения таких документов к учету оригиналов необходимо в составе определяемого типа `Сотрудник` указать соответствующие справочники. Как правило, это такие справочники, как `Физические лица`, `Сотрудники`. Необходимо определить состав документов, для которых требуется подпись нескольких сотрудников, и перечислить **их** и **наименование табличной части**, в которой хранится список сотрудников, в процедуре `ПриОпределенииМногосотрудниковыхДокументов` общего модуля `УчетОригиналовПервичныхДокументовПереопределяемый`, например:

```bsl
Процедура ПриОпределенииМногосотрудниковыхДокументов(СписокОбъектов) Экспорт    
    СписокОбъектов.Вставить(Метаданные.Документы._ДемоОтпускаСотрудников.ПолноеИмя(),"Сотрудники");
КонецПроцедуры
```

При этом, если документ подключен к подсистеме учета оригиналов и в данной переопределяемой процедуре:

- не указывать такой документ, то состояния будут отслеживаться в разрезе печатных форм, как и раньше;
- указать документ и табличную часть, то состояния будут отслеживаться по печатным формам документа в разрезе сотрудников.

</details>

## Настройка форм

Подключить формы к подсистеме `ПодключаемыеКоманды`

### Форма документа

Для подключения форм документов, в которых требуется выводить сведения о текущем состоянии оригинала первичного документа необходимо в формах документов, определенных на предыдущем шаге:

- в процедуре `ПриСозданииНаСервере` (обработчик события формы) вставить вызов по шаблону:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументов.ПриСозданииНаСервере_ФормаДокумента(ЭтотОбъект, Элемент.<ГруппаФормы>);
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов 
```
Где второй параметр `Расположение` (необязательный) - указание группы формы, в которой будет размещена декорация с данными о текущем состоянии оригинала. В противном случае, без указания параметра, декорация будет размещена в **нижнем правом углу формы**.

- в процедуре `ОбработкаОповещения` (обработчик события формы) добавить код:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументовКлиент.ОбработчикОповещенияФормаДокумента(ИмяСобытия, ЭтотОбъект);
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

- добавить вспомогательную процедуру:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
&НаКлиенте
Процедура Подключаемый_ДекорацияСостояниеОригиналаНажатие()
    УчетОригиналовПервичныхДокументовКлиент.ОткрытьМенюВыбораСостояния(ЭтотОбъект);
КонецПроцедуры
//Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

> Примеры внедрения и настройки подсистемы в формах объектов см. в документах _ДемоПеремещениеТоваров и _ДемоРеализацияТоваров.

### Форма списка

- Для основного списка установить `ПроизвольныйЗапрос` и дополнить его выборкой трех строк: `СостояниеОригиналаПервичногоДокумента`, `ОбщееСостояние`, `СостояниеОригиналПолучен`

```bsl
ВЫБРАТЬ
	...
    <ВыбираемыеПоля>
    ...,
	NULL КАК СостояниеОригиналаПервичногоДокумента,
	ИСТИНА КАК ОбщееСостояние,
	0 КАК СостояниеОригиналПолучен
ИЗ
	...
```
для этих полей установить признак `ИспользоватьВсегда`

- В обработчике события `ПриСозданииНаСервере` формы вставить вызов по шаблону:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументов.ПриСозданииНаСервере_ФормаСписка(ЭтотОбъект, Элементы.<ТаблицаФормы>, Элементы.<КолонкаДинамическогоСписка>);
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```
Где третий параметр `Расположение` (необязательный) - указание колонки динамического списка, перед которой будет размещены колонки с данными о текущем состоянии оригинала. В противном случае, без указания параметра, новые колонки **будут размещены в списке последними**. 

- В обработчике события `ОбработкаОповещения` формы добавить код:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументовКлиент.ОбработчикОповещенияФормаСписка(ИмяСобытия, ЭтотОбъект, Элементы.<ТаблицаФормы>);
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

- В обработчике события `Выбор` таблицы формы добавить код:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументовКлиент.СписокВыбор(Поле.Имя, ЭтотОбъект, Элементы.<ТаблицаФормы>, СтандартнаяОбработка);
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

- В обработчике события `ПриПолученииДанныхНаСервере` таблицы формы добавить код:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
УчетОригиналовПервичныхДокументов.ПриПолученииДанныхНаСервере(Строки); 
// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

- Добавить вспомогательные процедуры:
```bsl
// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
&НаКлиенте
Процедура Подключаемый_ОбновитьКомандыСостоянияОригинала()
    
    ОбновитьКомандыСостоянияОригинала()
   
КонецПроцедуры
&НаСервере
Процедура ОбновитьКомандыСостоянияОригинала()
    
// Код из обработчика события ПриСозданииНаСервере этой формы по подключению команд:
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    
КонецПроцедуры
//Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
```

## Оптимизация
Опционально. Для целей оптимизации производительности при открытии формы рекомендуется добавить в командную панель 
- подменю:
  -  Имя: ПодменюУстановитьНастроитьСостояниеОригинала;
  -  Заголовок: Состояние оригинала;
  -  Вид: Подменю;
  -  Отображение: Картинка и текст;
  -  Картинка: УстановитьСостояниеОригиналаПервичногоДокумента.
- группу для вывода команд установки состояния оригинала по шаблону:
  - Имя: ГруппаУстановитьОригиналПолучен;
  - Вид: Подменю;
  - Отображение: Картинка;
  - Картинка: СостояниеОригиналаПервичногоДокументаОригиналПолучен.

>Примеры внедрения и настройки подсистемы в формах списков см. в документах `_ДемоПеремещениеТоваров,` `_ДемоРеализацияТоваров` и обработке `_ДемоЖурналУчетаОригиналовПервичныхДокументов`.