Книга знаний

1С:Предприятие / v8 / Приемы программирования / Обмен данными, УРБД

v8: Как правильно пользоваться переносом остатков 7.7 - 8.0 с помощью КД 2.0

Очень многие допускают очень большую ошибку думая, что в конвертации нужно сочинять и писать правила для совершенно разных структур..Автор статьи: Maniac | Редакторы: Defender aka LINN,
Последняя редакция №3 от 29.01.08 | История
URL: http://kb.mista.ru/article.php?id=369

Ключевые слова: Конвертация данных, КД, Конвертация, Перенос остатков, Обмен данными


Очень многие допускают очень большую ошибку думая, что в конвертации нужно сочинять и писать правила для совершенно разных структур..
Поэтому пытаются настроить правила между разными объектами, мучаются как перенести остатки, справочники и т.д. Пишут дополнительные обработчики и в общем безрезультатно или криво тратят время.
А ведь все элементрано просто: технология ввода и обмена лежит перед носом.
В описании конфигураций 8.0 лежит методика ввода остатков. Там четко и ясно описано какими документами производится ввод остатков. Это первое.
Самый главный вопрос для всех, как перенести в эти документы остатки из 7.7 если структуры документов совершенно разные. Многие пытаются безрезультатно что-то сделать. Но ведь ответ практически перед самым носом.
Опять же действует принцип "Если гора не идет у Магомету, Магомет идет к горе":
Если вы собрались переходить на 8.0 то без разницы какая у вас конфигурация, самописная или типовая. Изучив технологию ввода согласно документации 8.0
достаточно встроить точно такие же документы по образу и подобию в семерку. Назвав в них точно также все реквизиты как 8.0 Это будут простые документы безо всяких движений и т.п. Их главная задача: именно их мы настроим вобмене конфигурации Конвертация данных 2.0 -> перенесем и затем просто проведем в восьмерке.
Все что нужно это просто их "нарисовать" в вашей семерке, написать обработку которая из ваших регистров достанет всю информацию и заполнит эти документы.
Элементарный пример: вам нужно перенести цены номенклатуры. Недавно столкнулся с несколькими людьми, которые были сильно озадачены как это сделать. А ведь все просто. Пишем в семерке документ "Установка цен номенклатуры" полностью аналогичный документу в УТ. Пишем обработку, которая заполнит его ценами. Переносим его без проблем в восьмерку и просто проводим. Аля и у вас ваши цены.
Данный механизм гарантировано был проверен и испробован мною многократно на разных базах. Имеются рабочие материалы. В общем то всё.


Вышеприведенный способ, конечно, рабочий. Но у него есть один недостаток - программист должен добавлять документы непонятного назначения специально для переноса.
На самом деле все гораздо проще. Дело в том, что в КД2.0 источником данных может являться не только объект ИБ (документ, справочник, перечисление, счет и т.д.), но и абсолютно произвольные данные.
Рассмотрим пошагово на примере (пример очень простой, но общий смысл, думаю, будет ясен):
Задача - перенести остатки по складам из ТиС в УТ.
1. Настраиваем Правила Конвертации Объектов - справочники "Номенклатура" и "Склады".
2. Создаем еще одно ПКО - источник не указываем, а приемником выступает документ "Корректировка записей регистров".
2.1. Добавляем ПКС " -> Дата", т.е. источник - пустой, приемник - реквизит документа "Дата" и устанавливаем галку поиска.
2.2. Теперь добавляем таким же образом ПКС для движений документа по регистру "ТоварыНаСкладах" (как группу), и добавляем в этой группе ПКС для свойств регистра - Номенклатура, Склад и Количество.
3. Добавляем Правило Выгрзуки Данных - в качестве ПКО указываем наше свежесозданное правило, способ выборки - "Произвольный алгоритм". Тут мы можем творить чудеса.
Теперь займемся собственно получением данных. Для того, чтобы создался необходимый документ, мы должны указать источник данных. В нашем случае это будет ТаблицаЗначений. Соответственно, в событии "Перед обработкой" инициализируем нужные данные:
ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("Дата");
ВыборкаДанных.НоваяКолонка("ТоварыНаСкладах");

ВыборкаДанных.НоваяСтрока();
ВыборкаДанных.Дата = ДатаОкончания; //ДатаОкончания - реквизит обработки "Выгрузка данных"
ВыборкаДанных.ТоварыНаСкладах = СоздатьОбъект("ТаблицаЗначений");

ТоварыНаСкладах = ВыборкаДанных.ТоварыНаСкладах;
ТоварыНаСкладах.НоваяКолонка("Активность");
ТоварыНаСкладах.НоваяКолонка("ВидДвижения");
ТоварыНаСкладах.НоваяКолонка("Номенклатура");
ТоварыНаСкладах.НоваяКолонка("Склад");
ТоварыНаСкладах.НоваяКолонка("Количество");

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Остатки)
|Период с ДатаОкончания по ДатаОкончания;
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
|Склад = Регистр.ОстаткиТМЦ.Склад;
|Количество = Регистр.ОстаткиТМЦ.Количество;
|Функция Остаток = КонОст(Количество);
|Группировка Номенклатура;
|Группировка Склад;
|"//}}ЗАПРОС
;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Отказ = 1;
    Возврат; //В 8.0/8.1 Возврат использовать нельзя!
КонецЕсли;

Пока Запрос.Группировка(1) = 1 Цикл
    Пока Запрос.Группировка(2) = 1 Цикл
        ТоварыНаСкладах.НоваяСтрока();
        ТоварыНаСкладах.Активность        = 1; //1/0 конвертируются в булевские Истина/Ложь
        ТоварыНаСкладах.ВидДвижения        = "Приход"; //Для перечислений достаточно указать имя значения, обработка загрузки вставит нужное значение
        ТоварыНаСкладах.Номенклатура        = Запрос.Номенклатура;
        ТоварыНаСкладах.Склад            = Запрос.Склад;
        ТоварыНаСкладах.Количество        = Запрос.Остаток;
    КонецЦикла;
КонецЦикла;


Все. Что произойдет при выгрузке:
Система, определив, что ВыборкаДанных имеет тип "ТаблицаЗначений" начнет обычный обход этой таблицы через ВыбратьСтроки()/ПолучитьСтроку() и для каждой строки будет вызывать процедуру "ВыгрузитьПоПравилу". В созданном нами правиле источник не указан, однако обработка выгрузки в этом случае пытается получить значение из Источника (в нашем случе - ТЗ) по имени. То есть, добавив в таблицу колонку "Номер" и добавив соответствующее Правило Конвертации Свойств, мы получим при загрузке документ с этим номером. Далее, это же правило распростаняется и на группы свойств (таб. части, движения регистров и т.д.). То есть, система, дойдя до группы свойств "ТоварыНаСкладах" сделает то же самое. После загрузки данных в базе-приемнике будет создан документ "Корректировка записей регистров", который добавит остатки по всей номенклатуре, которая есть на складах.
Следует отметить, что кроме ТаблицыЗначений можно также использовать объекты "СписокЗначений" в 7.7 (Если, например, по данным строки документа нам надо в приемнике создать элемент справочника) и, соответственно, "Структура" для 8.x

P.S. Согласен с предыдущим автором - технология лежит под носом, она даже слишком проста, поэтому ее и не заметно :)

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика