Как перенести ширину колонок из Excel в форму 1С

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

Разработка интерфейсов в 1С часто сопряжена с рутинной задачей: приведением внешнего вида табличных частей или динамических списков в соответствие с требованиями заказчика, оформленными в виде Excel-макета. Часто программисты тратят часы на "подгонку" ширины колонок на глаз, что является крайне неэффективным использованием времени. В этой статье мы разберем, как автоматизировать этот процесс, проанализируем разницу в единицах измерения и разработаем алгоритм программного переноса настроек.

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

Первая и главная проблема, которую мы должны осознать — это принципиально разные подходы к расчету геометрии в Microsoft Excel и в платформе 1С:Предприятие. Рассмотрим их подробнее, чтобы понять физику процесса:

  1. В Excel: Ширина колонки измеряется в количестве символов моноширинного шрифта (по умолчанию это Calibri 11pt), которые помещаются в ячейку. Это нелинейная величина, которая включает в себя также отступы для границ.
  2. В 1С (Управляемые формы): Свойство Ширина измеряется в средних символах шрифта, установленного для конкретного элемента формы. Это абстрактная единица, которая зависит от системного DPI и настроек масштабирования ОС.
  3. В 1С (Обычные формы): Здесь все еще сложнее, так как ширина измеряется в специальных единицах (примерно 1/8 символа), и визуальный результат сильно зависит от разрешения экрана.

Проанализируем ситуацию: если в Excel ширина колонки установлена в 10, это не значит, что в 1С значение 10 даст тот же результат. На практике для управляемых форм (интерфейс "Такси") эмпирически выведен коэффициент 1.1 – 1.2. То есть значение из Excel нужно умножать на этот коэффициент для получения похожего результата в 1С.

Программный способ получения данных из Excel

Для автоматизации нам нужно научиться программно читать ширину колонок из исходного файла. Самый надежный метод — использование COM-объекта Excel.Application. Разберем код, который позволяет получить точные данные:


// Создаем объект подключения к Excel
Попытка
    ExcelПриложение = Новый COMОбъект("Excel.Application");
    Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1);
Исключение
    Сообщить("Не удалось открыть файл Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Читаем ширину первой колонки
// ColumnWidth возвращает ширину в символах (как в интерфейсе Excel)
ШиринаВКурсиве = Лист.Columns(1).ColumnWidth;

// Width возвращает ширину в пунктах (более точное значение для расчетов)
ШиринаВПунктах = Лист.Columns(1).Width;

Важно помнить, что свойство Width является более стабильным для расчетов, так как оно возвращает дробное число в пунктах (1/72 дюйма), тогда как ColumnWidth может округляться интерфейсом Excel.

Алгоритм автоматизированной настройки формы 1С

Теперь рассмотрим, как применить полученные данные к элементам управляемой формы. Нам необходимо перебрать колонки таблицы на форме и сопоставить их с колонками из файла. Проанализируем пример кода, который выполняет эту задачу:


&НаСервере
Процедура УстановитьШиринуКолонокНаСервере(ДанныеКолонокExcel)
    // ДанныеКолонокExcel - это Соответствие, где Ключ - имя колонки, Значение - ширина
    
    Для Каждого Элемент Из Элементы.ТабличнаяЧастьТовары.ПодчиненныеЭлементы Цикл
        // Проверяем, есть ли у нас данные для этой колонки
        Если ДанныеКолонокExcel.Свойство(Элемент.Имя, ЦелеваяШирина) Тогда
            
            // Применяем коэффициент пересчета (например, 1.15)
            Элемент.Ширина = ЦелеваяШирина * 1.15;
            
            // Важно: отключаем автоматическое растягивание, иначе ширина может игнорироваться
            Элемент.РастягиватьПоГоризонтали = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

В данном примере мы используем свойство ПодчиненныеЭлементы, чтобы обойти все колонки конкретной таблицы (например, ТабличнаяЧастьТовары). Обратите внимание на свойство РастягиватьПоГоризонтали. В управляемом интерфейсе, если это свойство установлено в Истина, платформа может проигнорировать заданную ширину, чтобы заполнить все свободное пространство формы.

Нюансы работы с интерфейсом "Такси"

Выясним причину, по которой иногда программная установка ширины не дает видимого эффекта. В современном интерфейсе 1С "Такси" используется адаптивная верстка. Чтобы жестко задать ширину, как в Excel, рекомендуем выполнить следующие шаги:

Влияние шрифтов на визуальное соответствие

Как отмечалось в обсуждениях на форумах, ширина колонки неразрывно связана со шрифтом. Если в Excel используется узкий шрифт (например, Arial Narrow), а в 1С стандартный шрифт интерфейса, то даже при одинаковом количестве символов текст в 1С будет обрезаться.

Рассмотрим рекомендации: если макет в Excel критичен к ширине, проверьте, какой шрифт там используется. Если он отличается от системного шрифта 1С, коэффициент пересчета придется увеличить до 1.3 – 1.4. Также полезно программно устанавливать свойство Шрифт для элементов формы 1С, чтобы добиться максимального сходства с макетом.

Сохранение настроек для пользователя

После того как мы программно установили идеальную ширину, важно, чтобы эти настройки не "слетели" при следующем открытии формы пользователем. Для этого убедитесь, что:

  1. У формы включено свойство Автоматическое сохранение данных в настройках.
  2. В свойствах таблицы на форме флаг Использовать сохранение данных в настройках установлен в Истина.
  3. Если настройки все равно не сохраняются (распространенная проблема в некоторых версиях БСП), можно принудительно использовать метод ХранилищеОбщихНастроек.Сохранить(), записывая туда массив структур с именами колонок и их шириной.

Подводя итог, можно сказать, что хотя прямой функции "Импорт из Excel в Конфигуратор" не существует, задача решается написанием простой внешней обработки. Она читает свойства ColumnWidth через COM-объект и переносит их в свойство Ширина элементов формы с коэффициентом 1.15. Это экономит часы работы программиста и исключает человеческий фактор при верстке сложных интерфейсов.

← На главную