641 lines
47 KiB
Markdown
641 lines
47 KiB
Markdown
---
|
||
title: 3. Загрузка данных в табличную часть
|
||
slug: общие-загрузка-данных-из-файла/3-загрузка-данных-в-табличную-часть
|
||
---
|
||
|
||
Полезное:
|
||
[Консоль кода](/common/konsol-koda-is.epf)
|
||
[Фрагменты кода](/bsp-zagruzka-iz-faila/fragmenty-koda.json)
|
||
|
||
Подсистема "Загрузка данных из файла" также поддерживает загрузку в табличные части документов и справочников. Для этого нужно:
|
||
|
||
# Создать макет
|
||
|
||
Макет создается на уровне объекта и должен обязательно иметь имя, созданное по шаблону **ЗагрузкаИзФайла<ИмяТабличнойЧасти>**.
|
||
> Если табличная часть одна, допускается именовать макет просто **"ЗагрузкаИзФайла"**
|
||
>
|
||
В нем настраиваем вид шапки таблицы **именя ячеек которой должны соответствовать именам реквизитов нужной табличной части**.
|
||
|
||

|
||
|
||
Если имя ячейки характеризует реквизит целевого реквизита (например `Номенклатура.Артикул`), то также нужно запонять **параметры расшифровки**. Например, для `Номенклатура.Артикул` имя ячейки - `Артикул`, а параметр расшифровки - `Номенклатура`
|
||
|
||

|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Подробнее</summary>
|
||
|
||
Если в макете есть колонки, которые являются реквизитами какой-то колонки целевой **табличной части**, то нужно для ячеек указывать **параметры расшифровки**. Например, есть макет с именами колонок:
|
||
- **Артикул**
|
||
- **Наименование**
|
||
- ...
|
||
- ...
|
||
|
||
По которым мы пытаемся подобрать значение реквизита ТЧ `Номенклатура`:
|
||
|
||
```bsl
|
||
СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");
|
||
|
||
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
|
||
|
||
...
|
||
|
||
Если СтрокаНоменклатуры <> Неопределено Тогда
|
||
|
||
Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда
|
||
СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура;
|
||
|
||
// ТУТ ПОЯВИЛАСЬ НЕДОНОЗНАЧНОСТЬ
|
||
ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда
|
||
СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
|
||
СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
|
||
СтрокаНеоднозначности.Колонка = "Номенклатура"; // ИМЯ КОЛОНКИ ТАБЛИЧНОЙ ЧАСТИ, НЕ ТАБ.ДОК
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
...
|
||
|
||
КонецПроцедуры
|
||
|
||
```
|
||
|
||
Для того, чтобы в аргументе `ЗагружаемыеЗначенияСтрока` процедуры `ЗаполнитьСписокНеоднозначностей` были добавлены значения колонок `Артикул` и `Наименование` таб.док нужно для них указать расшифровку, что эти колонки относятся именно к номенклатуре.
|
||
|
||
Если не указать параметры расшифровки для колонок, то при попытке считать их из аргумента `ЗагружаемыеЗначенияСтрока` будет сыпаться ошибка.
|
||
|
||
```bsl
|
||
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
|
||
|
||
...
|
||
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
|
||
ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование";
|
||
Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование);
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда
|
||
Если ПустаяСтрока(ТекстГде) Тогда
|
||
ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул";
|
||
Иначе
|
||
ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул";
|
||
КонецЕсли;
|
||
|
||
Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул);
|
||
КонецЕсли;
|
||
|
||
...
|
||
|
||
```
|
||
</details>
|
||
|
||
# Создать команду на форме
|
||
|
||
В командной панели нужной ТЧ создаем команду `ЗагрузитьТоварыИзФайла` (имя произвольное), в обработчике которой реализуем заполнение служебной структуры, полученной с помощью метода `ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных` и вызываем непосредственное открытие формы загрузки методом `ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки`.
|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>
|
||
|
||
```bsl
|
||
&НаКлиенте
|
||
Процедура ЗагрузитьТоварыИзФайла(Команда)
|
||
|
||
|
||
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
|
||
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПриходнаяНакладная.Товары";
|
||
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка списка товаров из файла'");
|
||
|
||
// Любые параметры, которые могут понадобиться дальше при
|
||
// выполнении метода, указанного в описании оповещения
|
||
ДополнительныеПараметры = Новый Структура();
|
||
ДополнительныеПараметры.Вставить("Контрагент", Объект.Контрагент);
|
||
ДополнительныеПараметры.Вставить("Организация", Объект.Организация);
|
||
|
||
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
|
||
|
||
Оповещение = Новый ОписаниеОповещения("ЗагрузитьТоварыИзФайлаЗавершение", ЭтотОбъект);
|
||
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Выполняем после завершения работы в стандартной форме загрузки из файла
|
||
&НаКлиенте
|
||
Процедура ЗагрузитьТоварыИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
|
||
|
||
Если АдресЗагруженныхДанных = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
// АдресЗагруженныхДанных - адрес ВХ подготовленной ТЗ с загруженными данными
|
||
ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных);
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Процедура ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных)
|
||
|
||
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
|
||
|
||
ТоварыДобавлены = Ложь;
|
||
Для каждого СтрокаТаблицы Из ЗагруженныеДанные Цикл
|
||
|
||
Если Не ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
СтрокаТовары = Объект.Товары.Добавить();
|
||
ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрокаТаблицы);
|
||
|
||
ТоварыДобавлены = Истина;
|
||
|
||
КонецЦикла;
|
||
|
||
Если ТоварыДобавлены Тогда
|
||
Модифицированность = Истина;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
```
|
||
|
||
</details>
|
||
|
||
# В модуле менеджера реализовать методы программного интерфейса
|
||
|
||
## Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ
|
||
|
||
Аналогично процедуре `ОпределитьПараметрыЗагрузкиДанныхИзФайла` (см. статью `2. Настраиваемые алгоритмы загрузки в справочники`). Может быть пустой
|
||
|
||
```bsl
|
||
// Переопределяет параметры загрузки данных из файла.
|
||
//
|
||
// Параметры:
|
||
// Параметры - Структура:
|
||
// * ИмяМакетаСШаблоном - Строка - наименование макета. Например, "ЗагрузкаИзФайла".
|
||
// * ИмяТабличнойЧасти - Строка - полное имя табличной части. Например, "Документ._ДемоСчетНаОплатуПокупателю.ТабличнаяЧасть.Товары"
|
||
// * ОбязательныеКолонки - Массив из Строка - наименования обязательных для заполнения колонок.
|
||
// * ТипДанныхКолонки - Соответствие из КлючИЗначение:
|
||
// * Ключ - Строка - имя колонки;
|
||
// * Значение - ОписаниеТипов - тип колонки загружаемых данных.
|
||
// * ДополнительныеПараметры - Структура
|
||
//
|
||
Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ(Параметры) Экспорт
|
||
|
||
КонецПроцедуры
|
||
```
|
||
|
||
## Процедура СопоставитьЗагружаемыеДанные
|
||
|
||
В этой процедуре необходимо заполнить таблицу, находящуюся по адресу `АдресТаблицыСопоставления`
|
||
|
||
```bsl
|
||
// АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой
|
||
// находятся загруженные данные из файла. Состав колонок:
|
||
// * Идентификатор - Число - порядковый номер строки.
|
||
// Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла.
|
||
// АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
|
||
// являющейся копией табличной части документа,
|
||
// которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
|
||
// СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений:
|
||
// * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность.
|
||
// * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность.
|
||
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
|
||
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
|
||
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
|
||
```
|
||
|
||
|Аргумент|Описание|
|
||
|-|-|
|
||
|`АдресЗагружаемыхДанных`|По этому адресу расположена таблица значений, заполненная на основании введенных пользователем данных в форме обработки|
|
||
|`АдресТаблицыСопоставления`|По этому адресу расположена копия табличной части документа/справочника, которую необходимо заполнить|
|
||
|`СписокНеоднозначностей`|Таблица, в которую записываются идентификаторы строк ТЧ, для которых не удалось однозначно определить сопоставляемые данные|
|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>
|
||
|
||
```bsl
|
||
// АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой
|
||
// находятся загруженные данные из файла. Состав колонок:
|
||
// * Идентификатор - Число - порядковый номер строки.
|
||
// Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла.
|
||
// АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
|
||
// являющейся копией табличной части документа,
|
||
// которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
|
||
// СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений:
|
||
// * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность.
|
||
// * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность.
|
||
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
|
||
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
|
||
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
|
||
|
||
|
||
ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных);
|
||
ТабличнаяЧасть = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления);
|
||
|
||
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ВЫРАЗИТЬ(ДанныеДляСопоставления.Артикул КАК СТРОКА(50)) КАК Артикул,
|
||
| ВЫРАЗИТЬ(ДанныеДляСопоставления.ЕдиницаИзмерения КАК СТРОКА(30)) КАК ЕдиницаИзмерения,
|
||
| ВЫРАЗИТЬ(ДанныеДляСопоставления.Номенклатура КАК СТРОКА(300)) КАК Номенклатура,
|
||
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ВТДанныеДляСопоставления
|
||
|ИЗ
|
||
| &ЗагружаемыеДанные КАК ДанныеДляСопоставления
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| СправочникНоменклатура.Ссылка КАК Номенклатура,
|
||
| СправочникНоменклатура.Артикул КАК Артикул,
|
||
| ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоАртикулу
|
||
|ИЗ
|
||
| ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
|
||
| ПО ВТДанныеДляСопоставления.Артикул = СправочникНоменклатура.Артикул
|
||
| И (ВТДанныеДляСопоставления.Артикул <> """")
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| ВТДанныеДляСопоставления.Номенклатура КАК Номенклатура,
|
||
| ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ВТДанныеДляСопоставленияПоНаименованию
|
||
|ИЗ
|
||
| ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
|
||
| ЛЕВОЕ СОЕДИНЕНИЕ ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу
|
||
| ПО ВТДанныеДляСопоставления.Идентификатор = ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор
|
||
|ГДЕ
|
||
| ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор ЕСТЬ NULL
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| СправочникНоменклатура.Ссылка КАК Номенклатура,
|
||
| ВТДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоНаименованию
|
||
|ИЗ
|
||
| ВТДанныеДляСопоставленияПоНаименованию КАК ВТДанныеДляСопоставленияПоНаименованию
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
|
||
| ПО ВТДанныеДляСопоставленияПоНаименованию.Номенклатура = СправочникНоменклатура.Наименование
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| МАКСИМУМ(СопоставленнаяНоменклатура.Номенклатура) КАК Номенклатура,
|
||
| СопоставленнаяНоменклатура.Идентификатор КАК Идентификатор,
|
||
| СУММА(СопоставленнаяНоменклатура.КоличествоСтрок) КАК КоличествоСтрок
|
||
|ИЗ
|
||
| (ВЫБРАТЬ
|
||
| ВТСопоставленнаяНоменклатураПоАртикулу.Номенклатура КАК Номенклатура,
|
||
| ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор КАК Идентификатор,
|
||
| 1 КАК КоличествоСтрок
|
||
| ИЗ
|
||
| ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу
|
||
|
|
||
| ОБЪЕДИНИТЬ ВСЕ
|
||
|
|
||
| ВЫБРАТЬ
|
||
| ВТСопоставленнаяНоменклатураПоНаименованию.Номенклатура,
|
||
| ВТСопоставленнаяНоменклатураПоНаименованию.Идентификатор,
|
||
| 1
|
||
| ИЗ
|
||
| ВТСопоставленнаяНоменклатураПоНаименованию КАК ВТСопоставленнаяНоменклатураПоНаименованию) КАК СопоставленнаяНоменклатура
|
||
|
|
||
|СГРУППИРОВАТЬ ПО
|
||
| СопоставленнаяНоменклатура.Идентификатор
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор,
|
||
| КОЛИЧЕСТВО(ВТДанныеДляСопоставления.ЕдиницаИзмерения) КАК КоличествоСтрок,
|
||
| МАКСИМУМ(УпаковкиЕдиницыИзмерения.Ссылка) КАК ЕдиницаИзмерения
|
||
|ИЗ
|
||
| ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
|
||
| ПО ВТДанныеДляСопоставления.ЕдиницаИзмерения = УпаковкиЕдиницыИзмерения.Наименование
|
||
|
|
||
|СГРУППИРОВАТЬ ПО
|
||
| ВТДанныеДляСопоставления.Идентификатор";
|
||
|
||
Запрос.УстановитьПараметр("ЗагружаемыеДанные", ЗагружаемыеДанные);
|
||
|
||
РезультатыЗапроса = Запрос.ВыполнитьПакет();
|
||
|
||
ТаблицаНоменклатуры = РезультатыЗапроса.Получить(4).Выгрузить();
|
||
ТаблицаЕдиницИзмерения = РезультатыЗапроса.Получить(5).Выгрузить();
|
||
|
||
Для Каждого СтрокаЗагружаемыхДанных Из ЗагружаемыеДанные Цикл
|
||
|
||
СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить();
|
||
СтрокаТабличнойЧасти.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
|
||
СтрокаТабличнойЧасти.Цена = СтрокаЗагружаемыхДанных.Цена;
|
||
|
||
СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");
|
||
|
||
Если СтрокаНоменклатуры <> Неопределено Тогда
|
||
|
||
Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда
|
||
СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура;
|
||
ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда
|
||
СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
|
||
СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
|
||
|
||
// ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК
|
||
СтрокаНеоднозначности.Колонка = "Номенклатура";
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
СтрокаЕдиницыИзмерения = ТаблицаЕдиницИзмерения.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");
|
||
|
||
Если СтрокаЕдиницыИзмерения <> Неопределено Тогда
|
||
|
||
Если СтрокаЕдиницыИзмерения.КоличествоСтрок = 1 Тогда
|
||
СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтрокаЕдиницыИзмерения.ЕдиницаИзмерения;
|
||
ИначеЕсли СтрокаЕдиницыИзмерения.КоличествоСтрок > 1 Тогда
|
||
СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
|
||
СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
|
||
|
||
// ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК
|
||
СтрокаНеоднозначности.Колонка = "ЕдиницаИзмерения";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецЦикла;
|
||
|
||
ПоместитьВоВременноеХранилище(ТабличнаяЧасть, АдресТаблицыСопоставления);
|
||
|
||
КонецПроцедуры
|
||
```
|
||
|
||
</details>
|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Пример реализации из БСП</summary>
|
||
|
||
```bsl
|
||
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
|
||
|
||
|
||
Товары = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); // ТаблицаЗначений
|
||
ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); // ТаблицаЗначений
|
||
|
||
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ВЫРАЗИТЬ(ДанныеДляСопоставления.Штрихкод КАК СТРОКА(13)) КАК Штрихкод,
|
||
| ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
|
||
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ДанныеДляСопоставления
|
||
|ИЗ
|
||
| &ДанныеДляСопоставления КАК ДанныеДляСопоставления
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| _ДемоНоменклатура.Ссылка КАК Ссылка,
|
||
| _ДемоНоменклатура.Штрихкод КАК Штрихкод,
|
||
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ СопоставленнаяНоменклатураПоШтрихкоду
|
||
|ИЗ
|
||
| ДанныеДляСопоставления КАК ДанныеДляСопоставления
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
|
||
| ПО (_ДемоНоменклатура.Штрихкод = ДанныеДляСопоставления.Штрихкод)
|
||
| И (ДанныеДляСопоставления.Штрихкод <> """")
|
||
|
|
||
|ИНДЕКСИРОВАТЬ ПО
|
||
| Идентификатор
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
|
||
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|
||
|ПОМЕСТИТЬ ДанныеДляСопоставленияПоНаименованию
|
||
|ИЗ
|
||
| ДанныеДляСопоставления КАК ДанныеДляСопоставления
|
||
| ЛЕВОЕ СОЕДИНЕНИЕ СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
|
||
| ПО ДанныеДляСопоставления.Идентификатор = СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор
|
||
|ГДЕ СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор ЕСТЬ NULL
|
||
|
|
||
|ИНДЕКСИРОВАТЬ ПО
|
||
| Идентификатор
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| МАКСИМУМ(_ДемоНоменклатура.Ссылка) КАК Ссылка,
|
||
| ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор,
|
||
| КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество
|
||
|ИЗ
|
||
| ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
|
||
| ПО (_ДемоНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500))))
|
||
|
|
||
|СГРУППИРОВАТЬ ПО
|
||
| ДанныеДляСопоставленияПоНаименованию.Идентификатор
|
||
|
|
||
|ОБЪЕДИНИТЬ ВСЕ
|
||
|
|
||
|ВЫБРАТЬ
|
||
| МАКСИМУМ(СопоставленнаяНоменклатураПоШтрихкоду.Ссылка),
|
||
| СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
|
||
| КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор)
|
||
|ИЗ
|
||
| СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
|
||
|
|
||
|СГРУППИРОВАТЬ ПО
|
||
| СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор";
|
||
|
||
Запрос.УстановитьПараметр("ДанныеДляСопоставления", ЗагружаемыеДанные);
|
||
РезультатыЗапросов = Запрос.ВыполнитьПакет(); // Массив из РезультатЗапроса
|
||
|
||
ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить(); // ТаблицаЗначений
|
||
ФункциональнаяОпцияХарактеристика = ?(ЗагружаемыеДанные.Колонки.Найти("Характеристика") <> Неопределено, Истина, Ложь);
|
||
Для каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл
|
||
|
||
Товар = Товары.Добавить();
|
||
Товар.Идентификатор = СтрокаТаблицы.Идентификатор;
|
||
Товар.Количество = СтрокаТаблицы.Количество;
|
||
Товар.Цена = СтрокаТаблицы.Цена;
|
||
|
||
СтрокаНоменклатура = ТаблицаНоменклатура.Найти(СтрокаТаблицы.Идентификатор, "Идентификатор");
|
||
Если СтрокаНоменклатура <> Неопределено Тогда
|
||
Если СтрокаНоменклатура.Количество = 1 Тогда
|
||
Товар.Номенклатура = СтрокаНоменклатура.Ссылка;
|
||
Если ФункциональнаяОпцияХарактеристика Тогда
|
||
Товар.Характеристика = Справочники._ДемоХарактеристики.НайтиПоНаименованию(СтрокаТаблицы.Характеристика,
|
||
Истина,, Товар.Номенклатура);
|
||
КонецЕсли;
|
||
ИначеЕсли СтрокаНоменклатура.Количество > 1 Тогда
|
||
ЗаписьОНеоднозначности = СписокНеоднозначностей.Добавить();
|
||
ЗаписьОНеоднозначности.Идентификатор = СтрокаТаблицы.Идентификатор;
|
||
ЗаписьОНеоднозначности.Колонка = "Номенклатура";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
ПоместитьВоВременноеХранилище(Товары, АдресТаблицыСопоставления);
|
||
|
||
КонецПроцедуры
|
||
```
|
||
|
||
</details>
|
||
|
||
|
||
## ЗаполнитьСписокНеоднозначностей
|
||
|
||
```bsl
|
||
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
|
||
// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
|
||
// ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность.
|
||
// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
|
||
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
|
||
//
|
||
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
|
||
|
||
```
|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>
|
||
|
||
```bsl
|
||
|
||
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
|
||
// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
|
||
// ИмяКолонки - Строка - имя колонки <ТАБЛИЧНОЙ ЧАСТИ>, в который возникла неоднозначность.
|
||
// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
|
||
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
|
||
//
|
||
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
|
||
|
||
// ВАЖНО
|
||
// В ЗагружаемыеЗначенияСтрока попадают только значения, где Имя или ПараметрРасшифровки = ИмяКолонки
|
||
|
||
Запрос = Новый Запрос;
|
||
|
||
Если ИмяКолонки = "Номенклатура" Тогда
|
||
|
||
ТекстГде = "";
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
|
||
ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование";
|
||
Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование);
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда
|
||
Если ПустаяСтрока(ТекстГде) Тогда
|
||
ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул";
|
||
Иначе
|
||
ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул";
|
||
КонецЕсли;
|
||
|
||
Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул);
|
||
КонецЕсли;
|
||
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| СправочникНоменклатура.Ссылка КАК Ссылка
|
||
|ИЗ
|
||
| Справочник.Номенклатура КАК СправочникНоменклатура " + ТекстГде;
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
|
||
Пока Выборка.Следующий() Цикл
|
||
СписокНеоднозначностей.Добавить(Выборка.Ссылка);
|
||
КонецЦикла;
|
||
|
||
КонецЕсли;
|
||
|
||
Если ИмяКолонки = "ЕдиницаИзмерения" Тогда
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| УпаковкиЕдиницыИзмерения.Ссылка КАК Ссылка
|
||
|ИЗ
|
||
| Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
|
||
|ГДЕ
|
||
| НЕ УпаковкиЕдиницыИзмерения.ПометкаУдаления
|
||
| И УпаковкиЕдиницыИзмерения.Наименование = &Наименование";
|
||
|
||
Запрос.УстановитьПараметр("Наименование", СокрЛП(ЗагружаемыеЗначенияСтрока.ЕдиницаИзмерения));
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
|
||
Пока Выборка.Следующий() Цикл
|
||
СписокНеоднозначностей.Добавить(Выборка.Ссылка);
|
||
КонецЦикла;
|
||
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
```
|
||
|
||
</details>
|
||
|
||
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
|
||
<summary style="font-weight: bold; cursor: pointer;">Пример реализации из БСП</summary>
|
||
|
||
```bsl
|
||
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
|
||
//
|
||
// Параметры:
|
||
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
|
||
// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
|
||
// ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность.
|
||
// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
|
||
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
|
||
//
|
||
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
|
||
|
||
Если ИмяКолонки = "Номенклатура" Тогда
|
||
Запрос = Новый Запрос;
|
||
|
||
ТекстГде = "";
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
|
||
ТекстГде = "ГДЕ _ДемоНоменклатура.Наименование = &Наименование";
|
||
Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Номенклатура);
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Штрихкод) Тогда
|
||
Если ЗначениеЗаполнено(ТекстГде) Тогда
|
||
ТекстГде = ТекстГде + " ИЛИ _ДемоНоменклатура.Штрихкод = &Штрихкод";
|
||
Иначе
|
||
ТекстГде = "ГДЕ _ДемоНоменклатура.Штрихкод = &Штрихкод";
|
||
КонецЕсли;
|
||
Запрос.УстановитьПараметр("Штрихкод", ЗагружаемыеЗначенияСтрока.Штрихкод);
|
||
КонецЕсли;
|
||
|
||
Запрос.Текст = "ВЫБРАТЬ
|
||
| _ДемоНоменклатура.Ссылка
|
||
|ИЗ
|
||
| Справочник._ДемоНоменклатура КАК _ДемоНоменклатура " + ТекстГде;
|
||
|
||
РезультатЗапроса = Запрос.Выполнить();
|
||
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
|
||
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
|
||
СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
```
|
||
|
||
</details> |