При работе в конфигурации «1С:Управление торговлей 11.5» часто возникает ситуация, когда документы (например, Заказы клиентов) загружаются из внешних систем, таких как УНФ или интернет-магазины. В таких случаях реквизиты, в частности Соглашение, могут быть заполнены некорректно или требовать массового обновления в соответствии с новыми правилами учета. Однако простое изменение ссылки на соглашение в базе данных не приведет к автоматическому обновлению цен, графиков оплаты или налогообложения. Рассмотрим подробно, как правильно решить эту задачу программно, имитируя поведение системы при интерактивном выборе соглашения пользователем.
Проанализируем ситуацию: почему недостаточно просто изменить реквизит и вызвать метод Записать(РежимЗаписиДокумента.Проведение)? В управляемых формах УТ 11 соглашение является ключевым объектом, который определяет «профиль» всей сделки. При его выборе на форме срабатывают специализированные обработчики (событие СоглашениеПриИзменении), которые каскадно обновляют другие реквизиты: валюту документа, статус налогообложения НДС, склад, вид цен и даже сами цены в табличной части Товары. Если мы просто заменим ссылку программно, документ проведется со старыми данными в регистрах, что приведет к расхождениям в управленческом учете и задолженностях.
Для того чтобы система «увидела» изменения, нам необходимо создать алгоритм, который будет выполнять те же действия, что и форма. Разберем по шагам создание обработки или команды в расширении для массового обновления выбранных заказов. Для этой задачи можно использовать расширение для группового изменения реквизитов из списков УТ 11.5.
Во-первых, выясним, как получить доступ к бизнес-логике. Весь основной код пересчета в современных конфигурациях вынесен в модули менеджера или специализированные серверные модули. Рассмотрим пример кода, который можно разместить в серверной части вашей обработки или расширения:
&НаСервереБезКонтекста
Процедура ОбновитьСоглашениеВЗаказе(СсылкаНаЗаказ, НовоеСоглашение)
// Получаем объект документа для редактирования
ОбъектДокумента = СсылкаНаЗаказ.ПолучитьОбъект();
// Устанавливаем новое соглашение
ОбъектДокумента.Соглашение = НовоеСоглашение;
// ВАЖНО: Вызываем механизмы типовой конфигурации для заполнения условий
// В УТ 11 за это часто отвечают методы в модулях «ПродажиСервер» или «ОбработкаТабличныхЧастей»
// 1. Заполняем основные условия продаж по новому соглашению
ПараметрыЗаполнения = Новый Структура("Соглашение", НовоеСоглашение);
// Применяем логику заполнения реквизитов шапки (валюта, склад и т.д.)
// Ниже приведен пример типового вызова, который может меняться от версии релиза
ПродажиСервер.ЗаполнитьУсловияПродажПоСоглашению(ОбъектДокумента, ПараметрыЗаполнения);
// 2. Если нужно пересчитать цены в табличной части согласно новому соглашению
СтруктураПересчета = Новый Структура;
СтруктураПересчета.Вставить("ПересчитатьЦены", Истина);
СтруктураПересчета.Вставить("Соглашение", НовоеСоглашение);
// Вызываем обработку табличной части Товары
// Это обновит ВидЦены в строках и сами суммы
ОбъектДокумента.ЗаполнитьЦеныПоСоглашению(); // Метод может быть встроен в модуль объекта
// 3. Записываем и проводим документ
Попытка
ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ОбновлениеСоглашений", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Инфо));
КонецПопытки;
КонецПроцедуры
Если вы создаете кнопку в расширении на форме списка, вам нужно правильно обработать массив выделенных строк. Посмотрим на пример реализации клиентского обработчика:
&НаКлиенте
Процедура КомандаОбновитьСоглашения(Команда)
// Получаем список выделенных заказов
ВыделенныеСсылки = Элементы.Список.ВыделенныеСтроки;
Если ВыделенныеСсылки.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Выберите хотя бы один документ!");
Возврат;
КонецЕсли;
// Здесь можно вызвать диалог выбора нового соглашения
// Для примера предположим, что оно уже выбрано или фиксировано
Для Каждого Ссылка Из ВыделенныеСсылки Цикл
Результат = ЗаменитьСоглашениеНаСервере(Ссылка, Объект.ЦелевоеСоглашение);
КонецЦикла;
ОповеститьОбИзменении(Тип("ДокументСсылка.ЗаказКлиента"));
КонецПроцедуры
Проанализируем дополнительные факторы, которые могут повлиять на результат:
ОбменДанными.Загрузка: Часто программисты устанавливают этот флаг в Истина перед записью, чтобы избежать лишних проверок. В данной задаче этого делать нельзя, так как нам нужно, чтобы при проведении сработали все механизмы формирования движений по регистрам на основе новых данных.Заказ клиента находится в статусе Закрыт, система может запретить его редактирование. Перед выполнением кода стоит добавить проверку: Если ОбъектДокумента.Статус = Перечисления.СтатусыЗаказовКлиентов.Закрыт Тогда Продолжить; КонецЕсли;.ЗаполнитьУсловияПродажПоСоглашению корректно обновляет признак ЦенаВключаетНДС и пересчитывает суммы налогов в строках.Если задача разовая и вы не хотите писать код в расширении, можно воспользоваться стандартным инструментом администратора. Разберем, как сделать это правильно:
Заказ клиента и настройте фильтр по нужным документам.Соглашение и укажите новое значение.Таким образом, мы выяснили, что ключ к успешному обновлению соглашений лежит не в самом факте перезаписи ссылки, а в запуске встроенной бизнес-логики конфигурации УТ 11.5. Используйте программный метод с вызовом серверных процедур заполнения для достижения максимальной точности данных.