При регистрации первичных документов, в частности документов СчетФактураПолученный, нередко возникает ситуация, когда пользователи повторно вводят один и тот же документ с одинаковым входящим номером и датой от контрагента. В результате в книге покупок данные могут задваиваться или сворачиваться некорректно. Разберем возможные способы реализации контроля правильности заполнения «на лету» без вмешательства в типовой код конфигурации, а также технические ограничения платформы 1С:Предприятие.
Если информационная база работает на современной платформе и не использует устаревшие режимы совместимости, наиболее удобным и чистым способом перехвата логики является механизм расширений.
Разберем по шагам, как перехватить процедуру проверки перед записью:
СчетФактураПолученный.ПередЗаписью с помощью аннотации &Перед или &Вместо.Ограничения механизма: данный вариант применим только в том случае, если режим совместимости конфигурации позволяет использовать расширения модулей (версия 8.3.9 и выше). Для устаревших конфигураций (например, 1С:УПП 1.3 или КА 1.1), работающих в режиме совместимости с платформой 8.2.15, отключение режима совместимости приводит к синтаксическим ошибкам и неработоспособности интерфейса (в частности, конфликтам неуникальных имен в коллекции ОбщиеКартинки).
Если база находится на официальной поддержке поставщика, но механизм расширений использовать невозможно из-за режима совместимости, оптимальным решением является частичное включение возможности изменения.
Проанализируем преимущества этого подхода:
ПередЗаписью или ОбработкаПроведения источника ДокументОбъект.СчетФактураПолученный).Отказ = Истина и выводим пользователю предупреждающее сообщение через ОбщегоНазначенияКлиентСервер.СообщитьПользователю.Поскольку типовые модули и формы не изменяются, при последующих типовых обновлениях конфигурации процедура сравнения и объединения проходит в полностью автоматическом режиме без конфликтов.
Рассмотрим пример запроса, который позволяет найти задвоенные входящие номера по контрагенту и организации, исключая текущий документ при проверке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СФ.Ссылка КАК Ссылка,
| СФ.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
| СФ.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента
|ИЗ
| Документ.СчетФактураПолученный КАК СФ
|ГДЕ
| СФ.Организация = &Организация
| И СФ.Контрагент = &Контрагент
| И СФ.НомерВходящегоДокумента = &НомерВходящегоДокумента
| И СФ.ДатаВходящегоДокумента = &ДатаВходящегоДокумента
| И СФ.Ссылка <> &ТекущийДокумент
| И СФ.Проведен = ИСТИНА";
Запрос.УстановитьПараметр("Организация", Источник.Организация);
Запрос.УстановитьПараметр("Контрагент", Источник.Контрагент);
Запрос.УстановитьПараметр("НомерВходящегоДокумента", Источник.НомерВходящегоДокумента);
Запрос.УстановитьПараметр("ДатаВходящегоДокумента", Источник.ДатаВходящегоДокумента);
Запрос.УстановитьПараметр("ТекущийДокумент", Источник.Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Обнаружен дубликат входящего счета-фактуры по данному контрагенту!";
Сообщение.Поле = "НомерВходящегоДокумента";
Сообщение.УстановитьДанные(Источник);
Сообщение.Сообщить();
КонецЕсли;
Если правила регламента разработки категорически запрещают любое изменение конфигурации (база остается на строгой поддержке), контроль можно вынести во внешнюю обработку.
Посмотрим на пример пакетного запроса для поиска всех существующих задвоений за выбранный период:
ВЫБРАТЬ
ДокументСчетФактураПолученный.Ссылка КАК Ссылка,
ДокументСчетФактураПолученный.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
ДокументСчетФактураПолученный.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
ДокументСчетФактураПолученный.Контрагент КАК Контрагент,
1 КАК КолВо
ПОМЕСТИТЬ ТаблЗнач
ИЗ
Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный
ГДЕ
ДокументСчетФактураПолученный.Проведен = ИСТИНА
И ДокументСчетФактураПолученный.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) И КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
И ДокументСчетФактураПолученный.Организация = &Организация
;
ВЫБРАТЬ
ТаблЗнач.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
ТаблЗнач.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
ТаблЗнач.Контрагент КАК Контрагент,
СУММА(ТаблЗнач.КолВо) КАК КолВо
ПОМЕСТИТЬ ТаблЗнач1
ИЗ
ТаблЗнач КАК ТаблЗнач
СГРУППИРОВАТЬ ПО
ТаблЗнач.ДатаВходящегоДокумента,
ТаблЗнач.НомерВходящегоДокумента,
ТаблЗнач.Контрагент
;
ВЫБРАТЬ
ТаблЗнач1.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
ТаблЗнач1.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
ТаблЗнач1.Контрагент КАК Контрагент
ПОМЕСТИТЬ ТаблЗнач2
ИЗ
ТаблЗнач1 КАК ТаблЗнач1
ГДЕ
ТаблЗнач1.КолВо > 1
;
ВЫБРАТЬ
ТаблЗнач.Ссылка КАК Ссылка,
ТаблЗнач.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
ТаблЗнач.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
ТаблЗнач.Контрагент КАК Контрагент
ИЗ
ТаблЗнач2 КАК ТаблЗнач2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблЗнач КАК ТаблЗнач
ПО ТаблЗнач2.ДатаВходящегоДокумента = ТаблЗнач.ДатаВходящегоДокумента
И ТаблЗнач2.НомерВходящегоДокумента = ТаблЗнач.НомерВходящегоДокумента
И ТаблЗнач2.Контрагент = ТаблЗнач.Контрагент
УПОРЯДОЧИТЬ ПО
ТаблЗнач.ДатаВходящегоДокумента,
ТаблЗнач.НомерВходящегоДокумента,
ТаблЗнач.Контрагент
Такую внешнюю обработку можно подключить в справочник ДополнительныеОтчетыИОбработки и запускать по расписанию через РегламентныеЗадания для регулярной отправки отчета бухгалтеру о найденных дубликатах.