Дописываю обработку переноса данных из самописной erp в бухгалтерию.
В erp вариантИсполнения-справочникссылка,а в создала бухгалтерии реквизит документа ВариантИсполнения-строка.
(5) {ВнешняяОбработка.ЗагрузкаДанныхXMLизПСУМФБП82.МодульОбъекта(2143)}: Поле объекта не обнаружено (Наименование)
СтрокаТЧ.ВариантИсполнения= ?(ЗначениеЗаполнено(СтрокаТаблТЧ.Значение),СтрокаТаблТЧ.Значение.Наименование,"");
(13) Пардон,не в те дебри занесло)
СтрокаТЧ.ВариантИсполнения= ?(ЗначениеЗаполнено(СтрокаТаблТЧ.ВариантИсполнения),СтрокаТаблТЧ.ВариантИсполнения.Наименование,"");
(33)
Отбор = Новый Структура;
Отбор.Вставить("ИмяРеквизита","ВариантИсполнения");
Строки = СтрокаТаблТЧ.Значение.НайтиСтроки(Отбор);
//Посмотри отладкой что туда попало.
Если Строки.Количество() > 0 Тогда
ВариантИсполнения = Строки[0].Значение;
СтрокаТЧ.ВариантИсполнения = ВариантИсполнения;
Конецесли;
(35) Врядли создает,скорее всего с ERP такая тч идет, причем наименования нет.Вначале на стороне ERP проверь что выгружается в "ВариантИсполнения".Если нет наименования,добавь.
Отбор = Новый Структура;
Отбор.Вставить("ИмяРеквизита","ВариантИсполнения");
Строки = СтрокаТаблТЧ.Значение.НайтиСтроки(Отбор);
//Посмотри отладкой что туда попало.
Если Строки.Количество() > 0 Тогда
ВариантИсполнения = Строки[0].Значение;
//тут получили тз,при условии что в ерп первой строкой всегда выгружается наименование(сейчас там код),можем по индексу вытянуть его.
СтрокаТЧ.ВариантИсполнения = ВариантИсполнения[0].Значение;
Конецесли;
"СтрокаТЧ.ВариантИсполнения= СтрокаТаблТЧ.Значение;" из (1)
Вставь вот это:
Отбор = Новый Структура;
Отбор.Вставить("ИмяРеквизита","ВариантИсполнения");
Строки = СтрокаТаблТЧ.Значение.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ВариантИсполнения = Строки[0].Значение;
//тут получили тз,при условии что в ерп первой строкой всегда выгружается наименование(сейчас там код),можем по индексу вытянуть его.
СтрокаТЧ.ВариантИсполнения = ВариантИсполнения[0].Значение;
Конецесли;
(49)да,создаются.но,блин когда я что то добавляю в обработку,на стороне ERP пишет Ошибка подключения обработки загрузки в БП,вот разбираюсь
Функция НайтиСоздать_ДокОтгрузкаПокупателю(ТипОбъекта, ТаблРекв) // РеализацияТоваровУслуг
ДокС = ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Ссылка"); // возвращает ссылку на док-т (если не найден, то тут же создается)
Если ДокС = 0 Тогда
Возврат 0;
КонецЕсли;
_ТолькоЧтоСоздан = ЭтоНовыйОбъектБазы(ДокС);
// Выходим из процедуры, если док не только что создан и если НЕ установлен признак обновления
Если НЕ _ТолькоЧтоСоздан И НЕ ОбновлятьДокументы Тогда
Возврат Истина;
КонецЕсли;
// сюда попали - значит док только что создан или нужно обновлять
ДокО = ДокС.ПолучитьОбъект();
ДокО.УстановитьПометкуУдаления(Ложь); // на всякий случай снимаем пометку, что в случае обновления будет полезным
// ТЧ очистим заранее, чтобы у системы не было вопросов с перезаполнением их параметров при обработке выбора договора
ДокО.Товары.Очистить();
ДокО.Услуги.Очистить();
МессагаПоОбъекту(ДокО, ?(_ТолькоЧтоСоздан, "Загрузка", "Обновление"));
// заполнение шапки
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ДокО, м_ТекПользователь, м_ВалютаРеглУчета, "Продажа");
ДокО.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
ДокО.ТипЦен = ТипЦенПродажи;
ДокО.Организация = ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Фирма");
ДокО.УстановитьНовыйНомер();
//ДокО.Контрагент = ПолучитьЗначениеИзТаблРекв(ТаблРекв,"Контрагент");
ДокО.Контрагент = ПолучитьЗначениеИзТаблРекв(ТаблРекв,"Контрагент", "Покупатель");
//Пытаемся подобрать первый попавшийся, если не находим, ищем по коду+конт, при необходимости создаем
ПС_УстановитьДоговорКонтрагента(ДокО.ДоговорКонтрагента,
ДокО.Контрагент,
ДокО.Организация,
ПС_ПолучитьСписокВидовДоговоров("СПокупателем"));
Если Не ЗначениеЗаполнено(ДокО.ДоговорКонтрагента) Тогда
ДокО.ДоговорКонтрагента = ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Договор");
КонецЕсли;
ПС_ЗаполнитьКомментарий(ДокО, ТаблРекв);
// обработка изменения договора (ПриИзмененииДоговора()):
СпособЗаполненияЦен = ""; //Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(ЭтотОбъект);
//ЗаполнениеДокументов.ПриИзмененииЗначенияДоговора(ДокО, "", м_ВалютаРеглУчета, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, "Продажа", "Товары");
ПриИзмененииЗначенияДоговора(ДокО, "", м_ВалютаРеглУчета, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, "Продажа", "Товары");
_ТекущаяВерсияИБ = Константы.НомерВерсииКонфигурации.Получить();
Если Число(Лев(_ТекущаяВерсияИБ, 1)) < 2 Тогда
СчетаУчета = УправлениеВзаиморасчетами.ПолучитьСчетаРасчетовСКонтрагентом(ДокО.Организация, ДокО.Контрагент, ДокО.ДоговорКонтрагента);
Иначе
СчетаУчета = БухгалтерскийУчетРасчетовСКонтрагентами.ПолучитьСчетаРасчетовСКонтрагентом(ДокО.Организация, ДокО.Контрагент, ДокО.ДоговорКонтрагента);
КонецЕсли;
ДокО.ЗаполнитьСчетаУчетаРасчетов(СчетаУчета);
//ДокО.Склад = СкладДляДокументов;
ДокО.Склад = ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Склад");
ДокО.Ответственный = м_ТекПользователь;
//Заполнение Табл частей:
_ТаблТЧ = ТаблРекв.Найти("ТЧ", "ИмяРеквизита").Значение;
Для Каждого СтрокаТаблТЧ Из _ТаблТЧ Цикл
СпрС_Номен = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, ?(мПараметрыЗагрузки.ЗагружатьВариантыИсполнения, "ВариантИсполнения", "Номенклатура"));;
Если НЕ СпрС_Номен.Услуга Тогда // товары
СтрокаТЧ = ДокО.Товары.Добавить();
СтрокаТЧ.ЕдиницаИзмерения = СпрС_Номен.БазоваяЕдиницаИзмерения;
СтрокаТЧ.Коэффициент = 1;
_СтранаПроисхождения = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "СтранаПроисхождения");
_НомерГТД = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "НомерГТД");
СтрокаТЧ.СтранаПроисхождения = НайтиСоздатьСтрануПроисхожднния(_СтранаПроисхождения);
СтрокаТЧ.НомерГТД = НайтиСоздатьНомерГТД(_НомерГТД);
СтрокаТЧ.СкидкаПроцент = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "ПроцентСкидки");
СтрокаТЧ.СкидкаИтог = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "СуммаСкидки");
Иначе // услуга
СтрокаТЧ = ДокО.Услуги.Добавить();
СтрокаТЧ.Содержание = СокрЛП(ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, ?(мПараметрыЗагрузки.ЗагружатьВариантыИсполнения, "ВариантИсполнения", "Номенклатура")));
КонецЕсли;
СтрокаТЧ.Номенклатура = СпрС_Номен;
_ИсхКол = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "Кол");
_ИсхКоэф = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "Коэффициент");
_ИсхКол = ?(_ИсхКол = "", 1, Число(_ИсхКол));
_ИсхКоэф = ?(_ИсхКоэф = "", 1, Число(_ИсхКоэф));
СтрокаТЧ.Количество = _ИсхКол * _ИсхКоэф;
//ВИ
Отбор = Новый Структура;
Отбор.Вставить("ИмяРеквизита","ВариантИсполнения");
Строки = СтрокаТаблТЧ.Значение.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ВариантИсполнения = Строки[0].Значение;
СтрокаТЧ.ВариантИсполнения = ВариантИсполнения[0].Значение;
Конецесли;
//ВИ
СтрокаТЧ.СуммаНДС = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение,"НДС");
Если ДокО.СуммаВключаетНДС Тогда // сумма включает НДС - в зависимости от флажка
СтрокаТЧ.Сумма = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "Сумма");
Иначе
СтрокаТЧ.Сумма = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "Сумма") - СтрокаТЧ.СуммаНДС;
КонецЕсли;
//СтрокаТЧ.Цена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
СтрокаТЧ.Цена = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "Цена");
_ИсхСтавкаНДС = ПолучитьЗначениеИзТаблРекв(СтрокаТаблТЧ.Значение, "СтавкаНДС");
СтрокаТЧ.СтавкаНДС = ПолучитьЛокСтавкуНДС(_ИсхСтавкаНДС);
КонецЦикла;
//Сворачиваем по номенклатуре
_ТЧ_ТоварыСвернуто = ПС_СвернутьТЧ(ДокО.Товары, "ЕдиницаИзмерения, Коэффициент, СтранаПроисхождения, НомерГТД, Номенклатура, СтавкаНДС, Цена", "Количество, СуммаНДС, Сумма, СкидкаИтог", "СкидкаПроцент");
ДокО.Товары.Загрузить(_ТЧ_ТоварыСвернуто);
_ТЧ_УслугиСвернуто = ПС_СвернутьТЧ(ДокО.Услуги, "Номенклатура, СтавкаНДС, Цена", "Количество, СуммаНДС, Сумма");
ДокО.Услуги.Загрузить(_ТЧ_УслугиСвернуто);
ДокО.ЗаполнитьСчетаУчетаВТабЧасти(ДокО.Товары, "Товары", Истина);
ДокО.ЗаполнитьСчетаУчетаВТабЧастиУслуги(Истина);
Если ЗаписатьЗаполненныйОбъект(ДокО)=Ложь Тогда
Возврат 0;
КонецЕсли;
//добавим в табл документ к проведению:
_Проведен = Булево(ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Проведен"));
ДобавитьВТаблДокДляПроведения(ДокО, _Проведен);
// --------------------------- Создаем сч-ф --------------------------
Отбор = Новый Структура;
Отбор.Вставить("Организация", ДокО.Организация);
УчетнаяПолитикаОрганизации = РегистрыСведений.УчетнаяПолитикаОрганизаций.ПолучитьПоследнее(ДокО.Дата, Отбор);
Если УчетнаяПолитикаОрганизации.УпрощенныйУчетНДС Тогда
Возврат 1;
КонецЕсли;
Мессага(" создание/обновление счета-фактуры выданного");
//Создание СФ только для Орг. Юрлиц
Если ДокО.Организация.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
//Попытаемся найти счет-фактуру
ДокС_СчФ = УчетНДС.НайтиПодчиненныйСчетФактуру(ДокО.Ссылка, "СчетФактураВыданный");
//Если не нашли - создаем новый док
Если Не ЗначениеЗаполнено(ДокС_СчФ) Тогда
ДокО_СчФ = Документы.СчетФактураВыданный.СоздатьДокумент();
ДокО_СчФ.Заполнить(ДокО.Ссылка); // заполнение на основании текущего дока реализации
ДокО_СчФ.Номер = ДокО.Номер;
ДокО_СчФ.Дата = ДокО.Дата;
ДокО_СчФ.КодВидаОперации = "01";
ДокО_СчФ.ОпределениеПараметровСчетаФактуры();
ДокО_СчФ.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаРеализацию;
Если ЗаписатьЗаполненныйОбъект(ДокО_СчФ)=Ложь Тогда
Возврат 0;
КонецЕсли;
//добавим в табл документ к проведению
_Проведен = Булево(ПолучитьЗначениеИзТаблРекв(ТаблРекв, "Проведен"));
ДобавитьВТаблДокДляПроведения(ДокО_СчФ, _Проведен, 2); // приоритет 2 (чтобы проводились позже отгрузок, имеющих приоритет = 1)
КонецЕсли;
КонецЕсли;
Возврат 1;
КонецФункции
(52) Чтобы получить наименование надо выгрузку в ERP править,найди там кусок кода где заполняются данные по "ВариантИсполнения" и добавь туда наименование,в зависимости как добавишь надо будет тут:
СтрокаТЧ.ВариантИсполнения = ВариантИсполнения[0].Значение;
правильный индекс указать.(0,1,2,3)
Судя по обсуждению в (10) тут одно из двух: либо криво написанная обработка выгрузки/загрузки и проще написать новую, чем исправлять эту
либо полное непонимание откуда какие данные берутся и как это искать в коде
(60)
я правильно понимаю, что обработка запускается в бухгалтерии
подключается по ком к ерп
потом вызывает процедуру из глобального модуля в ерп, и та возвращает данные для загрузки?
но в самом ерп такой процедуры нету?
(63)
если да это ответ на оба моих вопроса
то скорее всего отсутствует исходник модуля в ерп и изменить его вы не сможете
как следствие данную выгрузку до ума не доведете самостоятельно
тут надо пообщаться с тем у кого исходник этого модля
В erp вариантИсполнения-справочникссылка,а в создала бухгалтерии реквизит документа ВариантИсполнения-строка.
Только я не вижу тут постановку задачи? Как соотносится значение элемента справочника в ERP и значение строки, которая должна быть в Бухгалтерии?
Без этого можно бесконечно долго обсуждать способы, и никакой из них не удовлетворит автора, потому что она держит эти значения и их соотношение в своей белокурой (явно!) голове. И то нет гарантии, что эти данные, даже если автор их рассекретит, не устареют: напоминаю, это справочник, который пользователи наверняка могут дополнять и модифицировать.
Поэтому подскажу только самый общий способ: дополнить справочник вариантИсполнения в ERP текстовым реквизитом СтрокаВБухгалтерии, и пусть пользователи его заполняют так, как надо.
Ну, а вытащить потом это значение по ссылке - элементарно.
СтрокаТЧ.ВариантИсполнения= СокрЛП(?(ЗначениеЗаполнено(ВариантИсполнения),ВариантИсполнения,""));
Но скорее всего тут будет "Таблица значений". Если нужен элемент из таблицы тогда с помощью [] выдрать его, например код [0]
Хотя я не понял задачу...
Сегодня смотрел видео по КД2. Понравилась фраза преподавателя. Смысл в том что все кто пишут свои велосипеды по обмену данных не пользуясь КД теряют свое время и бюджет клиента ))