Перенос данных из устаревших систем, таких как 1С:Торговля и Склад 7.7, в современные конфигурации на платформе 8.3 (например, Розница 2.2) — задача трудоемкая. Одной из специфических задач является выгрузка цен номенклатуры, основываясь на списке товаров из документов реализации. Рассмотрим подробно, как реализовать этот алгоритм с помощью «Конвертации данных 2.0», разберем типичные ошибки в запросах 7.7 и оптимизируем процесс загрузки в приемник.
Типичная ситуация: заказчику требуется перенести не все цены из огромного справочника, а только те, которые использовались в оперативной деятельности (в документах реализации) за определенный период. Нам необходимо:
Реализация в источнике (7.7).Цены.УстановкаЦенНоменклатуры.Важное архитектурное замечание: создание отдельного документа установки цен на каждую реализацию может привести к избыточности данных в «Рознице 2.2». Если одна и та же номенклатура продается ежедневно, регистр сведений «Цены номенклатуры» будет перегружен одинаковыми записями. Рекомендуется сначала собрать уникальный список всей номенклатуры за период и создать один итоговый документ установки цен. Однако, если бизнес-логика требует жесткой привязки к датам реализаций, воспользуемся механизмом ИсходящиеДанные.
В конфигурации ТиС 7.7 справочник Цены подчинен справочнику Номенклатура. Реквизит Цена в нем является периодическим. Это означает, что простое обращение через точку в запросе может вернуть не то значение, которое было актуально на момент совершения сделки. Проанализируем, как правильно извлечь эти данные.
Для получения цены лучше использовать стандартные функции глобального модуля ТиС, такие как глПолучитьЦену, или работать с объектом Периодический. Если мы используем прямой запрос, нужно учитывать, что оператор В в языке запросов 7.7 не поддерживает ТаблицуЗначений — только СписокЗначений или группы справочника.
В «Конвертации данных» создадим ПВД для документа Реализация. В обработчике «Перед обработкой» напишем код, который подготовит структуру данных для ПКО документа УстановкаЦенНоменклатуры. Обратите внимание на использование объекта СписокЗначений для передачи данных в ИсходящиеДанные.
// Создаем структуру для передачи в ПКО
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
// Выбираем номенклатуру из текущего документа реализации (Источник)
ТЗ_Товары = СоздатьОбъект("ТаблицаЗначений");
Источник.ВыгрузитьТабличнуюЧасть(ТЗ_Товары, "Номенклатура");
// Подготавливаем таблицы для документа УстановкаЦен в 8.3
ТоварыПриемник = СоздатьОбъект("ТаблицаЗначений");
ТоварыПриемник.НоваяКолонка("Номенклатура");
ТоварыПриемник.НоваяКолонка("Цена");
ТоварыПриемник.НоваяКолонка("ВидЦены");
ТоварыПриемник.НоваяКолонка("ЦенаИзмененаВручную");
ВидыЦенПриемник = СоздатьОбъект("ТаблицаЗначений");
ВидыЦенПриемник.НоваяКолонка("ВидЦены");
// Цикл по товарам реализации
ТЗ_Товары.ВыбратьСтроки();
Пока ТЗ_Товары.ПолучитьСтроку() = 1 Цикл
ТекущаяНом = ТЗ_Товары.Номенклатура;
// Получаем розничную цену через справочник
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(ТекущаяНом);
СпрЦены.ВыбратьЭлементы();
Пока СпрЦены.ПолучитьЭлемент() = 1 Цикл
// Проверяем тип цены (например, "Розничная")
Если СокрЛП(СпрЦены.ТипЦен.Наименование) = "Розничная" Тогда
ТоварыПриемник.НоваяСтрока();
ТоварыПриемник.Номенклатура = ТекущаяНом;
// Получаем периодическое значение цены на дату документа
ТоварыПриемник.Цена = СпрЦены.Цена.Получить(Источник.ДатаДок);
ТоварыПриемник.ВидЦены = "Розничная";
ТоварыПриемник.ЦенаИзмененаВручную = 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Заполняем структуру данных для выгрузки
ИсходящиеДанные.Установить("Дата", Источник.ДатаДок);
ИсходящиеДанные.Установить("Товары", ТоварыПриемник);
ИсходящиеДанные.Установить("ВидыЦен", ВидыЦенПриемник);
ИсходящиеДанные.Установить("Согласован", 1);
// Вызываем выгрузку по правилу
ВыгрузитьПоПравилу(Источник, , ИсходящиеДанные, , "УстановкаЦенНоменклатуры");
Чтобы данные из подготовленной структуры корректно попали в документ-приемник, проанализируем настройки Правила Конвертации Объектов (ПКО):
УстановкаЦенНоменклатуры поле «Источник» должно быть пустым, если мы полностью формируем объект из ИсходящихДанных, либо заполненным, если часть реквизитов берется из Реализации.Товары, ВидыЦен) в ПКС (Правилах Конвертации Свойств) необходимо установить флаг «Получать из входящих данных».КоллекцияОбъектов = ВходящиеДанные.Получить("Товары");.Выясним причину, почему при загрузке количество объектов может уменьшаться. Рассмотрим основные факторы:
При загрузке цен в Розницу 2.2 крайне важно заполнять реквизит ЦенаИзмененаВручную = Истина. Проанализируем ситуацию: в «Рознице» реализован сложный механизм расчета цен (например, розничная может зависеть от закупочной через наценку). Если этот флаг не будет установлен, то при проведении документа в 8-ке система может автоматически пересчитать ваши загруженные из 7.7 цены по своим внутренним правилам, что приведет к расхождению данных.
Также убедитесь, что вы загружаете Упаковку (Единицу измерения). В ТиС 7.7 это обычно справочник Единицы, а в Рознице — УпаковкиНоменклатуры. Несоответствие единиц измерения приведет к тому, что цена будет установлена некорректно (например, за штуку вместо коробки).
Используя предложенный подход с ИсходящимиДанными и аккуратным обращением к периодическим реквизитам 7.7, мы обеспечим точный перенос ценовых показателей, необходимых для начала работы в новой системе.