diff --git a/public/bsp-zagruzka-iz-faila/19.png b/public/bsp-zagruzka-iz-faila/19.png new file mode 100644 index 0000000..8e000b0 Binary files /dev/null and b/public/bsp-zagruzka-iz-faila/19.png differ diff --git a/src/content/docs/knowledge-base/Общие/(БСП) Стандартные подсистемы/Загрузка данных из файла/3. Загрузка данных в табличную часть.md b/src/content/docs/knowledge-base/Общие/(БСП) Стандартные подсистемы/Загрузка данных из файла/3. Загрузка данных в табличную часть.md index 3e9b41c..ef18b2a 100644 --- a/src/content/docs/knowledge-base/Общие/(БСП) Стандартные подсистемы/Загрузка данных из файла/3. Загрузка данных в табличную часть.md +++ b/src/content/docs/knowledge-base/Общие/(БСП) Стандартные подсистемы/Загрузка данных из файла/3. Загрузка данных в табличную часть.md @@ -13,6 +13,73 @@ slug: общие-бсп-стандартные-подсистемы-загруз Макет создается на уровне объекта и должен обязательно иметь имя, созданное по шаблону **ЗагрузкаИзФайла<ИмяТабличнойЧасти>**. В нем настраиваем вид шапки таблицы **именя ячеек которой должны соответствовать именам реквизитов нужной табличной части**. +## ВАЖНО + +![Изображение](/bsp-zagruzka-iz-faila/11.png) + +Если в макете есть колонки, которые являются реквизитами какой-то колонки целевой **табличной части**, то нужно для ячеек указывать **параметры расшифровки**. Например, есть макет с именами колонок: +- **Артикул** +- **Наименование** +- ... +- ... + +По которым мы пытаемся подобрать значение реквизита ТЧ `Номенклатура`: + +```bsl +СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); + +Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт + +... + +Если СтрокаНоменклатуры <> Неопределено Тогда + + Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда + СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура; + + // ТУТ ПОЯВИЛАСЬ НЕДОНОЗНАЧНОСТЬ + ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда + СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); + СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; + СтрокаНеоднозначности.Колонка = "Номенклатура"; // ИМЯ КОЛОНКИ ТАБЛИЧНОЙ ЧАСТИ, НЕ ТАБ.ДОК + КонецЕсли; + +КонецЕсли; + +... + +КонецПроцедуры + +``` + +Для того, чтобы в аргументе `ЗагружаемыеЗначенияСтрока` процедуры `ЗаполнитьСписокНеоднозначностей` были добавлены значения колонок `Артикул` и `Наименование` таб.док нужно для них указать расшифровку, что эти колонки относятся именно к номенклатуре. + +Если не указать параметры расшифровки для колонок, то при попытке считать их из аргумента `ЗагружаемыеЗначенияСтрока` будет сыпаться ошибка. + +```bsl +Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт + +... + +Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда + ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование"; + Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование); +КонецЕсли; + +Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда + Если ПустаяСтрока(ТекстГде) Тогда + ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул"; + Иначе + ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул"; + КонецЕсли; + + Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул); +КонецЕсли; + +... + +``` + >Если табличная часть одна, допускается именовать макет просто **"ЗагрузкаИзФайла"** ![Изображение](/bsp-zagruzka-iz-faila/5.png) @@ -140,6 +207,172 @@ slug: общие-бсп-стандартные-подсистемы-загруз
Пример реализации + +```bsl +// АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой +// находятся загруженные данные из файла. Состав колонок: +// * Идентификатор - Число - порядковый номер строки. +// Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла. +// АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений, +// являющейся копией табличной части документа, +// которую необходимо заполнить из таблицы АдресЗагружаемыхДанных. +// СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений: +// * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность. +// * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность. +// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. +// ДополнительныеПараметры - Произвольный - любые дополнительные сведения. +Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт + + + ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); + ТабличнаяЧасть = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + Запрос.Текст = + "ВЫБРАТЬ + | ВЫРАЗИТЬ(ДанныеДляСопоставления.Артикул КАК СТРОКА(50)) КАК Артикул, + | ВЫРАЗИТЬ(ДанныеДляСопоставления.ЕдиницаИзмерения КАК СТРОКА(30)) КАК ЕдиницаИзмерения, + | ВЫРАЗИТЬ(ДанныеДляСопоставления.Номенклатура КАК СТРОКА(300)) КАК Номенклатура, + | ДанныеДляСопоставления.Идентификатор КАК Идентификатор + |ПОМЕСТИТЬ ВТДанныеДляСопоставления + |ИЗ + | &ЗагружаемыеДанные КАК ДанныеДляСопоставления + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СправочникНоменклатура.Ссылка КАК Номенклатура, + | СправочникНоменклатура.Артикул КАК Артикул, + | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор + |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоАртикулу + |ИЗ + | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура + | ПО ВТДанныеДляСопоставления.Артикул = СправочникНоменклатура.Артикул + | И (ВТДанныеДляСопоставления.Артикул <> """") + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТДанныеДляСопоставления.Номенклатура КАК Номенклатура, + | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор + |ПОМЕСТИТЬ ВТДанныеДляСопоставленияПоНаименованию + |ИЗ + | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления + | ЛЕВОЕ СОЕДИНЕНИЕ ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу + | ПО ВТДанныеДляСопоставления.Идентификатор = ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор + |ГДЕ + | ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СправочникНоменклатура.Ссылка КАК Номенклатура, + | ВТДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор + |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоНаименованию + |ИЗ + | ВТДанныеДляСопоставленияПоНаименованию КАК ВТДанныеДляСопоставленияПоНаименованию + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура + | ПО ВТДанныеДляСопоставленияПоНаименованию.Номенклатура = СправочникНоменклатура.Наименование + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | МАКСИМУМ(СопоставленнаяНоменклатура.Номенклатура) КАК Номенклатура, + | СопоставленнаяНоменклатура.Идентификатор КАК Идентификатор, + | СУММА(СопоставленнаяНоменклатура.КоличествоСтрок) КАК КоличествоСтрок + |ИЗ + | (ВЫБРАТЬ + | ВТСопоставленнаяНоменклатураПоАртикулу.Номенклатура КАК Номенклатура, + | ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор КАК Идентификатор, + | 1 КАК КоличествоСтрок + | ИЗ + | ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВТСопоставленнаяНоменклатураПоНаименованию.Номенклатура, + | ВТСопоставленнаяНоменклатураПоНаименованию.Идентификатор, + | 1 + | ИЗ + | ВТСопоставленнаяНоменклатураПоНаименованию КАК ВТСопоставленнаяНоменклатураПоНаименованию) КАК СопоставленнаяНоменклатура + | + |СГРУППИРОВАТЬ ПО + | СопоставленнаяНоменклатура.Идентификатор + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор, + | КОЛИЧЕСТВО(ВТДанныеДляСопоставления.ЕдиницаИзмерения) КАК КоличествоСтрок, + | МАКСИМУМ(УпаковкиЕдиницыИзмерения.Ссылка) КАК ЕдиницаИзмерения + |ИЗ + | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения + | ПО ВТДанныеДляСопоставления.ЕдиницаИзмерения = УпаковкиЕдиницыИзмерения.Наименование + | + |СГРУППИРОВАТЬ ПО + | ВТДанныеДляСопоставления.Идентификатор"; + + Запрос.УстановитьПараметр("ЗагружаемыеДанные", ЗагружаемыеДанные); + + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + + ТаблицаНоменклатуры = РезультатыЗапроса.Получить(4).Выгрузить(); + ТаблицаЕдиницИзмерения = РезультатыЗапроса.Получить(5).Выгрузить(); + + Для Каждого СтрокаЗагружаемыхДанных Из ЗагружаемыеДанные Цикл + + СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить(); + СтрокаТабличнойЧасти.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; + СтрокаТабличнойЧасти.Цена = СтрокаЗагружаемыхДанных.Цена; + + СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); + + Если СтрокаНоменклатуры <> Неопределено Тогда + + Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда + СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура; + ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда + СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); + СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; + + // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК + СтрокаНеоднозначности.Колонка = "Номенклатура"; + КонецЕсли; + + КонецЕсли; + + СтрокаЕдиницыИзмерения = ТаблицаЕдиницИзмерения.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); + + Если СтрокаЕдиницыИзмерения <> Неопределено Тогда + + Если СтрокаЕдиницыИзмерения.КоличествоСтрок = 1 Тогда + СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтрокаЕдиницыИзмерения.ЕдиницаИзмерения; + ИначеЕсли СтрокаЕдиницыИзмерения.КоличествоСтрок > 1 Тогда + СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); + СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; + + // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК + СтрокаНеоднозначности.Колонка = "ЕдиницаИзмерения"; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ПоместитьВоВременноеХранилище(ТабличнаяЧасть, АдресТаблицыСопоставления); + +КонецПроцедуры +``` + +
+ +
+Пример реализации из БСП ```bsl Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт @@ -273,6 +506,87 @@ slug: общие-бсп-стандартные-подсистемы-загруз
Пример реализации +```bsl + +// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. +// +// Параметры: +// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. +// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными. +// ИмяКолонки - Строка - имя колонки <ТАБЛИЧНОЙ ЧАСТИ>, в который возникла неоднозначность. +// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность. +// ДополнительныеПараметры - Произвольный - любые дополнительные сведения. +// +Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт + + // ВАЖНО + // В ЗагружаемыеЗначенияСтрока попадают только значения, где Имя или ПараметрРасшифровки = ИмяКолонки + + Запрос = Новый Запрос; + + Если ИмяКолонки = "Номенклатура" Тогда + + ТекстГде = ""; + Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда + ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование"; + Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование); + КонецЕсли; + + Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда + Если ПустаяСтрока(ТекстГде) Тогда + ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул"; + Иначе + ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул"; + КонецЕсли; + + Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул); + КонецЕсли; + + Запрос.Текст = + "ВЫБРАТЬ + | СправочникНоменклатура.Ссылка КАК Ссылка + |ИЗ + | Справочник.Номенклатура КАК СправочникНоменклатура " + ТекстГде; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + СписокНеоднозначностей.Добавить(Выборка.Ссылка); + КонецЦикла; + + КонецЕсли; + + Если ИмяКолонки = "ЕдиницаИзмерения" Тогда + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | УпаковкиЕдиницыИзмерения.Ссылка КАК Ссылка + |ИЗ + | Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения + |ГДЕ + | НЕ УпаковкиЕдиницыИзмерения.ПометкаУдаления + | И УпаковкиЕдиницыИзмерения.Наименование = &Наименование"; + + Запрос.УстановитьПараметр("Наименование", СокрЛП(ЗагружаемыеЗначенияСтрока.ЕдиницаИзмерения)); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + СписокНеоднозначностей.Добавить(Выборка.Ссылка); + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +``` + +
+ +
+Пример реализации из БСП + ```bsl // Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. //