Перенос данных между современными конфигурациями на платформе 1С:Предприятие 8.3 и устаревшими базами на 1С:Предприятие 7.7 — это задача, с которой регулярно сталкиваются разработчики при поддержке исторических систем учета. Из-за существенных различий в архитектуре этих двух платформ стандартные механизмы «Конвертации данных 2.1» могут вести себя непредсказуемо.
Типичный пример такой проблемы — сопоставление справочников при выгрузке документов. Предположим, мы переносим документы, где контрагенты должны сопоставляться по ИНН и Наименованию. В базе-приемнике 1С 7.7 присутствуют несколько дубликатов одного и того же контрагента (например, три записи), причем два из них помечены на удаление, а один является активным. При стандартной настройке правил обмена система находит первый попавшийся элемент (который часто оказывается помеченным на удаление), подставляет его в документ и «оживляет» — автоматически снимает с него пометку удаления.
В этой статье мы подробно разберем, почему стандартные подходы из обсуждений на форумах не работают, проанализируем ограничения платформы 1С 7.7 и рассмотрим три надежных способа решения этой проблемы.
Для начала проанализируем причины, по которым популярные рекомендации для платформы 1С 8.х оказываются абсолютно неработоспособными при выгрузке в 1С 7.7:
УниверсальныйОбменДаннымиXML.epf). Универсальная обработка загрузки для семерки — V77Imp.ert — просто не содержит парсера для этого обработчика и полностью игнорирует прописанный в нем код.ПометкаУдаления(). Попытка установить галочку «Поиск» напротив этого свойства в ПКС (Правилах конвертации свойств) приводит к тому, что стандартный загрузчик пытается выполнить метод НайтиПоРеквизиту() по несуществующему полю, вызывая ошибку выполнения «Неверное имя реквизита».Рассмотрим детально, как обойти эти ограничения и настроить корректный обмен.
Хотя обработчик «Поля поиска» в среде 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, система сама выберет правильного контрагента и запишет документ на него.
Наличие «затроенных» элементов в справочнике Контрагенты — это серьезная методологическая ошибка ведения учета. Рано или поздно наличие дубликатов приведет к неверному распределению взаиморасчетов на счетах учета (например, 60.1 и 60.2), некорректному формированию книги покупок и книги продаж, а также к хаосу в актах сверки.
Самым правильным решением будет полное физическое уничтожение дубликатов в базе 1С 7.7 перед выполнением обмена. Выполним это по шагам:
REPLVAL.ERT), которая поставляется на дисках информационно-технологического сопровождения (ИТС) или входит в состав типовых дополнительных обработок.Операции -> Удаление помеченных объектов и безвозвратно удалите очищенные дубликаты из базы данных.После удаления дублей стандартный поиск по ИНН и Наименованию в правилах конвертации начнет отрабатывать идеально, так как в базе останется только один уникальный элемент.
Если по каким-то причинам (например, жесткие требования безопасности или корпоративные стандарты) вам категорически запрещено удалять дубликаты или запускать обработку замены ссылок в семерке, можно применить «костыль», который хотя бы предотвратит «оживление» удаленных объектов.
Для этого мы заблокируем перезапись пометки удаления, если объект в приемнике уже помечен на удаление. В ПКО Контрагенты найдите ПКС для свойства ПометкаУдаления. В обработчике события «Перед выгрузкой» этого свойства напишем следующий код:
// Проверяем состояние объекта в приемнике
Если ОбъектНайден = 1 Тогда
// Если объект в 1С 7.7 уже помечен на удаление, запрещаем менять этот статус
Если Объект.ПометкаУдаления() = 1 Тогда
Отказ = 1; // Отменяем выгрузку и запись данного свойства
КонецЕсли;
КонецЕсли;
Важное предупреждение: Данный способ является полумерой. Он решает проблему несанкционированного снятия пометки удаления, но документы все равно могут привязаться к помеченному на удаление контрагенту, что потребует последующей ручной корректировки документов бухгалтером.
При переносе данных в устаревшие системы на платформе 1С 7.7 важно помнить о ее технологических ограничениях. Наилучшим решением проблемы дубликатов является их своевременная чистка и слияние (Вариант 2). Если же чистка невозможна из-за ограничений прав доступа, используйте переопределение объекта при загрузке (Вариант 1) — это гарантирует корректную привязку документов к активным контрагентам без изменения их состояния.