Как перенести платежные документы на конец дня в 1С:Управление торговлей 10.3

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

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

Создание внешней обработки: пошаговый алгоритм

Для гибкого управления процессом переноса дат создадим специализированную внешнюю обработку. Рассмотрим все этапы разработки в конфигураторе:

  1. Создание файла обработки: открываем конфигуратор, выбираем меню Файл > Новый > Внешняя обработка.
  2. Добавление реквизитов: в структуру обработки добавляем реквизиты отбора: ДатаНачала (тип Дата), ДатаОкончания (тип Дата) и Организация (тип СправочникСсылка.Организации).
  3. Создание формы: добавляем обычную форму обработки (для УТ 10.3 используются обычные формы), размещаем на ней созданные реквизиты и кнопку для запуска выполнения процедуры.
  4. Программная обработка: создаем процедуру, которая выбирает документы запросом, модифицирует их дату и выполняет запись или перепроведение.

Реализация программного кода обработки

Проанализируем пример кода процедуры переноса. При изменении времени важно не просто установить всем документам время 23:59:59 через функцию КонецДня(), но и учесть последовательность: если все документы будут записаны на одну и ту же секунду, платформа упорядочит их произвольно (по внутреннему идентификатору ссылки). Поэтому разнесем документы по времени с разницей в одну секунду назад от конца суток.


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

Важные нюансы и ограничения при смене времени документов

Выясним, на какие аспекты системы влияет массовое изменение даты и времени проведения:

  1. Восстановление последовательностей: после переноса документов задним числом в УТ 10.3 обязательно сдвигается граница последовательности партионного учета и взаиморасчетов. После выполнения обработки необходимо зайти в Операции > Проведение документов > Восстановление последовательностей и перепровести документы для актуализации регистров.
  2. Дата запрета изменения данных: если выбранный период попадает под действие даты запрета редактирования, запись объекта завершится ошибкой. Перед запуском необходимо проверить настройки регистра Границы запрета изменения данных.
  3. Контроль блокировок: блок записи обязательно оборачивается в конструкцию Попытка ... Исключение, чтобы блокировка отдельного документа другим пользователем не останавливала всю процедуру.

Использование типовых инструментов

Если нет возможности написать внешнюю обработку с нуля, разберем альтернативный вариант через типовой функционал:

В конфигурации УТ 10.3 присутствует инструмент Групповая обработка справочников и документов (меню Сервис > Универсальные обработки). Она позволяет отобрать документы видов ПлатежноеПоручениеВходящее и ПлатежноеПоручениеИсходящее по требуемым фильтрам (организация, период) и выполнить действие «Изменить реквизит [Дата]». Однако следует помнить, что стандартная групповая обработка присваивает одинаковое фиксированное время всем выбранным строкам без посекундного распределения.

← На главную