Заполнение таблиц в 1С: вручную, из Excel и программно
Содержание
Заполнить таблицу в 1С можно четырьмя путями: руками через кнопку Добавить в табличной части документа, копированием диапазона прямо из Excel, кодом на встроенном языке через метод Добавить() и загрузкой из внешнего файла обработкой. Выбор зависит от того, что за «таблица» перед вами и сколько строк нужно внести.
Под словом «таблица» в 1С 8.3 скрываются четыре разных объекта, и приёмы для них не совпадают. Ниже — что это за объекты, как заполнять каждый руками и программно, как грузить данные из табличного документа и Excel и на чём чаще всего спотыкаются.
Четыре вида таблиц в 1С — что именно вы заполняете
Прежде чем искать кнопку, определите, с чем имеете дело. От этого зависит способ.
- 📄 Табличная часть — строки внутри документа или справочника (товары в поступлении, сотрудники в начислении). Хранится в базе, заполняется пользователем в форме.
- 🧮 Таблица значений (
ТаблицаЗначений) — объект в памяти, существует только во время работы кода. Её не видно пользователю, пока не вывести на форму. - 🖨️ Табличный документ (
ТабличныйДокумент) — то, что печатают и выгружают в Excel: ячейки, области, макеты печатных форм и отчётов. - ⏳ Временная таблица — промежуточный результат внутри запроса, живёт до конца пакета запросов.
Если задача звучит «внести 200 позиций в документ» — это табличная часть. Если «собрать данные для отчёта и выгрузить в файл» — табличный документ. Если «обработать строки в коде» — таблица значений.
Коротко о том, какой способ под какую задачу:
| Способ | Когда применять | На что смотреть |
|---|---|---|
Руками через Добавить | 1–20 строк, разовый ввод | Дольше всего на больших объёмах |
Копирование из Excel (Ctrl+V) | Готовый список в файле | Порядок и типы колонок |
Кнопка Подбор | Выбор из справочника пачкой | Только существующие элементы |
Код Добавить() / Загрузить() | Автоматизация, обмены | Совпадение имён колонок |
| Обработка загрузки | Регулярный импорт из файла | Настройка сопоставления колонок |
Ручной ввод в табличную часть документа
Самый частый случай — руками добавить строки в документ.
- Откройте документ и встаньте на нужную таблицу (например, закладку
Товары). - Нажмите
Добавить(зелёный плюс в командной панели таблицы) или клавишуIns. - В появившейся строке выберите значение в первой колонке — обычно это ссылка на справочник. Остальные поля часто заполнятся по умолчанию (цена из типа цен, ставка НДС из карточки номенклатуры).
- Переход между ячейками —
TabилиEnter, в зависимости от настройки формы.
Горячие операции со строками:
- Скопировать строку —
F9илиCtrl+Cна строке, затемCtrl+V. Удобно для похожих позиций. - Удалить строку
—
Delили красный крестик в панели. - Переместить — кнопки со стрелками вверх/вниз в командной панели таблицы.
- Отсортировать — щелчок по заголовку колонки.
Для массового подбора почти в каждом документе есть кнопка Подбор. Она открывает справочник номенклатуры (или контрагентов) в отдельном окне, где вы отмечаете позиции и переносите их в таблицу пачкой с указанием количества и цены — это быстрее, чем добавлять по одной строке.
Отдельно стоит команда Заполнить в командной панели таблицы. У разных документов за ней свои варианты: Заполнить по документу-основанию переносит строки из документа, на основании которого вводится текущий (например, товары из заказа в реализацию), а Заполнить цены подтягивает значения из регистра цен. Набор пунктов зависит от вида документа — разверните меню Заполнить и посмотрите, что доступно именно здесь.
Поля, помеченные жирным или звёздочкой, — обязательные. Пустая обязательная ячейка не даст провести документ: при проведении выскочит сообщение с указанием колонки и номера строки.
Как загрузить данные из Excel в таблицу
Самый недооценённый приём: в табличную часть можно вставить данные прямо из буфера обмена. Это работает в 1С 8.3 без всяких обработок.
- В Excel выделите диапазон ячеек (без шапки), скопируйте
Ctrl+C. - В 1С встаньте на первую ячейку нужной колонки табличной части.
- Нажмите
Ctrl+V.
Строки добавятся автоматически, значения разложатся по колонкам слева направо. Главное условие — порядок и количество колонок в выделении Excel должны соответствовать колонкам таблицы в 1С.
Для текстовых колонок (номенклатура, контрагенты) 1С попытается найти элемент справочника по наименованию. Если точного совпадения нет — ячейка останется пустой или откроется форма выбора. Поэтому перед вставкой выгрузите из 1С эталонный список наименований и приведите к нему значения в Excel.
Типовой числовой затык: в Excel «1 234,50» хранится как текст с пробелом внутри. При вставке 1С не распознает это как число. Решение — в Excel предварительно прогнать колонку через Данные → Текст по столбцам или формат «Числовой».
Если данных много и загрузка повторяется регулярно, одноразовая вставка из буфера неудобна — тогда нужна обработка (следующий раздел).
Заполнение табличной части программно
В коде строки добавляют методом Добавить(). Он возвращает новую строку, а дальше присваиваете значения её реквизитам по именам колонок.
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 150;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Чтобы собрать данные в памяти, а не в документе, работают с таблицей значений. Сначала описывают колонки, потом добавляют строки:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура");
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Строка = Таблица.Добавить();
Строка.Номенклатура = Товар;
Строка.Количество = 5;
Заполнить табличную часть документа из готовой таблицы значений — одной строкой через метод Загрузить(). Условие: имена колонок таблицы значений должны совпадать с именами реквизитов табличной части.
Документ.Товары.Загрузить(Таблица);
Обратная операция — Выгрузить() переносит табличную часть в новую таблицу значений для обработки в памяти:
ТаблицаТоваров = Документ.Товары.Выгрузить();
Загрузить() полностью заменяет содержимое табличной части — старые строки стираются. Если нужно дополнить, добавляйте строки по одной через Добавить().
Найти в таблице конкретные строки удобно методом НайтиСтроки() — он принимает структуру с отбором и возвращает массив подходящих строк, которые дальше можно изменить или удалить:
Отбор = Новый Структура("Номенклатура", ИскомыйТовар);
НайденныеСтроки = Документ.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Строка.Количество = Строка.Количество + 1;
КонецЦикла;
Это надёжнее ручного цикла с проверкой Если на каждой строке и не зависит от того, сколько строк подошло под условие.
Распространённая задача — пройти по строкам и что-то пересчитать. Если по ходу цикла строки удаляются, идите с конца, иначе индексы собьются:
Для Сч = 1 По Документ.Товары.Количество() Цикл
ТекСтрока = Документ.Товары[Документ.Товары.Количество() - Сч];
Если ТекСтрока.Количество = 0 Тогда
Документ.Товары.Удалить(ТекСтрока);
КонецЕсли;
КонецЦикла;
Обработки загрузки и выгрузки данных
Когда файл грузят регулярно или нужен контроль над сопоставлением колонок, пишут или берут готовую обработку.
Выгрузка в Excel из кода идёт через табличный документ. Сформировали данные (например, отчётом по макету), затем сохранили в файл с указанием формата:
ТабДок = Новый ТабличныйДокумент;
// ... вывод областей макета в ТабДок ...
ТабДок.Записать("C:\Выгрузка\otchet.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Для старого формата подойдёт ТипФайлаТабличногоДокумента.XLS, для OpenOffice/LibreOffice — .ODS.
Загрузка из файла — чтение табличного документа и перенос ячеек в таблицу. Метод Прочитать() открывает xlsx, xls и mxl, а дальше идёте по ячейкам через Область(Строка, Колонка):
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\import.xlsx");
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Наименование = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
КоличествоТекст = ТабДок.Область(НомерСтроки, 2).Текст;
Строка = Таблица.Добавить();
Строка.Номенклатура = НайтиНоменклатуру(Наименование);
Строка.Количество = Число(КоличествоТекст);
КонецЦикла;
Здесь цикл начинается со строки 2, чтобы пропустить шапку. ВысотаТаблицы даёт число заполненных строк, .Текст возвращает содержимое ячейки строкой — число приводим явно через Число().
Если писать обработку с нуля не хочется, на диске ИТС есть универсальная обработка «Загрузка данных из табличного документа» — она сопоставляет колонки файла с реквизитами справочника или документа через наглядную форму настройки, без программирования. Её ставят как внешнюю обработку
через Файл → Открыть в режиме «Предприятие».
Внешние обработки из непроверенных источников не запускайте в рабочей базе — сначала протестируйте на копии. Обработка выполняет произвольный код и может изменить данные.
Временные таблицы в запросах
Когда таблицу собирают внутри запроса для промежуточных расчётов, используют временные таблицы. Их помещают в базу на время выполнения пакета запросов и затем соединяют с другими таблицами — так запрос читается проще и работает быстрее, чем громоздкие вложенные подзапросы.
Временную таблицу создаёт конструкция ПОМЕСТИТЬ:
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
Товары.Количество КАК Количество
ПОМЕСТИТЬ ВременныеТовары
ИЗ
&ТаблицаТоваров КАК Товары
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
Строка ИНДЕКСИРОВАТЬ ПО важна: если по полю Номенклатура дальше будет соединение, индекс заметно ускорит запрос на больших объёмах.
Чтобы временная таблица жила между запросами пакета, запросу назначают менеджер временных таблиц:
МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = ТекстСПоместить;
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);
Запрос.Выполнить();
После этого второй запрос с тем же менеджером видит ВременныеТовары и может соединять её со справочниками или регистрами. В одном пакете запросов (тексты разделены точкой с запятой) менеджер не обязателен — таблица видна следующим запросам пакета автоматически.
Явно удалить временную таблицу до конца пакета можно конструкцией УНИЧТОЖИТЬ ВременныеТовары. На практике это нужно редко: таблицы и так очищаются при закрытии менеджера. А вот загонять в ПОМЕСТИТЬ сразу все нужные колонки стоит всегда — дочитывать недостающие поля вторым соединением дороже, чем сразу отобрать их в временную таблицу.
Ошибки при заполнении таблиц и как их избежать
Большинство проблем возникает на импорте и в коде. Разберём по симптомам.
Ещё два момента, которые не видны сразу:
- Пустые обязательные поля. Загрузка кодом не проверяет заполненность так, как форма. Документ запишется, а при проведении выдаст ошибку. Проверяйте ключевые реквизиты до записи.
- Типы значений. В таблицу значений без указания
ОписаниеТиповможно положить что угодно, и строка «абв» в числовой колонке всплывёт позже при расчёте суммы. Задавайте типы колонок сразу.
Чем табличная часть отличается от таблицы значений?
Можно ли вставить данные из Excel без обработки?
Ctrl+V в табличную часть — строки добавятся сами. Порядок и число колонок должны совпадать.Как выгрузить табличную часть обратно в Excel?
Записать() с типом ТипФайлаТабличногоДокумента.XLSX. Либо используйте штатную команду «Сохранить» в печатной форме.Почему после Загрузить() пропали старые строки?
Загрузить() заменяет всё содержимое таблицы. Чтобы дополнить существующие строки, добавляйте их по одной через Добавить().Зачем временной таблице индекс?
ИНДЕКСИРОВАТЬ ПО ускоряет соединение временной таблицы с другими таблицами по указанному полю. На больших объёмах разница в скорости существенная.