Работа с конвертацией данных

Опубликовал Oxana Coffeeholic (perepetulichka) в раздел Программирование - Практика программирования

Поскольку к конвертации обращаюсь время от времени и какие-то детали забываются, хочу выделить несколько пунктов, чтобы "было где посмотреть". Статья сделана преимущественно «для себя», так что просьба не судить строго.

Передача программным путём Массива (Таблицы значений, Списка значений) в параметры.

На примере ЗУП 2.5: в обработке «Выгрузка данных в бухгалтерскую программу» на форме размещен реквизит, в котором пользователь подбирает нужные счета дебета, далее требуется передать выбранные пользователем счета в правила выгрузки.

В типовых конфигурациях есть удобный механизм "СериализоватьОбъектXDTO", саму функцию легко найти в интернете, а мне достаточно в процедуре "ВыгрузитьПоПравиламБух30" формы вписать вот это:

МассивСчетовДТ = ТиповыеОтчеты.СериализоватьОбъектXDTO(МассивСчетовВыбранныхПользователем);

И далее там же:

НовыйПараметр = мУниверсальнаяВыгрузкаДанных.ТаблицаНастройкиПараметров.Добавить();
НовыйПараметр.Значение = МассивСчетовДТ;
НовыйПараметр.Имя = "МассивСчетовДТ";
НовыйПараметр.Наименование = "МассивСчетовДТ";
НовыйПараметр.ПередаватьПараметрПриВыгрузке = Истина;

Далее в Конвертации данных добавляем параметр.

Перед выгрузкой данных выполняем проверку:

Если ЗначениеЗаполнено(Параметры.МассивСчетовДТ) Тогда
	МассивСчетовДТ = ТиповыеОтчеты.ПрочитатьОбъектXDTO(Параметры.МассивСчетовДТ);
КонецЕсли;

И используем десериализованный массив, например вот так:

Если МассивСчетовДТ<>Неопределено Тогда
//ваш код
КонецЕсли;

Использование произвольного алгоритма для создания объекта без источника.

В ПВД (правило выгрузки данных):

ТекстЗапроса = Запросы.Прием.Текст;

Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));
Запрос.УстановитьПараметр("ДатаОкончания",	КонецДня(ДатаОкончания));

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
	Отказ = Истина
КонецЕсли;

ВыборкаДанных = РезультатЗапроса.Выгрузить();

Запросы размещаются на закладке "Алгоритмы\Запросы" без кавычек.

Установка своего Значения (Вариант 1).

В описанном выше документе в табличной части есть реквизит "ВидРасчета" для которого правилом конвертации является ПКО "ОсновныеНачисленияОрганизаций".

Создавать новые ВидыРасчетов в базе загрузки из базы выгрузки я не хочу (отключаю поиск по "Коду", "Пометка на удаление" мне тоже не интересна), пытаюсь найти объекты по Наименованию

и в случае, если Наименование определенное, то присваиваю ему другое значение (другими словами. устанавливаю соответствие).

Если Источник.Наименование = "Оклад по среднечасовой за год учетный период 2014" Тогда					
	Значение = "Оклад по часам";				
КонецЕсли;

Если Источник.Наименование = "Оклад по среднечасовой за год учетный период 2017" Тогда					
	Значение = "Оклад по часам";				
КонецЕсли;

Если Источник.Наименование = "Оклад по среднечасовой за год учетный период 2016" Тогда					
	Значение = "Оклад по часам";				
КонецЕсли;

Установка своего Значения (Вариант 2).

Ситуация вторая, мне не интересно что было в источнике, я хочу просто задать своё конкретное значение.

Наименование у нас имеет тип "Строка", так что Значение задано строкой.

Особенности выгрузки документов (Задать своё значение реквизита в произвольном запросе).

Рассмотрим вариант произвольного запроса.

Как видно из картинки выше, в запросе выводим и реквизиты и табличную часть (и) документа (обведено голубым квадратом).

В ПВД:

ТекстЗапроса = Запросы.ОтражениеЗарплатыВРеглУчете.Текст;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Организация",	Данные.Организация);

ТаблицаДанных = Запрос.Выполнить().Выгрузить();

Для каждого СтрокаТД Из ТаблицаДанных Цикл

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

ВыборкаДанных = ТаблицаДанных.Скопировать();
ТаблицаДанных = Неопределено;

//1 - табличная часть документа

//2 - не суть, просто какое-то условие (завист от задачи)

//3 - задаём другое значение

Задать своё значение реквизиту табличной части в ПКС, использование Алгоритма, задать другое ПКО.

"Источник" содержит в себе ссылку.

Обратиться к строке табличной части можно с помощью переменной "ОбъектКоллекции".

Если ОбъектКоллекции.СчетДт.ПринадлежитЭлементу(ПланыСчетов.Хозрасчетный.РасчетыПоСоциальномуСтрахованию) Тогда
	ИмяПКО = "РегистрацииВНалоговомОргане";
Иначе	
	Источник = ОбъектКоллекции.СубконтоДт2;
	Выполнить(Алгоритмы.ПолучитьПКОСубконтоПоТипуЗначения);
	Если ИмяПКО = "" Тогда
		Отказ = Истина;
	КонецЕсли;
КонецЕсли;

Далее всё просто.

Алгоритм выглядит вот так:

Если в результате получаем ИмяПКО = "", отключаем ПКС (Отказ = Истина;), удобно для случаев, когда в одном документе есть реквизит, а в другом - нет. Например, подобная ситуация возникает, если в одной системе ЗУП 2.5 установлена программа  Бухучета 7.7, а в другой - Бухгалтерия 3.0

Несколько часто используемых строчек кода в ПКО.

Перед выгрузкой:

РежимЗаписи = "Проведение";

При загрузке:

Отказ = ОбъектНайден;

После загрузки:

Объект.Ответственный = Пользователи.ТекущийПользователь();

Несколько часто используемых строчек кода в ПВД.

Перед выгрузкой (подойдет для варианта стандартной выгрузки, когда при обмене выгружаются зарегистрированные объекты):

Отказ = Не Объект.Проведен;

Разное.

Значение = ПривестиНомерКДлине(Источник.НомерДок,8);

 Найти ссылку в приёмнике, которой нет в источнике.

Пример приведён, чтобы показать все возможности конвертации.

Предположим, в источнике есть информация о табельном номере сотрудника, мне необходимо определить сотрудника.

Вариант 1 приведен с целью, чтобы показать идею. Но, поскольку запрос в цикле - это зло, смотри Вариант 2 :)

В запросе установите галочку: 

  Еще одна проблема, с которой мне пришлось давным-давно столкнуться и по неопытности было потрачено какое-то время -  

  Конвертация документа "Перенос данных", или, например "Операция" (Перенос движений документа).

В выгрузке описания структуры установите галочку, как показано на рис. ниже.

Далее в конвертации данных:

Галочками отметьте необходимые регистры, по которым хотите перенести движения, они будут добавлены так же, как и табличные части документа. Менять стандартные правила выгрузки не нужно (то есть не нужно писать никаких запросов), движения будут выгружены автоматически.

См. также

Комментарии
1. Сергей (Sergafan10) 17.03.17 08:45 Сейчас в теме
Становится мене актуальным, в связи с КД 3.
2. борян петров (TODD22) 15 17.03.17 08:49 Сейчас в теме
(1)И что там стало менее актуально?
КД 3 это не замена КД2.
DrAku1a; Dementor; serg_infostart; Zeskord; maxdmt; dj_serega; Westbound; +7 Ответить
3. Сергей Галюк (dj_serega) 227 17.03.17 09:41 Сейчас в теме
(1) КД3 еще лет 5 будет раскручиваться.
А еще остались 7.7 и нужно делать выгрузку из них... Поэтому... Пока жива 7.7 и будет жить КД2 ;)
4. Роман Уничкин (unichkin) 303 17.03.17 10:50 Сейчас в теме
в п.1 лишнее
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
	Отказ = Истина
КонецЕсли;


ВыборкаДанных = РезультатЗапроса.Выгрузить();

Можно сразу:
ВыборкаДанных = Запрос;


п.2
Не понял, зачем вводить буферную переменную, и выгружать результата запроса.

Запросы.Прием.УстановитьПараметр("ПустаяДата", Дата(1,1,1));
Запросы.Прием.УстановитьПараметр("ДатаОкончания",	КонецДня(ДатаОкончания));
ВыборкаДанных =Запросы.Прием;


не нужны никакие отказы при пустом результате. Он если пустой, и так ничего не будет.

в п.5 запрос в цикле + см. п.2

п.6 тяжеловато
ОбъектКоллекции.СчетДт.ПринадлежитЭлементу(ПланыСчетов.Хозрасчетный.РасчетыПоСоциальномуСтрахованию)

п.7 не понял смысла
"При загрузке:
Отказ = ОбъектНайден;"
- т.е. если объект найден, то не обновлять? Там галка есть у ПКО "Не замещать существующие объекты в приемнике..."
п.8 - а как эти объекты уйдут из таблицы регистрации изменений? Их туда и помещать не надо, если они не должны выгружаться.

Почему-то когда дело касается КД люди сразу забывают о том что такое точка. Вообще, все это довольно субъективно.
5. Роман Уничкин (unichkin) 303 17.03.17 11:21 Сейчас в теме
Про п.1 - зачеркнуть, это дубль про п.2
6. d4rkmesa (d4rkmesa) 17.03.17 12:30 Сейчас в теме
Плохо все-таки писать РежимЗаписи = "Проведение" в обработчике, нужно пользоваться механизмом отложенного проведения, либо вынести проведение всех документов отдельно в обработчик "после загрузки данных", хотя для каких-то простых документов сойдет. Остальное имеет право на жизнь, нюансы реализации не так важны в целом.
7. Ivan Khorkov (vano-ekt) 816 17.03.17 21:44 Сейчас в теме
в обработчики ПКС/ПВД понапихают запросов, а потом ждут пока обмен час пройдет
корум; skiller3000; DrAku1a; unichkin; dj_serega; +5 1 Ответить 2
8. Serg (serg_infostart) 233 21.03.17 15:19 Сейчас в теме
(7) в ПКС не увидел, что понапихано...
В ПВД оно само собой разумеющееся.

(0) не хватает описания обработчиков Поля поиска.
9. Дмитрий Жиляков (Zhilyakovdr) 77 22.03.17 11:38 Сейчас в теме
ТекстЗапроса = Запросы.ОтражениеЗарплатыВРеглУчете.Текст;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Организация",	Данные.Организация);


меняем на

Запрос = Запросы.ОтражениеЗарплатыВРеглУчете;
Запрос.УстановитьПараметр("Организация",	Данные.Организация);


а можно и на
Запросы.ОтражениеЗарплатыВРеглУчете.УстановитьПараметр("Организация",	Данные.Организация);
10. Дмитрий Жиляков (Zhilyakovdr) 77 22.03.17 11:39 Сейчас в теме
(7) Запросы в ПВД вполне нормальное явление, в ПКС нет.
Гляньте типовые обмены, там и не такое увидите.
11. Дмитрий Жиляков (Zhilyakovdr) 77 22.03.17 11:42 Сейчас в теме
Все что вы описали в статье можно легко найти в типовых правилах и примерах в самой КД.
Пора потихоньку КД3 пользовать