Как программно изменить договор в документах Поступление на расчетный счет и Списание с расчетного счета в 1С:Бухгалтерия 3.0?

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

При автоматизации учетных задач в конфигурации Бухгалтерия предприятия 3.0 часто возникает необходимость массового изменения реквизитов документов. Однако попытка простого присвоения нового значения реквизиту ДоговорКонтрагента в табличной части РасшифровкаПлатежа часто приводит к ошибкам при проведении документа. Рассмотрим, почему это происходит и как правильно подойти к решению данной задачи.

Почему простого изменения реквизита недостаточно?

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

  1. Пересчет сумм в зависимости от валюты нового договора.
  2. Актуализацию счетов учета (счета расчетов с контрагентами, счета авансов).
  3. Установку признаков расчетов в условных единицах.
  4. Заполнение параметров погашения задолженности.

Если вы программно меняете только ссылку на договор, эти зависимые данные остаются «старыми» или пустыми. В результате, при попытке проведения, модуль УчетВзаиморасчетов обращается к параметрам, которые не были корректно инициализированы, что и приводит к ошибкам типа Преобразование значения к типу Булево не может быть выполнено.

Рекомендуемые способы решения задачи

Разберем, как можно организовать процесс внесения изменений корректно.

Способ 1: Сравнение эталонного документа

Если логика изменения договора сложная, одним из самых надежных методов является метод «эталона». Создайте в тестовой базе два документа: один, в котором вы вручную поменяли договор и успешно провели, и второй — исходный, который вы хотите изменить программно.

Выгрузите данные обоих документов в консоль запросов и сравните все поля, включая скрытые реквизиты табличных частей. Часто вы обнаружите, что при смене договора меняются служебные идентификаторы или флаги настроек в табличной части. Это позволит вам понять, какие именно поля нужно заполнить в вашей обработке помимо ДоговорКонтрагента.

Способ 2: Эмуляция действий пользователя

Вместо прямой записи объекта, попробуйте вызвать типовые методы заполнения. В модуле объекта документа ПоступлениеНаРасчетныйСчет или СписаниеСРасчетногоСчета поищите процедуры, которые отвечают за обновление данных при изменении договора. Попробуйте выполнить следующий алгоритм в вашей обработке:


ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Устанавливаем новый договор
ДокОбъект.РасшифровкаПлатежа[0].ДоговорКонтрагента = НовыйДоговор;

// Здесь необходимо вызвать процедуры пересчета, 
// которые обычно вызываются из формы. 
// Например, метод заполнения счетов расчетов:
ДокОбъект.ЗаполнитьСчетаРасчетов();

// Либо вызов через общий модуль, если это предусмотрено архитектурой:
УчетВзаиморасчетов.ЗаполнитьПараметрыРасчетов(ДокОбъект);

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Важные рекомендации при разработке

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

Подводя итог, можно сказать, что простого присвоения ссылки на договор недостаточно. Вам необходимо обеспечить консистентность данных всего объекта. Самый надежный путь — это анализ модуля формы документа и последовательный вызов функций, которые отвечают за подготовку данных взаиморасчетов на сервере.

← На главную