Добавление строки в табличную часть документа
Условие
Напишите код для программного добавления новой строки в табличную часть документа.
Требования:
- Создать новую строку в табличной части "Товары"
- Заполнить реквизиты: Номенклатура, Количество, Цена
- Рассчитать Сумму
Пример
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Задание
Покажите как это сделать на клиенте и на сервере.
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что произойдёт, если не установить ЭтотОбъект.Проведен = Истина
Это фундаментальный вопрос о механизме проведения документов в 1С:Предприятии. Правильное понимание этого вопроса критично для разработки документооборотной логики.
Ответы на вопросы
1. Будут ли сформированы движения по регистрам?
НЕ, движения не будут сформированы. Это главное последствие!
Если в обработчике проведения не установить ЭтотОбъект.Проведен = Истина, то:
- Программная логика в обработчике выполнится
- Расчёты будут произведены
- Но регистры НЕ получат движения
- Записи в табличных части (Товары, Услуги и т.д.) останутся, но регистровые данные не обновятся
// НЕПРАВИЛЬНО - движения не запишутся
Процедура ПередПроведением(Отмена, Режим)
// Расчёты и проверки
ДокументОбъект = РеквизитФормы.Объект;
// Добавляем движения
Для каждого Строка Из ДокументОбъект.Товары Цикл
Движение = ДокументОбъект.Движения.Остатки.Добавить();
Движение.ВидДвижения = ВидДвижения.Приход;
Движение.Период = ДокументОбъект.Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Количество = Строка.Количество;
КонецЦикла;
// ЗАБЫЛИ установить!
// ДокументОбъект.Проведен = Истина; <- ОШИБКА!
КонецПроцедуры
2. Какой будет статус документа после записи?
Статус документа: НЕ ПРОВЕДЁН
Свойство Проведен имеет три состояния:
Истина— документ проведёнЛожь— документ не проведён (начальное состояние)Неопределено— состояние неопределено (редко используется)
Если не установить свойство явно, документ останется в состоянии Ложь (не проведён):
// После выполнения обработчика
Документ.Проведен = Ложь; // Статус: НЕ ПРОВЕДЁН
Последствия:
- В интерфейсе 1С будет отображаться статус "Не проведён"
- Документ невозможно будет отменить проведением (так как он не проведён)
- Пользователь будет видеть, что проведение не выполнено
3. В каких случаях это свойство устанавливается автоматически?
Свойство Проведен НИКОГДА не устанавливается автоматически в обработчике проведения. Разработчик ВСЕГДА должен установить его явно.
Хотя, есть исключение при использовании встроенного алгоритма проведения (если он предусмотрен типом документа в конфигураторе).
Правильная реализация
Процедура ПередПроведением(Отмена, Режим)
// Проверки
Если НЕ ДокументОбъект.Товары.Количество() > 0 Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Заполните строки таблицы товаров";
Сообщение.Сообщить();
Отмена = Истина;
Возврат;
КонецЕсли;
// Удаляем старые движения (очень важно!)
ДокументОбъект.Движения.Очистить();
// Регистр остатков
Для каждого Строка Из ДокументОбъект.Товары Цикл
// Движение прихода
Движение = ДокументОбъект.Движения.Остатки.Добавить();
Движение.ВидДвижения = ВидДвижения.Приход;
Движение.Период = ДокументОбъект.Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Склад = ДокументОбъект.Склад;
Движение.Количество = Строка.Количество;
// Регистр оборотов (учёт сумм)
Движение = ДокументОбъект.Движения.Обороты.Добавить();
Движение.ВидДвижения = ВидДвижения.Приход;
Движение.Период = ДокументОбъект.Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.ДокументОснование = ДокументОбъект.Ссылка;
Движение.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
// КРИТИЧЕСКИ ВАЖНО! Без этой строки движения не запишутся!
ДокументОбъект.Проведен = Истина;
КонецПроцедуры
Разница между режимами записи
| Режим | Свойство | Что выполняется | Примечание |
|---|---|---|---|
| Запись | - | Ничего (только сохранение) | Используется Сохранить() |
| Проведение | Проведен=Истина | ПередПроведением, движения | Используется Провести() |
| Отмена проведения | Проведен=Ложь | ПередОтменойПроведения | Используется ОтменитьПроведение() |
Частые ошибки
// ОШИБКА 1: Забыли установить Проведен
Процедура ПередПроведением(Отмена, Режим)
ДокументОбъект.Движения.Остатки.Добавить();
// Забыли: ДокументОбъект.Проведен = Истина;
КонецПроцедуры
// ОШИБКА 2: Не очищают старые движения
Процедура ПередПроведением(Отмена, Режим)
// Старые движения остаются!
ДокументОбъект.Движения.Остатки.Добавить();
ДокументОбъект.Проведен = Истина; // Но движения дублируются!
КонецПроцедуры
// ПРАВИЛЬНО: Сначала очистить
Процедура ПередПроведением(Отмена, Режим)
ДокументОбъект.Движения.Очистить(); // СНАЧАЛА ОЧИЩАЕМ!
ДокументОбъект.Движения.Остатки.Добавить();
ДокументОбъект.Проведен = Истина; // ТЕМ БОЛЕЕ УСТАНАВЛИВАЕМ
КонецПроцедуры
Вывод
- Движения НЕ запишутся, если не установить
Проведен = Истина - Статус документа: останется "Не проведён"
- Это свойство НИКОГДА не устанавливается автоматически — разработчик отвечает за это
- Всегда очищайте старые движения перед добавлением новых во время повторного проведения
- Это основной механизм, обеспечивающий целостность регистровых данных в 1С:Предприятии