Почему не обновляются данные в табличной части документа при вызове внешней обработки в 1С

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

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

Причина 1. Ошибка обращения к менеджеру документа вместо строки табличной части

Рассмотрим распространенную ошибку в логике обхода строк. В исходном коде проверка производителя выглядела следующим образом:


Если Документы.ИзменениеЦен.Товары.Номенклатура.Производитель = ЭтаФорма.Производитель Тогда

Конструкция Документы.ИзменениеЦен представляет собой обращение к менеджеру объекта конфигурации, а не к конкретному документу или текущей строке табличной части. У менеджера объекта нет доступа к реквизитам конкретной строки выбранного номенклатурного позиционирования.

Чтобы обратиться к свойствам номенклатуры в текущем цикле обхода, необходимо использовать переменную цикла (в данном случае СтрокаТЧ):


Для каждого СтрокаТЧ Из Товары Цикл
    Если СтрокаТЧ.Номенклатура.Производитель = ЭтаФорма.Производитель Тогда
        // Выполнение пересчета цен
    КонецЕсли;
КонецЦикла;

Причина 2. Особенности контекста управляемых форм и работа с владельцем формы

Если внешняя обработка открывает свою собственную форму для ввода параметров (например, выбора производителя и процента наценки), алгоритм пересчета выполняется в контексте формы обработки. При этом изменения вносятся в локальные данные обработки, а не в открытую форму документа.

Чтобы изменить данные в документе-основании без его незамедлительного сохранения в базу данных, разберем порядок работы с контекстом формы-владельца:

  1. Обращение к табличной части через владельца формы: При вызове обработки из формы документа доступ к его данным осуществляется через ВладелецФормы.Объект.Товары.
  2. Установка флага изменения: После обхода строк и пересчета сумм следует установить свойство ВладелецФормы.Модифицированность = Истина. Это дает платформе понять, что данные формы изменены, и пользователь сможет visual-льно оценить результат перед записью документа.

Пример корректного алгоритма пересчета цен во внешней обработке:


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

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

Как настроить отладку внешней обработки

Выясним причину, почему точка останова может не срабатывать при отладке кода внешней обработки, подключенной через механику дополнительных отчетов и обработок БСП.

При запуске обработки из интерфейса системы библиотека БСП загружает двоичные данные файла .epf из хранилища базы данных и создает временный объект во временном каталоге. Поставленная точка останова в файле, открытом в Конфигураторе, ссылается на другой файл, поэтому отладчик ее пропускает.

Для решения проблемы с отладкой применим один из следующих подходов:

  1. Прямое открытие файла через режим Предприятия: На этапе разработки открываем внешнюю обработку через меню Файл -> Открыть в клиенте 1С. В таком режиме отладчик успешно останавливается на точках останова.
  2. Включение отладки фоновых заданий: Если вызов команды обработки выполняется в фоновом задании на сервере, необходимо в Конфигураторе открыть окно Отладка -> Подключение... -> Автоматическое подключение и установить флаг напротив пункта Фоновые задания.
← На главную