Как исправить ошибку «Поле объекта не обнаружено» при программной установке субконто в 1С

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

При разработке алгоритмов проведения документов в 1С программисты часто сталкиваются с необходимостью программного заполнения аналитики на счетах бухгалтерского учета. Для этого в типовых конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем), предусмотрена удобная процедура ОбщегоНазначения.УстановитьСубконто(). Однако неправильное использование этой функции может привести к ошибкам выполнения кода. В этой статье мы подробно разберем, почему возникает ошибка «Поле объекта не обнаружено» и как правильно передавать параметры в эту процедура.

Разбор проблемной ситуации

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


ОбщегоНазначения.УстановитьСубконто(Движение.СчетДт, Движение.СубконтоДт, Строка(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты), ВыборкаДетальныеЗаписи.Субконто1);
ОбщегоНазначения.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоДт, Строка(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами), ВыборкаДетальныеЗаписи.Субконто3.ссылка);

При выполнении этого кода система выдает ошибку: «Поле объекта не обнаружено (Документы расчетов с контрагентами)». Давайте проанализируем причины возникновения этой проблемы по шагам.

Причина №1: Некорректное использование функции Строка()

Это самая распространенная ошибка при работе с метаданными. Проанализируем, что происходит, когда мы вызываем Строка(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами). Функция Строка() для объектов метаданных и элементов планов видов характеристик возвращает их Представление (наименование или синоним).

В типовом плане видов характеристик элемент называется «Документы расчетов с контрагентами» (с пробелами). Однако функция УстановитьСубконто() внутри себя обращается к коллекции субконто. Чтобы обращение прошло успешно, ей нужно передать либо строковое имя (идентификатор без пробелов), либо ссылку на сам вид субконто. Когда в функцию попадает строка с пробелами, система пытается найти свойство с таким именем в структуре или наборе записей и, естественно, не находит его, выбрасывая ошибку «Поле объекта не обнаружено».

Решение: Никогда не используйте Строка() для получения идентификатора субконто. Вместо этого передавайте либо саму ссылку, либо явное имя в кавычках.

Причина №2: Логическая опечатка в соответствии счетов и субконто

Проанализируем внимательно вторую строку кода из примера:

ОбщегоНазначения.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоДт, ...)

Здесь мы видим явную опечатку: в качестве первого параметра передается Счет Кредита (СчетКт), а в качестве второго — коллекция субконто Дебета (СубконтоДт). Это приведет к тому, что функция будет пытаться найти виды субконто, принадлежащие счету кредита, в наборе аналитики дебета. Это грубая логическая ошибка, которая может привести к непредсказуемому поведению системы или отсутствию заполнения данных.

Правильные способы установки субконто

Рассмотрим несколько вариантов корректного написания кода, которые помогут избежать ошибок.

Вариант 1. Передача прямой ссылки на вид субконто

Этот способ считается наиболее надежным, так как исключает ошибки в написании строк и защищен от переименований метаданных в будущем.


// Правильная установка для Дебета
ОбщегоНазначения.УстановитьСубконто(
    Движение.СчетДт, 
    Движение.СубконтоДт, 
    ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты, 
    ВыборкаДетальныеЗаписи.Субконто1
);

// Правильная установка для Кредита
ОбщегоНазначения.УстановитьСубконто(
    Движение.СчетКт, 
    Движение.СубконтоКт, 
    ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами, 
    ВыборкаДетальныеЗаписи.Субконто3
);

Вариант 2. Использование строкового имени (идентификатора)

Если вы предпочитаете использовать строковые ключи, убедитесь, что вы используете внутреннее имя объекта метаданных без пробелов.


ОбщегоНазначения.УстановитьСубконто(Движение.СчетДт, Движение.СубконтоДт, "Контрагенты", Значение);
ОбщегоНазначения.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоКт, "ДокументыРасчетовСКонтрагентами", Значение);

Вариант 3. Динамическое получение имени из метаданных

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


ВидСубкСсылка = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры;
ИмяСубконто = ВидСубкСсылка.Метаданные().Имя;
ОбщегоНазначения.УстановитьСубконто(Движение.СчетДт, Движение.СубконтоДт, ИмяСубконто, НашДоговор);

Дополнительные рекомендации по работе с субконто

Выясним, на что еще стоит обратить внимание при программном формировании движений по регистрам бухгалтерии:

  1. Проверка наличия субконто на счете. Функция ОбщегоНазначения.УстановитьСубконто хороша тем, что она проверяет, назначен ли указанный вид субконто конкретному счету. Если вы попытаетесь установить «Контрагента» на счет, где его нет, система просто проигнорирует команду, не вызывая критической ошибки.
  2. Типизация значений. Убедитесь, что передаваемое значение (четвертый параметр) соответствует типу, заданному в Плане видов характеристик для этого субконто. Например, если вид субконто — «Договоры», а вы передаете строку вместо ссылки на справочник, субконто останется пустым.
  3. Порядок следования. Помните, что на счетах может быть до трех (в типовых решениях) субконто. Функция УстановитьСубконто сама найдет нужный «номер» (индекс) аналитики на счете, что избавляет разработчика от необходимости знать, является ли «Контрагент» первым или вторым субконто на конкретном счете.
  4. Прямое обращение к коллекции. Если производительность критична, и вы точно знаете структуру счета, можно использовать прямое обращение: Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Значение;. Однако такой подход менее гибкий и чаще приводит к ошибкам при изменении плана счетов.

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

← На главную