Разработка и Конфигурация · 10 мин
Как вставить строку в табличный документ 1С
Как программно вставить строку в табличный документ 1С: метод ВставитьОбласть, смещение строк, работа с областями, примеры кода и типичные ошибки разработчиков.
Вставка строки в табличный документ — типовая задача при доработке печатных форм и отчётов в 1С. В отличие от таблицы значений, табличный документ — это не структура данных, а «лист» с ячейками, поэтому вставить строку «в середину» напрямую нельзя: потребуется сместить существующие области или перестроить вывод. Понимание этой особенности избавляет от большинства ошибок при работе с объектом ТабличныйДокумент.
Основной инструмент для вставки — метод ВставитьОбласть, который сдвигает существующие строки вниз и освобождает место под новую область. Дополнительно используются методы ПолучитьОбласть, Вывести и Область для адресации конкретных ячеек. Выбор подхода зависит от того, формируется документ «с нуля» или редактируется уже заполненный.
Ниже разобраны рабочие способы вставки строки: через смещение областей, через повторный вывод секций макета и через прямую запись в ячейки. Приведены примеры кода, условия выбора метода и типичные ошибки, из-за которых печатная форма «съезжает» или теряет данные.
Как устроен табличный документ и почему это важно
Табличный документ в 1С — объект типа ТабличныйДокумент, состоящий из адресуемых областей ячеек. Каждая ячейка имеет координаты (номер строки и колонки), а группы ячеек объединяются в именованные области. Данные в него выводятся секциями из макета или записываются напрямую в ячейки.
Ключевое отличие от таблицы значений: у табличного документа нет метода «ВставитьСтроку(Индекс)». Нельзя просто «вклинить» строку между двумя существующими — можно только сместить диапазон строк вниз, освободив пустое место, а затем заполнить его. Именно это и делает ВставитьОбласть.
Перед вставкой определите, в каком состоянии документ. Если он ещё формируется в цикле — правильнее изменить порядок вывода секций. Если документ уже сформирован (например, получен из типовой процедуры печати и требует доработки) — используйте программное смещение областей.
Вставка строки методом ВставитьОбласть
Метод ВставитьОбласть(ОбластьПриемник, ОбластьИсточник, ТипСмещения, ЗаполнитьПараметры) копирует область-источник в область-приёмник со смещением существующего содержимого. Для вставки пустой строки источником служит область макета с нужным оформлением, а приёмником — строка, перед которой нужно вставить новую.
Тип смещения ТипСмещенияТабличногоДокумента.ПоВертикали сдвигает все строки, начиная с приёмника, вниз на высоту вставляемой области. Так данные ниже точки вставки не теряются, а перемещаются.
// Получаем область-источник из макета (секция с оформлением строки)
Макет = ПолучитьМакет("МакетОтчета");
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");
// Определяем приёмник: строка 10 табличного документа, целиком
ОбластьПриемник = ТабДок.Область("R10");
// Вставляем со смещением вниз
ТабДок.ВставитьОбласть(ОбластьПриемник, ОбластьСтрока,
ТипСмещенияТабличногоДокумента.ПоВертикали, Истина);
Параметр ЗаполнитьПараметры = Истина указывает, что параметры области-источника будут заполнены значениями, если они заданы. После вставки новая строка находится на месте бывшей строки 10, а прежнее содержимое сместилось на строку 11 и ниже.
- 1Получите область-источник из макета с нужным оформлением строки
- 2Определите координаты строки-приёмника, перед которой нужна вставка
- 3Вызовите ВставитьОбласть с типом смещения ПоВертикали
- 4Заполните параметры и текст ячеек новой строки
- 5Проверьте, что строки ниже сместились и данные не потеряны
Вставка строки при формировании документа секциями
Если табличный документ строится последовательным выводом секций макета, вставить строку «в середину» проще всего на этапе формирования: сначала выводятся строки до точки вставки, затем новая строка, затем остальные. Это самый надёжный способ, поскольку не требует смещения уже выведенных областей.
НомерСтроки = 0;
Для Каждого СтрокаТовара Из Товары Цикл
НомерСтроки = НомерСтроки + 1;
Если НомерСтроки = ПозицияВставки Тогда
// Сначала выводим вставляемую строку
ОбластьНовая.Параметры.Наименование = "Добавленная строка";
ТабДок.Вывести(ОбластьНовая);
КонецЕсли;
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Такой подход предпочтителен при доработке собственных печатных форм. Он быстрее по производительности, не рискует повредить форматирование соседних строк и проще сопровождается. Метод ВставитьОбласть оставьте для случаев, когда документ уже сформирован внешним кодом и перестроить его нельзя.
Сравнение способов вставки
Подходит при собственном формировании документа. Быстро и безопасно, но требует доступа к логике формирования.
Подходит для правки готового табличного документа. Универсально, но требует точных координат и аккуратности с форматированием.
Подходит для добавления данных в уже пустую строку. Не смещает содержимое — только заполняет существующие ячейки.
Прямая запись в ячейки и работа с адресными областями
Если строка в документе уже существует, но пуста (например, зарезервирована в макете), достаточно записать значения напрямую в её ячейки. Для этого используют свойство Текст или Параметр области.
// Запись текста в конкретную ячейку: строка 12, колонка 2
ТабДок.Область("R12C2").Текст = "Итого по группе";
// Запись через числовые координаты
ТабДок.Область(12, 3).Текст = Формат(СуммаИтог, "ЧДЦ=2");
Прямая запись не сдвигает другие строки — она меняет содержимое конкретных ячеек. Это удобно для точечных правок: добавить примечание, итог или служебную пометку в уже сформированной печатной форме без её перестроения.
Учтите, что если ячейка входит в объединённую область, обращаться нужно к левой верхней ячейке объединения — иначе значение не отобразится или запишется не туда.
Особенности при работе с группировками и итогами
При вставке строки в документ с группировками (уровнями) и подведением итогов смещение областей может нарушить структуру. Метод ВставитьОбласть не пересчитывает итоги и не корректирует диапазоны группировок — они привязаны к абсолютным номерам строк.
Если вставляемая строка должна попасть внутрь группы, смещайте область целиком вместе с группировкой или пересоздайте уровни после вставки. Проверьте, что итоговые строки остались на своих логических местах, а не «оторвались» от своих групп.
Для печатных форм с фиксированным количеством строк на странице (например, ТОРГ-12, счета-фактуры) дополнительная строка может «вытолкнуть» часть содержимого на следующий лист. Проверяйте разбиение на страницы методом ПроверитьВывод перед выводом итоговых секций.
Проверка результата и типичные ошибки
После вставки убедитесь, что новая строка появилась в нужной позиции, содержимое ниже сместилось корректно, а форматирование (границы, шрифты, высота строк) соответствует остальным строкам. Проще всего вывести документ на экран в режиме предприятия и визуально сверить результат.
Как проверить результат
Строка находится перед заданной, данные ниже сдвинуты на одну позицию
Строка вставилась не туда или перезаписала существующие данные
Границы, шрифт и высота совпадают с соседними строками
Строка без обрамления или с отличающейся высотой
Итоговые строки на своих местах, группы сворачиваются корректно
Итоги оторвались от групп или исчезли
Печатная форма разбита корректно, шапки повторяются
Часть строк уехала на новый лист без шапки
Отдельная частая проблема — абсолютная адресация после вставки. Если код после вставки продолжает писать в ячейки по старым номерам строк, все данные окажутся смещены. После ВставитьОбласть пересчитывайте координаты или используйте именованные области.
FAQ
Можно ли вставить строку в табличный документ в режиме пользователя, без программирования?
Да, если табличный документ открыт на редактирование (например, отчёт, выведенный как табличный документ с разрешённым редактированием): выделите строку и используйте контекстное меню «Вставить» или стандартное сочетание клавиш. Но в типовых печатных формах редактирование обычно заблокировано, и изменения не сохраняются в базе.
Чем ВставитьОбласть отличается от Вывести?
Вывести добавляет область в конец документа, ниже всего существующего содержимого. ВставитьОбласть помещает область в указанную позицию, сдвигая существующее содержимое. Для вставки «в середину» подходит только второй метод.
Как вставить сразу несколько строк?
Возьмите в качестве источника область макета, содержащую несколько строк, — ВставитьОбласть сместит содержимое на всю высоту источника. Либо вызывайте ВставитьОбласть в цикле, каждый раз корректируя номер строки-приёмника с учётом уже выполненных вставок.
Почему после вставки пропало форматирование строки?
Форматирование берётся из области-источника. Если источник — область без оформления, вставленная строка будет «голой». Используйте в качестве источника секцию макета с нужными границами, шрифтами и высотой строки или скопируйте формат с соседней строки.
Как удалить строку из табличного документа?
Используйте метод УдалитьОбласть с типом смещения ПоВертикали — он удалит указанные строки и подтянет нижележащее содержимое вверх. Это зеркальная операция к ВставитьОбласть, и к ней применимы те же предостережения про группировки и абсолютную адресацию.
Что важно запомнить
Строку в табличный документ 1С вставляют методом ВставитьОбласть со смещением ПоВертикали — он сдвигает содержимое вниз и освобождает место. Если документ формируется вашим кодом, проще выводить секции макета в нужном порядке. После вставки проверяйте форматирование, группировки, итоги и разбиение на страницы, а последующую адресацию ячеек пересчитывайте с учётом сдвига.