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

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

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

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

Различие между ПКО и ПКС: где писать код?

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

Для полного исключения объекта из процесса выгрузки нам необходимо работать на уровне ПКО (Правило конвертации объекта). Рассмотрим алгоритм действий:

  1. Откроем нужное ПКО (например, «Номенклатура»).
  2. Перейдем на закладку «Обработчики событий».
  3. Найдем событие «Перед выгрузкой».
  4. Именно здесь необходимо прописать условие, при котором переменной Отказ присваивается значение истины.

Проанализируем пример кода для ПКО:


// В обработчике ПКО "Перед выгрузкой"
Если Источник.ЭтоГруппа = 1 Тогда
    Отказ = 1;
КонецЕсли;

Синтаксические особенности 1С 7.7

Выясним важную деталь: при выгрузке из 1С 7.7 мы работаем в среде встроенного языка «семерки». В этой платформе отсутствует встроенный тип данных Булево. Вместо привычных Истина и Ложь используются числовые значения 1 и 0.

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

Рассмотрим пример условия, которое проверяет вхождение в группу или наличие слова в наименовании:


// Проверка на группу и вхождение подстроки
Если (Источник.ЭтоГруппа() = 1) Или (Найти(ВРег(Источник.Наименование), "УДАЛИТЬ") > 0) Тогда
    Отказ = 1;
КонецЕсли;

Проблема выгрузки объектов по ссылкам

Даже если мы правильно прописали Отказ = 1 в ПКО, объект может магическим образом оказаться в базе-приемнике. Проанализируем, почему это происходит. Если выгружаемая номенклатура указана в каком-либо документе (например, в «Приходной накладной»), который тоже участвует в обмене, механизм конвертации по умолчанию попытается выгрузить эту номенклатуру по ссылке, чтобы сохранить целостность данных документа.

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

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

Фильтрация на уровне ПВД — эффективный подход

Рассмотрим ситуацию с точки зрения производительности. Если в базе тысячи позиций номенклатуры, которые нам не нужны, зачем заставлять систему перебирать их в ПКО? Гораздо правильнее отсечь их на этапе выборки данных в ПВД.

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

Посмотрим на пример в ПВД с использованием функции ВыгрузитьОбъект:


// В обработчике ПВД "Перед обработкой"
Выборка = СоздатьОбъект("Справочник.Номенклатура");
Выборка.ВыбратьЭлементы();
Пока Выборка.ПолучитьЭлемент() = 1 Цикл
    // Проверяем условия перед вызовом выгрузки
    Если (Выборка.ЭтоГруппа() = 0) И (Выборка.Статус <> "Архив") Тогда
        ВыгрузитьОбъект(Выборка.ТекущийЭлемент());
    КонецЕсли;
КонецЦикла;

В данном примере мы полностью контролируем, какие объекты вообще попадают под действие правил конвертации.

Обработка иерархии и «осиротевшие» элементы

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

Для решения этой задачи в ПКО «Номенклатура» в событии «Перед выгрузкой» можно программно переопределять родителя:


// Если родитель не должен выгружаться, обнуляем его или меняем
Если Источник.Родитель.Наименование = "Служебные" Тогда
    // Свойство "Родитель" в ПКС будет проигнорировано или очищено
    // Можно программно установить значение родителя в приемнике
КонецЕсли;

Поиск по строковым вхождениям в 1С 7.7

Вернемся к задаче поиска слов в названии. Важно помнить, что функция Найти() в 1С 7.7 чувствительна к регистру. Чтобы поиск работал корректно для строк «Товар», «товар» и «ТОВАР», необходимо приводить текст к единому регистру.

Пример надежной проверки:


НаименованиеВерхнийРегистр = ВРег(Источник.Наименование);
Если Найти(НаименованиеВерхнийРегистр, "НЕ ВЫГРУЖАТЬ") > 0 Тогда
    Отказ = 1;
КонецЕсли;

Подведение итогов

Для успешного запрета выгрузки объектов из 1С 7.7 через Конвертацию данных необходимо помнить три правила:

  1. Используйте обработчик «Перед выгрузкой» именно в ПКО, а не в ПКС.
  2. Учитывайте, что в 1С 7.7 Отказ = 1, а функции работы со строками и группами имеют свои особенности синтаксиса.
  3. Помните о ссылочной целостности: если объект «запрещен» в ПКО, но нужен документу, он все равно может быть выгружен. Для полного запрета используйте фильтрацию на уровне ПВД.

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

← На главную