Как загрузить ссылку на документ в табличную часть через обработку «Загрузка данных из табличного документа» в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При переносе информации из внешних таблиц (Excel, CSV, MXL) с помощью универсальной обработки «Загрузка данных из табличного документа» часто возникает задача заполнить колонку, содержащую ссылку на существующий в базе документ (например, документ расчетов, счет на оплату или документ партии). В отличие от справочников, поиск документов стандартными средствами обработки вызывает трудности.

Разберем причины такого поведения платформы и детально рассмотрим способы корректной настройки сопоставления документов.

Почему стандартный поиск по наименованию не работает для документов

Проанализируем механику работы типовой обработки: при сопоставлении строковых значений из таблицы со справочниками система по умолчанию обращается к стандартным реквизитам Наименование или Код. У объектов метаданных типа Документ реквизита Наименование нет в принципе. Документы идентифицируются комбинацией реквизитов Номер и Дата.

Если колонка табличной части имеет составной тип данных (например, несколько видов документов или определяемый тип вроде ДокументОснование), обработка не может автоматически определить, в какой именно таблице базы данных следует искать объект, если тип не зафиксирован явно.

Способ 1. Уточнение описания типов реквизита

Если реквизит имеет составной тип данных, но в загружаемом файле фигурируют документы строго одного вида, выполним предварительную настройку типов:

  1. Откроем обработку и перейдем на вкладку «Настройка».
  2. Найдем строку с загружаемым реквизитом табличной части.
  3. В колонке «Описание типов» откроем окно выбора типа данных.
  4. Снимем флажки со всех лишних типов и оставим отметку только напротив одного конкретного документа (например, ДокументСсылка.ПоступлениеТоваровУслуг).

Однако даже после сужения типа стандартное сопоставление по строке не сможет однозначно найти документ, если номер и дата склеены в одну строку. Для полноценной идентификации перейдем ко второму способу.

Способ 2. Использование режима «Вычислять» и алгоритма на встроенном языке

Наиболее надежный и универсальный метод поиска документа в информационной базе — использование встроенного программного кода в настройках колонки. Обработка позволяет выполнять произвольное выражение для каждой строки загружаемой таблицы.

Разберем по шагам порядок настройки режима вычислений:

  1. Перейдем на вкладку «Настройка».
  2. Для реквизита документа в колонке «Режим загрузки» выберем значение «Вычислять».
  3. В поле «Выражение» напишем код поиска документа. При вычислении кода обработка предоставляет контекстные переменные:

    ТекстЯчейки — строковое значение текущей колонки;

    ТекстыЯчеек — массив всех значений текущей строки таблицы (индексация колонок начинается с единицы: ТекстыЯчеек[1], ТекстыЯчеек[2] и т. д.);

    Результат — выходная переменная, в которую необходимо поместить найденную ссылку на объект.

Рассмотрим типовые примеры поиска документов для поля «Выражение».

Вариант А: Номер и дата находятся в разных колонках файла

Предположим, что номер документа находится во второй колонке файла (ТекстыЯчеек[2]), а дата документа — в третьей колонке (ТекстыЯчеек[3]). Для поиска конкретного документа воспользуемся стандартным методом менеджера документов НайтиПоНомеру():


НомерДок = СокрЛП(ТекстыЯчеек[2]);
ДатаДок = Дата(ТекстыЯчеек[3]);
Результат = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДок, ДатаДок);

Вариант Б: Поиск документа через запрос (по номеру без точной даты)

Если в исходных данных точная дата отсутствует или известны только номер и организация, используем объект Запрос для выборки наиболее подходящей ссылки:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Док.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК Док
    |ГДЕ
    |	Док.Номер ПОДОБНО &Номер";

Запрос.УстановитьПараметр("Номер", "%" + СокрЛП(ТекстЯчейки));
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Результат = Выборка.Ссылка;
Иначе
    Результат = Документы.ПоступлениеТоваровУслуг.ПустаяСсылка();
КонецЕсли;

Вариант В: Поиск по уникальному идентификатору (GUID)

Если файл сформирован путем выгрузки из другой базы 1С и в ячейке содержится строковый GUID документа, выполним прямое получение ссылки через метод ПолучитьСсылку():


Попытка
    ГУИД = Новый УникальныйИдентификатор(СокрЛП(ТекстЯчейки));
    Результат = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(ГУИД);
Исключение
    Результат = Неопределено;
КонецПопытки;

Особенности использования обработки в 1С:Бухгалтерии 8.3

При работе в конфигурации «Бухгалтерия предприятия 3.0» важно учитывать технические ограничения:

  1. Режим интерфейса: Классический вариант обработки ЗагрузкаДанныхИзТабличногоДокумента.epf с диска ИТС выполнен на обычных формах. В управляемом приложении «1С:Бухгалтерии» запустить ее напрямую в режиме тонкого клиента не получится — потребуется либо запуск базы в режиме толстого клиента, либо использование версии обработки, адаптированной под управляемые формы.
  2. Штатный механизм БСП: Во многих документах типовой бухгалтерии в командной панели табличных частей присутствует встроенная кнопка «Загрузить из файла». Если структура файла простая, рекомендуем проверить стандартную загрузку БСП, поддерживающую управляемый интерфейс без необходимости запуска сторонних обработок.
  3. Автоматический зачет взаиморасчетов: Если табличная часть содержит документы расчетов с контрагентами, ручной поиск ссылок часто можно исключить, переключив способ зачета авансов на «Автоматически» или воспользовавшись типовой кнопкой заполнения по остаткам взаиморасчетов после импорта сумм.
← На главную