Задача: обеспечить перенос зарплатных документов с помощью «Конвертация данных 2.1» между одинаковыми конфигурациями «Бухгалтерия для Украины 2.0». Зарплата должна переносится в свёрнутом виде.
Подробная постановка задачи: бухгалтер ведет кадровый учет и учет ЗП в отдельной базе 1С:Бухгалтерия 2.0 (назовем ее зарплатной). Нужно обеспечить перенос ЗП из нее в другую аналогичную базу (назовем ее бухгалтерской), в которой все начисления и удержания должны ложится на «фейкового» сотрудника. В зарплатной базе бухгалтер может отредактировать движения вручную, и, следовательно, кроме самих документов необходимо переносить движения по регистрам. Все табличные части и движения должны быть свёрнуты. В зарплатной базе подразделений больше. Те из них, которые не существуют в бухгалтерской, необходимо подменить.
Перенос будем осуществлять при помощи конфигурации «Конвертация данных 2.1». В процессе разработки правил обмена столкнулся со следующими моментами:
Подменяем сотрудников на «фейкового»
Для справочников «Сотрудники», «Физические лица» и «Должности» ПКО создаем с поиском по полю «Код». В ПКС для него указываем код «фейкового» элемента справочника в базе-приёмнике. Например, в нашем случае, это код элемента справочника «Сотрудники» – «0000000003».
Перенос субконто движений
При переносе движений необходимо корректно перенести субконто. Для этого необходимо:
- Создать ПКО для плана видов характеристик ВидыСубконтоХозрасчетные
- В конвертации обязательно должны присутствовать ПКО для тех типов значений, которыми могут являтся субконто. В нашем случае, это справочники СтатьиЗатрат, Подразделения, ФизическиеЛица, СтатьиДДС, ОбособленныеПодразделения и БанковскиеСчета.
Подмена подразделений
Для справочника «Подразделения организации» создаем ПКО с поиском по поляем «Наименование» и «Владелец». Для ПКС «Наименование» в событии «Перед выгрузкой»:
Если Источник.Наименование = "Подразделение1" Тогда
Значение = "Подразделение2";
КонецЕсли;
С помощью этого кода мы подменяем наименование подразделения на то, которое нам необходимо. При загрузке в базу-приёмник, обработка конвертации данных осуществит поиск элемента по наименованию и владельцу.
Перенос документов
В нашем случае будем переносить 5 видов документов:
- Начисление зарплаты
- Ведомость в кассу
- Ведомость в банк
- Расходный кассовый ордер
- Списание с расчетного счета
Поиск объекта в базе приемнике осуществляется по идентификатору объекта. Кроме движений бухгалтерского регистра, переносим также движения регистра накопления и расчета. Для реквизита «Комментарий» используем следующий код:
Значение = "Импортирован " + ТекущаяДата() + ". Источник: " + Строка(Источник);
Для документов «Ведомость в кассу» и «Ведомость в банк» после загрузки объекта необходимо заполнить реквизит «КраткийСоставДокумента». Для этого в ПКО этих документов в событии «После загрузки» нужно вызвать следующий метод:
Отказ = ложь;
ЗарплатаКадрыСобытия.ЗаполнениеФизическихЛицПередЗаписью(Объект, Отказ, РежимЗаписиДокумента.Запись, РежимПроведенияДокумента.Неоперативный);
В этом же событии «После загрузки» для реквизита «Ответственный» устанавливаем пользователя, осуществившего загрузку:
Объект.Ответственный = Пользователи.ТекущийПользователь();
Выгрузка подчиненных документов
При выгрузке ведомостей из зарплатной базы необходимо также выгрузить подчиненные документы РКО и СписаниеСРасчетногоСчета (для них предварительно созданы ПКО).
В конфигурации «Бухгалтерия для Украины 2.0» для поиска подчиненных документов мы будем использовать объект КритерииОтбора. В ПКО документа «Ведомость в банк» в событии «После выгрузки» производим поиск подчиненных документов и выгружаем их при помощи метода конвертации «ВыгрузитьПоПравилу».
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СвязанныеДокументы.Ссылка
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&Источник) КАК СвязанныеДокументы";
Запрос.УстановитьПараметр("Источник", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ТипЗнч(ВыборкаДетальныеЗаписи.Ссылка) = Тип("ДокументСсылка.СписаниеСРасчетногоСчета") Тогда
ВыгрузитьПоПравилу(ВыборкаДетальныеЗаписи.Ссылка,
Неопределено,
Неопределено,
Неопределено,
"СписаниеСРасчетногоСчета",
,
,
);
КонецЕсли;
КонецЦикла;
Для документа «Ведомость в кассу» выгрузка несколько сложнее. В зарплатной базе в ней могут быть несколько сотрудников, для каждого из которого сформирована отдельная РКО.
При переносе ведомости в базу-приёмник она будет свернута и в ней останется только один «фейковый» сотрудник. А значит, выгрузка всех подчиненных РКО не требуется. Мы выгрузим только первую проведенную РКО и, с помощью ВходящихДанных, передадим в ПКО СуммуДокумента:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СвязанныеДокументы.Ссылка
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&Источник) КАК СвязанныеДокументы
|ГДЕ
| ТИПЗНАЧЕНИЯ(СвязанныеДокументы.Ссылка) = ТИП(Документ.РасходныйКассовыйОрдер)
|
|УПОРЯДОЧИТЬ ПО
| СвязанныеДокументы.Ссылка.Номер";
Запрос.УстановитьПараметр("Источник", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ВхДанные = Неопределено;
Если ВыборкаДетальныеЗаписи.Ссылка.Проведен И ВыборкаДетальныеЗаписи.Количество() > 1 Тогда
ВхДанные = Новый Структура;
ВхДанные.Вставить("СуммаДокумента", Источник.ЗарплатаПодробно.Итог("КВыплате"));
КонецЕсли;
ВыгрузитьПоПравилу(ВыборкаДетальныеЗаписи.Ссылка,
Неопределено,
ВхДанные,
Неопределено,
"РасходныйКассовыйОрдер",
,
,
);
Если ВыборкаДетальныеЗаписи.Ссылка.Проведен Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Далее в ПКО «РасходныйКассовыйОрдер» для ПКС «СуммаДокумента» в событии «Перед выгрузкой» анализируем присутствует ли во входящих данных «СуммаДокумента» и, если есть, присваиваем ее значение:
Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
Если ВходящиеДанные.Свойство("СуммаДокумента") Тогда
Значение = ВходящиеДанные.СуммаДокумента;
КонецЕсли;
КонецЕсли;
Не забываем также подменить сумму для набора движений регистра бухгалтерии «Хозрасчетный» и ТЧ «ВыплатаЗаработнойПлаты».
Свертка ТЧ и движений документов
Для свертки перебираем колонки переданной таблицы значений и формируем две строковых переменных: ГруппКолонки и СуммКолонки. Далее сворачиваем таблицу значений с помощью функции ТЗ.Свернуть(ГруппКолонки, СуммКолонки):
ГруппКолонки = "";
СуммКолонки = "";
МассивГруппКолонок = Новый Массив();
МассивГруппКолонок.Добавить("ОтработаноДней");
МассивГруппКолонок.Добавить("ОтработаноЧасов");
МассивГруппКолонок.Добавить("НормаДней");
МассивГруппКолонок.Добавить("НормаЧасов");
МассивГруппКолонок.Добавить("НормаДнейЗаМесяц");
МассивГруппКолонок.Добавить("НормаЧасовЗаМесяц");
МассивГруппКолонок.Добавить("КалендарныеДни");
МассивГруппКолонок.Добавить("ОплаченоДнейЧасов");
Для каждого Колонка Из ТЗ.Колонки Цикл
Если Колонка.ТипЗначения.СодержитТип(Тип("Число"))
И МассивГруппКолонок.Найти(Колонка.Имя) = Неопределено Тогда
СуммКолонки = Строка(СуммКолонки) + Колонка.Имя + ", ";
Иначе
ГруппКолонки = Строка(ГруппКолонки) + Колонка.Имя + ", ";
КонецЕсли;
КонецЦикла;
//Обрезаем последние ", "
ГруппКолонки = ?(ПустаяСтрока(ГруппКолонки),"",Лев(ГруппКолонки, СтрДлина(ГруппКолонки)-2));
СуммКолонки = ?(ПустаяСтрока(СуммКолонки),"",Лев(СуммКолонки, СтрДлина(СуммКолонки)-2));
ТЗ.Свернуть(ГруппКолонки, СуммКолонки);
Для облегчения задачи, непосредственно свертку будем осуществлять в событии конвертации «После загрузки объекта». Тут мы перебираем табличные части документа, выгружаем их в ТЗ, сворачиваем ее с помощью алгоритма и загружаем обратно. Аналогичная процедура производится и для движений.
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда
Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл
ТЗ = Объект[ТЧ.Имя].Выгрузить();
Выполнить(Алгоритмы.СвернутьТЗ);
Объект[ТЧ.Имя].Загрузить(ТЗ);
КонецЦикла;
Для Каждого НаборДвижений Из Объект.Движения Цикл
ТЗ = НаборДвижений.Выгрузить();
Выполнить(Алгоритмы.СвернутьТЗ);
НаборДвижений.Загрузить(ТЗ);
НаборДвижений.Записывать = Истина;
Конеццикла;
КонецЕсли;
Флаг НаборДвижений.Записывать = Истина
Для корректного переноса движений с помощью «Конвертации данных 2.1» обязательно для всех наборов движений установить флаг Записывать = Истина. Иначе документы, у которых свойство "Запись движений" при проведении установлено в "Записывать выбранные", загружаются без движений.
Подбробнее: https://www.forum.mista.ru/topic.php?id=688126