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