Как программно изменить номенклатуру и реквизиты табличной части в документе 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

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

Ошибка 1: Попытка записи реквизитов через ссылку, а не через объект

Если при попытке изменить дату, номер или любой другой реквизит документа система сообщает, что поле недоступно для записи, причина заключается в попытке модификации ссылки. В платформе 1С:Предприятие ссылки (тип ДокументСсылка) предназначены исключительно для чтения и навигации. Чтобы внести изменения в базу данных, необходимо получить объект документа (тип ДокументОбъект).

Разберем по шагам правильный алгоритм получения и перезаписи объекта с обязательной проверкой на корректность найденной ссылки:


// Выполняем поиск ссылки на документ
СсылкаНаДокумент = Документы.ПоступлениеТоваровУслуг.НайтиПоРеквизиту("Ответственный", НужныйОтветственный);

// Проверяем, что ссылка найдена и не является пустой
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
    // Получаем объект документа для редактирования
    ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    
    // Модифицируем необходимые реквизиты шапки
    ДокОбъект.Дата = ЖелаемаяДата;
    
    // Записываем документ (с проведением или без)
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Обратите внимание: метод НайтиПоРеквизиту возвращает только первый найденный документ. Если требуется обработать массив документов, целесообразно использовать объект Запрос.

Ошибка 2: Изменение отсоединенной таблицы значений вместо строк документа

Распространенной ошибкой при работе с табличными частями является выгрузка данных в промежуточную таблицу методом Выгрузить() с последующей модификацией этой копии. Метод Выгрузить() создает независимый объект ТаблицаЗначений в оперативной памяти. Изменение его строк никак не отражается на самом документе, если данные не загрузить обратно.

Посмотрим на пример прямой модификации строк табличной части без лишнего расхода памяти:


// Обходим строки табличной части непосредственно через объект документа
Для Каждого СтрокаТЧ Из ДокОбъект.Товары Цикл
    // Меняем номенклатуру или зависимые поля прямо в строке документа
    СтрокаТЧ.Номенклатура = НоваяСсылкаНаНоменклатуру;
КонецЦикла;

// Записываем изменения в объекте
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

Если по каким-то причинам логика требует предварительной работы с отдельной таблицей значений, после завершения цикла обязательно требуется вызвать метод ДокОбъект.Товары.Загрузить(ТаблицаЗначений) перед записью документа.

Ошибка 3: Ожидание автоматического срабатывания обработчиков формы

В интерактивном режиме при выборе пользователем новой номенклатуры срабатывает обработчик события ПриИзменении, который автоматически подтягивает единицу измерения, ставку НДС, счета учета и статусы серий. При программной установке СтрокаТЧ.Номенклатура = Значение события формы не вызываются. Номенклатура в строке изменится, но все сопутствующие реквизиты останутся прежними либо пустыми, что приведет к ошибкам проведения.

Рассмотрим, как правильно обновить зависимые поля программно:

  1. Ручное заполнение базовых полей: присвоить значения единицы измерения и других параметров напрямую из реквизитов выбранной позиции.
  2. Вызов экспортных процедур общих модулей: в типовых конфигурациях логика пересчета вынесена в серверные процедуры (например, модуля ОбработкаТабличныхЧастей или профильных модулей подсистем). Вызов этих процедур программно эмулирует выбор номенклатуры в пользовательском интерфейсе.

Для Каждого СтрокаТЧ Из ДокОбъект.Товары Цикл
    СтрокаТЧ.Номенклатура = НоваяНоменклатура;
    
    // Ручная установка связанных реквизитов
    СтрокаТЧ.ЕдиницаИзмерения = НоваяНоменклатура.ЕдиницаИзмерения;
    
    // Пример вызова пересчета через модуль типовой конфигурации (при наличии)
    // ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(СтрокаТЧ, ДокОбъект);
КонецЦикла;

ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

Особенности учета серий и проведения документов

Если замена номенклатуры связана с переходом на серийный учет, ручного изменения строковых статусов вроде СтатусУказанияСерий недостаточно. В современных конфигурациях (таких как 1С:Управление торговлей или 1С:ERP) учет серий опирается на следующие правила:

  1. В строке документа или подчиненной табличной части Серии должны быть физически указаны созданные элементы справочника СерииНоменклатуры, привязанные к конкретной номенклатуре.
  2. Если по номенклатуре включена политика управления остатками серий, регистры накопления контролируют списание в разрезе «Номенклатура — Серия». Если приходный документ не зафиксировал серию, расходный документ (например, перемещение) не проведется по причине отсутствия свободного серийного остатка на складе.
  3. После изменения номенклатуры или серий в цепочке документов требуется последовательное перепроведение всех документов движения по хронологии (от прихода к расходу).

Использование штатных обработок вместо написания кода

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

  1. Групповое изменение реквизитов: встроенная сервисная обработка (доступна в разделе «Администрирование» — «Обслуживание» — «Корректировка данных»). Позволяет отобрать нужные документы по условиям и пакетно заменить любые реквизиты шапки и строк табличной части.
  2. Поиск и удаление дублей (или Поиск и замена значений): инструмент, который находит задвоенные позиции номенклатуры (например, созданные с лишним пробелом в наименовании), меняет ссылки во всех документах и проводках базы данных на верную позицию, после чего удаляет дубль.

Использование встроенных обработок позволяет избежать типичных ошибок программной перезаписи и гарантирует сохранение ссылочной целостности информационной базы.

← На главную