← Назад к вопросам

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

1.3 Junior🔥 211 комментариев
#Объекты метаданных#Стандарты разработки

Условие

Напишите код для программного добавления новой строки в табличную часть документа.

Требования:

  • Создать новую строку в табличной части "Товары"
  • Заполнить реквизиты: Номенклатура, Количество, Цена
  • Рассчитать Сумму

Пример

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

Задание

Покажите как это сделать на клиенте и на сервере.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что произойдёт, если не установить ЭтотОбъект.Проведен = Истина

Это фундаментальный вопрос о механизме проведения документов в 1С:Предприятии. Правильное понимание этого вопроса критично для разработки документооборотной логики.

Ответы на вопросы

1. Будут ли сформированы движения по регистрам?

НЕ, движения не будут сформированы. Это главное последствие!

Если в обработчике проведения не установить ЭтотОбъект.Проведен = Истина, то:

  • Программная логика в обработчике выполнится
  • Расчёты будут произведены
  • Но регистры НЕ получат движения
  • Записи в табличных части (Товары, Услуги и т.д.) останутся, но регистровые данные не обновятся
// НЕПРАВИЛЬНО - движения не запишутся
Процедура ПередПроведением(Отмена, Режим)
    // Расчёты и проверки
    ДокументОбъект = РеквизитФормы.Объект;
    
    // Добавляем движения
    Для каждого Строка Из ДокументОбъект.Товары Цикл
        Движение = ДокументОбъект.Движения.Остатки.Добавить();
        Движение.ВидДвижения = ВидДвижения.Приход;
        Движение.Период = ДокументОбъект.Дата;
        Движение.Номенклатура = Строка.Номенклатура;
        Движение.Количество = Строка.Количество;
    КонецЦикла;
    
    // ЗАБЫЛИ установить!
    // ДокументОбъект.Проведен = Истина;  <- ОШИБКА!
КонецПроцедуры

2. Какой будет статус документа после записи?

Статус документа: НЕ ПРОВЕДЁН

Свойство Проведен имеет три состояния:

  • Истина — документ проведён
  • Ложь — документ не проведён (начальное состояние)
  • Неопределено — состояние неопределено (редко используется)

Если не установить свойство явно, документ останется в состоянии Ложь (не проведён):

// После выполнения обработчика
Документ.Проведен = Ложь;  // Статус: НЕ ПРОВЕДЁН

Последствия:

  • В интерфейсе 1С будет отображаться статус "Не проведён"
  • Документ невозможно будет отменить проведением (так как он не проведён)
  • Пользователь будет видеть, что проведение не выполнено

3. В каких случаях это свойство устанавливается автоматически?

Свойство Проведен НИКОГДА не устанавливается автоматически в обработчике проведения. Разработчик ВСЕГДА должен установить его явно.

Хотя, есть исключение при использовании встроенного алгоритма проведения (если он предусмотрен типом документа в конфигураторе).

Правильная реализация

Процедура ПередПроведением(Отмена, Режим)
    
    // Проверки
    Если НЕ ДокументОбъект.Товары.Количество() > 0 Тогда
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "Заполните строки таблицы товаров";
        Сообщение.Сообщить();
        Отмена = Истина;
        Возврат;
    КонецЕсли;
    
    // Удаляем старые движения (очень важно!)
    ДокументОбъект.Движения.Очистить();
    
    // Регистр остатков
    Для каждого Строка Из ДокументОбъект.Товары Цикл
        
        // Движение прихода
        Движение = ДокументОбъект.Движения.Остатки.Добавить();
        Движение.ВидДвижения = ВидДвижения.Приход;
        Движение.Период = ДокументОбъект.Дата;
        Движение.Номенклатура = Строка.Номенклатура;
        Движение.Склад = ДокументОбъект.Склад;
        Движение.Количество = Строка.Количество;
        
        // Регистр оборотов (учёт сумм)
        Движение = ДокументОбъект.Движения.Обороты.Добавить();
        Движение.ВидДвижения = ВидДвижения.Приход;
        Движение.Период = ДокументОбъект.Дата;
        Движение.Номенклатура = Строка.Номенклатура;
        Движение.ДокументОснование = ДокументОбъект.Ссылка;
        Движение.Сумма = Строка.Количество * Строка.Цена;
    КонецЦикла;
    
    // КРИТИЧЕСКИ ВАЖНО! Без этой строки движения не запишутся!
    ДокументОбъект.Проведен = Истина;
    
КонецПроцедуры

Разница между режимами записи

РежимСвойствоЧто выполняетсяПримечание
Запись-Ничего (только сохранение)Используется Сохранить()
ПроведениеПроведен=ИстинаПередПроведением, движенияИспользуется Провести()
Отмена проведенияПроведен=ЛожьПередОтменойПроведенияИспользуется ОтменитьПроведение()

Частые ошибки

// ОШИБКА 1: Забыли установить Проведен
Процедура ПередПроведением(Отмена, Режим)
    ДокументОбъект.Движения.Остатки.Добавить();
    // Забыли: ДокументОбъект.Проведен = Истина;
КонецПроцедуры

// ОШИБКА 2: Не очищают старые движения
Процедура ПередПроведением(Отмена, Режим)
    // Старые движения остаются!
    ДокументОбъект.Движения.Остатки.Добавить();
    ДокументОбъект.Проведен = Истина;  // Но движения дублируются!
КонецПроцедуры

// ПРАВИЛЬНО: Сначала очистить
Процедура ПередПроведением(Отмена, Режим)
    ДокументОбъект.Движения.Очистить();  // СНАЧАЛА ОЧИЩАЕМ!
    ДокументОбъект.Движения.Остатки.Добавить();
    ДокументОбъект.Проведен = Истина;  // ТЕМ БОЛЕЕ УСТАНАВЛИВАЕМ
КонецПроцедуры

Вывод

  • Движения НЕ запишутся, если не установить Проведен = Истина
  • Статус документа: останется "Не проведён"
  • Это свойство НИКОГДА не устанавливается автоматически — разработчик отвечает за это
  • Всегда очищайте старые движения перед добавлением новых во время повторного проведения
  • Это основной механизм, обеспечивающий целостность регистровых данных в 1С:Предприятии