INFOSTART EVENT 2018 EDUCATION

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

Баданов Владимир | Старший программист | 1С-Коннект

«Роль платформы 1С:Предприятие в сервисе 1С-Коннект»

- Сервис 1С-Коннект использует почти вся партнерская сеть 1С: 500 тыс. пользователей, 120+ тыс. ежедневно, рост трафика 2+ раза ежегодно. - Используемые продукты и технологии: xmpp, erlang, go, python, rabbitMQ, телефония, туннелирование, 4 СУБД: 1С: Предприятие (PostgreSQL+MSSQL), PostgreSQL, REDIS, MongoDB, описание ролей. - Администрирование сервиса осуществляется через конфигурацию 1С: написана с нуля, эксплуатация как SaaS, на одном сервере, без использования БСП, регламентные задания, PUSH-Sync, PartnerAPI, рассылки, отчёты. - Нагрузка, размер БД, способы оптимизации запросов: используем отбор по индексам, виртуальные таблицы, СКД в динамических списках, регистры сведений, разделение ИБ не используем. - RLS пережил два поколения. Система доступа оперирует сотней микро-ролей и назначает только нужные. - Интеграция: взаимодействие с другими частями инфраструктуры, API, проблемы первой версии, найденные решения - журналирование, ограничения на вызовы, гибкие входные параметры, пакетные вызовы. - Цикл производства: параллельная разработка выпусков. Ручное тестирование и автотесты (сценарные + API), обновление через механизм поставок, EDT+GIT. Трекер.

Обмен документами между одинаковыми конфигурациями

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

8
Простой вариант передавать созданное основание в подчиненный документ при обмене и делать обмен по произвольному алгоритму.

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

 

Итак, сегодня задача используя Конвертацию данных 2.1 по произвольному алгоритмом обменять две базы с одинаковыми конфигурациями (например Бухгалтерия 2.0)  и при этом сформировать документы подчиненные обмениваемым(точнее вновь созданным). Алгоритмом содержащим запрос формирую данные для загрузки например в базе Источнике  у меня Поступления товаров, в Приемник хочу сделать Реализации (встречные). 

С этой частью все ясно, делаем ПВД- Произвольный алгоритм, из Источника выбираем Поступления ,формируем структуру и используя стандартную функцию ВыгрузитьПоПравилу() передаем в ПКО Реализация. Так мы получим данные только для шапки, ниже напишу подробнее, табличную часть придется получать отдельно через запрос.

 

Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
	|	ПоступлениеТоваровУслуг.Ссылка,
	|	ПоступлениеТоваровУслуг.Дата,
	|	ПоступлениеТоваровУслуг.ВалютаДокумента,
	|	ПоступлениеТоваровУслуг.Контрагент,
	|	ПоступлениеТоваровУслуг.Организация,
	|	ПоступлениеТоваровУслуг.СуммаДокумента,
	|	ПоступлениеТоваровУслуг.НомерВходящегоДокумента,
	|	ПоступлениеТоваровУслуг.Комментарий
	|ИЗ
	|	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
	|ГДЕ
	|	ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
	|	И ПоступлениеТоваровУслуг.Контрагент = &Контрагент
	|";

Запрос.УстановитьПараметр("ДатаНач", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);

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

Выб = Запрос.Выполнить().Выбрать();

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

Но для завершенности я решил сделать еще и ПКО СчетФактураВыданный, все данные для счета фактуры есть, проблема небольшая с тем что в Источнике нет узла для Основания, первая мысль использовать снова ВыгрузитьПоПравилу() , Входящие данные, честно говоря тоже думал об этом, но отбросил эту мысль.  При написании правил большую роль играет последовательность действий и обработчики событий, то есть нужно следить за тем в какой базе и при каком событии выполняется тот или иной алгоритм. Так как Документ-основание появляется только после завершения загрузки ПКО с Реализацией, я сделал следующим образом, первоначально загружаю Счет-фактуру без Документа-основания, как видно из текста выше (ВходящиеДанные такие же как для Реализации), и в обработчике ПКО ПослеЗагрузки заполняю его из запроса, который в качестве параметров использует поля для поиска.

Запрос = Новый Запрос;

Запрос.Текст = 
"ВЫБРАТЬ
|	РеализацияТоваровУслуг.Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	РеализацияТоваровУслуг.Дата = &Дата
|	И РеализацияТоваровУслуг.Номер = &Номер
|	И РеализацияТоваровУслуг.Контрагент = &Контрагент";

Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номер", ПривестиНомерКДлине(Объект.Номер,11));
Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);

Выб = Запрос.Выполнить().Выбрать();

Если Выб.Следующий() Тогда
	ДокОсн = Объект.ДокументыОснования.Добавить();
	ДокОсн.ДокументОснование = Выб.Ссылка;
КонецЕсли;

Попытка 
	Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;

Скептики не оценят, но это работает и достаточно быстро, вариант 100%.

Теперь немного подробнее как выглядят ПКО. Часть реквизитов заполняется фиксированными данными, через общеизвестный прием с поиском объекта справочника в Приемнике: создаем ПКО, заполняем только Приемник например Контрагенты, в ПКС одно единственное свойство например Код для поиска, ПередВыгрузкой: Значение = Источник;

 в месте где это правило используется остается передать только значение Кода (Значение = <Ваш код>),

Далее получается как инструкция по сбору "Лего": фиксированные Реквизиты типа Организации, Контрагенты, Валюты может быть, делаем описанным образом, значения Перечислений вообще можно указывать явно без правила Значение = "ПродажаКомиссия"; 

Данные получаемые из входящих данных

Табличные части, получаются запросом (Поступления из Источника), в качестве параметра для берем Ссылку из входящих данных.

Запрос = Новый Запрос;

Запрос.Текст =
	"ВЫБРАТЬ
	|	ПостТов.Ссылка,
	|	ПостТов.Количество,
	|	ПостТов.Номенклатура,
	|	ПостТов.Сумма,
	|	ПостТов.СуммаНДС,
	|	ПостТов.Цена,
	|	ПостТов.НомерГТД,
	|	ПостТов.СтранаПроисхождения,
	|	ПостТов.ЕдиницаИзмерения
	|ИЗ
	|	Документ.ПоступлениеТоваровУслуг.Товары КАК ПостТов
	|ГДЕ
	|	ПостТов.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ВходящиеДанные.Ссылка);

КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

Внутри ТЧ, реквизиты аналогично шапке, только данные получаемые из запроса будут объектами коллекции, например

Постарался проиллюстрировать все описанное, а так все!

8

См. также

Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение