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