Как загрузить данные из файла внутреннего формата (.tzn) в отчет на СКД

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При интеграции и обмене данными между базами 1С нередко приходится сталкиваться с файлами, содержащими выгрузку таблиц во внутреннем представлении платформы. Разберем практическую задачу: как прочитать файл с расширением .tzn и корректно передать содержащуюся в нем таблицу значений в схему компоновки данных (СКД) в управляемом приложении конфигурации «1С:Управление торговлей 11».

Анализ формата файла и структуры данных

Проанализируем структуру текстового файла. В его заголовке присутствует уникальный идентификатор типа данных acf6192e-81ca-46ef-93a6-5a6968b78663. В платформе «1С:Предприятие» этот GUID соответствует системному типу ТаблицаЗначений, сериализованному с помощью функции ЗначениеВСтрокуВнутр или сохраненному методом ЗначениеВФайл.

Парсить такой файл вручную через построчное чтение текста или регулярные выражения не требуется. Платформа 1С предоставляет готовые методы для прямого восстановления объекта из внутреннего формата.

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

  1. ДатаДокумента (тип: Дата);
  2. НомерДокумента (тип: Строка);
  3. НоменклатураНаименование (тип: Строка);
  4. НоменклатураАртикул (тип: Строка);
  5. Количество (тип: Число);
  6. ТипДокумента (тип: Строка);
  7. СкладНаименование (тип: Строка).

Шаг 1. Чтение файла в таблицу значений в управляемом приложении

Рассмотрим, как правильно считать файл в клиент-серверной архитектуре. На клиенте пользователь выбирает файл на локальном диске, затем файл передается на сервер через временное хранилище, где восстанавливается в объект ТаблицаЗначений.

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


&НаСервереБезКонтекста
Функция ПрочитатьТаблицуИзФайла(АдресФайлаВоВременномХранилище)
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("tzn");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Восстанавливаем таблицу значений из файла
    ТаблицаДанных = ЗначениеИзФайла(ИмяВременногоФайла);
    
    // Удаляем временный файл после прочтения
    УдалитьФайлы(ИмяВременногоФайла);
    
    Возврат ТаблицаДанных;
    
КонецФункции

Если файл был предварительно прочитан как текстовая строка, для восстановления можно использовать метод ЗначениеИзСтрокиВнутр.

Шаг 2. Настройка схемы компоновки данных (СКД)

Чтобы СКД могла обработать подготовленную таблицу значений, выполним настройку структуры отчета:

  1. Откроем схему компоновки данных и перейдем на вкладку Наборы данных.
  2. Добавим Набор данных - объект и укажем имя источника, например ВнешняяТаблица.
  3. Добавим поля набора данных с именами и типами, в точности совпадающими с колонками таблицы значений: ДатаДокумента, НомерДокумента, НоменклатураНаименование, НоменклатураАртикул, Количество, ТипДокумента, СкладНаименование.
  4. На вкладке Ресурсы добавим поле Количество с выражением Сумма(Количество).
  5. На вкладке Настройки сформируем нужную структуру группировок (например, группировка по складам, типам документов и номенклатуре).

Шаг 3. Программное формирование отчета в модуле объекта

Переопределим стандартное формирование отчета в модуле объекта внешнего отчета через событие ПриКомпоновкеРезультата. Передадим загруженную таблицу значений в процессор компоновки.

Разберем программный код компоновки данных:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем таблицу значений из загруженного файла
    ТаблицаДанных = ПолучитьТаблицуДляОтчета(); 
    
    Если ТаблицаДанных = Неопределено Или ТаблицаДанных.Количество() = 0 Тогда
        ВызватьИсключение "Нет данных для формирования отчета.";
    КонецЕсли;
    
    // Формируем структуру внешних наборов данных
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ВнешняяТаблица", ТаблицаДанных);
    
    // Инициализируем макет компоновки
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
        СхемаКомпоновкиДанных, 
        Настройки, 
        ДанныеРасшифровки
    );
    
    // Инициализируем процессор компоновки и выводим результат
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(
        МакетКомпоновки, 
        ВнешниеНаборыДанных, 
        ДанныеРасшифровки
    );
    
    ДокументРезультат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Связывание строковых данных со справочниками базы

Так как в загруженном файле номенклатура и склады представлены строковыми наименованиями и артикулами, в СКД не получится обращаться к реквизитам объектов через точку (например, к иерархии номенклатуры или свойствам склада).

Если требуется получить ссылки на реальные справочники базы «1С:Управление торговлей», передадим полученную таблицу значений в запрос как временную таблицу, свяжем ее со справочниками Справочник.Номенклатура и Справочник.Склады, а полученный результат передадим в СКД.

Посмотрим на пример сопоставления ссылок в запросе:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ВТ.ДатаДокумента КАК ДатаДокумента,
    |    ВТ.НомерДокумента КАК НомерДокумента,
    |    ВТ.Количество КАК Количество,
    |    ЕСТЬNULL(СпрНоменклатура.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК НоменклатураСсылка,
    |    ЕСТЬNULL(СпрСклады.Ссылка, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК СкладСсылка
    |ИЗ
    |    &ТаблицаИзФайла КАК ВТ
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |        ПО ВТ.НоменклатураАртикул = СпрНоменклатура.Артикул
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК СпрСклады
    |        ПО ВТ.СкладНаименование = СпрСклады.Наименование";

Запрос.УстановитьПараметр("ТаблицаИзФайла", ТаблицаДанных);
ТаблицаСоСсылками = Запрос.Выполнить().Выгрузить();

В результате мы получаем готовую таблицу со ссылочными типами данных, которую можно использовать в СКД с полноценным доступом ко всем реквизитам информационной базы.

← На главную