Как решить проблему исчерпания номеров документов (Заказов покупателя, Реализаций) в 1С УТ 10.3?

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

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

Автору темы, с которой мы работаем, понадобилось срочное решение, так как запас номеров на год подходил к концу раньше ожидаемого из-за большого объема продаж. Примитивные попытки, такие как смена префикса организации или ручное изменение номера, не привели к желаемому результату, поскольку система продолжает считать последний номер и выдает ошибку. Перезаписывать миллионы документов стандартными средствами 1С — это крайне долго и трудоемко. Рассмотрим подробнее основные подходы к решению этой проблемы.

1. Прямое редактирование базы данных SQL (Быстрый, но рискованный метод)

Этот метод был выбран автором как наиболее быстрый и эффективный в условиях жесткого дефицита времени. Он подразумевает непосредственное изменение данных в таблицах SQL-базы, минуя логику 1С. Такой подход позволяет мгновенно изменить префиксы большого объема документов, но несет в себе значительные риски.

Преимущества:

  1. Высокая скорость: Перенумерация миллионов документов занимает минуты, а не часы или дни.
  2. Оперативное решение: Позволяет быстро восстановить работоспособность системы.

Недостатки и риски:

  1. Нарушение ссылочной целостности: Прямое редактирование SQL может привести к повреждению данных, если не учесть все связанные таблицы и поля.
  2. Проблемы с выгрузками в другие системы: Измененные номера могут вызвать расхождения при обмене данными с бухгалтерскими системами или другими внешними источниками.
  3. Неподдерживаемость 1С: База данных, измененная таким образом, перестает быть типовой, и техническая поддержка 1С может отказать в помощи при возникновении проблем.
  4. Повреждение индексов: Некорректные изменения могут привести к снижению производительности или ошибкам в работе базы данных.
  5. Отсутствие контроля 1С: Система не проходит стандартные проверки при записи, что может привести к появлению некорректных данных.

Мы настоятельно рекомендуем проводить все операции на тестовой копии базы данных перед применением на рабочей!

Разберем по шагам, как выполнить это решение:

  1. Получаем структуру хранения базы данных в 1С

    Для начала нам необходимо определить, в какой именно таблице SQL хранятся номера наших документов. Часто это таблицы с именами, начинающимися на _Document, с числовым идентификатором или частью имени документа (например, _Document140 для конкретных документов или _DocumentOrder, _DocumentRealization). Мы можем получить эту информацию, используя служебные функции 1С или проанализировав конфигурацию в Конфигураторе.

    Для получения структуры хранения базы данных из 1С, вы можете использовать следующий код, например, во временной обработке:

    
    ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
    // Вы можете вывести ТаблицаСтруктуры в табличное поле или в Сообщения,
    // чтобы найти нужную таблицу по имени объекта метаданных (например, "РеализацияТоваровУслуг" или "ЗаказПокупателя").
    // Обычно имена таблиц документов выглядят как _DocumentX, где X - внутренний ID.
    // Например, для документа "РеализацияТоваровУслуг" это может быть _Document140 (как в примере на форуме)
    // или _Document_РеализацияТоваровУслуг.
    
    // Пример вывода в табличное поле формы обработки
    // ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаСтруктуры;
    // ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    

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

  2. Меняем префиксы в таблицах SQL

    После того как мы определили имя таблицы, мы можем выполнить запрос на изменение данных. Цель — заменить старый префикс, который исчерпал свой диапазон (например, «УТАПН»), на новый, который предоставит больше номеров (например, «УТАП0» или «УТАП»). Удаление одного символа из префикса (например, с «УТАПН» на «УТАП») может увеличить диапазон доступных номеров в 10 раз (с 1 млн. до 10 млн. для оставшихся 6 цифр).

    Используем оператор UPDATE с функцией REPLACE. Важно использовать транзакции begin transaction и commit transaction для возможности отката изменений в случае ошибки. Также крайне важно ограничить область действия запроса с помощью условий WHERE, чтобы изменить номера только в нужном диапазоне дат и только те, которые начинаются со старого префикса.

    
    begin transaction
    
    -- Замените 'ut_new.dbo._Document140' на имя вашей базы и таблицы.
    -- Замените 'УТАПН' на старый префикс.
    -- Замените 'УТАП0' на новый префикс.
    -- Установите актуальную дату, с которой нужно изменить номера (обычно с начала текущего года).
    
    update a set _Number = replace(a._Number,'УТАПН','УТАП0')
    from ваша_база.dbo._Document140 a
    where a._Date_Time >= '2022-01-01 00:00:00.000' -- Укажите актуальную дату начала года
      and a._Number LIKE 'УТАПН%' -- Укажите старый префикс
    
    -- После выполнения запроса и проверки результата
    -- раскомментируйте следующую строку для сохранения изменений
    -- commit transaction
    
    -- Если что-то пошло не так, можно откатить изменения
    -- rollback transaction
    

    Обратите внимание на строку a._Date_Time >= '2022-01-01 00:00:00.000'. Мы рекомендуем менять префиксы с начала текущего года, чтобы сохранить последовательность в рамках года. Изменение префикса на УТАП0 добавляет один миллион номеров, тогда как изменение на УТАП (если префикс раньше был 5 символов, а стал 4) дает целых 10 миллионов новых номеров, что, возможно, решит проблему на значительно больший срок.

    Обязательно убедитесь в правильности имени таблицы и префиксов перед выполнением запроса!

  3. Обновляем нумерацию в 1С

    После внесения изменений напрямую в SQL-базу, 1С не знает об этих изменениях. Чтобы система корректно определяла следующий свободный номер, нам необходимо принудительно обновить внутренние механизмы нумерации. Для этого в 1С предусмотрена служебная процедура ОбновитьНумерациюОбъектов();.

    Выполните этот код в режиме 1С:Предприятие (например, через внешнюю обработку или в командном окне):

    ОбновитьНумерациюОбъектов();

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

2. Изменение префиксов через функционал 1С (Безопасный подход для новых документов)

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

Принцип работы:

Мы меняем префикс организации или префикс информационной базы. Например, если текущий префикс организации «АПН», мы можем изменить его на «АП» или «АП0». 1С будет использовать новый префикс для новых документов, начиная нумерацию с 1 (или с максимального номера для этого нового префикса, если он уже использовался).

Преимущества:

  1. Сохранение целостности данных: Все изменения выполняются штатными средствами 1С, что исключает риск повреждения базы.
  2. Поддержка 1С: Система остается типовой, и техническая поддержка будет работать в обычном режиме.
  3. Простота настройки: Изменение префикса часто делается через соответствующую форму элемента справочника «Организации» или в общих настройках информационной базы.

Недостатки:

  1. Разрыв в нумерации: Документы, созданные до смены префикса, будут иметь старый префикс, а новые — новый. Это может быть проблемой, если требуется строго сквозная нумерация по всем документам за период. Однако для годовой нумерации это часто приемлемо.
  2. Не решает проблему для существующих документов: Старые документы сохранят свои номера.

Как это сделать:

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

3. Программное изменение логики формирования номера

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

Принцип работы:

Мы создаем подписку на событие «ПриУстановкеНовогоНомера» или «ПриЗаписи» для соответствующих документов. В этой подписке мы можем перехватить стандартный механизм генерации номера и реализовать свой алгоритм. Например, при достижении максимального числового значения можно добавить буквенный суффикс (А, B, C и т.д.) после цифр или изменить часть префикса.

Пример логики:

Если стандартный номер достигает `УТАПН999999`, ваша логика может сгенерировать следующий номер как `УТАПНА00001`, затем `УТАПНА00002` и так далее. После исчерпания диапазона для `А` можно перейти к `УТАПНБ00001`.

Преимущества:

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

Недостатки:

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

4. Увеличение длины номера документа

Еще один способ расширить диапазон нумерации — это увеличить максимальную длину поля «Номер» для документа в Конфигураторе 1С. Если текущая длина 11 символов, ее можно увеличить до 12 или более.

Принцип работы:

В Конфигураторе, для соответствующего объекта метаданных (например, «Документ.ЗаказПокупателя» или «Документ.РеализацияТоваровУслуг»), вы можете изменить свойство «Длина» для реквизита «Номер». Например, с 11 на 12 символов. Это позволит системе генерировать более длинные номера.

Преимущества:

  1. Простота настройки: Изменение длины реквизита в Конфигураторе — относительно простая операция.
  2. Расширение диапазона: Каждый дополнительный символ значительно увеличивает количество доступных номеров.

Недостатки:

  1. Требует перенумерации существующих документов: Если номера уже сгенерированы в 11-символьном формате (например, «УТАПН999999»), простое увеличение длины поля не сделает их автоматически 12-символьными. Для использования нового диапазона, скорее всего, потребуется полная перенумерация документов, чтобы новые номера соответствовали новой длине и маске. Это именно то, чего автор изначально хотел избежать.
  2. Влияние на внешние системы: Если этот номер выгружается во внешние системы, они также должны быть готовы принять номер большей длины.

Оптимизация производительности перенумерации средствами 1С (если она все же необходима)

Если вы все же решаете перенумеровать миллионы документов средствами 1С (например, программно с использованием метода ОбъектДокумента.УстановитьНовыйНомер(); ОбъектДокумента.Записать();), будьте готовы к тому, что это займет очень много времени. Автором темы было подсчитано, что 2 миллиона документов могут занять до 3 дней работы в тестовой базе. Мы можем рассмотреть шаги для максимально возможного ускорения процесса:

  1. Монопольный режим: Все операции по перенумерации должны выполняться в монопольном режиме, чтобы избежать блокировок и конфликтов данных с другими пользователями.
  2. Отключение фоновых заданий: Временно отключите все регламентные и фоновые задания, которые могут создавать нагрузку на систему или вмешиваться в процесс записи документов.
  3. Отключение проверок уникальности: При массовой записи документов в 1С каждая запись может вызывать проверки уникальности номеров, дат, ссылок и т.д. Если вы уверены в генерируемых номерах, можно временно отключить некоторые проверки через подписки на события или путем изменения свойств объектов (хотя это требует осторожности).
  4. Оптимизация кода: Избегайте вызова ресурсоемких процедур в цикле. Если возможно, используйте прямые запросы к данным (например, для чтения информации), но запись всегда лучше выполнять через объекты 1С.
  5. Использование серверного оборудования: Выполняйте операцию на мощном сервере с быстрыми дисками (SSD/NVMe) и достаточным объемом оперативной памяти.
  6. Пакетная обработка: Вместо перезаписи каждого документа по отдельности, рассмотрите возможность пакетной обработки, если это позволяет конфигурация и ваша логика. Однако для изменения номеров, как правило, все равно приходится обращаться к каждому объекту.

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

Заключение

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

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

← На главную