Как обойти помеченных на удаление контрагентов при конвертации данных из 1С 8.3 в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Перенос данных между современными конфигурациями на платформе 1С:Предприятие 8.3 и устаревшими базами на 1С:Предприятие 7.7 — это задача, с которой регулярно сталкиваются разработчики при поддержке исторических систем учета. Из-за существенных различий в архитектуре этих двух платформ стандартные механизмы «Конвертации данных 2.1» могут вести себя непредсказуемо.

Типичный пример такой проблемы — сопоставление справочников при выгрузке документов. Предположим, мы переносим документы, где контрагенты должны сопоставляться по ИНН и Наименованию. В базе-приемнике 1С 7.7 присутствуют несколько дубликатов одного и того же контрагента (например, три записи), причем два из них помечены на удаление, а один является активным. При стандартной настройке правил обмена система находит первый попавшийся элемент (который часто оказывается помеченным на удаление), подставляет его в документ и «оживляет» — автоматически снимает с него пометку удаления.

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

Почему стандартные способы «Конвертации данных» не работают в 1С 7.7?

Для начала проанализируем причины, по которым популярные рекомендации для платформы 1С 8.х оказываются абсолютно неработоспособными при выгрузке в 1С 7.7:

  1. Обработчик «Поля поиска» не поддерживается загрузчиком 1С 7.7. Этот обработчик событий является мощным инструментом «Конвертации данных 2.1», но он ориентирован исключительно на платформу 1С 8.х (где загрузка выполняется через обработку УниверсальныйОбменДаннымиXML.epf). Универсальная обработка загрузки для семерки — V77Imp.ert — просто не содержит парсера для этого обработчика и полностью игнорирует прописанный в нем код.
  2. Поиск по свойству «ПометкаУдаления» вызывает системную ошибку. В 1С 8.х пометка удаления — это обычный реквизит типа Булево, хранящийся в таблице базы данных. В 1С 7.7 «Пометка на удаление» не является физическим реквизитом справочника. Это системное состояние объекта, доступное только через метод ПометкаУдаления(). Попытка установить галочку «Поиск» напротив этого свойства в ПКС (Правилах конвертации свойств) приводит к тому, что стандартный загрузчик пытается выполнить метод НайтиПоРеквизиту() по несуществующему полю, вызывая ошибку выполнения «Неверное имя реквизита».
  3. Автоматическое снятие пометки удаления при загрузке. Если в правилах обмена не заблокирована перезапись этого свойства, то при записи найденного элемента загрузчик сверяет состояние источника (в 1С 8.3 объект «активен», то есть пометка удаления равна Ложь) и приемника (в 1С 7.7 объект помечен на удаление). В результате загрузчик перезаписывает признак, восстанавливая удаленный дубль в учете.

Рассмотрим детально, как обойти эти ограничения и настроить корректный обмен.

Вариант 1. Переопределение найденного объекта в обработчике ПКО «При загрузке» (Рекомендуемый программный способ)

Хотя обработчик «Поля поиска» в среде 1С 7.7 недоступен, обработчики событий ПКО (Правил конвертации объектов) «При загрузке» и «После загрузки» прекрасно транслируются в исполняемый код модуля V77Imp.ert. Мы можем использовать этот факт для перехвата результатов стандартного поиска.

Если стандартный поиск нашел дубликат, помеченный на удаление, мы можем программно переопределить переменную Объект, выполнив ручной поиск «живого» (непомеченного) контрагента по ИНН. Писать код в данном обработчике необходимо исключительно на встроенном языке платформы 1С 7.7.

Разберем по шагам алгоритм для обработчика «При загрузке» в ПКО Контрагенты:


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

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

Вариант 2. Слияние дубликатов в базе-приемнике 1С 7.7 (Методологически верный путь)

Наличие «затроенных» элементов в справочнике Контрагенты — это серьезная методологическая ошибка ведения учета. Рано или поздно наличие дубликатов приведет к неверному распределению взаиморасчетов на счетах учета (например, 60.1 и 60.2), некорректному формированию книги покупок и книги продаж, а также к хаосу в актах сверки.

Самым правильным решением будет полное физическое уничтожение дубликатов в базе 1С 7.7 перед выполнением обмена. Выполним это по шагам:

  1. Откройте базу данных 1С 7.7 в режиме «Предприятие».
  2. Воспользуйтесь специализированной обработкой «Поиск и замена значений» (файл REPLVAL.ERT), которая поставляется на дисках информационно-технологического сопровождения (ИТС) или входит в состав типовых дополнительных обработок.
  3. В качестве переносимых объектов выберите ваши помеченные на удаление дубликаты контрагентов, а в качестве получателя ссылки — одного «живого» контрагента, который должен остаться в базе.
  4. Запустите процесс замены. Обработка найдет все упоминания удаляемых контрагентов в проводках, документах и регистрах и перепишет ссылки на правильного контрагента.
  5. После завершения замены перезапустите базу 1С 7.7 в монопольном режиме.
  6. Перейдите в меню Операции -> Удаление помеченных объектов и безвозвратно удалите очищенные дубликаты из базы данных.

После удаления дублей стандартный поиск по ИНН и Наименованию в правилах конвертации начнет отрабатывать идеально, так как в базе останется только один уникальный элемент.

Вариант 3. Запрет на снятие пометки удаления (Быстрый «костыль»)

Если по каким-то причинам (например, жесткие требования безопасности или корпоративные стандарты) вам категорически запрещено удалять дубликаты или запускать обработку замены ссылок в семерке, можно применить «костыль», который хотя бы предотвратит «оживление» удаленных объектов.

Для этого мы заблокируем перезапись пометки удаления, если объект в приемнике уже помечен на удаление. В ПКО Контрагенты найдите ПКС для свойства ПометкаУдаления. В обработчике события «Перед выгрузкой» этого свойства напишем следующий код:


// Проверяем состояние объекта в приемнике
Если ОбъектНайден = 1 Тогда
    // Если объект в 1С 7.7 уже помечен на удаление, запрещаем менять этот статус
    Если Объект.ПометкаУдаления() = 1 Тогда
        Отказ = 1; // Отменяем выгрузку и запись данного свойства
    КонецЕсли;
КонецЕсли;

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

Резюме

При переносе данных в устаревшие системы на платформе 1С 7.7 важно помнить о ее технологических ограничениях. Наилучшим решением проблемы дубликатов является их своевременная чистка и слияние (Вариант 2). Если же чистка невозможна из-за ограничений прав доступа, используйте переопределение объекта при загрузке (Вариант 1) — это гарантирует корректную привязку документов к активным контрагентам без изменения их состояния.

← На главную