Почему реквизит Субконто меняется с Неопределено на Пустую Ссылку при записи?

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

В процессе разработки или доработки конфигураций 1С, особенно связанных с бухгалтерским учетом (например, "Комплексная автоматизация", УПП или Бухгалтерия предприятия), мы часто сталкиваемся с ситуацией, когда программно установленное значение Неопределено самопроизвольно меняется на "пустую ссылку". Рассмотрим подробно, почему это происходит с реквизитами типа "Субконто" и как правильно с этим работать.

Суть проблемы

Представим ситуацию: нам необходимо программно очистить реквизит справочника, например, СубконтоКт2 в справочнике СпособыОтраженияЗарплатыВРеглУчете. Мы пишем код в обработчике формы ПередЗаписью:


ЭтотОбъект.СубконтоКт2 = Неопределено;

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

1. Различие между Объектом и Ссылкой

Для начала проанализируем важный аспект работы платформы 1С: разницу между данными в оперативной памяти формы и данными в базе.

Когда мы работаем в форме элемента, мы взаимодействуем с мутабельным объектом (ЭтотОбъект или ТекущийОбъект). Это "черновик" данных. Мы можем присвоить реквизиту любое значение, допустимое его типом. Если тип реквизита составной (например, Характеристика.ВидыСубконтоХозрасчетные), он вполне может принимать значение Неопределено.

Однако, когда мы обращаемся через точку от ссылки (ЭтотОбъект.Ссылка.Реквизит), платформа выполняет чтение данных непосредственно из базы данных. Пока транзакция записи не завершена окончательно, ссылка будет возвращать старое значение.

Если же запись прошла, но мы видим расхождение между тем, что мы записали (Неопределено), и тем, что сохранилось (Пустая ссылка), значит вмешалась логика прикладного решения или платформенные механизмы типизации.

2. Механизм типизации Субконто и Связь со счетом

Самая главная причина описанного поведения кроется в логике работы Плана счетов и механизма Характеристик (ПВХ).

Реквизиты субконто в документах и справочниках (таких как способы отражения зарплаты) не существуют сами по себе. Они жестко привязаны к выбранному Счету учета (в данном случае СчетКт). Давайте проследим логическую цепочку:

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

Таким образом, Справочник.ПодразделенияОрганизаций.ПустаяСсылка — это единственно верное "пустое" состояние для субконто, типизированного как Подразделение.

3. Как правильно проверять значение?

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

Поэтому, если вам нужно проверить в коде или запросе, заполнено ли поле, не сравнивайте его с Неопределено. Используйте универсальные методы.

В коде 1С используйте функцию ЗначениеЗаполнено():


// Правильная проверка
Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Ссылка.СубконтоКт2) Тогда
    // Действия, если субконто не заполнено (равно пустой ссылке или Неопределено)
КонецЕсли;

Если вы пишете запрос, проверяйте на пустую ссылку конкретного типа:


ВЫБРАТЬ
    Способы.Ссылка
ИЗ
    Справочник.СпособыОтраженияЗарплатыВРеглУчете КАК Способы
ГДЕ
    Способы.СубконтоКт2 = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)

Выводы

Давайте резюмируем решение:

  1. Не пытайтесь бороться с тем, что система подменяет Неопределено на ПустуюСсылку. Это штатное поведение для обеспечения целостности типов данных, заданных в Плане счетов.
  2. Если субконто определено в счете, оно никогда не будет Неопределено в базе данных (если только тип не составной и не допускает этого явно, что редкость для субконто).
  3. Для проверки "пустоты" поля всегда используйте метод ЗначениеЗаполнено(), который корректно отрабатывает и для Неопределено, и для пустых ссылок, и для пустых строк.
← На главную