При выполнении массовых операций над документами в 1С специалисты нередко сталкиваются с ситуацией, когда после изменения реквизита Проведен на значение Ложь с помощью стандартной обработки Групповое изменение реквизитов документ визуально отображается как непроведенный, но его движения по регистрам остаются активными. Разберем механику платформы 1С, выясним причины такого поведения и рассмотрим корректные способы групповой отмены проведения документов.
Проанализируем, как платформа 1С управляет записями регистров. В метаданных документа свойство Проведен является системным реквизитом, хранящимся в таблице самого документа. Однако очистка движений в регистрах накопления, бухгалтерии или сведений привязана не к факту изменения значения булева реквизита, а к вызову метода записи документа в определенном режиме.
Когда обработка Групповое изменение реквизитов меняет реквизит Проведен, платформа выполняет обычную запись объекта с флагом РежимЗаписиДокумента.Запись. При этом:
Проведен устанавливается в Ложь.Активность = Истина.Даже если в конфигураторе для документа задана настройка Удалять движения: Удалять автоматически при отмене проведения, данное правило срабатывает исключительно при явной отмене проведения через вызов соответствующего режима записи.
В расширенных версиях обработки Групповое изменение реквизитов (включая версии с диска ИТС) предусмотрена возможность выполнения произвольного кода для каждого выбранного объекта. Чтобы корректно снять проведение и очистить движения, перейдем на вкладку выполнения произвольного алгоритма и применим следующий код:
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
При таком вызове платформа запустит штатные механизмы распроведения, очистит все связанные наборы записей и корректно пересчитает итоги.
Если требуется массово отменить проведение без доработки конфигурации и запуска стороннего кода, воспользуемся стандартным платформенным инструментом:
Рассмотрим вариант быстрого снятия с проведения группы документов непосредственно из журнала или формы списка:
Реализация товаров и услуг).Ctrl + A (для выделения всех документов) или удерживая клавишу Shift/Ctrl.В этом случае платформа автоматически инициирует транзакцию отмены проведения для каждого выбранного объекта с полным удалением всех движений.
В ситуациях, когда требуется отобрать документы по сложным критериям (например, по наличию движений в определенном регистре за период), напишем внешнюю обработку или скрипт:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Партии.Регистратор КАК ДокументСсылка
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК Партии
|ГДЕ
| Партии.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
| И Партии.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ДокументОбъект = Выборка.ДокументСсылка.ПолучитьОбъект();
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
Исключение
Сообщить("Ошибка при отмене проведения документа " + Выборка.ДокументСсылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Если реквизит Проведен уже был изменен на Ложь, а движения остались в базе, восстановить корректное состояние регистров можно двумя путями:
НаборЗаписей = РегистрыНакопления.ПартииТоваровНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Записать(Истина);
При использовании внешних версий обработки группового изменения с диска ИТС на конфигурациях с пониженным режимом совместимости может возникнуть ошибка Метод не найден (СтрРазделить).
Функции СтрРазделить, СтрСоединить и СтрНайти поддерживаются платформой на уровне встроенного языка только в том случае, если режим совместимости конфигурации установлен на версию 8.3.6 или выше. Если режим совместимости конфигурации ниже (например, 8.3.4), даже при работе на платформе 8.3.10 вызов этих методов приведет к ошибке.
В этом случае не рекомендуется вручную повышать режим совместимости всей базы, так как это может вызвать сбои в типовом функционале. Оптимальным решением будет замена вызовов строковых функций в тексте обработки на типовые эквиваленты конфигурации (например, СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок) либо вынос собственных аналогов строковых функций в подключаемый модуль.