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