Конвертация данных: перенос и свертка ЗП (Бух 2.0 -> Бух 2.0)

Задача: обеспечить перенос зарплатных документов с помощью «Конвертация данных 2.1» между одинаковыми конфигурациями «Бухгалтерия для Украины 2.0». Зарплата должна переносится в свёрнутом виде.

Подробная постановка задачи: бухгалтер ведет кадровый учет и учет ЗП в отдельной базе 1С:Бухгалтерия 2.0 (назовем ее зарплатной). Нужно обеспечить перенос ЗП из нее в другую аналогичную базу (назовем ее бухгалтерской), в которой все начисления и удержания должны ложится на «фейкового» сотрудника. В зарплатной базе бухгалтер может отредактировать движения вручную, и, следовательно, кроме самих документов необходимо переносить движения по регистрам. Все табличные части и движения должны быть свёрнуты. В зарплатной базе подразделений больше. Те из них, которые не существуют в бухгалтерской, необходимо подменить.

Перенос будем осуществлять при помощи конфигурации «Конвертация данных 2.1». В процессе разработки правил обмена столкнулся со следующими моментами:

Подменяем сотрудников на «фейкового»

Для справочников «Сотрудники», «Физические лица» и «Должности» ПКО создаем с поиском по полю «Код». В ПКС для него указываем код «фейкового» элемента справочника в базе-приёмнике. Например, в нашем случае, это код элемента справочника «Сотрудники» – «0000000003».

ПКС "Код" для ПКО "Сотрудники"

Перенос субконто движений

При переносе движений необходимо корректно перенести субконто. Для этого необходимо:

  1. Создать ПКО для плана видов характеристик ВидыСубконтоХозрасчетные
  2. В конвертации обязательно должны присутствовать ПКО для тех типов значений, которыми могут являтся субконто. В нашем случае, это справочники СтатьиЗатрат, Подразделения, ФизическиеЛица, СтатьиДДС, ОбособленныеПодразделения и БанковскиеСчета.

ПКО для плана видов характеристик "ВидыСубконтоХозрасчетные"

Подмена подразделений

Для справочника «Подразделения организации» создаем ПКО с поиском по поляем «Наименование» и «Владелец». Для ПКС «Наименование» в событии «Перед выгрузкой»:

Если Источник.Наименование = "Подразделение1" Тогда
   Значение = "Подразделение2";
КонецЕсли;

Поменяем "Наименование" к ПКО "ПодразделенияОрганизаций"

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

Перенос документов

В нашем случае будем переносить 5 видов документов:

  1. Начисление зарплаты
  2. Ведомость в кассу
  3. Ведомость в банк
  4. Расходный кассовый ордер
  5. Списание с расчетного счета

Поиск объекта в базе приемнике осуществляется по идентификатору объекта. Кроме движений бухгалтерского регистра, переносим также движения регистра накопления и расчета. Для реквизита «Комментарий» используем следующий код:

Значение = "Импортирован " + ТекущаяДата() +  ". Источник: " + Строка(Источник);

Добавляем комментарий для документов

Для документов «Ведомость в кассу» и «Ведомость в банк» после загрузки объекта необходимо заполнить реквизит «КраткийСоставДокумента». Для этого в ПКО этих документов в событии «После загрузки» нужно вызвать следующий метод:

Отказ = ложь;
ЗарплатаКадрыСобытия.ЗаполнениеФизическихЛицПередЗаписью(Объект, Отказ, РежимЗаписиДокумента.Запись, РежимПроведенияДокумента.Неоперативный);

В этом же событии «После загрузки» для реквизита «Ответственный» устанавливаем пользователя, осуществившего загрузку:

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

Выгрузка подчиненных документов

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

В конфигурации «Бухгалтерия для Украины 2.0» для поиска подчиненных документов мы будем использовать объект КритерииОтбора. В ПКО документа «Ведомость в банк» в событии «После выгрузки» производим поиск подчиненных документов и выгружаем их при помощи метода конвертации «ВыгрузитьПоПравилу».

Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СвязанныеДокументы.Ссылка
	|ИЗ
	|	КритерийОтбора.СвязанныеДокументы(&Источник) КАК СвязанныеДокументы";

Запрос.УстановитьПараметр("Источник", Источник.Ссылка);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	Если ТипЗнч(ВыборкаДетальныеЗаписи.Ссылка) = Тип("ДокументСсылка.СписаниеСРасчетногоСчета") Тогда
		ВыгрузитьПоПравилу(ВыборкаДетальныеЗаписи.Ссылка,
							Неопределено,
							Неопределено,
							Неопределено,
							"СписаниеСРасчетногоСчета",
							,
							,
							);
	КонецЕсли;
КонецЦикла;

Для документа «Ведомость в кассу» выгрузка несколько сложнее. В зарплатной базе в ней могут быть несколько сотрудников, для каждого из которого сформирована отдельная РКО.

Структура подчиненности документа "Ведомость в кассу"

При переносе ведомости в базу-приёмник она будет свернута и в ней останется только один «фейковый» сотрудник. А значит, выгрузка всех подчиненных РКО не требуется. Мы выгрузим только первую проведенную РКО и, с помощью ВходящихДанных, передадим в ПКО СуммуДокумента:

Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СвязанныеДокументы.Ссылка
	|ИЗ
	|	КритерийОтбора.СвязанныеДокументы(&Источник) КАК СвязанныеДокументы
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(СвязанныеДокументы.Ссылка) = ТИП(Документ.РасходныйКассовыйОрдер)
    |
	|УПОРЯДОЧИТЬ ПО
	|	СвязанныеДокументы.Ссылка.Номер";

Запрос.УстановитьПараметр("Источник", Источник.Ссылка);

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

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

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

Далее в ПКО «РасходныйКассовыйОрдер» для ПКС «СуммаДокумента» в событии «Перед выгрузкой» анализируем присутствует ли во входящих данных «СуммаДокумента» и, если есть, присваиваем ее значение:

Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
	Если ВходящиеДанные.Свойство("СуммаДокумента") Тогда
		Значение = ВходящиеДанные.СуммаДокумента;
	КонецЕсли;
КонецЕсли;

Меняем сумму документа в зависимости от входящих данных

Не забываем также подменить сумму для набора движений регистра бухгалтерии «Хозрасчетный» и ТЧ «ВыплатаЗаработнойПлаты».

Свертка ТЧ и движений документов

Для свертки перебираем колонки переданной таблицы значений и формируем две строковых переменных: ГруппКолонки и СуммКолонки. Далее сворачиваем таблицу значений с помощью функции ТЗ.Свернуть(ГруппКолонки, СуммКолонки):

ГруппКолонки = "";
СуммКолонки = "";

МассивГруппКолонок = Новый Массив();
МассивГруппКолонок.Добавить("ОтработаноДней");
МассивГруппКолонок.Добавить("ОтработаноЧасов");
МассивГруппКолонок.Добавить("НормаДней");
МассивГруппКолонок.Добавить("НормаЧасов");
МассивГруппКолонок.Добавить("НормаДнейЗаМесяц");
МассивГруппКолонок.Добавить("НормаЧасовЗаМесяц");
МассивГруппКолонок.Добавить("КалендарныеДни");
МассивГруппКолонок.Добавить("ОплаченоДнейЧасов");


Для каждого Колонка Из ТЗ.Колонки Цикл
	Если Колонка.ТипЗначения.СодержитТип(Тип("Число"))
		И МассивГруппКолонок.Найти(Колонка.Имя) = Неопределено Тогда
		СуммКолонки = Строка(СуммКолонки) + Колонка.Имя + ", ";
	Иначе
		ГруппКолонки = Строка(ГруппКолонки) + Колонка.Имя + ", ";	
	КонецЕсли; 	
КонецЦикла; 

//Обрезаем последние ", "
ГруппКолонки = ?(ПустаяСтрока(ГруппКолонки),"",Лев(ГруппКолонки, СтрДлина(ГруппКолонки)-2));
СуммКолонки = ?(ПустаяСтрока(СуммКолонки),"",Лев(СуммКолонки, СтрДлина(СуммКолонки)-2));

ТЗ.Свернуть(ГруппКолонки, СуммКолонки);

Для облегчения задачи, непосредственно свертку будем осуществлять в событии конвертации «После загрузки объекта». Тут мы перебираем табличные части документа, выгружаем их в ТЗ, сворачиваем ее с помощью алгоритма и загружаем обратно. Аналогичная процедура производится и для движений.

Сворачиваем табличные части и движения документа

Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда
	Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл
		ТЗ = Объект[ТЧ.Имя].Выгрузить();
		Выполнить(Алгоритмы.СвернутьТЗ);
		Объект[ТЧ.Имя].Загрузить(ТЗ);
	КонецЦикла;
	

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

Флаг НаборДвижений.Записывать = Истина

Для корректного переноса движений с помощью «Конвертации данных 2.1» обязательно для всех наборов движений установить флаг Записывать = Истина. Иначе документы, у которых свойство "Запись движений" при проведении установлено в "Записывать выбранные", загружаются без движений.

Подбробнее: https://www.forum.mista.ru/topic.php?id=688126

https://forum.infostart.ru/forum15/topic128496


Похожие материалы

Комментарии