Как в 1С Бухгалтерия КОРП отключить изменение нумерации документов при проведении, загруженных из УТ?

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

Представим ситуацию: вы работаете в 1С:Бухгалтерия КОРП (БП КОРП), версия 3.0.147.25, и настроили обмен данными с 1С:Управление торговлей (УТ), версия 11.5. Из УТ успешно прилетают документы реализации товаров и услуг. Однако возникает досадная проблема: при открытии такого документа в БП КОРП, добавлении, например, подразделения и последующем сохранении, номер документа автоматически меняется. Исходный номер, пришедший из УТ (например, ФХЦБ-000019), превращается в новый, соответствующий внутренней логике БП (например, 02НБ-000001).

Более того, мы замечаем интересную особенность: если мы очищаем подразделение в документе и сохраняем его, номер снова меняется, например, на ФХНБ-000003. При повторном выборе подразделения и сохранении номер снова корректируется на 02НБ-000003, и так далее, сохраняя при этом сквозную нумерацию для нового префикса. Эта "фича" с автонумерацией доставляет неудобства, поскольку нам необходимо сохранить нумерацию базы-отправителя и в принципе не допускать ее изменения.

В более старых версиях 1С:Бухгалтерии (например, БП 2.0) существовала настройка стратегии редактирования номеров объектов через меню "Сервис - Служебные". Однако в 1С:Бухгалтерии 3.0 эта возможность в пользовательском режиме отсутствует. Разработчики 1С отмечали, что пожелания по ее реализации зарегистрированы, но пока мы не имеем встроенного решения. Давайте разберемся, почему это происходит и как можно остановить это автоматическое изменение нумерации, сохраняя номера документов, пришедшие из базы-отправителя.

Анализируем механизм нумерации документов в 1С

Прежде чем перейти к решению, нам важно понять, как формируется номер документа в системе 1С. Номер документа — это не просто порядковый набор символов, а структурированная строка, которая может состоять из нескольких частей:

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

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

Выясняем причины изменения нумерации при обмене и редактировании

Ситуация, когда документ, прилетевший из УТ, меняет свой номер после редактирования в БП КОРП, является типовой и объясняется внутренними правилами работы платформы 1С. Давайте проанализируем эту ситуацию:

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

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

Варианты решения проблемы

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

Подход 1: Управление префиксами организации или подразделения (с осторожностью)

Изначально, на форуме прозвучало предложение "Префикс у подразделения надо отключить" или искать "РС Префиксы объектов информационных баз". Давайте разберем этот вариант.

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

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

Подход 2: Использование расширения конфигурации с подпиской на событие "ПередЗаписью" (Рекомендуемое решение)

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

  1. Концепция расширения конфигурации:

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

  2. "Точка входа" – Подписка на событие ПередЗаписью:

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

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

  3. Реализация в расширении (пошаговый алгоритм):

    Для реализации этого решения мы будем создавать расширение и в нем – подписку на событие. Давайте рассмотрим шаги.

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

      В модуле обработчика подписки нам нужно будет реализовать логику, которая проверит, является ли документ загруженным из УТ, и если да, то сохранит его исходный номер.

      Рассмотрим подробнее логику обработчика:

      1. Идентификация загруженного документа:
        • В момент *первичной загрузки* документа из УТ, система 1С устанавливает флаг ОбменДанными.Загрузка = Истина. Вы могли бы использовать этот флаг в обработчике правил обмена для того, чтобы сохранить исходный номер документа.
        • Однако, как мы уже выяснили, проблема проявляется *после* загрузки, когда пользователь уже редактирует документ. В этот момент флаг ОбменДанными.Загрузка уже будет Ложь. Поэтому нам нужен другой, более надежный способ определить, что документ "пришел из обмена".
        • Наиболее надежный подход: Мы рекомендуем при загрузке документа из УТ, в процессе обмена, сохранять оригинальный номер документа из УТ в дополнительный реквизит документа в БП КОРП. Для этого создадим дополнительный реквизит, например, с именем ИсходныйНомерИзОбмена, тип которого - строка. Этот реквизит должен быть заполнен в момент, когда документ впервые загружается из УТ.
      2. Логика сохранения номера в обработчике ПередЗаписью:

        Когда пользователь редактирует документ (например, указывает подразделение) и пытается его сохранить, срабатывает наша подписка ПередЗаписью. В этот момент мы реализуем следующую логику:

        1. Мы проверяем, что документ не является новым (НЕ Источник.ЭтоНовый()). Это важно, поскольку наша проблема касается уже загруженных и ранее записанных документов, а не вновь создаваемых интерактивно.
        2. Мы проверяем наличие и заполненность нашего дополнительного реквизита ИсходныйНомерИзОбмена. Если он есть и его значение заполнено, это служит надежным индикатором того, что документ пришел из обмена и у нас есть его оригинальный номер. Мы используем метод ДополнительныеРеквизиты.Найти("ИсходныйНомерИзОбмена") для проверки наличия реквизита.
        3. Мы сравниваем текущий номер документа (Источник.Номер), который система пытается записать, с сохраненным значением ИсходныйНомерИзОбмена.
        4. Если эти номера отличаются, это означает, что система попыталась изменить номер. В этом случае мы принудительно возвращаем документу его ИсходныйНомерИзОбмена, устанавливая Источник.Номер = ИсходныйНомер.

        Пример кода для обработчика:

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

      Для успешной работы вышеописанного кода нам потребуется предварительно настроить дополнительный реквизит и обеспечить его заполнение в процессе обмена данными.

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

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

        Как это сделать, зависит от используемого механизма обмена:

        • Если используются стандартные правила обмена (например, через "Конвертацию данных"): Возможно, потребуется модифицировать правила обмена (файл XML) через внешнюю обработку "Конвертация данных 2.0" или "3.0". Вам нужно будет добавить сопоставление, которое будет переносить значение поля Номер источника (документа в УТ) в дополнительный реквизит приемника (документа в БП КОРП).
        • Если используются обработчики событий при загрузке (в модулях обмена): Если вы используете какой-либо код, который выполняется при загрузке документов (например, в общем модуле или обработчике обмена данными), вы можете добавить туда строку, которая будет заполнять этот реквизит. Пример кода для обработчика событий обмена:

          
          // Пример кода в обработчике события, которое выполняется при загрузке объекта
          // Например, в процедуре "ПередЗаписьюОбъекта" или "ПриЗагрузкеОбъекта" в модуле обмена.
          Процедура ПередЗаписьюОбъектаПриЗагрузке(Объект, Отказ, Параметры)
              // Проверяем, что текущий объект - это документ "Реализация товаров и услуг"
              Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
                  // Получаем менеджер дополнительных реквизитов для текущего объекта.
                  // Этот менеджер позволяет работать с дополнительными реквизитами программно.
                  МенеджерДопРеквизитов = ДополнительныеРеквизитыИСведения.ПолучитьМенеджерЗначенийСвойств(Объект);
          
                  // Проверяем, существует ли наш дополнительный реквизит.
                  // Это предотвратит ошибку, если реквизит еще не создан.
                  Если МенеджерДопРеквизитов.Свойство("ИсходныйНомерИзОбмена") Тогда
                      // Записываем текущий номер документа (который пришел из УТ)
                      // в наш дополнительный реквизит "ИсходныйНомерИзОбмена".
                      МенеджерДопРеквизитов.УстановитьЗначениеСвойства("ИсходныйНомерИзОбмена", Объект.Номер);
                  КонецЕсли;
              КонецЕсли;
          КонецПроцедуры
          

Заключение

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

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

Таким образом, путем аккуратной настройки расширения и адаптации правил обмена, мы можем обеспечить сохранение целостности номеров документов, что способствует повышению точности и надежности ведения учета в вашей 1С:Бухгалтерия КОРП.

← На главную