Новая строка в 1С 8.3: клавиатура, Добавить() и ПоказатьВводСтроки

· 9 мин

Содержание

Чтобы ввести строку в табличную часть документа 1С, встаньте в таблицу и нажмите Insert или кнопку Добавить над ней. В коде новую строку создаёт метод Добавить() табличной части, а текстовое значение у пользователя запрашивают через ПоказатьВводСтроки().

Типичная ситуация: бухгалтер набирает реализацию на 40 позиций и тратит время на мышь, а программисту нужно, чтобы обработка сама дописала строку с доставкой. Ниже — оба сценария для платформы 8.3 с интерфейсом «Такси»: ввод руками, ввод кодом, события формы и ошибки, на которых спотыкаются чаще всего.

Как ввести строку в табличную часть вручную

Табличная часть — это таблица внутри документа: «Товары» в реализации, «Услуги» в поступлении, «Начисления» в документах зарплаты. Ввод строки везде устроен одинаково, потому что это поведение платформы, а не конкретной конфигурации.

Добавление новой строки

  1. Откройте документ и щёлкните в нужной табличной части.
  2. Нажмите Insert или кнопку Добавить в командной панели таблицы.
  3. В конце таблицы появится пустая строка, курсор встанет в первую доступную колонку.
  4. Заполните поле и переходите к следующему клавишей Tab или Enter.
  5. Когда последняя колонка заполнена, нажмите Enter: редактирование строки закончится.

Если передумали, пока строка ещё новая и не завершена, нажмите Esc. Пустая строка исчезнет.

Горячие клавиши для работы со строками

ДействиеКлавиша
Добавить новую строкуInsert
Скопировать текущую строкуF9
Начать редактирование ячейкиF2 или Enter
Открыть выбор значения в ячейкеF4
Удалить строкуDelete
Отменить ввод в текущей строкеEsc

💡 F9 экономит больше всего времени. Если пять строк отличаются только количеством, введите первую полностью, а остальные копируйте и правьте одну ячейку.

Подбор вместо построчного ввода

Когда позиций много, строки удобнее не вводить, а подбирать. В товарных документах БП 3.0 и УТ 11 над таблицей есть кнопка Подбор. Она открывает список номенклатуры: отмечаете нужное, указываете количество, и все строки переносятся в документ разом.

Если позиции лежат в таблице Excel, посмотрите в командной панели табличной части и в меню Ещё команду загрузки из файла. В типовых конфигурациях на БСП такая команда есть у большинства товарных таблиц, но её набор зависит от документа и релиза.

Прямая вставка нескольких строк из Excel через Ctrl+V в таблицу формы не работает: текст попадёт в одну ячейку. Нужна команда загрузки или обработка.

Программное добавление строк: Добавить() и Вставить()

Для программиста «ввести строку» обычно значит дописать строку в табличную часть объекта. У коллекции табличной части для этого два метода.

МетодЧто делаетКогда брать
Добавить()Создаёт строку в конце таблицыПочти всегда
Вставить(Индекс)Создаёт строку перед позицией с указанным индексомНужен конкретный порядок строк

Индекс в Вставить() считается с нуля. Вставить(0) даст новую первую строку, а реквизит НомерСтроки у табличной части платформа пересчитает сама.

Пример в модуле формы документа

&НаКлиенте
Процедура ДобавитьДоставку(Команда)

	НоваяСтрока = Объект.Услуги.Добавить();
	НоваяСтрока.Содержание = "Доставка";
	НоваяСтрока.Количество = 1;
	НоваяСтрока.Цена = 1500;
	НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

	// Ставим курсор на добавленную строку
	Элементы.Услуги.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	Модифицированность = Истина;

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

Здесь Объект.Услуги — данные формы, поэтому строку можно добавить прямо на клиенте. Имена табличной части и реквизитов замените на свои: у разных документов они разные.

Пример на сервере, в объекте документа

ДокументОбъект = Ссылка.ПолучитьОбъект();
НоваяСтрока = ДокументОбъект.Товары.Вставить(0);
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 250;
НоваяСтрока.Сумма = 2500;
ДокументОбъект.Записать();

Проверка арифметики: 10 × 250 = 2 500. В реальном коде сумму считайте формулой, а не числом.

Если документ проведён, Записать() без режима проведения запишет его, но движения останутся старыми. Для проведённого документа используйте Записать(РежимЗаписиДокумента.Проведение) и сначала проверьте код на копии базы.

Интерактивное добавление из кода

Бывает, что строку нужно не заполнить молча, а открыть на редактирование, как будто пользователь сам нажал Insert. Для этого у элемента формы «Таблица» есть метод ДобавитьСтроку():

&НаКлиенте
Процедура НоваяПозиция(Команда)
	Элементы.Товары.ДобавитьСтроку();
КонецПроцедуры

Разница принципиальная. Объект.Товары.Добавить() работает с данными, Элементы.Товары.ДобавитьСтроку() — с интерфейсом. Во втором случае сработают все события таблицы, о которых ниже.

Как ввести строку текста: ВвестиСтроку и ПоказатьВводСтроки

Вторая трактовка запроса — попросить пользователя напечатать текст в отдельном окошке. Например, причину отмены заказа или номер договора. Для этого в платформе есть два метода.

МетодКак работаетГде использовать
ВвестиСтроку()Модальный: код ждёт, пока пользователь закроет окноТолько если в свойствах конфигурации разрешены модальные окна
ПоказатьВводСтроки()Немодальный: результат приходит в процедуру-обработчикСовременные конфигурации, веб-клиент, мобильный клиент

Типовые конфигурации на 8.3 работают с режимом использования модальности «Не использовать». В них ВвестиСтроку() вызовет ошибку, поэтому сразу пишите через ПоказатьВводСтроки().

Немодальный ввод строки

&НаКлиенте
Процедура УказатьПричину(Команда)

	Оповещение = Новый ОписаниеОповещения("ПослеВводаПричины", ЭтотОбъект);
	ПоказатьВводСтроки(Оповещение, Объект.Комментарий, "Причина отмены", 200, Истина);

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

&НаКлиенте
Процедура ПослеВводаПричины(Строка, ДополнительныеПараметры) Экспорт

	Если Строка = Неопределено Тогда
		Возврат; // пользователь нажал «Отмена»
	КонецЕсли;

	Объект.Комментарий = СокрЛП(Строка);
	Модифицированность = Истина;

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

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

Модальный вариант для старых конфигураций

Значение = "";
Если ВвестиСтроку(Значение, "Номер договора", 30) Тогда
	Сообщить("Введено: " + Значение);
КонецЕсли;

Метод возвращает Истина, если пользователь нажал ОК, а введённый текст кладёт в переменную, переданную первым параметром.

Перенос строки, многострочный текст и буфер обмена

Метода с названием «ВводПереноса» во встроенном языке нет. Перенос внутри строки делают символом из системного перечисления Символы.

Перенос в коде

// Через символ перевода строки
Текст = "Счёт оплачен" + Символы.ПС + "Отгрузка завтра";

// Многострочный литерал: продолжение начинается с вертикальной черты
Запрос = "ВЫБРАТЬ
	|	Товары.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Товары";

Кавычку внутри строки удваивают: "ООО ""Ромашка""". Число к строке не приклеивайте напрямую, используйте Формат(Сумма, "ЧГ=0") или СтрШаблон("Итого: %1", Формат(Сумма, "ЧДЦ=2")).

Многострочное поле на форме

Чтобы пользователь мог набирать текст в несколько строк, у поля ввода в форме включите свойство МногострочныйРежим. Для длинного комментария заодно увеличьте высоту поля, иначе видна будет одна строка с полосой прокрутки.

В ПоказатьВводСтроки() многострочность задаёт пятый параметр. При значении Истина окно ввода позволяет переносить строки, и в результат попадут символы Символы.ПС.

Буфер обмена

Обычное копирование текста в поле ввода работает стандартно: Ctrl+C и Ctrl+V. Программный доступ к буферу обмена появился во встроенном языке в платформе 8.3.24 через свойство глобального контекста СредстваБуфераОбмена. Работа с ним асинхронная. Точные имена методов для вашей версии смотрите в синтакс-помощнике Конфигуратора. На платформе с номером ниже 8.3.24 этого свойства нет.

События таблицы формы при добавлении строки

Когда строку добавляют интерактивно, через Insert, F9 или ДобавитьСтроку(), таблица формы вызывает цепочку событий. Через них заполняют значения по умолчанию и запрещают лишнее.

СобытиеКогда срабатываетЧто в нём делают
ПередНачаломДобавленияДо появления строкиЗапрещают добавление (Отказ = Истина)
ПриНачалеРедактированияСтрока появилась, начат вводЗаполняют значения по умолчанию
ПередОкончаниемРедактированияПользователь завершает вводПроверяют заполнение, могут отменить завершение
ПриОкончанииРедактированияВвод завершёнПересчитывают итоги, обновляют связанные поля
ПриИзменении (у колонки)Изменилось значение ячейкиПересчёт суммы по количеству и цене

Заполнение новой строки значениями по умолчанию

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если НоваяСтрока И Не Копирование Тогда
		ТекДанные = Элементы.Товары.ТекущиеДанные;
		ТекДанные.Количество = 1;
		ТекДанные.СтавкаНДС = СтавкаНДСПоУмолчанию;
	КонецЕсли;

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

Условие Не Копирование здесь важно. Без него при F9 скопированная строка затрёт количество и ставку значениями по умолчанию, и пользователь не поймёт, куда делись данные.

Запрет добавления строк

Если строки в таблице должны появляться только из подбора или из кода, есть два пути:

  • 🔒 снять у элемента таблицы свойство ИзменятьСоставСтрок — пропадут добавление, копирование и удаление;
  • 🧩 обработать ПередНачаломДобавления и ставить Отказ = Истина по своему условию, например если не выбран склад.

Строки, добавленные методом Добавить() у данных, этих событий не вызывают. Значения по умолчанию в таком случае заполняйте прямо в коде, а пересчёт сумм вызывайте явно.

Чем отличается ввод в управляемых формах

В обычных формах 8.1–8.2 табличная часть на форме была самим объектом, а код формы выполнялся на одной стороне. В управляемых формах 8.3 данные разделены на клиентские и серверные, и это меняет привычные приёмы.

  • 📦 Объект.Товары в форме — это ДанныеФормыКоллекция, а не табличная часть объекта. Методы Добавить(), Вставить(), Удалить() у неё есть, но объектных методов документа нет.
  • 🔁 Чтобы обработать строки серверным кодом с запросами, вызовите процедуру &НаСервере. Данные формы передадутся туда и вернутся обратно вместе с добавленными строками.
  • 🗂️ Если нужна именно табличная часть объекта, на сервере получите объект через РеквизитФормыВЗначение("Объект"), измените его и верните в форму через ЗначениеВРеквизитФормы(ДокОбъект, "Объект").
  • 🖱️ Текущую строку задают не ссылкой на строку, а её идентификатором: ПолучитьИдентификатор() у строки и ТекущаяСтрока у элемента таблицы.
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()

	ДокОбъект = РеквизитФормыВЗначение("Объект");
	ДокОбъект.Товары.Очистить();
	// ... запрос к остаткам и Добавить() для каждой позиции
	ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

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

Метод Очистить() удаляет все строки, включая введённые пользователем вручную. Перед автозаполнением спросите подтверждение через ПоказатьВопрос().

Ошибки при вводе строк и как их устранить

Большинство проблем сводится к трём вещам: таблица закрыта для изменений, код обращается к реквизиту не по тому имени или выполняется не на той стороне.

Диагностика: выберите симптом

Частые вопросы

Как переставить строку выше или ниже?
Выделите строку и используйте кнопки со стрелками вверх и вниз в командной панели таблицы. В коде строку двигает метод Сдвинуть() коллекции: второй параметр задаёт смещение, отрицательное число поднимает строку.
Можно ли добавить сразу несколько строк одной командой?
Руками — через подбор или загрузку из файла. В коде — циклом по выборке запроса с вызовом Добавить() на каждую запись.
Как ограничить длину вводимого текста?
В ПоказатьВводСтроки() длину задаёт четвёртый параметр. Для поля на форме ограничение берётся из длины строкового реквизита в конфигурации.
Почему после добавления строки кодом форма не помечается как изменённая?
Программное изменение данных не всегда выставляет флаг. Присвойте Модифицированность = Истина, и при закрытии 1С предложит сохранить документ.
Как удалить строку из табличной части кодом?
Вызовите Удалить() у коллекции и передайте строку или её индекс. При удалении в цикле идите с конца таблицы, иначе индексы сместятся и часть строк останется.