В современных типовых конфигурациях на базе 1С:ERP и 1С:Комплексная автоматизация 2.4 (и выше) программисты часто сталкиваются с ситуацией: если просто программно изменить значение реквизита (например, Соглашение или Договор) в объекте документа и записать его, результат будет отличаться от того, который получается при ручном выборе этого же реквизита в форме. Рассмотрим подробнее, почему так происходит, и как правильно реализовать программный "перевыбор" с полным обновлением всех зависимых данных.
В рассматриваемом примере автор пытался имитировать действия пользователя, открывая форму программно через ПолучитьФорму и вызывая обработчики событий типа СоглашениеПриИзменении. Разберем, почему этот путь тупиковый:
Записать может выполниться раньше, чем закончатся сложные серверные пересчеты, инициированные кодом формы.Проанализируем ситуацию, описанную в теме. Автор столкнулся с тем, что после смены соглашения счета учета (например, 004 и 41.01) не меняются. В конфигурациях 1С:ERP и КА 2.4 счета учета не хранятся в строках табличной части документа. Они определяются при проведении на основании данных скрытой табличной части ВидыЗапасов.
Важный момент: если вы программно изменили реквизит НалогообложениеНДС в шапке документа, но не обновили таблицу ВидыЗапасов, система при проведении будет использовать старые данные из этой таблицы. Именно поэтому проводки остаются неверными. При ручном же выборе соглашения в форме срабатывает сложный механизм, который помечает виды запасов к пересчету или очищает их.
Вместо того чтобы пытаться "нажать на кнопку" в форме, нам нужно выполнить последовательность действий на стороне сервера, используя механизмы самого объекта документа и общих модулей. Разберем по шагам, как это сделать правильно.
Шаг 1. Получение объекта и вызов серверной логики заполнения.
В типовых конфигурациях логика "перевыбора" вынесена в специализированные модули. Для документа ПриобретениеТоваровУслуг нам потребуются процедуры, которые обновят условия закупок.
Шаг 2. Очистка видов запасов.
Это критический шаг. Чтобы система заново рассчитала налогообложение и счета учета при проведении, нужно заставить её переформировать виды запасов.
Шаг 3. Запись с режимом проведения.
Рассмотрим пример кода, который реализует правильный перевыбор соглашения:
&НаСервере
Процедура ИсправитьДокументНаСервере(СсылкаНаДокумент)
// Получаем объект документа для редактирования
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
// 1. Устанавливаем новое (или то же самое) соглашение
// В некоторых случаях полезно сначала очистить, чтобы сработали триггеры
СоглашениеСсылка = ОбъектДок.Соглашение;
// 2. Вызываем типовой механизм заполнения условий по соглашению.
// Для каждого типа документа это свой модуль.
// Для Приобретения товаров это может быть ЗакупкиСервер или ЗакупкиКлиентСервер.
ПараметрыЗаполнения = Новый Структура();
ПараметрыЗаполнения.Вставить("УведомлятьОбОшибках", Ложь);
// Используем экспортную процедуру модуля менеджера или общего модуля
// В КА 2.4/ERP часто используется механизм ОбработкаРедактированияРеквизита
СтруктураРеквизитов = Новый Структура("Соглашение", СоглашениеСсылка);
ЗакупкиСервер.ОбработатьИзменениеРеквизитов(ОбъектДок, СтруктураРеквизитов);
// 3. Ключевой момент: сброс видов запасов
// Если этого не сделать, налогообложение в проводках не изменится!
Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВидыЗапасов", ОбъектДок.Метаданные()) Тогда
ОбъектДок.ВидыЗапасов.Очистить();
КонецЕсли;
// 4. Дополнительные свойства (информируем механизмы проведения о необходимости пересчета)
ОбъектДок.ДополнительныеСвойства.Вставить("ПересчитатьВидыЗапасов", Истина);
ОбъектДок.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);
// 5. Записываем и проводим
Попытка
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ " + СсылкаНаДокумент + " успешно обновлен.");
Исключение
Сообщить("Ошибка при проведении " + СсылкаНаДокумент + ": " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Выясним причину, по которой трудно найти нужный метод. В разных версиях КА и ERP названия общих модулей могут меняться. Чтобы найти "тот самый" метод, выполните следующие действия:
ФормаОбъекта документа ПриобретениеТоваровУслуг).СоглашениеПриИзменении.ПродажиСервер.ОбработатьИзменениеСоглашения или ЗакупкиСервер.ЗаполнитьПоСоглашению.ОбъектДок.Проанализируем еще один аспект: в Комплексной автоматизации 2.4 проводки по счетам (004, 41) формируются не сразу при нажатии "Провести", а при выполнении регламентной операции Отражение документов в регл. учете. Однако данные для этих проводок берутся из регистров накопления, которые заполняются именно в момент проведения документа на основании тех самых ВидовЗапасов. Для автоматического формирования проводок непосредственно в момент проведения можно использовать расширение для автоматического отражения документов в регламентированном учете.
Поэтому, если ваша задача — изменить счета учета, цепочка действий должна быть такой:
ВидыЗапасов.ВыручкаИСебестоимостьПродаж, ДетализацияСебестоимостиТоваров и др.).Программный перевыбор реквизита в сложных конфигурациях — это не имитация работы формы, а корректное воспроизведение бизнес-логики на уровне объекта. Всегда помните о табличной части ВидыЗапасов: в 90% случаев проблем с неверными проводками в КА и ERP виновата именно она. Очистка этой таблицы перед программным проведением заставляет систему пересчитать аналитику учета "с чистого листа" согласно новым реквизитам шапки.