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