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