При работе с несколькими банковскими счетами и загрузке выписок из клиент-банка в 1С:Управление торговлей 10.3, пользователи часто сталкиваются с проблемой дублирования номеров исходящих платежных поручений (ПП). Эта ситуация особенно актуальна, когда платежи формируются непосредственно в разных клиент-банках, а не в самой системе 1С. В результате при загрузке выписки система выдает ошибку о неуникальности номера документа, что препятствует корректному формированию данных в базе. В этой статье мы подробно разберем причины возникновения этой проблемы и предложим практическое решение с примерами кода.
Давайте выясним, почему возникает сообщение об ошибке вида "Документ 'Исходящее платежное поручение' № УТ000000011 от 09.01.2020 0:00:00 не создан! Произошли ошибки при записи! Причина: Значение 'УТ000000011' поля 'Номер' не уникально."
ОбъектДокумента.Номер) используется как основной идентификатор, и именно его уникальность проверяется. Это означает, что если мы хотим сохранить уникальность, нам придется модифицировать именно этот основной номер.Самый "чистый" и рекомендуемый фирмой 1С способ избежать подобных проблем – это формировать все исходящие платежные поручения непосредственно в 1С, а затем выгружать их в клиент-банк. Рассмотрим преимущества такого подхода и возможные препятствия.
Если перейти на формирование ППИ в 1С невозможно по организационным причинам, нам остается единственный путь — адаптация самой обработки загрузки банковской выписки. Для разделения загрузки документов по счетам и статьям можно использовать обработку клиент-банка с дополнительными фильтрами.
Если мы не можем формировать платежные поручения в 1С, то нам необходимо модифицировать логику обработки, которая загружает банковские выписки. Суть решения заключается в том, чтобы при создании документа "Платежное поручение исходящее" в 1С, к его номеру добавлялся уникальный префикс, зависящий от конкретного банковского счета, через который был осуществлен платеж. Таким образом, даже если два разных банка прислали ПП с одинаковыми номерами (например, "11"), в 1С они станут "А000000011" и "Б000000011", что обеспечит их уникальность.
Для начала нам понадобится место, где мы будем хранить этот уникальный префикс для каждого банковского счета. Мы добавим новый реквизит в справочник "Банковские счета".
Откроем конфигуратор 1С и перейдем в дерево метаданных: Справочники - БанковскиеСчета. Здесь добавим новый реквизит:
ПрефиксРС (ПрефиксРасчетногоСчета)Строка1После добавления реквизита, необходимо обновить базу данных и в режиме "Предприятие" для каждого банковского счета вашей организации установить уникальный *нечисловой* префикс. Например, для первого счета это будет "А", для второго – "Б", для третьего – "В" и так далее. Важно, чтобы префикс был нечисловым, чтобы избежать конфликтов при форматировании номера.
Далее мы модифицируем стандартную внешнюю обработку "КлиентБанк", которая используется для загрузки выписок. Нам нужно найти процедуру, отвечающую за заполнение реквизитов исходящего платежного поручения.
Откройте внешнюю обработку "КлиентБанк" в конфигураторе. Найдите процедуру с именем ЗаполнитьРеквизитПлатежногоПорученияИсходящего. Внутри этой процедуры нам нужно найти блок кода, отвечающий за присвоение номера новому документу. Обычно это происходит после установки основных реквизитов, таких как организация и дата.
Вставим следующий код после строк, устанавливающих организацию и дату (например, после УстановитьСвойство(ОбъектДокумента, "Дата", ИсходныеДанные.ДатаДок);):
//Организация, ДАТА, НОМЕР
УстановитьСвойство(ОбъектДокумента, "Организация", Организация);
УстановитьСвойство(ОбъектДокумента, "Дата", ИсходныеДанные.ДатаДок);
Если ЗначениеЗаполнено(ИсходныеДанные.Списано) Тогда
УстановитьСвойство(ОбъектДокумента, "Оплачено", Истина);
УстановитьСвойство(ОбъектДокумента, "ДатаОплаты",НачалоДня(ИсходныеДанные.Списано), истина);
КонецЕсли;
Если ОбъектДокумента.ЭтоНовый Тогда
ОбъектДокумента.УстановитьНовыйНомер(Организация.Префикс);
Если Не ОбщегоНазначения.ЕстьНеЦифры(ИсходныеДанные.Номер) Тогда
ИтоговыйПрефикс = ОбменДаннымиСобытияУТ.ПолучитьПрефиксЧислоНомера(ОбъектДокумента.Номер);
ПрефиксРасчетногоСчета = СокрЛП(БанковскийСчет.ПрефиксРС);
ИтоговыйПрефикс=ИтоговыйПрефикс+ПрефиксРасчетногоСчета;
ОкончаниеНомера = Формат(Число(СокрЛП(ИсходныеДанные.Номер)), "ЧН=; ЧГ=0");
ДлинаОкончания = СтрДлина(СокрЛП(ОбъектДокумента.Номер)) - СтрДлина(ИтоговыйПрефикс);
ОбъектДокумента.Номер = ИтоговыйПрефикс + Формат(Число(ОкончаниеНомера), "ЧЦ=" + ДлинаОкончания + "; ЧВН=; ЧГ=0");
КонецЕсли;
КонецЕсли;
Теперь давайте подробно разберем, что делает этот код:
Если ОбъектДокумента.ЭтоНовый Тогда: Этот блок кода выполняется только в том случае, если документ "Платежное поручение исходящее" создается в 1С в первый раз в процессе загрузки выписки. Если документ уже существует, его номер не меняется.ОбъектДокумента.УстановитьНовыйНомер(Организация.Префикс);: Сначала мы устанавливаем для нового документа стандартный номер, который бы ему присвоила 1С, учитывая префикс организации (например, "УТ"). Это дает нам основу для дальнейших манипуляций.Если Не ОбщегоНазначения.ЕстьНеЦифры(ИсходныеДанные.Номер) Тогда: Мы проверяем, является ли номер, полученный из файла клиент-банка (ИсходныеДанные.Номер), полностью числовым. Это важно, потому что наша логика добавления префиксов и форматирования числа ориентирована на числовую часть номера.ИтоговыйПрефикс = ОбменДаннымиСобытияУТ.ПолучитьПрефиксЧислоНомера(ОбъектДокумента.Номер);: Из номера, который только что был установлен (ОбъектДокумента.Номер), мы выделяем его префиксную часть (например, "УТ" или "ПП-").ПрефиксРасчетногоСчета = СокрЛП(БанковскийСчет.ПрефиксРС);: Мы получаем наш заранее настроенный уникальный префикс для текущего расчетного счета (например, "А") из реквизита ПрефиксРС справочника "Банковские счета".ИтоговыйПрефикс=ИтоговыйПрефикс+ПрефиксРасчетногоСчета;: К полученному префиксу 1С добавляем префикс расчетного счета. Теперь наш итоговый префикс может выглядеть как "УТ-А" или "ПП-А".ОкончаниеНомера = Формат(Число(СокрЛП(ИсходныеДанные.Номер)), "ЧН=; ЧГ=0");: Мы берем числовую часть номера из клиент-банка, преобразуем ее в число и форматируем без лидирующих нулей и групп разрядов.ДлинаОкончания = СтрДлина(СокрЛП(ОбъектДокумента.Номер)) - СтрДлина(ИтоговыйПрефикс);: Вычисляем, сколько символов должно приходиться на числовую часть номера после наших префиксов, чтобы общая длина номера документа оставалась неизменной или соответствовала стандартной длине номера документа в 1С.ОбъектДокумента.Номер = ИтоговыйПрефикс + Формат(Число(ОкончаниеНомера), "ЧЦ=" + ДлинаОкончания + "; ЧВН=; ЧГ=0");: Формируем окончательный номер документа 1С. Он состоит из объединенного префикса (организация + расчетный счет) и числовой части оригинального номера из банка, отформатированной с нужным количеством лидирующих нулей, чтобы соответствовать вычисленной длине. Например, если исходный номер был "11", а префикс "УТ-А", то номер станет "УТ-А00000011".После сохранения модифицированной обработки и ее использования для загрузки банковской выписки, номера исходящих платежных поручений будут формироваться с учетом уникального префикса расчетного счета, что полностью решает проблему дублирования.
Хотя предложенное решение эффективно устраняет проблему дублирования номеров, оно имеет несколько важных аспектов, которые стоит учитывать:
Если для вас критически важно сохранить "чистую" нумерацию документов 1С и при этом иметь возможность хранить оригинальный номер платежного поручения из банка, можно рассмотреть более сложный, но и более гибкий подход. Этот метод требует более глубокой модификации метаданных и логики обработки.
В конфигураторе добавьте новый реквизит в документ Платежное поручение исходящее, например:
НомерИзБанкаСтрока15-20)Этот реквизит будет использоваться исключительно для хранения оригинального номера платежного поручения, как он пришел из файла выписки.
В процедуре, отвечающей за создание или обновление документа "Платежное поручение исходящее", необходимо будет изменить логику поиска и присвоения номера:
НомерИзБанка и дате документа, а также по банковскому счету.НомерИзБанка и датой уже найден, то обновлять его (например, устанавливать флаг оплаты, если он еще не был установлен).ОбъектДокумента.Номер) будет присвоен стандартным образом (с префиксом организации, без префикса расчетного счета), а в новый реквизит НомерИзБанка будет записан оригинальный номер из файла выписки (ИсходныеДанные.Номер).Выбор между этими решениями зависит от ваших приоритетов: хотите ли вы быстро и относительно просто решить проблему уникальности ценой небольшого изменения в нумерации 1С, или готовы вложить больше усилий для сохранения "чистой" нумерации и отдельного хранения банковского номера.
В любом случае, приступая к модификации конфигурации или внешней обработки, всегда создавайте резервную копию вашей информационной базы! Для регулярного технического обслуживания можно автоматизировать архивирование и тестирование баз 1С.