При переходе с конфигурации «Зарплата и управление персоналом», редакция 2.5, на редакцию 3.1 многие технические специалисты сталкиваются с неожиданной проблемой при попытке доработать типовой перенос. Открыв правила конвертации в программе «Конвертация данных 2.0» (КД 2.0), разработчик видит, что у большинства Правил Конвертации Объектов (ПКО) поле «Источник» пустое, а Правила Выгрузки Данных (ПВД) практически отсутствуют или не содержат привычной логики выборки. В этой статье мы разберем, как устроена архитектура этого переноса и как правильно добавить в выгрузку недостающие реквизиты.
Прежде всего, проанализируем ситуацию: почему в КД 2.0 мы видим пустые поля? Типовой переход между редакциями ЗУП реализован не классическим способом «объект в объект», а через технологию выгрузки по структуре или с использованием параметра ВходящиеДанные. Это означает следующее:
ВыгрузитьПоПравилу вызывается программно, и в качестве источника ей передается не ссылка на объект (справочник или документ), а специально подготовленная структура (или таблица значений), содержащая набор полей.Именно поэтому в ПКО источник пуст — правила настроены на прием набора данных, чьи имена ключей соответствуют именам свойств в Правилах Конвертации Свойств (ПКС).
Для модификации состава данных нам нужно найти «центр управления» переносом. Рассмотрим, где он находится. В типовом решении это обработка, которая обычно называется ПереносДанныхИзИнформационныхБаз1СПредприятия8. Она встроена в конфигурацию ЗУП 3.1 и часто дублируется во внешних файлах для удобства отладки.
Внутри этой обработки нас интересует модуль объекта. Проанализируем его содержимое. Нам нужно найти методы, отвечающие за сбор данных для конкретных объектов. Например, если нам нужно изменить перенос справочника «Должности», мы будем искать метод ВыгрузитьСправочники или более специфичный, например, ВыгрузитьДолжности.
Рассмотрим стандартный механизм КД 2.0: обычно в ПВД пишется запрос, результат которого передается в ПКО. Однако в случае с ЗУП 2.5 разработчики 1С решили централизовать процесс в модуле обработки. Это сделано для повышения производительности и возможности сложной трансформации данных «на лету» перед выгрузкой.
Посмотрим на пример того, как это выглядит в коде обработки. Вместо обращения к объекту, в коде формируется структура:
ДанныеДляВыгрузки = Новый Структура;
ДанныеДляВыгрузки.Вставить("Наименование", СсылкаНаДолжность.Наименование);
ДанныеДляВыгрузки.Вставить("Код", СсылкаНаДолжность.Код);
// Здесь мы можем добавить свой реквизит
ДанныеДляВыгрузки.Вставить("КатегорияВоинскогоУчета", СсылкаНаДолжность.КатегорияУчета);
ВыгрузитьПоПравилу(,, ДанныеДляВыгрузки,, "Должности");
Здесь "Должности" — это имя ПКО в ваших правилах конвертации.
Предположим, нам нужно выгрузить дополнительный реквизит из справочника «Должности», который по умолчанию не переносится. Пройдем по шагам этот процесс:
Шаг 1. Модификация запроса в обработке выгрузки.
Найдем в модуле обработки текст запроса, который собирает данные по должностям. Добавим в секцию ВЫБРАТЬ нужный нам реквизит из базы ЗУП 2.5. Убедитесь, что результат запроса помещается в структуру, которая позже будет передана в функцию выгрузки. Если данные собираются не запросом, а прямым обращением к свойствам объекта, просто добавьте новую строку заполнения структуры, как в примере выше.
Шаг 2. Настройка правил в Конвертации данных 2.0.
Теперь нам нужно «подружить» обновленный код с правилами XML. Разберем действия в КД 2.0:
Источник оставьте пустым.Имя свойства источника впишите строковое название ключа из структуры, которую вы подготовили в коде обработки (например, "КатегорияВоинскогоУчета").Приемник выберите соответствующий реквизит справочника в ЗУП 3.x.Шаг 3. Сохранение и обновление правил.
Сохраните правила из КД 2.0 в файл XML. После этого у вас есть два пути:
Иногда данные передаются не через основные поля структуры, а через коллекцию ПараметрыОбъекта. Это часто используется для передачи данных, которые не являются прямыми реквизитами справочника в приемнике, но нужны для алгоритмов «После загрузки».
Если вы видите в ПКС код типа Значение = ПараметрыОбъекта.Получить("МойПараметр"), это сигнал к тому, что в коде выгрузки (в обработке) вам нужно добавить заполнение этого параметра:
// В обработке выгрузки перед вызовом ВыгрузитьПоПравилу
ПараметрыДляВыгрузки = Новый Структура;
ПараметрыДляВыгрузки.Вставить("МойПараметр", ЗначениеПараметра);
ВыгрузитьПоПравилу(,, ДанныеДляВыгрузки, ПараметрыДляВыгрузки, "Должности");
Важно помнить, что обработка перехода жестко привязана к релизам программ. Если вы решили дорабатывать перенос, убедитесь, что:
.md (через обработку MD83Exp.epf).ВыгрузитьПоПравилу.Подводя итог, можно сказать, что решение проблемы «пустых правил» кроется в понимании разделения ответственности. В типовом переносе ЗУП 2.5 -> 3.x правила КД 2.0 являются лишь картой соответствия имен, в то время как выборка данных целиком лежит на плечах программного кода обработки. Чтобы добавить новые данные, необходимо действовать синхронно: расширить выборку в коде обработки и прописать аналогичное имя поля в ПКС правил конвертации.