Нередко возникает типовая бизнес-задача: бухгалтерии или менеджменту необходимо отслеживать фактическое поступление оригиналов первичных документов (накладных, актов, УПД). Часто оригиналы приходят с большим опозданием, когда бухгалтерский и налоговый периоды уже закрыты, а в базе установлена дата запрета изменения данных. Попытка решить эту задачу «в лоб» — добавлением реквизита непосредственно в документ — сразу наталкивается на технические ограничения платформы и архитектурные риски. Разберем подробно, почему так делать не стоит и как правильно реализовать этот механизм.
Проанализируем ситуацию, которая возникает при добавлении реквизита с типом Булево в метаданные документа:
Форма.ТолькоПросмотр = Истина. Интерактивно отредактировать флаг пользователь не сможет.ОбменДанными.Загрузка = Истина и записывает объект без проверок, документ фактически модифицируется. Это приводит к регистрации изменений в планах обмена (РИБ, синхронизация с УТ, ЗУП), что может вызвать коллизии и ошибки при передаче данных в приемники с закрытым периодом.Прежде чем приступать к доработкам конфигурации, проверим типовой функционал. В современных версиях «1С:Бухгалтерии предприятия 3.0» уже встроен готовый механизм отслеживания оригиналов первичных документов. Он реализован на базе независимого регистра сведений и справочника состояний.
Рассмотрим по шагам, как включить и настроить этот функционал:
Так как данные о состоянии оригинала хранятся в отдельном независимом регистре, изменение статуса никак не модифицирует сам проведенный документ. Следовательно, дата запрета изменения данных не блокирует операцию, а электронные подписи и синхронизация не нарушаются.
Если типовых статусов недостаточно и требуется вести учет нескольких специфических отметок (например, «Оригинал получен», «Подписанный акт возвращен», «Скан проверен»), разработаем собственное решение на базе регистра сведений. Разберем по шагам весь процесс реализации.
Шаг 1. Создание структуры метаданных
В конфигураторе добавим новый непериодический независимый регистр сведений, например, СостоянияОригиналовДокументов:
Документ с типом ссылки на нужные документы (или определяемым типом). Установим свойство Ведущее.Булево: ОригиналПолучен, АктВозвращен.Шаг 2. Отображение отметок в форме списка
В динамическом списке журнала документов откроем настройку запроса и добавим левое соединение с нашим новым регистром сведений:
ВЫБРАТЬ
ДокументРеализация.Ссылка КАК Ссылка,
ДокументРеализация.Номер КАК Номер,
ДокументРеализация.Дата КАК Дата,
ЕСТЬNULL(СостоянияОригиналов.ОригиналПолучен, ЛОЖЬ) КАК ОригиналПолучен
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияОригиналовДокументов КАК СостоянияОригиналов
ПО ДокументРеализация.Ссылка = СостоянияОригиналов.Документ
После изменения запроса выведем поле ОригиналПолучен в элементы таблицы формы списка и настроим отображение в виде флажка.
Шаг 3. Изменение признака без открытия документа
Поскольку в динамическом списке нельзя напрямую редактировать присоединенные поля по месту, добавим в командную панель списка команду (кнопку), которая будет инвертировать или устанавливать значение флага для всех выделенных строк.
Посмотрим на пример реализации клиентского и серверного методов в модуле формы списка:
&НаКлиенте
Процедура КомандаПереключитьОригинал(Команда)
МассивВыделенных = Элементы.Список.ВыделенныеСтроки;
Если МассивВыделенных.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ИзменитьПризнакОригиналаНаСервере(МассивВыделенных);
Элементы.Список.Обновить();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ИзменитьПризнакОригиналаНаСервере(МассивДокументов)
Для Каждого СсылкаДокумент Из МассивДокументов Цикл
МенеджерЗаписи = РегистрыСведений.СостоянияОригиналовДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = СсылкаДокумент;
МенеджерЗаписи.Прочитать();
// Инвертируем текущее значение или устанавливаем Истина
МенеджерЗаписи.Документ = СсылкаДокумент;
МенеджерЗаписи.ОригиналПолучен = НЕ МенеджерЗаписи.ОригиналПолучен;
МенеджерЗаписи.Записать();
КонецЦикла;
КонецПроцедуры
Выясним причину, почему данный метод надежен: процедура обращается только к объекту МенеджерЗаписи регистра сведений. Сам ДокументОбъект не считывается, не блокируется транзакцией проведения и не перезаписывается. Соответственно, проверка прав и дат запрета изменения данных документа игнорируется, так как регистр сведений не привязан к дате закрытия периода.
Таким образом, архитектурно правильным решением для фиксации любых признаков пост-обработки документов закрытых периодов является полное разделение учетных данных документа и статусной информации через регистры сведений.