Часто при разработке отчетов или обработок выгрузки данных программисты 1С сталкиваются с ситуацией, когда итоговый файл Excel выглядит неопрятно: данные начинаются не с первой ячейки (A1), а со смещением — например, со второй колонки и пятой строки. Это создает неудобства для пользователей, особенно если файл предназначен для автоматизированной обработки или импорта в другие системы. В этой статье мы подробно проанализируем причины такого поведения системы и разберем несколько эффективных способов решения проблемы.
Рассмотрим ситуацию, когда для преобразования ТаблицыЗначений в ТабличныйДокумент используется объект ПостроительОтчета. Это удобный инструмент, который автоматически формирует структуру отчета, но он имеет ряд настроек по умолчанию, которые и вызывают смещение:
Выясним, как программно управлять этими настройками, чтобы "прижать" данные к левому верхнему углу.
Самый простой и правильный путь — это отключение вывода служебных областей в самом построителе перед тем, как вызвать метод Вывести(). Проанализируем необходимые свойства:
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
Построитель.Выполнить();
// Отключаем лишние элементы оформления
Построитель.ВыводитьЗаголовокОтчета = Ложь;
Построитель.ВыводитьОтбор = Ложь;
Построитель.ВыводитьПодвалОтчета = Ложь;
ТабличныйДокумент = Новый ТабличныйДокумент;
Построитель.Вывести(ТабличныйДокумент);
Установка свойства ВыводитьЗаголовокОтчета в значение Ложь убирает пустые строки сверху. Однако это не всегда решает проблему первой пустой колонки. Если колонка все равно остается, перейдем к более радикальным методам.
Если настройки построителя не помогают или вы используете сложный макет, мы можем программно удалить ненужные строки и колонки из уже сформированного объекта ТабличныйДокумент перед его сохранением в файл.
Разберем пример кода, который удаляет первую колонку и первые четыре строки:
// Удаление первых 4-х строк
Если ТабличныйДокумент.ВысотаТаблицы >= 4 Тогда
ОбластьДляУдаления = ТабличныйДокумент.Область(1, , 4, );
ТабличныйДокумент.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
// Удаление первой колонки
Если ТабличныйДокумент.ШиринаТаблицы >= 1 Тогда
ОбластьКолонки = ТабличныйДокумент.Область(, 1, , 1);
ТабличныйДокумент.УдалитьОбласть(ОбластьКолонки, ТипСмещенияТабличногоДокумента.ПоГоризонтали);
КонецЕсли;
Важный момент: При использовании метода УдалитьОбласть крайне важно указывать правильный ТипСмещенияТабличногоДокумента, чтобы остальные данные корректно сдвинулись. Для реализации сложного форматирования также существует COM компонента для вывода в Excel в стиле 1С.
Если вам нужен полный контроль над каждой ячейкой и вы хотите избежать "магии" построителя, оптимальным решением будет прямой перебор ТаблицыЗначений и заполнение ТабличногоДокумента. Рассмотрим оптимизированный алгоритм, который корректно обрабатывает типы данных (числа и даты) для Excel.
ТабДок = Новый ТабличныйДокумент;
КоличествоКолонок = ТЗ.Колонки.Количество();
// 1. Формируем шапку (первая строка)
Для ИндексКол = 0 По КоличествоКолонок - 1 Цикл
ТекущаяКолонка = ТЗ.Колонки[ИндексКол];
Ячейка = ТабДок.Область(1, ИндексКол + 1);
Ячейка.Текст = ?(ЗначениеЗаполнено(ТекущаяКолонка.Заголовок), ТекущаяКолонка.Заголовок, ТекущаяКолонка.Имя);
Ячейка.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт для шапки
КонецЦикла;
// 2. Заполняем данные (начиная со второй строки)
НомерСтроки = 2;
Для Каждого СтрокаДанных Из ТЗ Цикл
Для НомерКолонки = 1 По КоличествоКолонок Цикл
Значение = СтрокаДанных[НомерКолонки - 1];
Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
// Устанавливаем значение с учетом типа для корректного отображения в Excel
Если ТипЗнч(Значение) = Тип("Число") Тогда
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
Ячейка.Значение = Значение;
Ячейка.Формат = "ЧГ=0"; // Убираем разделитель групп разрядов
ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = Новый ОписаниеТипов("Дата");
Ячейка.Значение = Значение;
Ячейка.Формат = "ДФ=dd.MM.yyyy";
Иначе
Ячейка.Текст = Строка(Значение);
КонецЕсли;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать("C:\my_export.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Проанализируем этот код подробнее. Использование свойства СодержитЗначение и Значение вместо простого присвоения Текст позволяет Excel распознать данные именно как числа или даты. Это критически важно, если пользователь планирует в дальнейшем суммировать колонки или фильтровать даты в Excel.
При выгрузке данных стоит обратить внимание на используемый формат файла. В современных версиях платформы 1С настоятельно рекомендуется использовать ТипФайлаТабличногоДокумента.XLSX (формат Excel 2007 и выше).
Преимущества XLSX:
XLS ограничен 65 536 строками.Если ваша таблица содержит десятки тысяч строк, метод перебора каждой ячейки (Способ 3) может работать медленно. В таких случаях рекомендуем:
ПостроительОтчета или Easy Peasy (легкий обмен с MS Excel), так как внутренние механизмы 1С по выводу коллекций работают быстрее, чем цикл на языке 1С.Вывести() для небольших областей-макетов.CSV. Этот формат открывается в Excel мгновенно и гарантированно не имеет лишних отступов, хотя и не поддерживает оформление (цвета, границы).Таким образом, мы рассмотрели все основные причины смещения данных при выгрузке и нашли способы их устранения. Выбор конкретного метода зависит от ваших требований к скорости разработки и производительности системы.