Как программно заполнить реквизиты документа с помощью внешней обработки?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Налоговый учет Промышленность, строительство и АПК
← На главную

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

Почему изменения не записываются в базу?

Когда вы работаете с Выборка или запросом, вы получаете только «ссылочные» данные. Чтобы внести изменения в документ, недостаточно просто присвоить новое значение переменной. Необходимо получить полноценный объект документа, изменить его свойства и принудительно вызвать метод Записать(). Именно метод ОбъектДокумент.Записать() является критически важным звеном, без которого любые манипуляции останутся только в оперативной памяти и не будут зафиксированы в БД.

Разбираем алгоритм обновления данных

Рассмотрим по шагам, как правильно реализовать цикл обхода документов и их запись:

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

Вот пример кода, который демонстрирует этот процесс на практике:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.ВводОстатковВнеоборотныхАктивов2_4.ОС";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбъектДокумент = Выборка.Ссылка.ПолучитьОбъект();
    // Устанавливаем режим загрузки для ускорения
    ОбъектДокумент.ОбменДанными.Загрузка = Истина;
    
    Для каждого СтрокаТЧ Из ОбъектДокумент.ОС Цикл
        СтрокаТЧ.ДатаПринятияКУчетуНУ = СтрокаТЧ.ДатаПринятияКУчетуБУ;
    КонецЦикла;
    
    ОбъектДокумент.Записать();
КонецЦикла;

Оптимизация массовой записи

Когда документов тысячи, важно учитывать производительность. Давайте рассмотрим, как мы можем ускорить работу кода:

На что обратить внимание при работе с БСП

Многие современные конфигурации, такие как 1С:ERP Управление предприятием, активно используют БСП. При вызове Записать() система может запускать множество процедур в общих модулях, что замедляет выполнение скрипта. Если вы видите, что процесс «скачет» по модулям, проверьте, нет ли у вас лишних подписок на события. Использование режима Загрузка обычно помогает избежать срабатывания большинства стандартных механизмов БСП.

Важное примечание: Если после использования метода Записать() изменения по-прежнему не видны в отчетах или списках, проверьте, не переопределены ли значения реквизитов другими подписками на события, либо убедитесь, что вы меняете именно тот реквизит, который используется в запросе отчета.

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

← На главную