Как правильно пользоваться переносом остатков 7.7 - 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 |