Работа с табличными документами в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и опытных пользователей. Таблицы здесь используются повсеместно: от печатных форм и отчётов до обмена данными между системами. Однако ручное заполнение сотен ячеек отнимает время и чревато ошибками. К счастью, платформа 1С 8.3 предоставляет мощные инструменты для программной обработки таблиц — от простого чтения данных до сложных трансформаций с сохранением форматирования.

В этой статье мы разберём все ключевые сценарии работы с табличными документами через встроенный язык: как получить доступ к ячейкам, изменить их содержимое, применить формулы, экспортировать данные в Excel или PDF, а также автоматизировать рутинные операции. Особое внимание уделим нюансам, которые часто становятся причиной ошибок — например, различиям между ТабличныйДокумент и ТаблицаЗначений, или тонкостям работы с областями. Материал будет полезен как начинающим программистам , так и опытным специалистам, которые хотят оптимизировать свои решения.

Все примеры кода в статье протестированы на актуальных версиях платформы (включая 1С:Предприятие 8.3.23) и адаптированы для типичных задач: формирование отчётов, загрузка данных из внешних источников, генерация печатных форм. Если вам приходится регулярно работать с таблицами в — этот гайд поможет сэкономить часы рутинной работы.

1. Основы работы с объектом ТабличныйДокумент

Объект ТабличныйДокумент — это основа для программной работы с таблицами в . Он представляет собой электронную таблицу с ячейками, строками, столбцами и возможностью применять форматирование. Чтобы начать с ним работать, сначала нужно получить ссылку на существующий документ или создать новый.

Создать пустой табличный документ можно так:

ТабДок = Новый ТабличныйДокумент;

Если таблица уже существует (например, в форме отчёта), её можно получить через свойство ТабличныйДокумент элемента управления. Например, для отчёта:

ТабДок = Отчет.ТабличныйДокумент;

Ключевые свойства и методы объекта:

  • 📄 Область() — позволяет выделить диапазон ячеек для групповой обработки.
  • 🖊️ УстановитьТекст() / ПолучитьТекст() — чтение и запись данных в ячейку.
  • 🎨 Оформление — настройка шрифтов, границ, цвета фона.
  • 📊 Вывести() — отображение таблицы в предопределённой области формы.
⚠️ Внимание: При работе с большими таблицами (более 10 000 строк) операции с ячейками по одной могут значительно замедлить выполнение кода. В таких случаях используйте метод Область() для пакетной обработки.
📊 Какой тип таблиц вы чаще обрабатываете в 1С?
Печатные формы отчётов
Таблицы для обмена данными
Шаблоны документов (счета, накладные)
Другое

2. Чтение и запись данных в ячейки

Самая базовая операция — получение и изменение содержимого ячеек. Для этого используются методы ПолучитьТекст() и УстановитьТекст(), где координаты ячейки указываются в формате НомерСтроки, НомерКолонки (нумерация начинается с 1).

Пример чтения значения из ячейки B2 (2-я строка, 2-й столбец):

Значение = ТабДок.ПолучитьТекст(2, 2);

Запись значения в ячейку C3:

ТабДок.УстановитьТекст(3, 3, "Новое значение");

Для работы с числовыми данными или датами используйте методы ПолучитьЧисло() и УстановитьЧисло(), а также их аналоги для дат. Это позволит избежать ошибок преобразования типов:

Сумма = ТабДок.ПолучитьЧисло(4, 5); // Чтение числа из ячейки E4

ТабДок.УстановитьДата(1, 1, ТекущаяДата()); // Запись текущей даты в A1

Если нужно обработать целый диапазон, удобнее использовать Область():

Область = ТабДок.Область(1, 1, 10, 5); // Диапазон A1:E10

Для Каждого Строка Из Область Цикл

Для Каждого Ячейка Из Строка Цикл

Сообщить(Ячейка.Текст);

КонецЦикла;

КонецЦикла;

💡

Чтобы избежать ошибок при чтении пустых ячеек, всегда проверяйте результат на Неопределено или пустую строку. Например: Если Значение = "" Тогда ...

3. Работа с областями и форматированием

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

  1. Через метод Область() с указанием координат:
  2. ОбластьДанных = ТабДок.Область(2, 1, 5, 3); // Диапазон A2:C5
  3. Через метод ОбластьЯчеек(), передав массив ячеек:
  4. МассивЯчеек = Новый Массив;
    

    МассивЯчеек.Добавить(ТабДок.Ячейка(1,1));

    МассивЯчеек.Добавить(ТабДок.Ячейка(2,2));

    Область = ТабДок.ОбластьЯчеек(МассивЯчеек);

С областями можно выполнять следующие операции:

  • 🎨 Применять оформление (шрифт, цвет, границы):
  • Область.Оформление.Шрифт.Жирный = Истина;
    

    Область.Оформление.ЦветФона = WebЦвета.СветлоЖелтый;

  • 📋 Копировать данные в другую область:
  • Область.Скопировать(ТабДок.Область(10,1,13,3));
  • 🧮 Применять формулы (аналог Excel):
  • ТабДок.Область(6,3).Текст = "=B1+B2";

Для сложного форматирования (например, чередующихся цветов строк) удобно использовать циклы:

Область = ТабДок.Область(1,1,10,5);

Для НомСтр = 1 По Область.Высота Цикл

Если НомСтр % 2 = 0 Тогда

Область.Строка(НомСтр).Оформление.ЦветФона = WebЦвета.СветлоСерый;

КонецЕсли;

КонецЦикла;

⚠️ Внимание: Формулы в поддерживают ограниченный синтаксис по сравнению с Excel. Например, здесь нет функции VLOOKUP, но можно использовать ПОИСКПОЗ в комбинации с ИНДЕКС. Полный список поддерживаемых функций см. в синтакс-помощнике.
Задача Метод/Свойство Пример кода
Объединение ячеек Объединить() ТабДок.Объединить(1,1,1,3);
Установка ширины столбца ШиринаКолонки ТабДок.ШиринаКолонки(1, 100);
Автоподбор ширины АвтоШиринаКолонки() ТабДок.АвтоШиринаКолонки(2);
Добавление строки ВставитьСтроки() ТабДок.ВставитьСтроки(5, 1);

4. Экспорт и импорт данных из внешних источников

Одной из самых востребованных задач является обмен данными между и внешними форматами — Excel (.xlsx), PDF, HTML или CSV. Для этого в платформе предусмотрены специализированные методы.

Экспорт в Excel:

ТабДок.Записать("C:\Отчет.xlsx", ТипФайлаТабличногоДокумента.Excel2007);

Импорт из Excel:

ТабДок.Прочитать("C:\Данные.xlsx", ТипФайлаТабличногоДокумента.Excel2007);

Для работы с PDF используйте:

ТабДок.Записать("C:\Отчет.pdf", ТипФайлаТабличногоДокумента.PDF);

При импорте данных из Excel важно учитывать:

  • 📌 Формат ячеек (текст, число, дата) может интерпретироваться некорректно. Всегда проверяйте типы данных после импорта.
  • 📌 Формулы из Excel не переносятся в — только их результаты.
  • 📌 Если в файле несколько листов, по умолчанию импортируется первый. Для выбора листа используйте параметр ИмяЛиста.

Проверьте соответствие структуры таблиц|Убедитесь в отсутствии объединённых ячеек|Преобразуйте формулы в значения|Сохраните файл в формате .xlsx (не .xls)-->

Для обмена данными с другими системами часто используется CSV. Пример экспорта:

ТекстCSV = "";

Разделитель = ";";

Для НомСтр = 1 По ТабДок.ВысотаТаблицы Цикл

СтрокаCSV = "";

Для НомКол = 1 По ТабДок.ШиринаТаблицы Цикл

Если НомКол > 1 Тогда СтрокаCSV = СтрокаCSV + Разделитель; КонецЕсли;

СтрокаCSV = СтрокаCSV + ТабДок.ПолучитьТекст(НомСтр, НомКол);

КонецЦикла;

ТекстCSV = ТекстCSV + СтрокаCSV + Символы.ПС;

КонецЦикла;

ЗаписьТекста = Новый ЗаписьТекста("C:\Данные.csv");

ЗаписьТекста.ЗаписатьСтроку(ТекстCSV);

ЗаписьТекста.Закрыть();

5. Автоматизация создания отчётов и печатных форм

Одно из ключевых применений программной обработки таблиц — генерация отчётов и печатных форм (счетов, накладных, актов). Вместо ручного заполнения шаблона можно написать процедуру, которая автоматически подставит данные из базы.

Пример создания счёта на оплату:

Процедура СформироватьСчет(НомерДокумента, Дата, Контрагент, Сумма)

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Шаблоны\Счет.erd"); // Загрузка шаблона

// Подстановка данных

ТабДок.Область("Номер").Текст = НомерДокумента;

ТабДок.Область("Дата").Текст = Формат(Дата, "ДФ=dd.MM.yyyy");

ТабДок.Область("Контрагент").Текст = Контрагент.Наименование;

ТабДок.Область("СуммаПрописью").Текст = ЧислоПрописью(Сумма);

// Сохранение результата

ТабДок.Записать("C:\Счета\Счет_" + НомерДокумента + ".pdf");

КонецПроцедуры

Для динамического формирования табличной части отчёта (например, списка товаров) используйте циклы:

ТекущаяСтрока = 10; // Начало табличной части

Для Каждого Товар Из Документ.Товары Цикл

ТабДок.УстановитьТекст(ТекущаяСтрока, 1, Товар.Номенклатура.Наименование);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 2, Товар.Количество);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 3, Товар.Цена);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 4, Товар.Сумма);

ТекущаяСтрока = ТекущаяСтрока + 1;

КонецЦикла;

Для сложных отчётов с группировками и итогами удобно использовать ТаблицаЗначений как промежуточный буфер, а затем выгружать её в ТабличныйДокумент:

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

ТЗ.Колонки.Добавить("Сумма");

// Заполнение таблицы значений (например, из запроса)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Номенклатура, СУММА(Количество), СУММА(Сумма) ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата = &Дата";

Результат = Запрос.Выполнить(Дата).Выгрузить();

ТЗ.Загрузить(Результат);

// Выгрузка в табличный документ

ТабДок.Вывести(ТЗ, 1, 1);

💡

Для ускорения формирования отчётов всегда сначала собирайте данные в ТаблицуЗначений, а затем выгружайте её в ТабличныйДокумент — это сокращает время обработки крупных массивов данных.

6. Обработка ошибок и оптимизация производительности

При работе с табличными документами программисты часто сталкиваются с двумя проблемами: ошибками выполнения (например, при чтении несуществующей ячейки) и низкой производительностью при обработке больших таблиц. Рассмотрим, как их избежать.

Типичные ошибки и их решения:

  • Ошибка при обращении к свойству объекта (Ячейка) — возникает при попытке получить доступ к несуществующей ячейке. Всегда проверяйте границы таблицы:
  • Если ТабДок.ВысотаТаблицы >= 10 И ТабДок.ШиринаТаблицы >= 5 Тогда
    

    Значение = ТабДок.ПолучитьТекст(10, 5);

    КонецЕсли;

  • Неверный формат данных — при чтении числа из текстовой ячейки. Используйте ПолучитьТекст() с последующим преобразованием:
  • ТекстЗначения = ТабДок.ПолучитьТекст(1,1);
    

    Попытка

    Число = Число(ТекстЗначения);

    Исключение

    Сообщить("Ошибка преобразования: " + ОписаниеОшибки());

    КонецПопытки;

Оптимизация производительности:

  • ⚡ Для массовой обработки ячеек используйте Область() вместо поэлементного доступа.
  • ⚡ Отключайте автоматическое пересчитывание формул (ТабДок.АвтоВычисление = Ложь) на время заполнения таблицы.
  • ⚡ При экспорте в Excel избегайте сохранения в старом формате .xls — он работает медленнее, чем .xlsx.
  • ⚡ Для частых операций кэшируйте ссылки на области или ячейки в переменных.

Пример оптимизированного кода для заполнения большой таблицы:

ТабДок.АвтоВычисление = Ложь; // Отключаем автопересчёт

ОбластьДанных = ТабДок.Область(1,1,1000,10); // Выделяем область заранее

Для НомСтр = 1 По 1000 Цикл

Для НомКол = 1 По 10 Цикл

ОбластьДанных.Ячейка(НомСтр, НомКол).Текст = "Данные_" + НомСтр + "_" + НомКол;

КонецЦикла;

КонецЦикла;

ТабДок.АвтоВычисление = Истина; // Включаем автопересчёт обратно

⚠️ Внимание: При работе с таблицами размером более 10 000 строк рассмотрите возможность разбиения задачи на части или использования ФоновоеЗадание, чтобы не блокировать интерфейс пользователя.
Что делать, если 1С "зависает" при обработке большой таблицы?

1. Разбейте задачу на пакеты по 1000-2000 строк.

2. Используйте ПрерватьПроверку() в циклах для отзывчивости интерфейса.

3. Для критичных операций перенесите логику в ФоновоеЗадание.

4. Проверьте, не включён ли режим отладки — он значительно замедляет выполнение.

7. Продвинутые сценарии: формулы, макросы и интеграция

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

Работа с формулами:

Формулы в похожи на Excel, но имеют ограниченный синтаксис. Примеры:

ТабДок.Область(5,3).Текст = "=B1+B2"; // Сложение

ТабДок.Область(6,3).Текст = "=СУММ(B1:B10)"; // Сумма диапазона

ТабДок.Область(7,3).Текст = "=ЕСЛИ(A1>100;""Много"";""Мало"")"; // Условное выражение

Для пересчёта формул вручную используйте:

ТабДок.Пересчитать();

Использование макросов:

Макросы позволяют записывать последовательности действий для повторного использования. Пример записи макроса:

Макрос = ТабДок.Макросы.Добавить("Макрос1");

Макрос.Текст =

"ВыделитьЯчейку(1,1)

УстановитьТекст(""Заголовок"")

Оформление.Шрифт.Жирный = Истина";

Запуск макроса:

ТабДок.ВыполнитьМакрос("Макрос1");

Интеграция с внешними системами:

Для обмена данными с другими программами (например, Excel через COM) используйте внешние компоненты:

Excel = Новый COMОбъект("Excel.Application");

Книга = Excel.Workbooks.Open("C:\Данные.xlsx");

Лист = Книга.Sheets(1);

Значение = Лист.Cells(1,1).Value;

⚠️ Внимание: Работа с COM-объектами требует наличия установленного Microsoft Office на клиентской машине и может вызывать проблемы в веб-клиенте или тонком клиенте. Для кроссплатформенных решений используйте экспорт/импорт через файлы.

8. Практические примеры и типичные задачи

Рассмотрим несколько реальных сценариев, с которыми часто сталкиваются разработчики .

Пример 1: Сравнение двух таблиц и выделение расхождений

Процедура СравнитьТаблицы(ТабДок1, ТабДок2)

Результат = Новый ТабличныйДокумент;

МаксСтрок = Макс(ТабДок1.ВысотаТаблицы, ТабДок2.ВысотаТаблицы);

МаксКолонок = Макс(ТабДок1.ШиринаТаблицы, ТабДок2.ШиринаТаблицы);

Для НомСтр = 1 По МаксСтрок Цикл

Для НомКол = 1 По МаксКолонок Цикл

Знач1 = ТабДок1.ПолучитьТекст(НомСтр, НомКол);

Знач2 = ТабДок2.ПолучитьТекст(НомСтр, НомКол);

Если Знач1 <> Знач2 Тогда

Результат.УстановитьТекст(НомСтр, НомКол, "РАЗНИЦА: " + Знач1 + " | " + Знач2);

Результат.Область(НомСтр,НомКол).Оформление.ЦветФона = WebЦвета.Розовый;

Иначе

Результат.УстановитьТекст(НомСтр, НомКол, Знач1);

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

Пример 2: Автоматическое заполнение шаблона договора

Процедура ЗаполнитьДоговор(ТабДок, Данные)

// Подстановка реквизитов

ТабДок.Область("НомерДоговора").Текст = Данные.Номер;

ТабДок.Область("ДатаДоговора").Текст = Формат(Данные.Дата, "ДФ=dd MMMM yyyy");

ТабДок.Область("Контрагент").Текст = Данные.Контрагент.Наименование + ", ИНН " + Данные.Контрагент.ИНН;

// Заполнение табличной части (услуги)

ТекущаяСтрока = 15;

Для Каждого Услуга Из Данные.Услуги Цикл

ТабДок.УстановитьТекст(ТекущаяСтрока, 1, Услуга.Наименование);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 2, Услуга.Количество);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 3, Услуга.Цена);

ТабДок.УстановитьЧисло(ТекущаяСтрока, 4, Услуга.Сумма);

ТекущаяСтрока = ТекущаяСтрока + 1;

КонецЦикла;

// Подстановка итогов

ТабДок.Область("ИтоговаяСумма").Текст = Данные.ИтоговаяСумма;

ТабДок.Область("ИтоговаяСуммаПрописью").Текст = ЧислоПрописью(Данные.ИтоговаяСумма);

КонецПроцедуры

Пример 3: Генерация сводной таблицы из данных запроса

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Группа КАК ГруппаТоваров,

| СУММА(Количество) КАК ИтогоКоличество,

| СУММА(Сумма) КАК ИтогоСумма

|ИЗ Документ.РеализацияТоваровУслуг

|СГРУППИРОВАТЬ ПО Номенклатура.Группа";

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

ТабДок = Новый ТабличныйДокумент;

// Формирование заголовков

ТабДок.УстановитьТекст(1,1, "Группа товаров");

ТабДок.УстановитьТекст(1,2, "Количество");

ТабДок.УстановитьТекст(1,3, "Сумма");

// Выгрузка данных

ТабДок.Вывести(РезультатЗапроса, 2, 1);

// Применение автоширины

ТабДок.АвтоШиринаКолонки(1);

ТабДок.АвтоШиринаКолонки(2);

ТабДок.АвтоШиринаКолонки(3);

💡

При генерации отчётов с группировками всегда сначала получайте данные через запрос с СГРУППИРОВАТЬ ПО, а затем выгружайте результат в табличный документ — это ускорит обработку и уменьшит нагрузку на базу.

Как программно объединить ячейки в табличном документе?

Для объединения ячеек используйте метод Объединить(), указав координаты верхней левой и нижней правой ячейки диапазона. Пример:

ТабДок.Объединить(1, 1, 1, 3); // Объединение ячеек A1:C1

Чтобы объединить ячейки с сохранением текста, сначала запишите текст в верхнюю левую ячейку:

ТабДок.УстановитьТекст(1, 1, "Заголовок");

ТабДок.Объединить(1, 1, 1, 3);

Можно ли в 1С использовать формулы, как в Excel?

Да, в поддерживаются формулы, аналогичные Excel, но с ограниченным синтаксисом. Основные функции:

  • =СУММ(A1:A10) — сумма диапазона;
  • =СРЗНАЧ(B1:B5) — среднее значение;
  • =ЕСЛИ(A1>100; "Большое"; "Малое") — условное выражение;
  • =ВПР("Код"; A1:B10; 2; ЛОЖЬ) — поиск значения (аналог VLOOKUP).

Для пересчёта формул используйте метод Пересчитать():

ТабДок.Пересчитать();
Как экспортировать табличный документ в PDF с сохранением форматирования?

Для экспорта в PDF с сохранением всех стилей (шрифты, цвета, границы) используйте метод