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