Разработка интерфейсов в 1С часто сопряжена с рутинной задачей: приведением внешнего вида табличных частей или динамических списков в соответствие с требованиями заказчика, оформленными в виде Excel-макета. Часто программисты тратят часы на "подгонку" ширины колонок на глаз, что является крайне неэффективным использованием времени. В этой статье мы разберем, как автоматизировать этот процесс, проанализируем разницу в единицах измерения и разработаем алгоритм программного переноса настроек.
Первая и главная проблема, которую мы должны осознать — это принципиально разные подходы к расчету геометрии в Microsoft Excel и в платформе 1С:Предприятие. Рассмотрим их подробнее, чтобы понять физику процесса:
Ширина измеряется в средних символах шрифта, установленного для конкретного элемента формы. Это абстрактная единица, которая зависит от системного DPI и настроек масштабирования ОС.Проанализируем ситуацию: если в Excel ширина колонки установлена в 10, это не значит, что в 1С значение 10 даст тот же результат. На практике для управляемых форм (интерфейс "Такси") эмпирически выведен коэффициент 1.1 – 1.2. То есть значение из Excel нужно умножать на этот коэффициент для получения похожего результата в 1С.
Для автоматизации нам нужно научиться программно читать ширину колонок из исходного файла. Самый надежный метод — использование 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.
Теперь рассмотрим, как применить полученные данные к элементам управляемой формы. Нам необходимо перебрать колонки таблицы на форме и сопоставить их с колонками из файла. Проанализируем пример кода, который выполняет эту задачу:
&НаСервере
Процедура УстановитьШиринуКолонокНаСервере(ДанныеКолонокExcel)
// ДанныеКолонокExcel - это Соответствие, где Ключ - имя колонки, Значение - ширина
Для Каждого Элемент Из Элементы.ТабличнаяЧастьТовары.ПодчиненныеЭлементы Цикл
// Проверяем, есть ли у нас данные для этой колонки
Если ДанныеКолонокExcel.Свойство(Элемент.Имя, ЦелеваяШирина) Тогда
// Применяем коэффициент пересчета (например, 1.15)
Элемент.Ширина = ЦелеваяШирина * 1.15;
// Важно: отключаем автоматическое растягивание, иначе ширина может игнорироваться
Элемент.РастягиватьПоГоризонтали = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В данном примере мы используем свойство ПодчиненныеЭлементы, чтобы обойти все колонки конкретной таблицы (например, ТабличнаяЧастьТовары). Обратите внимание на свойство РастягиватьПоГоризонтали. В управляемом интерфейсе, если это свойство установлено в Истина, платформа может проигнорировать заданную ширину, чтобы заполнить все свободное пространство формы.
Выясним причину, по которой иногда программная установка ширины не дает видимого эффекта. В современном интерфейсе 1С "Такси" используется адаптивная верстка. Чтобы жестко задать ширину, как в Excel, рекомендуем выполнить следующие шаги:
РастягиватьПоГоризонтали в значение Ложь.РастягиватьПоГоризонтали = Истина, чтобы таблица выглядела гармонично.АвтоМаксимальнаяШирина. Если оно включено, платформа может "схлопнуть" колонку, если в ней мало данных, несмотря на ваши настройки.Как отмечалось в обсуждениях на форумах, ширина колонки неразрывно связана со шрифтом. Если в Excel используется узкий шрифт (например, Arial Narrow), а в 1С стандартный шрифт интерфейса, то даже при одинаковом количестве символов текст в 1С будет обрезаться.
Рассмотрим рекомендации: если макет в Excel критичен к ширине, проверьте, какой шрифт там используется. Если он отличается от системного шрифта 1С, коэффициент пересчета придется увеличить до 1.3 – 1.4. Также полезно программно устанавливать свойство Шрифт для элементов формы 1С, чтобы добиться максимального сходства с макетом.
После того как мы программно установили идеальную ширину, важно, чтобы эти настройки не "слетели" при следующем открытии формы пользователем. Для этого убедитесь, что:
Автоматическое сохранение данных в настройках.Использовать сохранение данных в настройках установлен в Истина.ХранилищеОбщихНастроек.Сохранить(), записывая туда массив структур с именами колонок и их шириной.Подводя итог, можно сказать, что хотя прямой функции "Импорт из Excel в Конфигуратор" не существует, задача решается написанием простой внешней обработки. Она читает свойства ColumnWidth через COM-объект и переносит их в свойство Ширина элементов формы с коэффициентом 1.15. Это экономит часы работы программиста и исключает человеческий фактор при верстке сложных интерфейсов.