В практике сопровождения 1С:Бухгалтерии 3.0 часто возникают задачи по массовой корректировке данных в документах прошлых периодов. Типичный пример — необходимость очистить поле Комментарий во всех документах ПоступлениеТоваровУслуг, начиная с 2013 года. Главная сложность здесь заключается не в самом изменении, а в том, чтобы не спровоцировать массовое перепроведение документов при закрытии месяца и не сдвинуть границу последовательности в закрытых периодах.
Разберем детально несколько способов решения этой задачи: от использования стандартных инструментов до программного кода и прямого вмешательства в базу данных.
Проанализируем самый простой и безопасный для пользователя метод. В типовых конфигурациях на платформе 8.3 существует мощный инструмент для массовой правки данных. Однако по умолчанию он работает в «обычном» режиме, что может привести к записи документа с выполнением всех проверок и регистраций изменений.
Рассмотрим, как запустить эту обработку правильно:
Документ Поступление (акты, накладные, УПД).Комментарий, установим галочку и оставим значение пустым (или введем нужное).Почему это работает? Включение режима «Загрузка данных» устанавливает свойство ОбменДанными.Загрузка = Истина. Это сообщает системе, что данные записываются «как есть», и большинство стандартных проверок и механизмов регистрации изменений в последовательностях будут проигнорированы.
Если документов «очень много» и работа стандартной обработки затягивается или требуется более тонкая логика, мы можем написать небольшую внешнюю обработку. Выясним, какие методы программного кода позволяют избежать перепроведения.
Ключевым моментом здесь является использование метода Записать с параметром РежимЗаписиДокумента.Запись. Рассмотрим пример кода:
Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.Комментарий = ""; // Очищаем комментарий
// Устанавливаем режим загрузки, чтобы не срабатывали подписки на события
Объект.ОбменДанными.Загрузка = Истина;
// Записываем объект БЕЗ проведения
Попытка
Объект.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Ошибка при записи документа " + Объект + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Проанализируем ситуацию с подписками на события. В современных версиях БП 3.0 многие механизмы, отвечающие за актуализацию последовательностей и закрытие месяца, вынесены в Подписки на события. Важно убедиться, что подписки в вашей конфигурации корректно обрабатывают флаг ОбменДанными.Загрузка. Обычно типовые подписки 1С учитывают этот флаг и не регистрируют изменения, если он установлен в Истина.
Этот метод считается экстремальным и нарушает условия лицензионного соглашения 1С, однако он самый быстрый. Если документов миллионы, выполнение через интерфейс 1С может занять часы, в то время как SQL-запрос справится за секунды.
Посмотрим на последовательность действий:
ПолучитьСтруктуруХраненияБазыДанных()._DocumentXXX, а поле комментария — _FldYYY.
UPDATE _Document123
SET _Fld456 = ''
WHERE _Date_Time >= '2013-01-01'
Важные предостережения при использовании SQL:
Рассмотрим еще один нестандартный подход, предложенный участниками обсуждения. Если нужно очистить комментарии абсолютно во всех документах данного типа, можно временно удалить реквизит Комментарий из документа в конфигураторе, обновить базу данных (при этом данные в таблице SQL будут физически удалены), а затем вернуть реквизит обратно.
Этот метод работает быстро, но имеет ряд ограничений:
Чтобы выполнить это, если кнопка «Удалить» не активна, необходимо зайти в Конфигурация — Поддержка — Настройка поддержки и разрешить изменения для нужного объекта.
Проанализировав все варианты, мы рекомендуем придерживаться следующего алгоритма:
Таким образом, использование свойства ОбменДанными.Загрузка = Истина является наиболее сбалансированным решением, сочетающим безопасность платформенных механизмов и скорость работы.