Выгрузка проводок ЗУП 3.1 -> КА 1.1

На настройку выгрузки проводок из ЗУП 3.1 в КА 1.1 я потратил 2 рабочих дня.
Выгрузка еще не завершена, но большая часть, считаю, реализована.
Задача интересна и как частный случай — выгрузка проводок ЗУП 3.1 -> КА 1.1, и как общий случай — настройка обмена между базами.
Релизы конфигураций:
Зарплата и управление персоналом, редакция 3.1 (3.1.5.129)
Комплексная автоматизация, редакция 1.1 (1.1.96.1)

С конца прошлого года холдинг где я работаю начал переход на ЗУП 3.1. 

Вместе с этим появилось много задач в т.ч. выгрузка проводок в КА 1.1.  При этом все нужно сделать в кратчайшие сроки, ведь еще нужно выполнить много других задач.

Типового обмена между вышеуказанными решениями пока нет, а возможно, и никогда не будет.

Варианты обмена

Готовых решений я не нашел и начал решать задачу собственными силами.

Начал со знакомства с типовым обменом с другими конфигурациями. Технология обмена сильно изменилась, по сравнению с ЗиК, и ЗУП 2.5 (насчет ЗУП 2.5 могу ошибаться), привычной настройки проводок, и обработки выгрузки проводок теперь нет. Но все не так страшно, как кажется при беглом осмотре.

Для знакомства с настройкой обмена  пользовался информацией с сайта ИТС.

Информация для формирования бухгалтерских проводок заносится в:

  • справочник организации;
  • справочник подразделения;
  • справочник сотрудники;
  • виды начисления;
  • некоторые виды документов.

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

После заполнения способов отражения в БУ, можно сформировать документ "Отражение зарплаты в бухгалтерском учете". Заполнив документ увидим, что практически вся необходимая информация для формирования проводок у нас есть (скриншот с рабочей базы приложить не могу).

Типовой механизм предусматривает выгрузку элементов справочника "Отражение зарплаты в бухгалтерском учете" с последующим его заполнением (счетами и аналитикой) в бухгалтерской базе.

В книгах пишут, что человеку свойственно ходить привычными путями, пускай и не самыми лучшими.  На текущий момент, я считаю, что данный вариант лучше, но когда приступал к реализации выбрал альтернативный вариант, который также предложен на ИТС.

Я решил сделать выгрузку на подобие ЗиК, т.е. настройка формирования проводок настраивается в ЗУП.

В данном варианте нужно будет синхронизировать следующие данные:

  1.  Сотрудников. Данные по сотрудникам заполняются в каждой базе, элементы синхронизируются по реквизиту "ИНН".
  2. Бухгалтерские счета. Синхронизация по коду.
  3. Аналитика проводок:
    1. Перечисления — по имени.
    2. Элементы справочников по уникальному идентификатору.

Для получения уникального идентификатора элементов справочника и имя значений перечислений, была написана небольшая обработка:

Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(выбСправочник)) Тогда
текGUID = выбСправочник.УникальныйИдентификатор();
Иначе

НужноеЗначение = выбСправочник;
ИмяПеречисления = НужноеЗначение.Метаданные().Имя;
НужныйИндекс = Перечисления[ИмяПеречисления].Индекс(НужноеЗначение);
ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[НужныйИндекс].Имя;

текGUID = ИмяЗначения;
КонецЕсли;
//Сообщить(СтрДлина(текGUID)); //36
КонецПроцедуры

Для хранения счетов и аналитики добавил дополнительные реквизиты к справочнику  "Способы отражения зарплаты в бухгалтерском учете" Администрирование -> общие настройки -> Дополнительные реквизиты и сведения

Дополнительные реквизиты

Для реквизита "Счет" длина строки 10, "Субконто" — 100, GUID — 36.

Далее настроил форму справочника  "Способы отражения зарплаты в бухгалтерском учете"

Форма элемента справочника

Реквизит "Субконто" используется следующим образом:

  1. При указании элемента справочника, только информативно.
  2. При указании значения перечисления — содержит имя перечисления, уникальный идентификатор при этом не заполняется.

Остальная информация для формирования проводок будет вводится в форме обработки выгрузки проводок.

Форма обработки выгрузки проводок

Сначала я пытался хранить данные из вышеуказанной формы в хранилище настроек, у меня так и не получилось сделать чтобы настройки были общими для всех пользователей. В итоге решил добавить дополнительное свойство  "НастройкиПроводок" для справочника организации, с типом строка неограниченной длины, как выяснилось позже, нельзя создать дополнительной свойство с типом — строка неограниченной длины. Остановился на варианте: дополнительное свойство для каждого взноса — длинной 830. 10  (длина кода счета) + 6 * (36 (Длина уникального идентификатора) + 100)  + символы разделители.

Дополнительный свойства справочника "Организации"

Дополнительные сведения

Теперь есть все необходимые данные для формирования проводок, приступаем к выгрузке.

Функции выгрузки выглядят следующим образом (обработки добавлены к статье, в тексте опишу только интересные, на мой взгляд, моменты)

&НаСервере
Функция ВыгрузитьПроводкиНаСервере()
// Вставить содержимое обработчика.
СписокДокументов = ВыгрузитьПроводкиНаСервере_ПолучитьСписокДокументов();

ствСвойстваСпособовОтраженияБУ = ВыгрузитьПроводкиНаСервере_ПолучитьСвойстваОтбораженияБУ(СписокДокументов);

стрВыгрузка = Новый Структура("Организация,НачалоПериода,КонецПериода,Проводки");
стрВыгрузка.Организация = Организация.Наименование;
стрВыгрузка.НачалоПериода = НачДата;
стрВыгрузка.КонецПериода = КонДата;

Проводки = Новый Массив();

ВыгрузитьПроводкиНаСервере_СформироватьПроводкиПоНачислениям(СписокДокументов, ствСвойстваСпособовОтраженияБУ, Проводки);
ВыгрузитьПроводкиНаСервере_СформироватьПроводкиПоВзносам(СписокДокументов, ствСвойстваСпособовОтраженияБУ, Проводки);
ВыгрузитьПроводкиНаСервере_СформироватьПроводкиПоНДФЛ(СписокДокументов, ствСвойстваСпособовОтраженияБУ, Проводки);

стрВыгрузка.Проводки = Проводки;

ТекстXML = СтруктураВXML(стрВыгрузка, "ВыгрузкаЗУП_КА");

Возврат ТекстXML;

КонецФункции

&НаКлиенте
Процедура ВыгрузитьПроводки(Команда)
ТекстXML = ВыгрузитьПроводкиНаСервере();

ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(выбФайл, "windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьБезОбработки(ТекстXML);

ЗаписьXML.Закрыть();

ПоказатьПредупреждение(, "Обработка завершена");

КонецПроцедуры

В данном случае можно было воспользоваться стандартной сериализацией, собственную функцию я использую, т.к. структура XML получается проще, а соответственно и более читабельной.

Функция СтруктураВXML(вхСтруктура, НаименованиеКорневогоУзла)
ТекстXML = "";
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("windows-1251");
ЗаписьXML.ЗаписатьНачалоЭлемента(НаименованиеКорневогоУзла);

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

ЗаписьXML.ЗаписатьКонецЭлемента();
ТекстXML = ЗаписьXML.Закрыть();
Возврат ТекстXML;

КонецФункции

Данную функция я написал, когда делал обмен между базами 1С8 -> 1С77, также рассматривал стандартную реализацию, но решил что проще написать собственную.

Добавить свою обработку в дополнительные в новых конфигурациях уже не так просто. ЗУП отказывается добавлять обработку  в список дополнительных, без нижеуказанной функции в модуле:

Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Наименование", "Выгрузка проводок ЗУП 3.1 -> КА 1.1");
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("Информация", "Обработка выгрузки проводок из ЗУП 3.1 в КА 1.1" );

///////////// команды /////////////////////////
тзКоманд = Новый ТаблицаЗначений;
тзКоманд.Колонки.Добавить("Идентификатор",             Новый ОписаниеТипов("Строка"));
тзКоманд.Колонки.Добавить("Представление",             Новый ОписаниеТипов("Строка"));
тзКоманд.Колонки.Добавить("Модификатор",             Новый ОписаниеТипов("Строка"));
тзКоманд.Колонки.Добавить("ПоказыватьОповещение",     Новый ОписаниеТипов("Булево"));
тзКоманд.Колонки.Добавить("Использование",             Новый ОписаниеТипов("Строка"));


Идентификатор_Команды = "ОткрытьФорму";
строкаКоманды = тзКоманд.Добавить();
строкаКоманды.Идентификатор         = Идентификатор_Команды;
строкаКоманды.Представление         = "Открыть форму выгрузки проводок ЗУП 3.1 -> КА 1.1";
строкаКоманды.ПоказыватьОповещение     = Истина;
строкаКоманды.Использование         = "ОткрытиеФормы";

РегистрационныеДанные.Вставить("Команды", тзКоманд);

Возврат РегистрационныеДанные;
КонецФункции

При загрузке проводок, отмечу функцию, которая определяет тип данных по коду счета:

Функция ПолучитьСчетСубконто(СчетКод, Субконто1, Субконто2, Субконто3)
стрСчетСубконто = Новый Структура("Счет,Субконто1,Субконто2,Субконто3");

текСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СчетКод);

стрСчетСубконто.Счет = текСчет;

Если СчетКод = "70" Тогда
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ФизическиеЛица.Ссылка
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
|ГДЕ
| ФизическиеЛица.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", Субконто1);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
стрСчетСубконто.Субконто1 = Выборка.Ссылка;
Иначе
стрСчетСубконто.Субконто1 = Справочники.ФизическиеЛица.ПустаяСсылка();
КонецЕсли;
Иначе
Если текСчет.ВидыСубконто.Количество() > 0 Тогда
ВидСубконто = текСчет.ВидыСубконто[0];
Типы = ВидСубконто.ВидСубконто.ТипЗначения.Типы();
текМетаданные = Метаданные.НайтиПоТипу(Типы[0]);

Если Справочники.ТипВсеСсылки().СодержитТип(Типы[0]) Тогда
УИД = Новый УникальныйИдентификатор(Субконто1);
стрСчетСубконто.Субконто1 = Справочники[текМетаданные.Имя].ПолучитьСсылку(УИД);
Иначе
стрСчетСубконто.Субконто1 = Перечисления[текМетаданные.Имя][Субконто1];
КонецЕсли
КонецЕсли;

Если текСчет.ВидыСубконто.Количество() > 1 Тогда
ВидСубконто = текСчет.ВидыСубконто[1];
Типы = ВидСубконто.ВидСубконто.ТипЗначения.Типы();
текМетаданные = Метаданные.НайтиПоТипу(Типы[0]);

Если Справочники.ТипВсеСсылки().СодержитТип(Типы[0]) Тогда
УИД = Новый УникальныйИдентификатор(Субконто2);
стрСчетСубконто.Субконто2 = Справочники[текМетаданные.Имя].ПолучитьСсылку(УИД);
Иначе
стрСчетСубконто.Субконто2 = Перечисления[текМетаданные.Имя][Субконто2];
КонецЕсли
КонецЕсли;

Если текСчет.ВидыСубконто.Количество() > 2 Тогда
ВидСубконто = текСчет.ВидыСубконто[2];
Типы = ВидСубконто.ВидСубконто.ТипЗначения.Типы();
текМетаданные = Метаданные.НайтиПоТипу(Типы[0]);

Если Справочники.ТипВсеСсылки().СодержитТип(Типы[0]) Тогда
УИД = Новый УникальныйИдентификатор(Субконто3);
стрСчетСубконто.Субконто3 = Справочники[текМетаданные.Имя].ПолучитьСсылку(УИД);
Иначе
стрСчетСубконто.Субконто3 = Перечисления[текМетаданные.Имя][Субконто3];
КонецЕсли
КонецЕсли;
КонецЕсли;

Возврат стрСчетСубконто;

КонецФункции

 

3 Comments

  1. Brawler

    Вам стоило посмотреть БП 3.0.

    Там на вход поступает документ из ЗУП 3.Х в котором конечно же нет проводок, но в нем говорится какие способы отражения должны быть использованы для формирования проводок.

    Имея все суммы и способы отражения (аналитики в них нужно на стороне БП 3.Х заполнять) БП 3.0 генерирует проводки.

    Я сам когда сидел думал над реализацией переноса отражения из ЗУП 3.Х в УПП обдумывал именно вариант работы как при обмене с ЗУП 3.Х и БП 3.0. Не супер сложно в правилах переноса данных цепляться за способы отражения описанные в КА/УПП, брать из них счета учета и субконто, а так как все суммы в ЗУП 3.Х в документе отражения ЗП расписаны по полочкам. то не сложно для отражения всяких там налогов прописать конкретные счета учетов…

    + еще есть, юзерам на стороне ЗУП 3.1 вообще не нужно заполнять аналитики в способах отражениях, все аналитики заполнены в КА/УПП и главное при переносе данных совместить способы отражения разных баз.

    Reply
  2. HAMMER_59

    (2) Практически в самом начале я так и написал, что если бы делал заново, тогда бы выгружал «способы отражения в БУ», а не проводки.

    Лучшее — враг хорошего. Можно очень долго думать как сделать лучше, и ничего так и не сделать. Вариант вполне себе рабочий.

    Также у варианта, который я реализовал есть неоспоримый плюс — не нужно вносить изменения в бухгалтерскую базу, в данном случае в КА 1.1. В случае с выгрузкой «способов отражения в БУ», придется эти данные где-то хранить, т.е. нужно будет вносить изменения в конфигурацию.

    Reply
  3. Brawler

    (3) Каждая реализация имеет право на свое существование.

    Я немного не понял, что вам бы потребовалось менять на стороне КА, так как мои размышления по поводу обмена данными сводились все к тому, что на стороне КА ну в моем случае УПП, нужно данные перенести из документа отражения ЗП в ЗУП 3.Х, в документ отражения ЗП в УПП, при этом в УПП заполнить только первую вкладку документа там, где проводки. Все алгоритмы формирования проводок размещались бы в правилах переноса данных.

    Способы отражения ЗП в УПП типовые и должны быть просто заполнены юзером. В ситуации когда к примеру происходит переход зарплатного блока из КА/УПП в отдельную базу ЗУП, то способы отражения как правило в большинстве своем уже есть и настроены.

    Собственно аналогичные варианты решения проблемы уже есть https://infostart.ru/public/601831/

    Еще раз оговорюсь, я не против вашего решения.

    У всех видение ситуации свое и возможно у вас там есть заковырки в учете, которые проще решать так как они решены сейчас.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *