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