Как программно перевыбрать соглашение или договор в документе ERP и КА 2.4, чтобы корректно обновились реквизиты и проводки

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

В современных типовых конфигурациях на базе 1С:ERP и 1С:Комплексная автоматизация 2.4 (и выше) программисты часто сталкиваются с ситуацией: если просто программно изменить значение реквизита (например, Соглашение или Договор) в объекте документа и записать его, результат будет отличаться от того, который получается при ручном выборе этого же реквизита в форме. Рассмотрим подробнее, почему так происходит, и как правильно реализовать программный "перевыбор" с полным обновлением всех зависимых данных.

Почему метод через получение формы часто не работает

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

  1. Контекст формы: Процедуры формы часто завязаны на внутренние переменные модуля формы, которые не инициализируются при программном открытии без участия пользователя.
  2. Асинхронность: Многие вызовы в управляемых формах 1С происходят асинхронно, и команда Записать может выполниться раньше, чем закончатся сложные серверные пересчеты, инициированные кодом формы.
  3. Сложность логики: В ERP-системах выбор соглашения тянет за собой изменение налогообложения, валют, цен, графиков оплаты и — самое важное — аналитики учета запасов. Попытка вызвать клиентский код "в лоб" из обработки не учитывает всю цепочку этих изменений.

Главный секрет: Табличная часть "Виды запасов"

Проанализируем ситуацию, описанную в теме. Автор столкнулся с тем, что после смены соглашения счета учета (например, 004 и 41.01) не меняются. В конфигурациях 1С:ERP и КА 2.4 счета учета не хранятся в строках табличной части документа. Они определяются при проведении на основании данных скрытой табличной части ВидыЗапасов.

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

Правильный алгоритм программного перевыбора

Вместо того чтобы пытаться "нажать на кнопку" в форме, нам нужно выполнить последовательность действий на стороне сервера, используя механизмы самого объекта документа и общих модулей. Разберем по шагам, как это сделать правильно.

Шаг 1. Получение объекта и вызов серверной логики заполнения.
В типовых конфигурациях логика "перевыбора" вынесена в специализированные модули. Для документа ПриобретениеТоваровУслуг нам потребуются процедуры, которые обновят условия закупок.

Шаг 2. Очистка видов запасов.
Это критический шаг. Чтобы система заново рассчитала налогообложение и счета учета при проведении, нужно заставить её переформировать виды запасов.

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


&НаСервере
Процедура ИсправитьДокументНаСервере(СсылкаНаДокумент)
    
    // Получаем объект документа для редактирования
    ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
    
    // 1. Устанавливаем новое (или то же самое) соглашение
    // В некоторых случаях полезно сначала очистить, чтобы сработали триггеры
    СоглашениеСсылка = ОбъектДок.Соглашение;
    
    // 2. Вызываем типовой механизм заполнения условий по соглашению.
    // Для каждого типа документа это свой модуль. 
    // Для Приобретения товаров это может быть ЗакупкиСервер или ЗакупкиКлиентСервер.
    ПараметрыЗаполнения = Новый Структура();
    ПараметрыЗаполнения.Вставить("УведомлятьОбОшибках", Ложь);
    
    // Используем экспортную процедуру модуля менеджера или общего модуля
    // В КА 2.4/ERP часто используется механизм ОбработкаРедактированияРеквизита
    СтруктураРеквизитов = Новый Структура("Соглашение", СоглашениеСсылка);
    ЗакупкиСервер.ОбработатьИзменениеРеквизитов(ОбъектДок, СтруктураРеквизитов);

    // 3. Ключевой момент: сброс видов запасов
    // Если этого не сделать, налогообложение в проводках не изменится!
    Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВидыЗапасов", ОбъектДок.Метаданные()) Тогда
        ОбъектДок.ВидыЗапасов.Очистить();
    КонецЕсли;

    // 4. Дополнительные свойства (информируем механизмы проведения о необходимости пересчета)
    ОбъектДок.ДополнительныеСвойства.Вставить("ПересчитатьВидыЗапасов", Истина);
    ОбъектДок.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);
    
    // 5. Записываем и проводим
    Попытка
        ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Документ " + СсылкаНаДокумент + " успешно обновлен.");
    Исключение
        Сообщить("Ошибка при проведении " + СсылкаНаДокумент + ": " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Как найти нужную процедуру заполнения?

Выясним причину, по которой трудно найти нужный метод. В разных версиях КА и ERP названия общих модулей могут меняться. Чтобы найти "тот самый" метод, выполните следующие действия:

  1. Откройте модуль формы документа (например, ФормаОбъекта документа ПриобретениеТоваровУслуг).
  2. Найдите процедуру СоглашениеПриИзменении.
  3. Посмотрите, какую серверную процедуру она вызывает. Обычно это что-то вроде ПродажиСервер.ОбработатьИзменениеСоглашения или ЗакупкиСервер.ЗаполнитьПоСоглашению.
  4. Именно эту процедуру нужно вызвать в своем коде, передав туда ОбъектДок.

Особенности отражения в регламентированном учете

Проанализируем еще один аспект: в Комплексной автоматизации 2.4 проводки по счетам (004, 41) формируются не сразу при нажатии "Провести", а при выполнении регламентной операции Отражение документов в регл. учете. Однако данные для этих проводок берутся из регистров накопления, которые заполняются именно в момент проведения документа на основании тех самых ВидовЗапасов. Для автоматического формирования проводок непосредственно в момент проведения можно использовать расширение для автоматического отражения документов в регламентированном учете.

Поэтому, если ваша задача — изменить счета учета, цепочка действий должна быть такой:

  1. Программное изменение реквизитов шапки и очистка ВидыЗапасов.
  2. Проведение документа (формируются новые движения в регистрах ВыручкаИСебестоимостьПродаж, ДетализацияСебестоимостиТоваров и др.).
  3. Запуск обработки "Отражение документов в регл. учете" (или ожидание автоматического запуска). Если после проведения программных доработок требуется проконтролировать правильность сформированных движений, можно выполнить автоматическое сравнение бухгалтерских и налоговых проводок с копией базы до изменений.

Резюме

Программный перевыбор реквизита в сложных конфигурациях — это не имитация работы формы, а корректное воспроизведение бизнес-логики на уровне объекта. Всегда помните о табличной части ВидыЗапасов: в 90% случаев проблем с неверными проводками в КА и ERP виновата именно она. Очистка этой таблицы перед программным проведением заставляет систему пересчитать аналитику учета "с чистого листа" согласно новым реквизитам шапки.

← На главную