Как программно изменить КПП организации в 1С?

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

При программной разработке и интеграциях в среде 1С:Предприятие 8 часто возникает задача обновления реквизитов справочников — в частности, изменения кода причины постановки на учет (КПП) организации. Начинающие разработчики нередко сталкиваются с ситуацией, когда код выполняется без ошибок, однако новые данные в базе не сохраняются. Разберем механику работы платформы с объектами и выясним причину такого поведения.

Анализ классической ошибки с методом ПолучитьОбъект()

Рассмотрим частую ошибку, возникающую при попытке изменить реквизит справочника в одну или две несвязанные строки:


// Ошибочный вариант 1: отсутствие вызова метода Записать()
СсылкаНаОрганизацию.ПолучитьОбъект().КПП = "771111111";

// Ошибочный вариант 2: повторный вызов ПолучитьОбъект()
СсылкаНаОрганизацию.ПолучитьОбъект().КПП = "771111111";
СсылкаНаОрганизацию.ПолучитьОбъект().Записать();

Выясним причину, почему приведенный выше код не приводит к изменению данных в информационной базе:

  1. Метод ПолучитьОбъект() считывает данные из базы и создает в оперативной памяти абсолютно новый экземпляр объектной сущности СправочникОбъект.
  2. В первом варианте мы меняем реквизит у созданного в памяти объекта, но не вызываем метод Записать(). Сразу после выполнения строки объект удаляется сборщиком мусора, а изменения теряются.
  3. Во втором варианте первая строка создает первый экземпляр объекта в памяти и меняет в нем реквизит КПП. Вторая строка создает второй, совершенно новый экземпляр объекта, считывая его исходное состояние из базы данных, и записывает его обратно без каких-либо изменений. Первый объект с модифицированным КПП при этом уничтожается.

Правильный способ программной перезаписи реквизита

Для корректного сохранения изменений необходимо сначала поместить ссылку на созданный объект в переменную, изменить требуемые реквизиты и затем вызвать метод Записать() у этой же переменной.

Разберем рабочий пример кода:


ОбъектОрганизации = СсылкаНаОрганизацию.ПолучитьОбъект();
ОбъектОрганизации.КПП = "771111111";
ОбъектОрганизации.Записать();

В этом случае платформа работает с одним и тем же экземпляром объекта в памяти и фиксирует новые значения в базе данных.

Особенности записи при наличии проверок и блокировок

При вызове метода Записать() платформа выполняет обработчики событий модуля объекта (ПередЗаписью, ПриЗаписи) и общие подписки на события. В типовых конфигурациях встроена проверка корректности формата КПП (строка из 9 знаков, отсутствие недопустимых символов).

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


Попытка
    ОбъектОрганизации = СсылкаНаОрганизацию.ПолучитьОбъект();
    Если ОбъектОрганизации <> Неопределено Тогда
        ОбъектОрганизации.ОбменДанными.Загрузка = Истина;
        ОбъектОрганизации.КПП = "771111111";
        ОбъектОрганизации.Записать();
    КонецЕсли;
Исключение
    // Обработка ошибок блокировки или отсутствия прав доступа
    ЗаписьЖурналаРегистрации("ОбновлениеКПП", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

Быстрое изменение реквизитов средствами БСП

Если в конфигурации используется Библиотека стандартных подсистем (БСП), то для обновления одиночных реквизитов можно использовать готовую функцию общего модуля без явного получения объекта:


ЗначенияРеквизитов = Новый Структура;
ЗначенияРеквизитов.Вставить("КПП", "771111111");

ОбщегоНазначения.УстановитьРеквизитыОбъекта(СсылкаНаОрганизацию, ЗначенияРеквизитов);

Особенности хранения КПП в современных типовых решениях

Обратим внимание на архитектуру хранения данных в современных конфигурациях (1С:ERP, 1С:Комплексная автоматизация, 1С:Бухгалтерия предприятия 3.0, 1С:Управление торговлей 11):

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