Перенос данных между разными поколениями платформ 1С — задача всегда ответственная и полная нюансов. Одной из часто встречающихся проблем при использовании конфигурации «Конвертация данных 2.0» является необходимость «отсечь» лишние данные еще на этапе выгрузки из базы-источника. Рассмотрим ситуацию, когда при переносе из 1С 7.7 в 1С 8.3 нужно запретить выгрузку групп номенклатуры или объектов, соответствующих определенным текстовым фильтрам.
Часто начинающие разработчики сталкиваются с тем, что привычные команды отмены выгрузки не срабатывают, и объекты все равно попадают в файл обмена. Проанализируем причины этой проблемы и разберем по шагам правильные способы реализации фильтрации.
Разберем типичную ошибку: написание условия Отказ = 1 в правилах конвертации свойств (ПКС). Если мы прописываем условие в ПКС конкретного реквизита (например, «Наименование» или «Код»), система отменит выгрузку только этого конкретного поля. Сам же объект (запись справочника) все равно будет инициализирован, выгружен в XML-файл и создан в базе-приемнике, просто он окажется пустым или частично заполненным.
Для полного исключения объекта из процесса выгрузки нам необходимо работать на уровне ПКО (Правило конвертации объекта). Рассмотрим алгоритм действий:
Отказ присваивается значение истины.Проанализируем пример кода для ПКО:
// В обработчике ПКО "Перед выгрузкой"
Если Источник.ЭтоГруппа = 1 Тогда
Отказ = 1;
КонецЕсли;
Выясним важную деталь: при выгрузке из 1С 7.7 мы работаем в среде встроенного языка «семерки». В этой платформе отсутствует встроенный тип данных Булево. Вместо привычных Истина и Ложь используются числовые значения 1 и 0.
Хотя универсальная обработка выгрузки V77Exp.ert часто содержит эмуляцию этих констант, для надежности рекомендуется использовать именно числовой формат. Посмотрим на правильный синтаксис для 1С 7.7:
Отказ = Истина; пишем Отказ = 1;Источник.ЭтоГруппа надежнее использовать Источник.ЭтоГруппа() = 1 (зависит от конфигурации, но метод со скобками — стандарт для 7.7).Рассмотрим пример условия, которое проверяет вхождение в группу или наличие слова в наименовании:
// Проверка на группу и вхождение подстроки
Если (Источник.ЭтоГруппа() = 1) Или (Найти(ВРег(Источник.Наименование), "УДАЛИТЬ") > 0) Тогда
Отказ = 1;
КонецЕсли;
Даже если мы правильно прописали Отказ = 1 в ПКО, объект может магическим образом оказаться в базе-приемнике. Проанализируем, почему это происходит. Если выгружаемая номенклатура указана в каком-либо документе (например, в «Приходной накладной»), который тоже участвует в обмене, механизм конвертации по умолчанию попытается выгрузить эту номенклатуру по ссылке, чтобы сохранить целостность данных документа.
В этом случае стандартный Отказ игнорируется, так как приоритет отдается ссылочной целостности. Чтобы полностью предотвратить появление объекта, можно использовать следующие приемы:
Рассмотрим ситуацию с точки зрения производительности. Если в базе тысячи позиций номенклатуры, которые нам не нужны, зачем заставлять систему перебирать их в ПКО? Гораздо правильнее отсечь их на этапе выборки данных в ПВД.
В обработчике «Перед обработкой» правила выгрузки данных мы можем изменить способ выборки. Если используется стандартная выборка, можно наложить фильтр. Если используется произвольный алгоритм, мы сами управляем процессом.
Посмотрим на пример в ПВД с использованием функции ВыгрузитьОбъект:
// В обработчике ПВД "Перед обработкой"
Выборка = СоздатьОбъект("Справочник.Номенклатура");
Выборка.ВыбратьЭлементы();
Пока Выборка.ПолучитьЭлемент() = 1 Цикл
// Проверяем условия перед вызовом выгрузки
Если (Выборка.ЭтоГруппа() = 0) И (Выборка.Статус <> "Архив") Тогда
ВыгрузитьОбъект(Выборка.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
В данном примере мы полностью контролируем, какие объекты вообще попадают под действие правил конвертации.
Проанализируем ситуацию: мы запретили выгрузку групп, но разрешили выгрузку элементов. В 1С 8.3 справочники иерархические, и если у товара не будет выгружен его «родитель», то в базе-приемнике этот товар может попасть в корень справочника или вообще вызвать ошибку при загрузке, если реквизит «Родитель» обязателен.
Для решения этой задачи в ПКО «Номенклатура» в событии «Перед выгрузкой» можно программно переопределять родителя:
// Если родитель не должен выгружаться, обнуляем его или меняем
Если Источник.Родитель.Наименование = "Служебные" Тогда
// Свойство "Родитель" в ПКС будет проигнорировано или очищено
// Можно программно установить значение родителя в приемнике
КонецЕсли;
Вернемся к задаче поиска слов в названии. Важно помнить, что функция Найти() в 1С 7.7 чувствительна к регистру. Чтобы поиск работал корректно для строк «Товар», «товар» и «ТОВАР», необходимо приводить текст к единому регистру.
Пример надежной проверки:
НаименованиеВерхнийРегистр = ВРег(Источник.Наименование);
Если Найти(НаименованиеВерхнийРегистр, "НЕ ВЫГРУЖАТЬ") > 0 Тогда
Отказ = 1;
КонецЕсли;
Для успешного запрета выгрузки объектов из 1С 7.7 через Конвертацию данных необходимо помнить три правила:
Соблюдение этих принципов позволит вам создавать гибкие и надежные правила перехода между конфигурациями, обеспечивая чистоту данных в новой системе.