Как выбрать, удалить или аннулировать временные документы в 1С 7.7, созданные вручную, на определенную дату?

Программист 1С v7.7 Управленческий учет Финансы и профессиональные услуги
← На главную

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

1. Подход к идентификации временных документов

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

  1. Создание специального реквизита: Мы рекомендуем добавить в конфигурацию документ, который вы используете для ручного ввода, новый реквизит. Назовем его, например, ВременныйДокумент с типом "Число" и длиной 1 (или "Булево", если ваша конфигурация поддерживает такой тип для реквизитов документов, но в 7.7 число 0/1 чаще используется). Установите значение 1 для документов, введенных вручную и подлежащих последующей замене, и 0 для всех остальных.
  2. Преимущества реквизита: Использование специального реквизита обеспечивает четкий и программно доступный признак для отбора документов, исключая возможные ошибки при анализе номеров или комментариев. Это позволяет в будущем легко выполнять отборы и обработки по этому признаку.

2. Программный подход к выбору и удалению документов

После того как мы определили способ идентификации временных документов, рассмотрим алгоритм их программного выбора и последующей пометки на удаление.

  1. Выборка документов на заданную дату: Для начала нам необходимо отобрать все документы определенного вида, которые были созданы на нужную дату. В 1С 7.7 это можно сделать с помощью объекта Документ.

    Обратите внимание на особенность работы с датами в 1С 7.7: дата документа представляется как "момент времени" (дата + время). Если нам нужны все документы за конкретный день, мы указываем начальную дату как начало дня (например, 'ГГГГММДД000000') и конечную как конец дня ('ГГГГММДД235959').

    
    // Пример программного кода для 1С 7.7
    // Определяем имя вида документа, например "ПокупкаАкций"
    ИмяВидаДокумента = "ПокупкаАкций"; 
        
    // Задаем дату, за которую нужно выбрать документы
    // Например, для 15 января 2023 года
    ДатаДляОтбора = "20230115"; 
        
    // Формируем моменты времени для выборки за весь день
    НачалоДня = ДатаДляОтбора + "000000"; 
    КонецДня = ДатаДляОтбора + "235959";
        
    // Создаем объект для работы с документами
    ВыборкаДокументов = СоздатьОбъект("Документ." + ИмяВидаДокумента);
        
    // Выполняем выборку документов за указанный период
    ВыборкаДокументов.ВыбратьДокументы(НачалоДня, КонецДня);
        
    // Создаем СписокЗначений, куда будем сохранять ссылки на временные документы
    СписокДокументовКПометке = СоздатьОбъект("СписокЗначений");
        
    Пока ВыборкаДокументов.ПолучитьДокумент() = 1 Цикл
        // Получаем объект текущего документа
        ТекДокумент = ВыборкаДокументов.ТекущийДокумент();
            
        // Проверяем значение нашего служебного реквизита "ВременныйДокумент"
        // Предполагаем, что 1 означает, что документ временный и подлежит удалению
        Если ТекДокумент.ВременныйДокумент = 1 Тогда
            СписокДокументовКПометке.ДобавитьЗначение(ТекДокумент.ТекущийДокумент(), ТекДокумент.НомерДок);
            Сообщить("Найден временный документ: " + ТекДокумент.НомерДок + " от " + ТекДокумент.ДатаДок);
        КонецЕсли;
    КонецЦикла;
    
  2. Пометка документов на удаление: После того как мы собрали список всех временных документов, следующим шагом будет их пометка на удаление. Важно помнить, что в 1С 7.7 пометка на удаление — это не физическое удаление, а лишь установка соответствующего флага. Фактическое удаление происходит позже в монопольном режиме.
  3. Перед пометкой на удаление рекомендуется снять проведение с документа, чтобы избежать проблем с блокировками или некорректными проводками.

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

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

3. Альтернативный методологический подход – Аннулирование документов

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

Рассмотрим преимущества и реализацию этого подхода:

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

4. Дополнительные аспекты и рекомендации

Помимо основных методов, существуют важные нюансы, которые необходимо учитывать при работе с документами в 1С 7.7.

  1. Точность времени документов в 1С 7.7: В 1С 7.7 дата документа включает не только календарную дату, но и время с точностью до секунды (как "момент времени"). При работе с брокерскими отчетами, где важна последовательность операций, мы должны быть внимательны к точности времени. Если вы используете программное изменение времени проведенного документа, это может быть сложной задачей, так как напрямую его изменить сложно. Обычно требуется сначала сделать документ непроведенным, затем установить новое время и только потом провести заново.
  2. Групповая обработка документов (стандартная): Если объем документов для пометки на удаление невелик или вы предпочитаете ручной контроль, можно использовать встроенную обработку "Групповая обработка документов" (меню "Сервис" -> "Групповая обработка документов"). Она позволяет отобрать документы по виду, периоду и выполнить действие "Пометить на удаление" для выбранных объектов.
  3. Управление дубликатами: При загрузке данных из внешних систем, таких как брокерские отчеты, часто возникают дубликаты. Помимо использования ID для связывания, мы должны предусмотреть механизмы поиска и объединения дубликатов. Это может быть реализовано путем сопоставления по комбинации нескольких полей (например, дата, актив, количество, цена). Для 1С 7.7 это обычно означает разработку собственных процедур для сопоставления и, при необходимости, замены ссылок на "правильный" элемент или документ.
  4. Производительность и резервное копирование: Массовые операции по удалению или изменению документов в 1С 7.7 могут быть ресурсоемкими. Всегда выполняйте такие операции в нерабочее время и в монопольном режиме для избежания ошибок и максимальной производительности. Перед любой серьезной модификацией данных обязательно создавайте актуальную резервную копию базы данных. Это ваша страховка от непредвиденных проблем.
  5. Контроль ссылочной целостности: 1С 7.7 строго следит за ссылочной целостностью. Если на документ, который вы пытаетесь удалить, есть ссылки из других объектов (например, записи в регистрах, ссылки в других документах), система может не позволить его удалить. В этом случае мы должны либо вручную удалить все ссылки, либо использовать специальные обработки, которые могут удалять подчиненные объекты, но это требует крайней осторожности и понимания последствий.

Таким образом, для эффективной работы с временными документами в 1С 7.7 мы можем использовать как программные методы пометки на удаление с последующим физическим удалением, так и более гибкий методологический подход аннулирования. Выбор метода зависит от требований к сохранению истории, аудиту и сложности вашей учетной системы.

← На главную