From bd940b107833c62683d0baa756cd4610fe9e0f5a Mon Sep 17 00:00:00 2001 From: wakadakawaka Date: Tue, 29 Jul 2025 20:43:30 +0500 Subject: [PATCH] upd --- public/bsp-zagruzka-iz-faila/19.png | Bin 0 -> 35360 bytes .../Загрузка данных из файла/3. Загрузка данных в табличную часть.md | 314 ++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 public/bsp-zagruzka-iz-faila/19.png diff --git a/public/bsp-zagruzka-iz-faila/19.png b/public/bsp-zagruzka-iz-faila/19.png new file mode 100644 index 0000000000000000000000000000000000000000..8e000b066679b262fa9d6dd6d2bcab8841222310 GIT binary patch literal 35360 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

{Gk4}CJP7!sa7k6RP{!2%{{RiLG7A6z literal 0 HcmV?d00001 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 // Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. //