В данной публикации приведено описание механизма загрузки данных в 1С из "двумерного формата" Excel, а также ряд примеров использования механизма.
Если лень читать длинное описание и смотреть унылые картинки: код можно взять здесь: https://github.com/artkor83/-ImportExcelOnec. И в дальнейшем разбираться самостоятельно: код полностью открыт.
Оглавление
Получение данных: общее описание, алгоритмы
Получение данных: Порядок работы
Получение данных из листа excel
Получение данных из макета (буфера)
Режим чтения макета из внешнего файла
Режим чтения макета из буфера ячеек
Дополнительные команды: Номера колонок: чтение наименований из файла
Дополнительные команды: Номера колонок: выбор типов
Дополнительные команды: Номера колонок: определение типов
Загрузка данных: Внешние файлы: обработки, макеты
Загрузка данных: Алгоритмы "Перед загрузкой", "Загрузка данных строки"
Загрузка данных: буфер вспомогательного кода
Построчная загрузка данных: пример
Построчная загрузка данных: редактирование алгоритмов
Построчная загрузка данных: Загрузка данных в базу
Общая (непострочная) загрузка данных: пример
Общая (непострочная) загрузка данных:редактирование алгоритмов
Общая (непострочная) загрузка данных:загрузка данных в базу
Отладка общей (непострочной) загрузки.
Сохранение / загрузка настроек
Интерфейс сохранения, краткое описание
Примеры файлов настроек, рекомендации
Введение.
В процессе работы очень часто встают задачи по импорту информации в базы 1С (далее БД1С) из различных excel-файлов. Наиболее распространенные варианты:
-
импорт начальных остатков,
-
прайс-листы различных видов и модификаций
-
сегменты номенклатуры, клиентов
-
прочее: справочники, документы, регистры сведений различного назначения
Если начать с последнего пункта: часто бывает нужно загрузить набор справочников со специально заполняемыми реквизитами, которые простой связью "1-к-1" никак не удается заполнить: появляются "красные поля" в карточке справочников типа "ФизическиеЛица", которые в дальнейшем "мешают жить" в процессе эксплуатации информационных систем.
На практике все неумолимо сводится к написанию программного кода, где на входе поступает некий объект "ТаблицаЗначений", полученный из Excel, на выходе "все что угодно":
-
Набор элементов ссылочного типа с фиксированными полями. Пример: элементы типа "Справочник.Контрагенты" с видом(физическое лицо/ юридическое лицо), зависящим от длины ИНН из файла excel
-
Набор элементов ссылочного типа нескольких метаданных. Пример: элементы типа Справочник.Сотрудники и "приклеенные" к ним физические лица: Справочник.ФизическиеЛица. При этом не забываем, что наименование физ.лица вовсе не единственное "обязательное поле": необходимо еще указать ФИО, разбивку по реквизитам "Фамилия Имя Отчество".
-
Документ по вводу начальных остатков: тут комментарии излишни. Вариантов "видов операций по вводу остатков" множество в базе формата УТ11, не говоря про ERP ;) И все их нужно как-то обыграть.
В противном случае столкнемся с недовольством пользователей в процессе работы с БД1С, которые никак не могут отредактировать карточку физ.лица. Система ругается на незаполненность полей, либо не получается исправить циферки при вводе начальных остатков.
При записи объекта система зачастую ругается на поля которые и на форме-то не видны (являются скрытыми), пользователи в ярости, разработчик "на измене".
При импорте данных через формат excel процесс требует значительных программных доработок. Целесообразно под рукой иметь удобный механизм для чтения/обработки/загрузки данных...
Загрузка обработками "на коленке"
Это - плохой путь: не делайте так.
Путем практического опыта с различными загрузками из excel вначале все сводилось к следующему алгоритму:
-
Есть заготовленный шаблон внешней обработки, который через com читает excel-файл и в нужной закладке собирает данные. Пример кода ниже, образцов можно нагуглить великое множество:
Excel = Новый COMОбъект("Excel.Application"); Excel.Visible = 0; Excel.DisplayAlerts = 0; Excel.WorkBooks.Open(ИмяФайлаЗагрузки);
-
Каждая прочитанная строка преобразуется в массив строковых ячеек, которые имеют свое назначение и в дальнейшем используются для загрузки данных
-
Набор данных выводится на форму в таблицу значений. Как правило, случаются пользовательские ошибки в файле excel. Например:
-
вместо числового поля ввели какую-то непонятную "чудо-строку", которая в момент преобразования значения в число дала ошибку и тем самым файл даже не дочитался
-
ключевое значение типа "артикул номенклатуры" введен в файле неверно - тем самым имеем множество пустых строк товаров, по которым заполнены показатели, а "всего-то нолик вначале забыли добавить до длины=10 символов"
-
файл excel модифицировался: добавили 2 колонки данных в листе excel между "номенклатура" и "цена", а программисту сказать забыли ;)
-
-
Загрузка данных. Полученная на форму таблица загружается в базу. При этом данные могут быть неполными из-за ошибок, также есть потребность отредактировать данные на форме. Сама загрузка зачастую идет по сложному алгоритму. одной конструкцией вида
Процедура ЗагрузитьДанные(ТаблицаЗначенийИзExcel)
Для каждого ДанныеСтроки Из ТаблицаДанныхExcel Цикл
R03; // алгоритм обработки загрузки
КонецЦикла;
КонецПроцедуры
никак не удаестся обойтись.
Требуется множество процедур и функций на каждый конкретный случай.
-
Итог: хаос из непонятных обработок чтения-загрузки, файлов-шаблонов excel различного вида "Штатнаярасстановка.xls, Штатнаярасстановка-02.xls, Штатнаярасстановка-03.xls, Штатнаярасстановка-03безОшибокФИО.xls, Штатнаярасстановка-03СНумерацией.xls, Штатная_расстановка-03Сбантиком.xls" и на каждый своя обработка загрузки... Решено было сделать хорошие вещи (ну хотя-бы попытаться).
Получение данных.
Общий интерфейс.
Пришли к выводу, что для чтения данных нужно: сам файл excel, расположенный на диске, закладка для чтения данных, интервал чтения строк данных, и кнопка "Получить данные" для вывода данных в ТЗ на форму:
Кроме этого требуется набор колонок с настройкой типов:
-
Нужна таблица настроек колонок вида "Имя колонки, номер колонки, Тип значения"
-
На форме обработки их нужно как-то сохранять, иначе будет "грустно" при каждом открытии формы заново их вводить.
-
Желательно сохранять их в какой-нибудь внешний файл и впоследствии читать из файла в другой копии БД1С.
В итоге решено было сделать такие настройки в виде таблицы на форме:
Пока нужно знать следующее: есть таблица имен колонок, соотствествие номеру колонки из excel "№ кол" и выбранный "Тип значения" колонки. Назначение команд формы "Прочитать колонки по номеру строки", "Поиск типов" будет описано ниже.
По команде "Получить данные" производится чтение данных из указанного диапазона строк excel-файла (это очевидно). Следует выделить 3 режима получения:
-
1 лист excel
-
несколько листов excel
-
режим "по макету": вставка данных из буфера в табличное поле на форме
Получение данных: общее описание, алгоритмы
По команде "Получить данные" производится чтение данных из указанного диапазона строк excel-файла (это очевидно), после этого полученные данные требуется преобразовать в типы, введенные на закладке "Номера колонок".
Если тип примитивный (Число,Строка,Дата,Булево) - обработка автоматически преобразует строковое значение ячейки в полученный тип. Для прочих типов:
-
Справочник, план видов характеристик - "НайтиПоНаименованию"
-
План счетов, план видов расчета: "НайтиПоКоду"
-
Документ: "НайтиПоНомеру"
-
Перечисление: поиск по синониму или по имени реквизита. Для примера "ПеречислениеСсылка.ВидыЗанятости" по строке "Основное место работы" или "ОсновноеМестоРаботы" вернет элемент перечисления с данным синонимом.
Но зачастую обычного простого преобразования не хватает: нужна программная обработка. Для этого предусмотрен специальный текстовый код на языке 1С, который срабатывает после чтения каждой строки.
Получение данных: Порядок работы
-
Переходим на закладку "Алгоритмы", редактируем поле "Поиск данных строки":
-
В примере текст кода уже заполнен, предположим что "его нет". нажимаем кнопку "Поиск данных строки". В левой части подсказка кода (не редактируется), в правой - сам код: при желании можно изменять:
Наиболее "интересные" переменные:
-
ТекКолонкаЗначение - Значение реквизита (строкой). Это та строка, которая получена из ячейки excel - то есть значение колонки. Его можно преобразовывать к нужному типу программно.
-
ТекКолонкаЗначениеЗапись - !!! Значение реквизита ДЛЯ ЗАПИСИ. Это как раз то, что будет подставлено в колонку данных на форме 1С, то есть значение "ТекКолонкаЗначение", преобразованное в нужный тип.
ПРИМЕЧАНИЕ: если преобразование по умолчанию удалось (например найден справочник по наименованию, или перечисление по синониму), то в данной переменной уже будет преобразованное значение и его можно программно использовать.
-
ТекОтказ: признак отказа от вывода строки. Если какие-то числовое значение в строке не заполнено, или строковое не обнаружено - то возможно, что эта строка вообще к загрузке не нужна. К примеру ФИО сотрудника пустое, оклад не указан итд..
-
Прочие функции: набор вспомогательных функций для преобразования данных из строки (бывает полезно).
-
Фиксированные значения. Можно задать фиксированные параметры данных на специальной закладке. Дабы не искать определенные статические параметры через "НайтиПоКоду", "НайтиПоНаименованию" (это нехорошо) предусмотрена спец. закладка:
Для примера подстановка организации в каждую колонку данных выглядит так:
-
Печать кода для преобразования. Вверху расположена кнопка "Добавить обработку колонок" - при нажатии на нее идет печать шаблона кода, который затем можно модифицировать. Это сделано для "удобства" - чтобы не переключаться в родительское окно и не искать имена колонок,которые сами же задали для поиска данных.
Пример:
После нажатия кнопки видно, что добавился код обработки колонок в дополнение к существующему. ненужные участки обработки можно смело удалять, дописав только "специфическое" преобразование значений.
Для примера допишем код, чтобы строки файла, в которых ФИО сотрудника не заполнено, просто не выводились:
-
Для сохранения кода нажимаем "Принять"
-
Также есть 2 вспомогательные кнопки "Сохранить, Восстановить" для импорта/экспорта кода во внешний текстовый файл, но про них позже.
-
Чтение на форму. Для примера можно указать небольшой интервал строк, дабы сразу не читать весь листа на форму: возможно будут ошибки чтения данных, недочеты по преобразованию колонок:
Результат чтения выведен на форме. В колонках таблицы видим преобразованные данные, при желании можно их отредактировать "на лету" перед непосредственной загрузкой.
-
Чтение большого объема данных. В случае, если файл excel имеет большой объем - будет показан "прогресс бар" с процессом вывода на форму. При желании можно приостановить процесс, нажав Ctrl-break:
Если приостановить чтение - то будет выведена только часть данных, которые "удалось прочитать":
Получение данных из листа excel
Самый простой режим: требует указания:
-
Файл excel: можно выбрать через "диалог выбора файла"
-
Лист excel: выбирается из списка, который заполнится после выбора файла
-
интервал строк чтения данных.
Получение данных из нескольких листов excel
Бывают случаи, когда данные введены на нескольких листах одинакового формата. На этот случай предусмотрен вариант чтения нескольких листов. Указывается:
-
Файл excel: можно выбрать через "диалог выбора файла"
-
Список листов excel: выбирается из списка, который заполнится после выбора файла: откроется "список с галочками"
-
интервал строк чтения данных: как правило каждый лист содержит заголовок, а сами данные начинаются с единого номера строк .
ПРИМЕЧАНИЕ: в алгоритме "поиск данных строки" бывает необходимо прописать параметр вида "ИмяЛиста", в частности на примере чтения штатного расписания каждый лист - это организация.
Выбираем набор листов в списке, нажимаем "Получить данные".
Получение данных из макета (буфера)
В данном случае ячейки задаются на форме обработки. Этот режим бывает полезен, когда есть проблемы с COM-соединением, с программным открытием файла и прочие...
Режим чтения макета из внешнего файла
Указываем:
-
Имя файла загрузки: можно выбрать из диалога выбора файла с диска (формат mxl), можно
-
интервал строк чтения данных
После выбора файла имеем:
Далее по интервалу строк производим чтение данных в закладку "Вывод данных"
Режим чтения макета из буфера ячеек
Указываем:
-
Текст ячеек на закладке "макет данных" методом "копи-пасты": можно для тестирования взять из файла excel
-
Имя файла загрузки: можно выбрать из диалога выбора файла с диска (формат mxl), можно в табличном поле сделать "ctrl-C ctrl-V"
-
интервал строк чтения данных
Далее по интервалу строк производим чтение данных в закладку "Вывод данных" (аналогично подбору файла с диска). По итогу получится нечто вроде:
Дополнительные команды
Дополнительные команды: Номера колонок: чтение наименований из файла
Часто бывает, что в листе excel заголовки колонок стоят вверху листа: на 1-й строке (либо чуть ниже). Дабы облегчить жизнь разработчику решено предусмотреть режим чтения колонок по номеру строки: чтобы не вводить их в таблице.
В режиме excel: нажимаем кнопку на закладке "Номера колонок" и вводим число (номер строки шапки):
В таблицу будут считаны колонки по номеру строки:
Остается только задать нужные типы колонок:
Аналогично в режиме "По макету": в панели инструментов есть аналогичная команда:
Дополнительные команды: Номера колонок: выбор типов
По сути самое "противное" во всей работе - поиск нужных типов колонок в огромном "безликом" списке всех типов. Сделаны следующие полезные вещи:
-
Придуман специальный удобный диалог типов:
-
В диалоге есть поиск типа по подстроке:
-
Значение типа: редактирование. Иногда чтобы не "копаться" в диалоге подбора типов бывает удобно просто ввести тип строкой: в случае когда мы знаем точное представление типа, либо хотим "скопипастить" из типа другой колонки.
Например, задан тип "Число (15,2)" в одной из колонок: просто берем его в буфер ОС и копируем в другую колонку с таким же типом:
-
Автоподбор типа по тексту ввода. При желании можно не вызывать диалог типов, а просто писать название в ячейке таблицы: будет отобрано 1-е 10 вхождений строки:
На примере видно, что есть справочник "Должности": и он-то нам как раз и нужен, нет необходимости вызывать диалог по кнопке "..." справа в поле.
Дополнительные команды: Номера колонок: определение типов
Также придумана специальная команда "Поиск типов". В случае с конфигурациями типа "ЗУП, ERP" имеет место множество типов данных: например перечисления с одинаковым назначением, похожие справочники, которые меняются от версии к версии на "такие же, но более актуальные".
Удобно бывает просто поискать в метаданных реквизиты с аналогичным названием, которые указаны в наименовании колонки. Естественно, что перебирать все метаданные для больших конфигураций ERP, ЗУП, УТ... довольно долго, особенно если детализация поиска идет до каждого измерения, реквизита.
ПРИМЕР:
Мы хотим разыскать типы для всех колонок, которые остались неопределенными. Нажимаем команду "Поиск типов":
В списке остаются только те колонки, по которым тип еще не выбран, но при желании можно отметить и другие:
Далее появится еще 1 диалог, в котором будут определены всевозможные типы. Предположим, мы хотим поискать все типы конфигурации, в которых реквизит имеет представление (синоним) под названием "Вид занятости", и при этом знаем, что реквизит "примерно где-то есть в регистрах сведений", только название регистров не помним. Выставляем режим поиска
При нажатии "Начать поиск" выведется окно выбора метаданных. Отмечаем "все регистры сведений" и начинаем поиск совпадений по синониму:
Спустя 5 секунд система найдет, что реквизит "вид занятости" есть в одном из регистров базы данных, измерений, ресурсов с наименованием "График" в регистрах сведений нет:
Принимаем результат поиска: хотя бы 1 тип нашли, скорее всего он нам нужен для последующего чтения, загрузки.
Чтение данных: окончание
В целом по чтению данных все описано, других особенностей нет. Остается добавить, что прочитанные данные сохраняются в настройки "ХранилищеСистемныхНастроек" при закрытии формы обработки. Также предусмотрено сохранение в специальный каталог, но это будет отдельно описано в разделе "Сохранение / загрузка настроек".
Загрузка данных
После того, как данные прочитаны в таблицу формы можно произвести загрузку данных. Для загрузки подразумевается использование специфических обработок, которые соlержат алгоритмы, предназначенные для преобразования данных, полученных из таблицы-excel. Но в целом, если алгоритм загрузки простой и уместится в 1 процедуру - можно обходиться и без внешних обработок, а просто писать/ сохранять код в режиме предприятия.
Загрузка данных: Внешние файлы: обработки, макеты
Предусмотрены специальные внешние файлы для загрузки данных. Различаем 2 вида:
а) "Внешняя обработка" - это файл EPF обработчик загрузки таблицы данных,
б) "Макет mxl": файлы печатных макетов. Основное название: печать различных отчетов по загрузке, а также можно использовать как внешний табличный документ, с которого можно брать фиксированные данные для загрузки (бывает весьма удобно, дабы не создавать большие массивы, структуры).
-
Внешние обработки: располагаются на отдельной закладке, подцепляются с диска во временное хранилище обработки-загрузчика. тут все просто: можно создавать внешние обработки в конфигураторе, после чего "цеплять" их в закладку "Внешние файлы":
Для добавления нового файла обработки используем кнопку подбора файла:
-
Табличные макеты. Придуманы как правило для печати отчета по загруженным данным, но в целом можно использовать и для других алгоритмических целей. Располагается также на закладке "Внешние файлы", Установка файлов в закладку осуществляется по кнопке выбора: открывается диалог подбора файла - далее "вопрос техники":
-
Фиксированные значения: уже ранее были описаны: могут применяться как при получении, так и для загрузки данных:
Загрузка данных: Алгоритмы "Перед загрузкой", "Загрузка данных строки"
Принцип формирования алгоритмов загрузки заключается в печати программного кода алгоритмов для удобной подстановки во внешние обработки/текст с последующим удалением лишнего кода/поправкой существующего.
Загрузка данных: буфер вспомогательного кода
При редактировании алгоритма загрузки предусмотрен специальный вспомогательный код, дабы облегчить работу программиста.
Как видно из описания вверху текста: код предназначен для копирования во внешнюю обработку загрузки: копируем, раскомментируем...
Рассмотрим составляющие процедуры по порядку:
-
Макеты из закладки "Внешние файлы"
Содержит список данных с закладки "Внешние файлы" вида "макет mxl":
Имеет тип "ТабличныйДокумент"
-
Значения параметров.
Здесь также все прозрачно - см закладку "Параметры".
-
Отчет по загрузке, шаблон для формирования печати
Из текста вверху понятно, что код будет полезен для печати отчета по загрузке. Во внешней обработке можно взять запрос и использовать его "с обработкой результата"
ВАЖНО: Есть следующий код:
ПараметрыЗагрузкиДанных.ОтчетыПоЗагрузке.Вставить("Отчет по загрузке данных", ТабДок);
После загрузки данный макет будет выведен пользователю на печать. При желании можно подготовить несколько таких "макетов" и расположить их в соответствие "ОтчетыПоЗагрузке", только с другим представлением.
-
Прочее. Добавлена свертка колонок: в 1 очередь чтобы имена колонок не вспоминать в процессе написания обработки загрузки; признак отказа от загрузки
-
Загрузка данных: дополнительные параметры
Загрузка в транзакции. Если установить данный флаг - то вся таблицы будет загружена в единой транзакции. В случае, если в процессе загрузки появится исключение - вся транзакция будет отменена.
Тестовый режим. Носит предварительный характер: при этом данные из таблицы загружаются в транзакции, после чего идет отмена транзакции. На данном этапе можно отследить, нет ли программных ошибок в алгоритме:
Зададим шаг загрузки: видеть "прогресс-бар" в процессе построчной загрузки данных, чтобы видеть "как идет процесс".
На примере шаг=10, это значит, что через каждые 10 загруженных строк будет взята паза и на клиентской форме изменен шаг прогресс-бара загрузки.
Примеры загрузки данных
Все примеры можно взять в репозитории в папочке "\ImportExcelOnec\tests". И использовать в тестовой базе данных ЗУП 3.1
Построчная загрузка данных: пример
Рассмотрим пример создания/использования кода загрузки. Для примера есть таблица с данными по сотрудникам: ФИО, должности, ставки итд... :
Задача состоит в том, чтобы создать набор данных: сотрудников, физ.лица к ним, штатное расписание, документы приема на работу...
Перед загрузкой данных: редактирование кода.
В данном алгоритме следует создать обработку загрузки и привязать ее к алгоритму. В данном случае она однозначно понадобится, так как алгоритм явно не умещается в 1 процедуру: сразу представляем, что штатное расписание нужно упаковать в отдельную процедуру, заполнение приема на работу в другие итд...
Переходим на закладку "алгоритмы", нажимаем кнопку открытия алгоритма:
В форме редактирования текста алгоритма есть 2 "волшебные кнопки": "Добавить вызов обработки", "Добавить буфер кода", Нас на данном этапе интересует только "Добавить вызов обработки": подключаем обработку, которая впоследствии используется для построчной загрузки данных. При нажатии печатается блок кода:
Как понятно из написанного: вниманию представляются все внешние обработки, введенные на закладке "Внешние файлы". Нужно выбрать "правильную обработку". Обычно редко бывает нужно "несколько штук на 1 алгоритм": выбираем одну; лишний код убираем:
"Добавить буфер кода". Данная полезная кнопка выдает набор строк кода, который осуществляет загрузку. Нажимаем кнопку, получаем код. на данном этапе нас интересует только печатный отчет о загрузке, все остальное пока не интересно, так как загрузка производится внешней обработкой:
По итогу после редактирования кода получаем следующее - подключение обработки и создание отчета по загрузке:
Все, обработка подключена: можно делать построчную загрузку
Построчная загрузка данных: редактирование алгоритмов
В нашем случае весь алгоритм реализован в доп.обработке, просто делаем вызов:
"Добавить буфер кода". Для построчной загрузке также формируется набор "полезных строк":
Для процедуры "ЗагрузкаДанныхПриемНаРаботу" можно скопировать список колонок, дабы не "лазать" за ними в интерфейс формы, а иметь готовый список, разбитый по числовым и групповым. В целом алгоритм практически полностью самостоятельный.
Все что делается - вначале получаем макет ""отчета по загрузке"" для последующей печати загруженных данных - далее по входным параметрам формируются справочники, документы; вызываются вспомогательные процедуры.
Макет печати: это файл mxl с закладки "Внешние файлы". По сути, простенький отчет по загрузке: можно было его использовать в самой обработке в разделе "Макеты", но для демонстрации сделан внешним:
В конечном итоге после загрузки печатаем строку данных:
Замечательно, обработка готова, после этого обновляем ее в закладке "Внешние файлы":
И проверяем написанный коды вызова обработки, все ли ОК:
Построчная загрузка данных: Загрузка в базу
Тестовый режим. Носит предварительный характер: при этом данные из таблицы загружаются в транзакции, после чего идет отмена транзакции. На данном этапе можно отследить, нет ли программных ошибок в алгоритме:
В результате получаем следующий отчет:
Понимаем, что проблем в загрузке нет, можно грузить в боевом режиме.
Шаг загрузки. Бывает полезно видеть "прогресс-бар" в процессе построчной загрузки данных, чтобы видеть "как идет процесс". Для этого предусмотрен реквизит "Шаг загрузки":
По окончанию будет распечатан отчет, для просмотра можно нажать на "лупу в строке" и просмотреть загруженные данные:
Как видно, документ в случайно выбранной строке корректный, без лишних "косяков".
Общая (непострочная) загрузка данных: пример.
Бывают случаи, когда построчная загрузка не подходит. Помимо построчного импорта данных базу нужно сгруппировать строки таблицы и впоследствии разбить по "подчастям".
Примером служит момент с загрузкой начальных остатков по ЗУП:
В данном примере после поиска сотрудников нужно сгруппировать их по "Организация+месяц", затем расположить в документы по вводу начальных остатков для расчета среднего по больничным листам. Построчная загрузка здесь не подходит.
Общая (непострочная) загрузка данных: редактирование алгоритмов.
Как и в случае с построчной загрузкой, подключаем обработку из внешнего хранилища.
ВАЖНО: вначале программной обработки указано "СтандартнаяОбработка = Ложь;" - это означает, производится загрузка единым алгоритмом, построчная загрузка не используется.
Производим печать буфера кода - оно нам очень пригодится.
Берем полученный код, вставляем во внешнюю обработку, раскомментируем.
-
Алгоритм перебора строк
Данный код можно использовать для сбора, получения данных для последующей загрузки в базу. После преобразования кода получаем примерно следующее:
Сгруппировали исходную таблицу по "Организация+месяц", затем производим программную загрузку
-
Алгоритм печати отчета. Это также полезный код для печати отчета по загрузке:
Путем несложных преобразований получим отчет: берем запрос и "кидаем" его в "Конструктор запроса с обработкой результата", как написано в комментарии:
По итогу получим готовый макет отчета и набор секций, лишний код убираем:
После этого пишем код загрузки данных, в нужные места подставляем участки по формированию отчета по загрузке:
Замечательно, обработка готова, после этого обновляем ее в закладке "Внешние файлы":
И проверяем написанный код вызова обработки, все ли ОК:
Загрузка данных в базу.
Загружаем аналогично построчной загрузке: можно произвести тестовый импорт данных, можно грузить сразу (если база тестовая или уверены что все верно):
Исполняем код, по итогу получим вот такую красивую таблицу, сформированную "Конструктором запроса с обработкой результата" и программными вставками:
В целом вполне наглядный пример использования загрузки данных: все будет выложено в репозитории.
Отладка алгоритмов
Естественно, что алгоритмы сложные: не всегда получается вслепую, без ошибок создать сразу работющую загрузку данных. Предусмотрена отладка алгоритмов, как ранее было описано существует 2 варианта:
-
Построчная загрузка данных
-
Общая (непострочная) загрузка данных
Передача входных параметров для отладки функций загрузки: рассмотрим примеры.
Отладка построчной загрузки.
Процедура обработки имеет 2 входных параметра:
ДанныеСтроки, ПараметрыЗагрузкиДанных.
Для примера: "Процедура ЗагрузкаДанныхПриемНаРаботу(ДанныеСтроки, ПараметрыЗагрузкиДанных) Экспорт"
Чтобы получить значение "ДанныеСтроки" типа "Структура" предусмотрена специальная команда формы. выбираем 1 строку в таблице полученных данных и нажимаем "Отладка (строка таблицы)"
Печатается некий текст: это строковое представление строки в виде структуры:
Порядок отладки:
-
Берем нужную внешнюю обработку - в примере Алгоритм_ПриемНаРаботу.epf
-
Создаем форму для внешней обработки,
-
На форме создаем реквизит "ОтладкаТекст" и команду для вызова нашего метода
-
В форме следует ввести программный код. Шаблон можно сформировать по кнопке "Добавить код отладки" в редакторе кода алгоритмов (только потом очистить за собой):
И немного заменим участи кода:
-
&НаСервере
Процедура ЗагрузкаДанныхПриемНаРаботуНаСервере()
...
&НаКлиенте
Процедура ЗагрузкаДанныхПриемНаРаботу(Команда)
ЗагрузкаДанныхПриемНаРаботуНаСервере();
КонецПроцедуры
-
В режиме предприятия в форме обработки вводим строковое представление строки в виде структуры, устанавливаем точку останова, нажимаем кнопку команды.
-
В реквизите "ДанныеСтроки" видим строку из таблицы значений.
Можем отлаживать алгоритм.
Отладка общей (непострочной) загрузки.
Принцип такой же: В обработке реализации алгоритма создаем форму с большим текстовым полем, в форме вводим текст "сериализованной" таблицы значений, пишем простенький программный код для отладки.
Процедура обработки имеет 3 входных параметра:
ТаблицаДанныхExcel, ПараметрыЗагрузкиДанных, СтандартнаяОбработка
Для примера "Процедура ЗагрузитьСуммыФСС(ТаблицаДанныхExcel, ПараметрыЗагрузкиДанных, СтандартнаяОбработка) Экспорт"
ВАЖНО: для отладки правильнее будет прочитать небольшое количество строк в форму обработки, нет нужды в отладку выкладывать всю огромную таблицу.
-
Берем нужную внешнюю обработку - в примере Алгоритм_ДляРасчетаСреднего.epf
-
Создаем форму для внешней обработки,
-
На форме создаем реквизит "ОтладкаТекст" и команду для вызова нашего метода
-
В форме вводим программный код:
&НаСервере Процедура ЗагрузкаДанныхПриемНаРаботуНаСервере() ПараметрыЗагрузкиДанных = Новый Структура; ПараметрыЗагрузкиДанных.Вставить("ОтчетыПоЗагрузке", Новый Соответствие); ТабДок = Новый ТабличныйДокумент; ТабДок.ТолькоПросмотр = истина; ПараметрыЗагрузкиДанных.ОтчетыПоЗагрузке.Вставить("Отчет по загрузке данных", ТабДок); РеквизитФормыВЗначение("Объект").ЗагрузитьСуммыФСС(ДеСериализоватьОбъект(ОтладкаТекст), ПараметрыЗагрузкиДанных, Ложь) КонецПроцедуры &НаКлиенте Процедура ЗагрузкаДанныхПриемНаРаботу(Команда) ЗагрузкаДанныхПриемНаРаботуНаСервере(); КонецПроцедуры &НаСервереБезКонтекста Функция ДеСериализоватьОбъект(СтрокаXML) Экспорт //Создаем объект чтения из XML ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(СтрокаXML); //Читаем таблицу значений из XML ОбъектТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); Возврат ОбъектТЗ КонецФункции
-
В режиме предприятия "распечатываем таблицу значений" для отладки:
-
В режиме предприятия в форме обработки вводим строковое представление строки в виде структуры, устанавливаем точку останова, нажимаем кнопку команды
-
В отладке видим таблицу значений, которая введена в форме:
Сохранение / загрузка настроек
Если кто-либо осилил прочитать до этого места: заметил, что есть множество различных настроек: это и номера+типы колонок и тексты алгоритмов, параметры...
Ключи настроек
Целесообразно предусмотреть механизм загрузки-восстановления настроек. Для набора настроек предусмотрен уникальный ключ сохранения:
-
Если загрузка идет из нескольких листов excel - ключом является имя файла excel
-
Если загрузка по макету / из буфера -то "идентификатор файлазагрузки"
-
Если загрузка из листа excel - ключом сохранения является "Имя файла+Лист"
Интерфейс сохранения, краткое описание
Производится сохранение:
-
"ХранилищеОбщихНастроек": при открытии/ закрытии формы обработки идет восстановление-сохранение. Тем самым при открытии формы все редактируемые значения будут подставлены в обработку.
-
Предусмотрено несколько наборов кнопок сохранения-загрузки в файлы/каталоги:
Сохраняют колонки в файл xml: формат файла "ТаблицаНомеровКолонок_" +Ключ настроек.
Сохраняют колонки в файл txt: формат файлов алгоритмов: "Алгоритм_ПоискДанныхСтроки_" +Ключ настроек, "Алгоритм_ПередЗагрузкойДанных_" +Ключ настроек.
Это просто список файлов: как в таблице, так и на диске.
Сохраняют колонки в файл xml: формат файла "ТаблицаПараметры_" +Ключ настроек.
-
Также есть общие команды сохранения-восстановления настроек:
ВАЖНО: данная команда сохраняет все настройки кроме внешних обработок: иначе можно "натворить плохих дел" в процессе написания обработок. Это пожалуйста делайте на закладке "Внешние файлы".
Примеры файлов настроек, рекомендации
-
На практике все файлы настроек, внешних обработок по проекту обычно складываются в 1 единый каталог, и в дальнейшем загружаются из него. Пример каталога с файлами:
-
-
Желательно производить версионирование папки настроек в git, применять полезные плагины для репозитория типа precommit4onec.
Хотя бы чтобы
-
иметь историю разработок и ничего не потерять в процессе разработки,
-
иметь возможность откатить настройки к стабильному варианту.
-