Как изменить комментарий в документах 1С без перепроведения и нарушения последовательности

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

В практике сопровождения 1С:Бухгалтерии 3.0 часто возникают задачи по массовой корректировке данных в документах прошлых периодов. Типичный пример — необходимость очистить поле Комментарий во всех документах ПоступлениеТоваровУслуг, начиная с 2013 года. Главная сложность здесь заключается не в самом изменении, а в том, чтобы не спровоцировать массовое перепроведение документов при закрытии месяца и не сдвинуть границу последовательности в закрытых периодах.

Разберем детально несколько способов решения этой задачи: от использования стандартных инструментов до программного кода и прямого вмешательства в базу данных.

Способ 1. Использование встроенной обработки «Групповое изменение реквизитов»

Проанализируем самый простой и безопасный для пользователя метод. В типовых конфигурациях на платформе 8.3 существует мощный инструмент для массовой правки данных. Однако по умолчанию он работает в «обычном» режиме, что может привести к записи документа с выполнением всех проверок и регистраций изменений.

Рассмотрим, как запустить эту обработку правильно:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. Выберем тип элементов Документ Поступление (акты, накладные, УПД).
  3. Нажмем кнопку Дополнительные параметры. Это критически важный шаг. В открывшемся окне в разделе «Специальные возможности» установим флаг Выполнять в режиме загрузки данных.
  4. В таблице реквизитов найдем поле Комментарий, установим галочку и оставим значение пустым (или введем нужное).
  5. Нажмем Изменить реквизиты.

Почему это работает? Включение режима «Загрузка данных» устанавливает свойство ОбменДанными.Загрузка = Истина. Это сообщает системе, что данные записываются «как есть», и большинство стандартных проверок и механизмов регистрации изменений в последовательностях будут проигнорированы.

Способ 2. Программное изменение через встроенный язык

Если документов «очень много» и работа стандартной обработки затягивается или требуется более тонкая логика, мы можем написать небольшую внешнюю обработку. Выясним, какие методы программного кода позволяют избежать перепроведения.

Ключевым моментом здесь является использование метода Записать с параметром РежимЗаписиДокумента.Запись. Рассмотрим пример кода:


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

Проанализируем ситуацию с подписками на события. В современных версиях БП 3.0 многие механизмы, отвечающие за актуализацию последовательностей и закрытие месяца, вынесены в Подписки на события. Важно убедиться, что подписки в вашей конфигурации корректно обрабатывают флаг ОбменДанными.Загрузка. Обычно типовые подписки 1С учитывают этот флаг и не регистрируют изменения, если он установлен в Истина.

Способ 3. Прямой SQL-запрос (для клиент-серверных баз)

Этот метод считается экстремальным и нарушает условия лицензионного соглашения 1С, однако он самый быстрый. Если документов миллионы, выполнение через интерфейс 1С может занять часы, в то время как SQL-запрос справится за секунды.

Посмотрим на последовательность действий:

  1. Сначала необходимо определить имя таблицы и имя поля комментария в базе данных SQL. Для этого используем функцию ПолучитьСтруктуруХраненияБазыДанных().
  2. Имя таблицы для документов поступления обычно выглядит как _DocumentXXX, а поле комментария — _FldYYY.
  3. Запрос в SQL Management Studio будет выглядеть примерно так:

UPDATE _Document123 
SET _Fld456 = '' 
WHERE _Date_Time >= '2013-01-01'

Важные предостережения при использовании SQL:

Способ 4. Манипуляции с конфигурацией

Рассмотрим еще один нестандартный подход, предложенный участниками обсуждения. Если нужно очистить комментарии абсолютно во всех документах данного типа, можно временно удалить реквизит Комментарий из документа в конфигураторе, обновить базу данных (при этом данные в таблице SQL будут физически удалены), а затем вернуть реквизит обратно.

Этот метод работает быстро, но имеет ряд ограничений:

Чтобы выполнить это, если кнопка «Удалить» не активна, необходимо зайти в Конфигурация — Поддержка — Настройка поддержки и разрешить изменения для нужного объекта.

Выводы и рекомендации

Проанализировав все варианты, мы рекомендуем придерживаться следующего алгоритма:

  1. Всегда делайте резервную копию перед массовыми операциями.
  2. Если объем данных позволяет (до 100-200 тысяч документов), используйте Групповое изменение реквизитов с флагом «Режим загрузки данных».
  3. Для очень больших баз используйте программный скрипт с записью порциями (например, по 5000 документов в одной транзакции), чтобы не блокировать таблицу надолго.
  4. После выполнения операции обязательно проверьте Монитор основных показателей или помощник закрытия месяца, чтобы убедиться, что граница последовательности не «улетела» в 2013 год.

Таким образом, использование свойства ОбменДанными.Загрузка = Истина является наиболее сбалансированным решением, сочетающим безопасность платформенных механизмов и скорость работы.

← На главную