Как избежать дублирования номеров исходящих платежных поручений в 1С:УТ 10.3 при загрузке выписки из разных клиент-банков?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет
← На главную

При работе с несколькими банковскими счетами и загрузке выписок из клиент-банка в 1С:Управление торговлей 10.3, пользователи часто сталкиваются с проблемой дублирования номеров исходящих платежных поручений (ПП). Эта ситуация особенно актуальна, когда платежи формируются непосредственно в разных клиент-банках, а не в самой системе 1С. В результате при загрузке выписки система выдает ошибку о неуникальности номера документа, что препятствует корректному формированию данных в базе. В этой статье мы подробно разберем причины возникновения этой проблемы и предложим практическое решение с примерами кода.

В чем суть проблемы дублирования номеров платежных поручений?

Давайте выясним, почему возникает сообщение об ошибке вида "Документ 'Исходящее платежное поручение' № УТ000000011 от 09.01.2020 0:00:00 не создан! Произошли ошибки при записи! Причина: Значение 'УТ000000011' поля 'Номер' не уникально."

  1. Типовое ожидание 1С: Система 1С, включая УТ 10.3, изначально подразумевает, что исходящие платежные поручения формируются в ней. В этом случае 1С самостоятельно присваивает уникальные номера документам, часто используя сквозную нумерацию с учетом префикса организации. После формирования в 1С, такие ПП выгружаются в клиент-банк.
  2. Реальность пользователя: Во многих организациях платежные поручения создаются напрямую в клиент-банках. Это может быть связано с политикой безопасности (доступ к банку только у директора), отсутствием навыков работы с выгрузкой у сотрудников или просто сложившейся практикой.
  3. Конфликт нумерации: Если у организации есть несколько банковских счетов в разных банках (или даже в одном, но с разными системами клиент-банка), и платежные поручения создаются в каждом из них независимо, то их нумерация может совпадать. Это особенно характерно для начала года, когда многие клиент-банки сбрасывают нумерацию до единицы. При загрузке выписки в 1С, система пытается создать или найти исходящее ПП с номером, указанным в файле выписки. Если документ с таким же номером уже существует (например, был создан по другому банковскому счету), возникает ошибка уникальности.
  4. Ограничения УТ 10.3: В типовой конфигурации УТ 10.3 для документа "Платежное поручение исходящее" отсутствует отдельный реквизит, предназначенный для хранения "номера из банка" (то есть оригинального номера, под которым ПП было зарегистрировано в клиент-банке). Номер документа 1С (ОбъектДокумента.Номер) используется как основной идентификатор, и именно его уникальность проверяется. Это означает, что если мы хотим сохранить уникальность, нам придется модифицировать именно этот основной номер.

Основной подход к решению: формирование ПП в 1С (и почему это не всегда применимо)

Самый "чистый" и рекомендуемый фирмой 1С способ избежать подобных проблем – это формировать все исходящие платежные поручения непосредственно в 1С, а затем выгружать их в клиент-банк. Рассмотрим преимущества такого подхода и возможные препятствия.

  1. Преимущества:
    • Сквозная и уникальная нумерация: 1С автоматически присваивает уникальные номера документам, исключая дублирование.
    • Единая база данных: Все платежные поручения хранятся в одной системе, упрощая контроль и отчетность.
    • Автоматическая выгрузка в клиент-банк: 1С имеет стандартные механизмы для выгрузки ПП в файлы, которые затем можно загрузить в большинство систем клиент-банка.
    • Экономия времени: Автоматизация создания ПП из других документов 1С (например, заказов поставщикам) значительно ускоряет процесс.
  2. Возможные препятствия:
    • Политика безопасности: Руководство может запрещать сотрудникам иметь прямой доступ к выгрузке данных для клиент-банка из 1С.
    • Отсутствие навыков: Директор или ответственные лица могут не уметь или не хотеть осваивать процесс выгрузки из 1С в клиент-банк.
    • Сложившаяся практика: Иногда изменить устоявшиеся рабочие процессы сложнее, чем адаптировать программное обеспечение.

Если перейти на формирование ППИ в 1С невозможно по организационным причинам, нам остается единственный путь — адаптация самой обработки загрузки банковской выписки. Для разделения загрузки документов по счетам и статьям можно использовать обработку клиент-банка с дополнительными фильтрами.

Решение через модификацию обработки загрузки "Клиент-банк": добавление префиксов

Если мы не можем формировать платежные поручения в 1С, то нам необходимо модифицировать логику обработки, которая загружает банковские выписки. Суть решения заключается в том, чтобы при создании документа "Платежное поручение исходящее" в 1С, к его номеру добавлялся уникальный префикс, зависящий от конкретного банковского счета, через который был осуществлен платеж. Таким образом, даже если два разных банка прислали ПП с одинаковыми номерами (например, "11"), в 1С они станут "А000000011" и "Б000000011", что обеспечит их уникальность.

  1. Шаг 1: Добавляем реквизит в справочник "Банковские счета"

    Для начала нам понадобится место, где мы будем хранить этот уникальный префикс для каждого банковского счета. Мы добавим новый реквизит в справочник "Банковские счета".

    Откроем конфигуратор 1С и перейдем в дерево метаданных: Справочники - БанковскиеСчета. Здесь добавим новый реквизит:

    1. Имя: ПрефиксРС (ПрефиксРасчетногоСчета)
    2. Тип: Строка
    3. Длина: 1

    После добавления реквизита, необходимо обновить базу данных и в режиме "Предприятие" для каждого банковского счета вашей организации установить уникальный *нечисловой* префикс. Например, для первого счета это будет "А", для второго – "Б", для третьего – "В" и так далее. Важно, чтобы префикс был нечисловым, чтобы избежать конфликтов при форматировании номера.

  2. Шаг 2: Модифицируем внешнюю обработку "КлиентБанк"

    Далее мы модифицируем стандартную внешнюю обработку "КлиентБанк", которая используется для загрузки выписок. Нам нужно найти процедуру, отвечающую за заполнение реквизитов исходящего платежного поручения.

    Откройте внешнюю обработку "КлиентБанк" в конфигураторе. Найдите процедуру с именем ЗаполнитьРеквизитПлатежногоПорученияИсходящего. Внутри этой процедуры нам нужно найти блок кода, отвечающий за присвоение номера новому документу. Обычно это происходит после установки основных реквизитов, таких как организация и дата.

    Вставим следующий код после строк, устанавливающих организацию и дату (например, после УстановитьСвойство(ОбъектДокумента, "Дата", ИсходныеДанные.ДатаДок);):

    
    //Организация, ДАТА, НОМЕР
    УстановитьСвойство(ОбъектДокумента, "Организация", Организация);
    УстановитьСвойство(ОбъектДокумента, "Дата", ИсходныеДанные.ДатаДок);
    Если ЗначениеЗаполнено(ИсходныеДанные.Списано) Тогда
        УстановитьСвойство(ОбъектДокумента, "Оплачено", Истина);
        УстановитьСвойство(ОбъектДокумента, "ДатаОплаты",НачалоДня(ИсходныеДанные.Списано), истина);
    КонецЕсли;
    
    Если ОбъектДокумента.ЭтоНовый Тогда
        ОбъектДокумента.УстановитьНовыйНомер(Организация.Префикс);
        Если Не ОбщегоНазначения.ЕстьНеЦифры(ИсходныеДанные.Номер) Тогда
            ИтоговыйПрефикс = ОбменДаннымиСобытияУТ.ПолучитьПрефиксЧислоНомера(ОбъектДокумента.Номер);
            ПрефиксРасчетногоСчета = СокрЛП(БанковскийСчет.ПрефиксРС);
            ИтоговыйПрефикс=ИтоговыйПрефикс+ПрефиксРасчетногоСчета;
            ОкончаниеНомера = Формат(Число(СокрЛП(ИсходныеДанные.Номер)), "ЧН=; ЧГ=0");
            ДлинаОкончания = СтрДлина(СокрЛП(ОбъектДокумента.Номер)) - СтрДлина(ИтоговыйПрефикс);
            ОбъектДокумента.Номер = ИтоговыйПрефикс + Формат(Число(ОкончаниеНомера), "ЧЦ=" + ДлинаОкончания + "; ЧВН=; ЧГ=0");
        КонецЕсли;
    КонецЕсли;
    

    Теперь давайте подробно разберем, что делает этот код:

    • Если ОбъектДокумента.ЭтоНовый Тогда: Этот блок кода выполняется только в том случае, если документ "Платежное поручение исходящее" создается в 1С в первый раз в процессе загрузки выписки. Если документ уже существует, его номер не меняется.
    • ОбъектДокумента.УстановитьНовыйНомер(Организация.Префикс);: Сначала мы устанавливаем для нового документа стандартный номер, который бы ему присвоила 1С, учитывая префикс организации (например, "УТ"). Это дает нам основу для дальнейших манипуляций.
    • Если Не ОбщегоНазначения.ЕстьНеЦифры(ИсходныеДанные.Номер) Тогда: Мы проверяем, является ли номер, полученный из файла клиент-банка (ИсходныеДанные.Номер), полностью числовым. Это важно, потому что наша логика добавления префиксов и форматирования числа ориентирована на числовую часть номера.
    • ИтоговыйПрефикс = ОбменДаннымиСобытияУТ.ПолучитьПрефиксЧислоНомера(ОбъектДокумента.Номер);: Из номера, который только что был установлен (ОбъектДокумента.Номер), мы выделяем его префиксную часть (например, "УТ" или "ПП-").
    • ПрефиксРасчетногоСчета = СокрЛП(БанковскийСчет.ПрефиксРС);: Мы получаем наш заранее настроенный уникальный префикс для текущего расчетного счета (например, "А") из реквизита ПрефиксРС справочника "Банковские счета".
    • ИтоговыйПрефикс=ИтоговыйПрефикс+ПрефиксРасчетногоСчета;: К полученному префиксу 1С добавляем префикс расчетного счета. Теперь наш итоговый префикс может выглядеть как "УТ-А" или "ПП-А".
    • ОкончаниеНомера = Формат(Число(СокрЛП(ИсходныеДанные.Номер)), "ЧН=; ЧГ=0");: Мы берем числовую часть номера из клиент-банка, преобразуем ее в число и форматируем без лидирующих нулей и групп разрядов.
    • ДлинаОкончания = СтрДлина(СокрЛП(ОбъектДокумента.Номер)) - СтрДлина(ИтоговыйПрефикс);: Вычисляем, сколько символов должно приходиться на числовую часть номера после наших префиксов, чтобы общая длина номера документа оставалась неизменной или соответствовала стандартной длине номера документа в 1С.
    • ОбъектДокумента.Номер = ИтоговыйПрефикс + Формат(Число(ОкончаниеНомера), "ЧЦ=" + ДлинаОкончания + "; ЧВН=; ЧГ=0");: Формируем окончательный номер документа 1С. Он состоит из объединенного префикса (организация + расчетный счет) и числовой части оригинального номера из банка, отформатированной с нужным количеством лидирующих нулей, чтобы соответствовать вычисленной длине. Например, если исходный номер был "11", а префикс "УТ-А", то номер станет "УТ-А00000011".

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

Важные нюансы и потенциальные последствия решения

Хотя предложенное решение эффективно устраняет проблему дублирования номеров, оно имеет несколько важных аспектов, которые стоит учитывать:

  1. Изменение "родной" нумерации 1С: Применение такого подхода означает, что мы сознательно отходим от стандартной сквозной нумерации, которую 1С могла бы присвоить документам. Номера ППИ в базе 1С будут содержать дополнительный префикс, отличный от того, который, возможно, использовался до этого. Это не ошибка, а осознанное изменение для решения конкретной проблемы, но его следует иметь в виду при анализе данных.
  2. Сохранение исходного номера: В данном решении оригинальный номер платежного поручения из банка становится частью номера документа 1С. Отдельного поля для его хранения нет. Если в будущем потребуется строго различать "номер 1С" и "номер из банка" (например, для детализированной сверки или отчетности, где важен именно банковский номер), то текущее решение может оказаться недостаточным. В таком случае потребуется более сложная доработка (см. "Альтернативный подход" ниже).
  3. Обновления конфигурации: Поскольку мы модифицировали внешнюю обработку "КлиентБанк", при каждом обновлении типовой конфигурации 1С или при получении новой версии этой обработки, потребуется переносить наши доработки вручную. Всегда сохраняйте резервные копии модифицированных обработок.
  4. Тестирование: Перед внедрением решения в рабочую базу обязательно проведите тщательное тестирование на копии базы данных. Убедитесь, что все платежи загружаются корректно, номера присваиваются правильно и не возникает новых ошибок.

Альтернативный подход: добавление отдельного реквизита для номера из банка

Если для вас критически важно сохранить "чистую" нумерацию документов 1С и при этом иметь возможность хранить оригинальный номер платежного поручения из банка, можно рассмотреть более сложный, но и более гибкий подход. Этот метод требует более глубокой модификации метаданных и логики обработки.

  1. Модификация документа "Платежное поручение исходящее":

    В конфигураторе добавьте новый реквизит в документ Платежное поручение исходящее, например:

    1. Имя: НомерИзБанка
    2. Тип: Строка
    3. Длина: (достаточная для хранения самого длинного номера из клиент-банка, например, 15-20)

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

  2. Изменение логики обработки загрузки "КлиентБанк":

    В процедуре, отвечающей за создание или обновление документа "Платежное поручение исходящее", необходимо будет изменить логику поиска и присвоения номера:

    • При загрузке из файла выписки, сначала проверять существование документа "Платежное поручение исходящее" не по основному номеру 1С, а по новому реквизиту НомерИзБанка и дате документа, а также по банковскому счету.
    • Если документ с таким НомерИзБанка и датой уже найден, то обновлять его (например, устанавливать флаг оплаты, если он еще не был установлен).
    • Если документ не найден, создавать новый документ. При этом основной номер 1С (ОбъектДокумента.Номер) будет присвоен стандартным образом (с префиксом организации, без префикса расчетного счета), а в новый реквизит НомерИзБанка будет записан оригинальный номер из файла выписки (ИсходныеДанные.Номер).
  3. Преимущества:
    • Сохранение оригинального номера: Вы всегда будете знать, под каким номером платеж был в банке, независимо от номера документа в 1С.
    • "Чистая" нумерация 1С документов: Внутренняя нумерация документов 1С останется последовательной и без дополнительных префиксов, что может быть важно для некоторых внутренних процессов или отчетности.
  4. Недостатки:
    • Более трудоемкая доработка: Этот подход требует изменения структуры метаданных (добавление реквизита в документ) и значительно более сложной модификации логики обработки загрузки, затрагивающей не только присвоение номера, но и механизм поиска существующих документов.
    • Влияние на другие механизмы: Добавление нового реквизита и изменение логики поиска могут повлиять на другие механизмы конфигурации, работающие с платежными поручениями, что потребует более глубокого анализа и тестирования.

Выбор между этими решениями зависит от ваших приоритетов: хотите ли вы быстро и относительно просто решить проблему уникальности ценой небольшого изменения в нумерации 1С, или готовы вложить больше усилий для сохранения "чистой" нумерации и отдельного хранения банковского номера.

В любом случае, приступая к модификации конфигурации или внешней обработки, всегда создавайте резервную копию вашей информационной базы! Для регулярного технического обслуживания можно автоматизировать архивирование и тестирование баз 1С.

← На главную