Вход | Регистрация
 
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. Зачем в запросе строка?
КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество


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