При разработке внешних обработок для изменения строк табличной части документов разработчики часто сталкиваются с ситуацией, когда код выполняется без видимых ошибок, однако цены или другие реквизиты в открытой форме документа не обновляются. Проанализируем основные причины этой проблемы, ошибки в коде и способы корректного обновления данных на форме без обязательного сохранения документа в базу данных.
Рассмотрим распространенную ошибку в логике обхода строк. В исходном коде проверка производителя выглядела следующим образом:
Если Документы.ИзменениеЦен.Товары.Номенклатура.Производитель = ЭтаФорма.Производитель Тогда
Конструкция Документы.ИзменениеЦен представляет собой обращение к менеджеру объекта конфигурации, а не к конкретному документу или текущей строке табличной части. У менеджера объекта нет доступа к реквизитам конкретной строки выбранного номенклатурного позиционирования.
Чтобы обратиться к свойствам номенклатуры в текущем цикле обхода, необходимо использовать переменную цикла (в данном случае СтрокаТЧ):
Для каждого СтрокаТЧ Из Товары Цикл
Если СтрокаТЧ.Номенклатура.Производитель = ЭтаФорма.Производитель Тогда
// Выполнение пересчета цен
КонецЕсли;
КонецЦикла;
Если внешняя обработка открывает свою собственную форму для ввода параметров (например, выбора производителя и процента наценки), алгоритм пересчета выполняется в контексте формы обработки. При этом изменения вносятся в локальные данные обработки, а не в открытую форму документа.
Чтобы изменить данные в документе-основании без его незамедлительного сохранения в базу данных, разберем порядок работы с контекстом формы-владельца:
ВладелецФормы.Объект.Товары.ВладелецФормы.Модифицированность = Истина. Это дает платформе понять, что данные формы изменены, и пользователь сможет visual-льно оценить результат перед записью документа.Пример корректного алгоритма пересчета цен во внешней обработке:
Процедура ПересчитатьЦенуВДокументе(ОбновитьПроцентНаценки)
ТабличнаяЧастьДокумента = ВладелецФормы.Объект.Товары;
Для каждого СтрокаТЧ Из ТабличнаяЧастьДокумента Цикл
Если СтрокаТЧ.Номенклатура.Производитель <> ПроизводительВыбранный Тогда
Продолжить;
КонецЕсли;
Если ОбновитьПроцентНаценки Тогда
Если ПроцентНаценкиИзНоменклатуры Тогда
СтрокаТЧ.ПроцентНаценки = СтрокаТЧ.Номенклатура.ПроцентНаценки;
Иначе
СтрокаТЧ.ПроцентНаценки = ПроцентНаценки;
КонецЕсли;
КонецЕсли;
Если СтрокаТЧ.ЦенаБазовая > 0 Тогда
СтрокаТЧ.Цена = СтрокаТЧ.ЦенаБазовая + (СтрокаТЧ.ЦенаБазовая * СтрокаТЧ.ПроцентНаценки / 100);
КонецЕсли;
СтрокаТЧ.СуммаНаценки = СтрокаТЧ.Цена - СтрокаТЧ.ЦенаБазовая;
// Логика округления
НоваяЦена = СтрокаТЧ.Цена;
Если ОкруглятьДо > 0 Тогда
ДельтаОкругления = НоваяЦена / ОкруглятьДо;
ДельтаОкругленияЦел = Цел(ДельтаОкругления);
Если ДельтаОкругления <> ДельтаОкругленияЦел Тогда
НоваяЦена = (ДельтаОкругленияЦел + 1) * ОкруглятьДо;
КонецЕсли;
КонецЕсли;
СтрокаТЧ.Цена = НоваяЦена;
КонецЦикла;
ВладелецФормы.Модифицированность = Истина;
КонецПроцедуры
Выясним причину, почему точка останова может не срабатывать при отладке кода внешней обработки, подключенной через механику дополнительных отчетов и обработок БСП.
При запуске обработки из интерфейса системы библиотека БСП загружает двоичные данные файла .epf из хранилища базы данных и создает временный объект во временном каталоге. Поставленная точка останова в файле, открытом в Конфигураторе, ссылается на другой файл, поэтому отладчик ее пропускает.
Для решения проблемы с отладкой применим один из следующих подходов: