Часто при разработке на платформе 1С:Предприятие 8 возникают ситуации, когда необходимо автоматизировать заполнение табличных частей документа на основе других данных. Одной из частых ошибок является попытка выполнить такой код внутри процедур ПриЗаписиНаСервере или ПередЗаписью, когда транзакция записи уже стартовала, а объект был заблокирован. Давайте разберем, почему это происходит и как правильно организовать процесс.
Когда пользователь нажимает кнопку «Записать» или «Провести», система проходит через ряд событий. Основная сложность заключается в том, что в момент вызова ПриЗаписиНаСервере объект уже находится в состоянии записи. Если вы пытаетесь изменить структуру табличной части в этот момент, могут возникнуть конфликты, так как система ожидает сохранения актуального состояния объекта, а не его активной модификации.
Для проверок заполнения данных в 1С предусмотрен специальный механизм — ОбработкаПроверкиЗаполнения. Именно здесь стоит выполнять все необходимые проверки, прежде чем документ будет передан на сервер для записи в базу данных. Если данные не проходят валидацию, мы можем прервать процесс, установив флаг Отказ = Истина.
Чтобы запретить запись документа с пустой табличной частью, разберем следующий подход. В модуле объекта используем процедуру ОбработкаПроверкиЗаполнения:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтотОбъект.ИмяТабличнойЧасти.Количество() = 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Табличная часть не заполнена!";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Таким образом, мы информируем пользователя об ошибке до того, как начнется сложный процесс транзакционной записи, что предотвращает появление «пустых» или ошибочных документов в базе.
Рассмотрим ситуацию, когда табличная часть должна заполниться данными из другой табличной части того же документа. Нам не нужно записывать документ для того, чтобы получить доступ к данным в форме. Мы можем выгрузить данные из формы в таблицу значений и использовать их для расчетов.
Рассмотрим пошаговый алгоритм решения:
Выгрузить().Загрузить().Пример реализации заполнения на сервере без привязки к ссылке (для незаписанного документа):
&НаСервере
Процедура ЗаполнитьНаСервере()
// Получаем текущие данные из табличной части в память
ТЗ_Данные = Объект.ИмяТЧИсточника.Выгрузить();
// Подготавливаем запрос
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ТЗ_Данные);
Результат = Запрос.Выполнить();
// Загружаем результат во вторую табличную часть
Объект.ИмяТЧПриемника.Загрузить(Результат.Выгрузить());
КонецПроцедуры
Чтобы избежать ошибок в будущем, проанализируем основные правила работы:
Объект в модуле формы — это данные формы, а не сам объект базы данных. При выполнении сложных манипуляций всегда проверяйте, находитесь ли вы в контексте формы или модуля объекта.ПередЗаписью, ПриЗаписиНаСервере и ОбработкаПроверкиЗаполнения. Проверяйте значение параметра РежимПроведения или Отказ в окне «Табло». Это позволит вам увидеть, в какой момент система пытается записать «пустые» данные.ОписаниеТипов — частая причина ошибок «Недопустимое значение параметра».Рассмотренные выше примеры помогут вам выстроить логику заполнения документов, которая будет работать стабильно, не вызывая конфликтов транзакций. Помните, что ключом к успешному программированию является понимание того, в каком контексте исполняется ваш код и какие данные доступны ему на каждом этапе выполнения.