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

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

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


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

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

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

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

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

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


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