INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Чичикин Арсен | Управляющий, собственник | 1С-Софт Райз

«Управление проектом в условиях неопределенности»

1. Требования Заказчика в тендерной документации и реальные требования к автоматизации диаметрально противовположны 2. Заказчик не готов к проекту автоматизации, а контракт уже подписан... 3. Заказчик "сам знает, как настроить автоматизированную систему"

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

Обмен - Перенос данных из 1C8 в 1C8

2
На настройку выгрузки проводок из ЗУП 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];
			КонецЕсли	
		КонецЕсли;
	КонецЕсли;
	
	Возврат стрСчетСубконто;
	
КонецФункции

 

2

Скачать файлы

Наименование Файл Версия Размер
Обработка выгрузки проводок из ЗУП 3.1 в КА 1.1
.epf 12,34Kb
20.03.18
8
.epf 12,34Kb 8 Скачать
Обработка загрузки проводок в КА 1.1 из ЗУП 3.1
.epf 8,14Kb
20.03.18
7
.epf 8,14Kb 7 Скачать

См. также

Комментарии
Сортировка: Древо
2. Brawler 388 20.03.18 11:39 Сейчас в теме
Вам стоило посмотреть БП 3.0.
Там на вход поступает документ из ЗУП 3.Х в котором конечно же нет проводок, но в нем говорится какие способы отражения должны быть использованы для формирования проводок.
Имея все суммы и способы отражения (аналитики в них нужно на стороне БП 3.Х заполнять) БП 3.0 генерирует проводки.
Я сам когда сидел думал над реализацией переноса отражения из ЗУП 3.Х в УПП обдумывал именно вариант работы как при обмене с ЗУП 3.Х и БП 3.0. Не супер сложно в правилах переноса данных цепляться за способы отражения описанные в КА/УПП, брать из них счета учета и субконто, а так как все суммы в ЗУП 3.Х в документе отражения ЗП расписаны по полочкам. то не сложно для отражения всяких там налогов прописать конкретные счета учетов...

+ еще есть, юзерам на стороне ЗУП 3.1 вообще не нужно заполнять аналитики в способах отражениях, все аналитики заполнены в КА/УПП и главное при переносе данных совместить способы отражения разных баз.
3. HAMMER_59 68 20.03.18 12:05 Сейчас в теме
(2) Практически в самом начале я так и написал, что если бы делал заново, тогда бы выгружал "способы отражения в БУ", а не проводки.
Лучшее - враг хорошего. Можно очень долго думать как сделать лучше, и ничего так и не сделать. Вариант вполне себе рабочий.
Также у варианта, который я реализовал есть неоспоримый плюс - не нужно вносить изменения в бухгалтерскую базу, в данном случае в КА 1.1. В случае с выгрузкой "способов отражения в БУ", придется эти данные где-то хранить, т.е. нужно будет вносить изменения в конфигурацию.
4. Brawler 388 20.03.18 12:38 Сейчас в теме
(3) Каждая реализация имеет право на свое существование.
Я немного не понял, что вам бы потребовалось менять на стороне КА, так как мои размышления по поводу обмена данными сводились все к тому, что на стороне КА ну в моем случае УПП, нужно данные перенести из документа отражения ЗП в ЗУП 3.Х, в документ отражения ЗП в УПП, при этом в УПП заполнить только первую вкладку документа там, где проводки. Все алгоритмы формирования проводок размещались бы в правилах переноса данных.
Способы отражения ЗП в УПП типовые и должны быть просто заполнены юзером. В ситуации когда к примеру происходит переход зарплатного блока из КА/УПП в отдельную базу ЗУП, то способы отражения как правило в большинстве своем уже есть и настроены.

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

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