Представим ситуацию: вы работаете в 1С:Бухгалтерия КОРП (БП КОРП), версия 3.0.147.25, и настроили обмен данными с 1С:Управление торговлей (УТ), версия 11.5. Из УТ успешно прилетают документы реализации товаров и услуг. Однако возникает досадная проблема: при открытии такого документа в БП КОРП, добавлении, например, подразделения и последующем сохранении, номер документа автоматически меняется. Исходный номер, пришедший из УТ (например, ФХЦБ-000019), превращается в новый, соответствующий внутренней логике БП (например, 02НБ-000001).
Более того, мы замечаем интересную особенность: если мы очищаем подразделение в документе и сохраняем его, номер снова меняется, например, на ФХНБ-000003. При повторном выборе подразделения и сохранении номер снова корректируется на 02НБ-000003, и так далее, сохраняя при этом сквозную нумерацию для нового префикса. Эта "фича" с автонумерацией доставляет неудобства, поскольку нам необходимо сохранить нумерацию базы-отправителя и в принципе не допускать ее изменения.
В более старых версиях 1С:Бухгалтерии (например, БП 2.0) существовала настройка стратегии редактирования номеров объектов через меню "Сервис - Служебные". Однако в 1С:Бухгалтерии 3.0 эта возможность в пользовательском режиме отсутствует. Разработчики 1С отмечали, что пожелания по ее реализации зарегистрированы, но пока мы не имеем встроенного решения. Давайте разберемся, почему это происходит и как можно остановить это автоматическое изменение нумерации, сохраняя номера документов, пришедшие из базы-отправителя.
Прежде чем перейти к решению, нам важно понять, как формируется номер документа в системе 1С. Номер документа — это не просто порядковый набор символов, а структурированная строка, которая может состоять из нескольких частей:
За этими префиксами следует порядковый номер, который автоматически увеличивается при создании нового документа. Важный момент: автоматическое формирование номера происходит в момент записи документа в базу. Это значит, что если номер не соответствует внутренним правилам 1С, система может попытаться его "исправить" при первом же сохранении.
Ситуация, когда документ, прилетевший из УТ, меняет свой номер после редактирования в БП КОРП, является типовой и объясняется внутренними правилами работы платформы 1С. Давайте проанализируем эту ситуацию:
Именно поэтому, когда вы указываете подразделение и сохраняете, система видит, что документ "меняется", и "пользуется" этой возможностью для пересчета номера по своим правилам.
Мы рассмотрим два основных подхода к решению этой задачи. Один из них, связанный с прямым отключением префиксов, может показаться простым, но имеет свои риски. Второй, более гибкий и рекомендуемый, предполагает использование расширения конфигурации.
Изначально, на форуме прозвучало предложение "Префикс у подразделения надо отключить" или искать "РС Префиксы объектов информационных баз". Давайте разберем этот вариант.
На форуме справедливо было отмечено: "не надо отключать префикс(обычно он указывается в настройках обмена) - в расширении добавьте проверку если загружен то не менять номер." Это подводит нас ко второму, более безопасному и гибкому решению.
Этот подход является наиболее гибким, безопасным и позволяет сохранить типовую конфигурацию без изменений, что значительно упрощает ее обновление. Мы будем "вмешиваться" в процесс записи документа, чтобы система не меняла номер, если документ пришел из обмена.
Расширения позволяют добавлять новый функционал или изменять существующий в типовой конфигурации, не затрагивая ее напрямую. Это достигается за счет наложения изменений поверх основной конфигурации. Если расширение отключить, конфигурация возвращается к исходному состоянию. Это идеальный инструмент для нашей задачи, так как он позволяет решить проблему без модификации типовой БП КОРП.
ПередЗаписью:
Платформа 1С:Предприятие предоставляет мощный механизм подписок на события. Это позволяет выполнить ваш код в определенный момент жизненного цикла объекта (например, документа, элемента справочника) – до записи, после записи, при удалении и так далее. Наша "точка входа" – это подписка на событие ПередЗаписью для объекта документа "Реализация товаров и услуг".
Почему именно ПередЗаписью? Потому что именно в этот момент система, в том числе, проверяет и формирует номер документа. Если мы сможем вмешаться до того, как система изменит номер, мы получим возможность сохранить его исходное значение или переопределить его до того, как он будет окончательно зафиксирован.
Для реализации этого решения мы будем создавать расширение и в нем – подписку на событие. Давайте рассмотрим шаги.
ПриЗаписиРеализацииИзОбмена.Документ.РеализацияТоваровУслуг. Если проблема наблюдается и с другими документами, вы можете создать отдельные подписки для каждого из них или одну общую, указав "Все объекты" (но это требует более сложной логики в обработчике).ПередЗаписью.Модули.ОбщийМодульРасширения). При создании обработчика платформа сама предложит шаблон процедуры. Пример имени процедуры: ОбщийМодульРасширения.ПередЗаписьюРеализацияТоваровУслуг.В модуле обработчика подписки нам нужно будет реализовать логику, которая проверит, является ли документ загруженным из УТ, и если да, то сохранит его исходный номер.
Рассмотрим подробнее логику обработчика:
ОбменДанными.Загрузка = Истина. Вы могли бы использовать этот флаг в обработчике правил обмена для того, чтобы сохранить исходный номер документа.ОбменДанными.Загрузка уже будет Ложь. Поэтому нам нужен другой, более надежный способ определить, что документ "пришел из обмена".ИсходныйНомерИзОбмена, тип которого - строка. Этот реквизит должен быть заполнен в момент, когда документ впервые загружается из УТ.ПередЗаписью:
Когда пользователь редактирует документ (например, указывает подразделение) и пытается его сохранить, срабатывает наша подписка ПередЗаписью. В этот момент мы реализуем следующую логику:
НЕ Источник.ЭтоНовый()). Это важно, поскольку наша проблема касается уже загруженных и ранее записанных документов, а не вновь создаваемых интерактивно.ИсходныйНомерИзОбмена. Если он есть и его значение заполнено, это служит надежным индикатором того, что документ пришел из обмена и у нас есть его оригинальный номер. Мы используем метод ДополнительныеРеквизиты.Найти("ИсходныйНомерИзОбмена") для проверки наличия реквизита.Источник.Номер), который система пытается записать, с сохраненным значением ИсходныйНомерИзОбмена.ИсходныйНомерИзОбмена, устанавливая Источник.Номер = ИсходныйНомер.Пример кода для обработчика:
Процедура ПередЗаписьюРеализацияТоваровУслуг(Источник, Отказ, РежимЗаписи) Экспорт
// Источник - это объект документа "РеализацияТоваровУслуг", который готовится к записи.
// Отказ - параметр, который позволяет отменить запись документа, если установить его в Истина.
// РежимЗаписи - режим, в котором происходит запись (Создание, Обновление).
// Шаг 1: Проверяем, что документ уже не является новым.
// Это важно, так как мы хотим работать с документами, которые уже были загружены и записаны.
Если НЕ Источник.ЭтоНовый() Тогда
// Шаг 2: Проверяем наличие нашего дополнительного реквизита "ИсходныйНомерИзОбмена".
// Мы используем Найти() для безопасного обращения к реквизиту.
РеквизитИсходныйНомер = Источник.ДополнительныеРеквизиты.Найти("ИсходныйНомерИзОбмена");
Если РеквизитИсходныйНомер <> Неопределено Тогда
// Шаг 3: Получаем значение исходного номера из дополнительного реквизита.
СтрокаИсходногоНомера = РеквизитИсходныйНомер.Значение;
// Шаг 4: Если исходный номер заполнен и текущий номер документа отличается от исходного,
// то мы восстанавливаем исходный номер.
Если ЗначениеЗаполнено(СтрокаИсходногоНомера) И Источник.Номер <> СтрокаИсходногоНомера Тогда
// Устанавливаем документу оригинальный номер из обмена.
Источник.Номер = СтрокаИсходногоНомера;
// Опционально: можно вывести сообщение пользователю для информирования о восстановлении номера.
// Это может быть полезно для отладки или для информирования пользователей о действиях системы.
// Сообщить("Номер документа " + Источник.Ссылка + " был восстановлен на исходный номер из обмена: " + СтрокаИсходногоНомера, СтатусСообщения.Информация);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для успешной работы вышеописанного кода нам потребуется предварительно настроить дополнительный реквизит и обеспечить его заполнение в процессе обмена данными.
Это самый критичный шаг. Вы должны убедиться, что при загрузке документа "Реализация товаров и услуг" из УТ в БП КОРП, значение поля Номер из УТ записывается в ваш новый дополнительный реквизит ИсходныйНомерИзОбмена в БП КОРП.
Как это сделать, зависит от используемого механизма обмена:
Номер источника (документа в УТ) в дополнительный реквизит приемника (документа в БП КОРП).
// Пример кода в обработчике события, которое выполняется при загрузке объекта
// Например, в процедуре "ПередЗаписьюОбъекта" или "ПриЗагрузкеОбъекта" в модуле обмена.
Процедура ПередЗаписьюОбъектаПриЗагрузке(Объект, Отказ, Параметры)
// Проверяем, что текущий объект - это документ "Реализация товаров и услуг"
Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
// Получаем менеджер дополнительных реквизитов для текущего объекта.
// Этот менеджер позволяет работать с дополнительными реквизитами программно.
МенеджерДопРеквизитов = ДополнительныеРеквизитыИСведения.ПолучитьМенеджерЗначенийСвойств(Объект);
// Проверяем, существует ли наш дополнительный реквизит.
// Это предотвратит ошибку, если реквизит еще не создан.
Если МенеджерДопРеквизитов.Свойство("ИсходныйНомерИзОбмена") Тогда
// Записываем текущий номер документа (который пришел из УТ)
// в наш дополнительный реквизит "ИсходныйНомерИзОбмена".
МенеджерДопРеквизитов.УстановитьЗначениеСвойства("ИсходныйНомерИзОбмена", Объект.Номер);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проблема автоматического изменения нумерации документов в 1С при обмене данными с последующим редактированием является распространенной. Как мы выяснили, прямое отключение префиксов может привести к нежелательным последствиям и не всегда решает проблему полностью.
Мы рассмотрели более надежное и гибкое решение: использование расширения конфигурации с подпиской на событие ПередЗаписью, в сочетании с дополнительным реквизитом для хранения исходного номера. Этот подход позволяет эффективно контролировать нумерацию документов, сохраняя их оригинальные номера, пришедшие из базы-отправителя (УТ), даже после интерактивных изменений. Преимуществами такого решения являются сохранение типовой конфигурации, что значительно упрощает ее дальнейшие обновления, и обеспечение стабильности нумерации, критически важной для корректного учета.
Таким образом, путем аккуратной настройки расширения и адаптации правил обмена, мы можем обеспечить сохранение целостности номеров документов, что способствует повышению точности и надежности ведения учета в вашей 1С:Бухгалтерия КОРП.