При ведении оперативного и управленческого учета часто возникает необходимость скорректировать время проведения банковских документов. Например, требуется перенести входящие и исходящие платежные поручения на конец дня, чтобы входящие оплаты регистрировались до списаний или чтобы выровнять хронологию движений по расчетным счетам. Разберем подробно, как реализовать такую задачу с помощью собственной внешней обработки на обычных формах или типовых инструментов конфигурации.
Для гибкого управления процессом переноса дат создадим специализированную внешнюю обработку. Рассмотрим все этапы разработки в конфигураторе:
Файл > Новый > Внешняя обработка.ДатаНачала (тип Дата), ДатаОкончания (тип Дата) и Организация (тип СправочникСсылка.Организации).Проанализируем пример кода процедуры переноса. При изменении времени важно не просто установить всем документам время 23:59:59 через функцию КонецДня(), но и учесть последовательность: если все документы будут записаны на одну и ту же секунду, платформа упорядочит их произвольно (по внутреннему идентификатору ссылки). Поэтому разнесем документы по времени с разницей в одну секунду назад от конца суток.
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Не ЗначениеЗаполнено(ДатаНачала) Или Не ЗначениеЗаполнено(ДатаОкончания) Тогда
Предупреждение("Укажите период обработки!");
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Платежи.Ссылка КАК Ссылка,
| Платежи.Дата КАК Дата,
| Платежи.Проведен КАК Проведен,
| Платежи.ПометкаУдаления КАК ПометкаУдаления,
| Платежи.ВидДокумента КАК ВидДокумента
|ИЗ
| (ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Дата КАК Дата,
| Док.Проведен КАК Проведен,
| Док.ПометкаУдаления КАК ПометкаУдаления,
| 1 КАК ВидДокумента
| ИЗ
| Документ.ПлатежноеПоручениеВходящее КАК Док
| ГДЕ
| Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
| И (&НеУчитыватьОрганизацию ИЛИ Док.Организация = &Организация)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Док.Ссылка,
| Док.Дата,
| Док.Проведен,
| Док.ПометкаУдаления,
| 2 КАК ВидДокумента
| ИЗ
| Документ.ПлатежноеПоручениеИсходящее КАК Док
| ГДЕ
| Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
| И (&НеУчитыватьОрганизацию ИЛИ Док.Организация = &Организация)) КАК Платежи
|
|УПОРЯДОЧИТЬ ПО
| НАЧАЛОПЕРИОДА(Платежи.Дата, ДЕНЬ) ВОЗР,
| Платежи.ВидДокумента ВОЗР,
| Платежи.Дата ВОЗР";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НеУчитыватьОрганизацию", НЕ ЗначениеЗаполнено(Организация));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ТекущийДень = '00010101';
СмещениеСекунд = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
ДеньДокумента = НачалоДня(Выборка.Дата);
Если ДеньДокумента <> ТекущийДень Тогда
ТекущийДень = ДеньДокумента;
СмещениеСекунд = 0;
Иначе
СмещениеСекунд = СмещениеСекунд + 1;
КонецЕсли;
// Формируем новую дату: конец дня минус секунды смещения
НоваяДата = КонецДня(Выборка.Дата) - СмещениеСекунд;
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокументОбъект.Дата = НоваяДата;
Попытка
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Иначе
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Исключение
Сообщить("Ошибка при обработке документа: " + Выборка.Ссылка + " - " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЦикла;
Сообщить("Перенос документов успешно завершен!");
КонецПроцедуры
Выясним, на какие аспекты системы влияет массовое изменение даты и времени проведения:
Операции > Проведение документов > Восстановление последовательностей и перепровести документы для актуализации регистров.Границы запрета изменения данных.Попытка ... Исключение, чтобы блокировка отдельного документа другим пользователем не останавливала всю процедуру.Если нет возможности написать внешнюю обработку с нуля, разберем альтернативный вариант через типовой функционал:
В конфигурации УТ 10.3 присутствует инструмент Групповая обработка справочников и документов (меню Сервис > Универсальные обработки). Она позволяет отобрать документы видов ПлатежноеПоручениеВходящее и ПлатежноеПоручениеИсходящее по требуемым фильтрам (организация, период) и выполнить действие «Изменить реквизит [Дата]». Однако следует помнить, что стандартная групповая обработка присваивает одинаковое фиксированное время всем выбранным строкам без посекундного распределения.