Наверняка каждый из нас, кто работает с системами автоматизации учета, сталкивался или боится столкнуться с ситуацией, когда заканчиваются номера документов. Это критическая проблема, особенно в активно работающих системах, таких как 1С:Управление торговлей 10.3, где нумерация заказов покупателей и реализаций идет полным ходом. В нашем случае, мы имеем 11-символьную автонумерацию, ограниченную рамками года, с префиксами конфигурации «УТ» и организации «АПН». При достижении номера, например, «УТАПН999999», система просто не сможет присвоить следующий номер, что полностью блокирует работу. Давайте разберем, какие существуют пути решения этой задачи и какие риски они несут. В качестве альтернативы сложным техническим манипуляциям в устаревшей базе можно рассмотреть переход на новую редакцию, выполнив перенос остатков и документов из УТ 10.3 в УТ 11.
Автору темы, с которой мы работаем, понадобилось срочное решение, так как запас номеров на год подходил к концу раньше ожидаемого из-за большого объема продаж. Примитивные попытки, такие как смена префикса организации или ручное изменение номера, не привели к желаемому результату, поскольку система продолжает считать последний номер и выдает ошибку. Перезаписывать миллионы документов стандартными средствами 1С — это крайне долго и трудоемко. Рассмотрим подробнее основные подходы к решению этой проблемы.
Этот метод был выбран автором как наиболее быстрый и эффективный в условиях жесткого дефицита времени. Он подразумевает непосредственное изменение данных в таблицах SQL-базы, минуя логику 1С. Такой подход позволяет мгновенно изменить префиксы большого объема документов, но несет в себе значительные риски.
Преимущества:
Недостатки и риски:
Мы настоятельно рекомендуем проводить все операции на тестовой копии базы данных перед применением на рабочей!
Для начала нам необходимо определить, в какой именно таблице SQL хранятся номера наших документов. Часто это таблицы с именами, начинающимися на _Document, с числовым идентификатором или частью имени документа (например, _Document140 для конкретных документов или _DocumentOrder, _DocumentRealization). Мы можем получить эту информацию, используя служебные функции 1С или проанализировав конфигурацию в Конфигураторе.
Для получения структуры хранения базы данных из 1С, вы можете использовать следующий код, например, во временной обработке:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
// Вы можете вывести ТаблицаСтруктуры в табличное поле или в Сообщения,
// чтобы найти нужную таблицу по имени объекта метаданных (например, "РеализацияТоваровУслуг" или "ЗаказПокупателя").
// Обычно имена таблиц документов выглядят как _DocumentX, где X - внутренний ID.
// Например, для документа "РеализацияТоваровУслуг" это может быть _Document140 (как в примере на форуме)
// или _Document_РеализацияТоваровУслуг.
// Пример вывода в табличное поле формы обработки
// ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаСтруктуры;
// ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
После получения структуры, найдите соответствующую таблицу для ваших документов «Заказ покупателя» и «Реализация товаров и услуг». В примере на форуме фигурирует таблица _Document140, что указывает на внутренний ID объекта метаданных. В вашей базе ID может быть другим.
После того как мы определили имя таблицы, мы можем выполнить запрос на изменение данных. Цель — заменить старый префикс, который исчерпал свой диапазон (например, «УТАПН»), на новый, который предоставит больше номеров (например, «УТАП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 миллионов новых номеров, что, возможно, решит проблему на значительно больший срок.
Обязательно убедитесь в правильности имени таблицы и префиксов перед выполнением запроса!
После внесения изменений напрямую в SQL-базу, 1С не знает об этих изменениях. Чтобы система корректно определяла следующий свободный номер, нам необходимо принудительно обновить внутренние механизмы нумерации. Для этого в 1С предусмотрена служебная процедура ОбновитьНумерациюОбъектов();.
Выполните этот код в режиме 1С:Предприятие (например, через внешнюю обработку или в командном окне):
ОбновитьНумерациюОбъектов();
Эта процедура заставит 1С перечитать максимальные номера для всех объектов и продолжить нумерацию с учетом новых префиксов и измененных диапазонов.
Если нет жесткой необходимости в перенумерации уже существующих документов и важнее сохранить целостность данных, можно изменить префиксы через стандартные настройки 1С. Этот метод является наиболее безопасным, но он не решает проблему для *уже существующих* документов со старым префиксом; он влияет только на *новые* создаваемые документы.
Принцип работы:
Мы меняем префикс организации или префикс информационной базы. Например, если текущий префикс организации «АПН», мы можем изменить его на «АП» или «АП0». 1С будет использовать новый префикс для новых документов, начиная нумерацию с 1 (или с максимального номера для этого нового префикса, если он уже использовался).
Преимущества:
Недостатки:
Как это сделать:
В 1С:Управление торговлей 10.3 перейдите в справочник «Организации», откройте нужную организацию и измените ее префикс. После этого система начнет генерировать номера для новых документов с использованием этого нового префикса. Если префикс задан на уровне информационной базы, его также можно изменить в соответствующих общих настройках.
Для более гибкого и управляемого решения можно разработать собственную логику формирования номера документа. Этот подход требует навыков программирования на платформе 1С, но дает полный контроль над процессом нумерации.
Принцип работы:
Мы создаем подписку на событие «ПриУстановкеНовогоНомера» или «ПриЗаписи» для соответствующих документов. В этой подписке мы можем перехватить стандартный механизм генерации номера и реализовать свой алгоритм. Например, при достижении максимального числового значения можно добавить буквенный суффикс (А, B, C и т.д.) после цифр или изменить часть префикса.
Пример логики:
Если стандартный номер достигает `УТАПН999999`, ваша логика может сгенерировать следующий номер как `УТАПНА00001`, затем `УТАПНА00002` и так далее. После исчерпания диапазона для `А` можно перейти к `УТАПНБ00001`.
Преимущества:
Недостатки:
Еще один способ расширить диапазон нумерации — это увеличить максимальную длину поля «Номер» для документа в Конфигураторе 1С. Если текущая длина 11 символов, ее можно увеличить до 12 или более.
Принцип работы:
В Конфигураторе, для соответствующего объекта метаданных (например, «Документ.ЗаказПокупателя» или «Документ.РеализацияТоваровУслуг»), вы можете изменить свойство «Длина» для реквизита «Номер». Например, с 11 на 12 символов. Это позволит системе генерировать более длинные номера.
Преимущества:
Недостатки:
Если вы все же решаете перенумеровать миллионы документов средствами 1С (например, программно с использованием метода ОбъектДокумента.УстановитьНовыйНомер(); ОбъектДокумента.Записать();), будьте готовы к тому, что это займет очень много времени. Автором темы было подсчитано, что 2 миллиона документов могут занять до 3 дней работы в тестовой базе. Мы можем рассмотреть шаги для максимально возможного ускорения процесса:
Даже с этими оптимизациями, перенумерация большого объема документов через механизмы 1С остается медленной операцией по сравнению с прямым редактированием SQL. Это связано с тем, что 1С при записи объекта выполняет множество внутренних проверок, вызовов событий, обновлений регистров и т.д., что обеспечивает целостность данных, но снижает производительность при массовых операциях.
Выбор метода решения проблемы исчерпания номеров документов зависит от вашей ситуации, времени, которое есть в запасе, и готовности принимать риски. Прямое редактирование SQL является самым быстрым, но и самым рискованным способом, подходящим для экстренных ситуаций, когда нет времени на другие решения. Изменение префиксов через функционал 1С или программная реализация собственной логики являются более безопасными, но требуют больше времени и могут привести к разрывам в нумерации. Увеличение длины номера может потребовать полной перенумерации.
Мы настоятельно рекомендуем тщательно тестировать любое выбранное решение на копии базы данных перед применением на рабочей системе. Всегда делайте резервные копии! Для автоматического создания резервных копий и тестирования баз перед техническими работами можно настроить автоматическое архивирование и обслуживание баз 1С.