Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

БСП 2.3. Загрузка из внешнего файла. Проблемы с сопоставлением по ШК.

БСП 2.3. Загрузка из внешнего файла. Проблемы с сопоставлением по ШК.
Я
   nihi1ist
 
08.12.18 - 08:20
Выдрал из БСП пример внедрения загрузки в таблицу документа из внешнего файла. Но видимо криво пытаюсь прикрутить ШК. Подскажите, что не так?

Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
    Товары = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления);
    ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных);
    
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ВЫРАЗИТЬ(ДанныеДляСопоставления.Штрихкод КАК СТРОКА(13)) КАК Штрихкод,
        |    ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
        |    ДанныеДляСопоставления.Идентификатор КАК Идентификатор
        |ПОМЕСТИТЬ ДанныеДляСопоставления
        |ИЗ
        |    &ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    ДанныеДляСопоставления.Идентификатор КАК Идентификатор,
        |    Штрихкоды.Штрихкод КАК Штрихкод,
        |    спрНоменклатура.Ссылка
        |ПОМЕСТИТЬ СопоставленнаяНоменклатураПоШтрихкоду
        |ИЗ
        |    ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
        |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
        |            ПО Штрихкоды.Владелец.Ссылка = спрНоменклатура.Ссылка
        |        ПО ДанныеДляСопоставления.Штрихкод = Штрихкоды.Штрихкод
        |            И (ДанныеДляСопоставления.Штрихкод <> """")
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Идентификатор
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
        |    ДанныеДляСопоставления.Идентификатор КАК Идентификатор
        |ПОМЕСТИТЬ ДанныеДляСопоставленияПоНаименованию
        |ИЗ
        |    ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
        |        ПО ДанныеДляСопоставления.Штрихкод = СопоставленнаяНоменклатураПоШтрихкоду.Штрихкод
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Идентификатор
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    МАКСИМУМ(спрНоменклатура.Ссылка) КАК Ссылка,
        |    ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор,
        |    КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество
        |ИЗ
        |    ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
        |        ПО (спрНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500))))
        |
        |СГРУППИРОВАТЬ ПО
        |    ДанныеДляСопоставленияПоНаименованию.Идентификатор
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    NULL,
        |    СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
        |    КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор)
        |ИЗ
        |    СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
        |
        |СГРУППИРОВАТЬ ПО
        |    СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор";

    Запрос.УстановитьПараметр("ДанныеДляСопоставления", ЗагружаемыеДанные);
    РезультатыЗапросов = Запрос.ВыполнитьПакет();
    
    ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить();
    ФункциональнаяОпцияХарактеристика = ?(ЗагружаемыеДанные.Колонки.Найти("Характеристика") <> Неопределено, Истина, Ложь);
    Для каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл
        
        Товар = Товары.Добавить();
        Товар.Идентификатор = СтрокаТаблицы.Идентификатор;
        Товар.Количество = СтрокаТаблицы.Количество;
        Товар.Цена = СтрокаТаблицы.Цена;
        
        СтрокаНоменклатура = ТаблицаНоменклатура.Найти(СтрокаТаблицы.Идентификатор, "Идентификатор");
        Если СтрокаНоменклатура <> Неопределено Тогда 
            Если СтрокаНоменклатура.Количество = 1 Тогда 
                Товар.Номенклатура = СтрокаНоменклатура.Ссылка;
                Если ФункциональнаяОпцияХарактеристика Тогда
                    Товар.Характеристика = Справочники._ДемоХарактеристики.НайтиПоНаименованию(СтрокаТаблицы.Характеристика, 
                        Истина,, Товар.Номенклатура);
                КонецЕсли;
            ИначеЕсли СтрокаНоменклатура.Количество > 1 Тогда
                ЗаписьОНеоднозначности = СписокНеоднозначностей.Добавить();
                ЗаписьОНеоднозначности.Идентификатор = СтрокаТаблицы.Идентификатор; 
                ЗаписьОНеоднозначности.Колонка = "Номенклатура";
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    ПоместитьВоВременноеХранилище(Товары, АдресТаблицыСопоставления);

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


Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
    Если ИмяКолонки = "Номенклатура" Тогда
        Запрос = Новый Запрос;
        
        ТекстГде = "";
        Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
            ТекстГде = "ГДЕ Номенклатура.Наименование = &Наименование";
            Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Номенклатура);
        КонецЕсли;
            
        Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Штрихкод) Тогда
            Если ЗначениеЗаполнено(ТекстГде) Тогда
                ТекстГде = ТекстГде + " ИЛИ Штрихкоды.Штрихкод = &Штрихкод";
            Иначе
                ТекстГде = "ГДЕ Штрихкоды.Штрихкод = &Штрихкод";
            КонецЕсли;
            Запрос.УстановитьПараметр("Штрихкод", ЗагружаемыеЗначенияСтрока.Штрихкод);
        КонецЕсли;
        
        Запрос.Текст = "ВЫБРАТЬ
            |    Номенклатура.Ссылка
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
            |        ПО Номенклатура.Ссылка = Штрихкоды.Владелец.Ссылка " + ТекстГде;
        
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        КонецЦикла;
    КонецЕсли;

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

 
 
   nihi1ist
 
1 - 08.12.18 - 08:26
Забыл указать в чем проблема:

Не сопоставляется с номенклатурой по ШК.
   МимохожийОднако
 
2 - 08.12.18 - 08:42
Отладчиком смотрел?
Например, строку
ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить();
   nihi1ist
 
3 - 08.12.18 - 10:35
(2) точка останова не срабатывает, может делаю что неправильно?
   nihi1ist
 
4 - 08.12.18 - 10:43
(2) нашел как включить.
   nihi1ist
 
5 - 08.12.18 - 10:47
(2) включил на сервере отладку, один черт та же проблема с несрабатыванием точки остатнова.
   МимохожийОднако
 
6 - 08.12.18 - 10:53
(5) Отлаживай на своём компьютере в файловом режиме...
Но лучше разобраться с включением отладки на сервере.
   nihi1ist
 
7 - 08.12.18 - 11:06
(6) чет вместо штрихкода количество в таблице:
https://snag.gy/BpZjnI.jpg
   nihi1ist
 
8 - 10.12.18 - 12:16
Разобрался с сопоставлением ШК. Теперь бы разобраться почему не вставляется количество. В 2 объединяемых запросах потерялась одна строка. Правильно так:
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    МАКСИМУМ(спрНоменклатура.Ссылка) КАК Ссылка,
    ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор,
    КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество
ИЗ
    ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
        ПО (спрНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500))))

СГРУППИРОВАТЬ ПО
    ДанныеДляСопоставленияПоНаименованию.Идентификатор

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    СопоставленнаяНоменклатураПоШтрихкоду.Ссылка,
    СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
    КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор)
ИЗ
    СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду

СГРУППИРОВАТЬ ПО
    СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
    СопоставленнаяНоменклатураПоШтрихкоду.Ссылка


P.S. Зачем в запросе строка?
КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует