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

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

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

Почему использование процедур из модуля менеджера — это ошибка?

Процедуры, которые вы находите в модуле менеджера с названиями вроде ОбработатьТаблицуУслуги, часто относятся к подсистеме «Обновление информационной базы» (БСП). Эти процедуры рассчитаны на работу с уже записанными в базу документами, у которых есть Ссылка. Когда вы вызываете такую процедуру в обработчике ПриСозданииНаСервере, объект документа еще не записан в базу, у него нет ссылки, и данные просто не могут быть корректно обработаны. Использование таких методов для оперативной работы пользователей приводит к ошибкам логики и нестабильной работе формы.

Реализуем правильный перенос данных

Чтобы данные из одного документа попадали в табличную часть Товары другого, необходимо использовать механизм ОбработкаЗаполнения в модуле объекта. Это штатный метод платформы, который срабатывает при создании нового документа на основании другого.

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

  1. Откажитесь от «УдалитьУслуги». Если современные версии конфигурации (например, 1С:Бухгалтерия 3.0) объединили товары и услуги в одну табличную часть, не пытайтесь эмулировать старое поведение. Заполняйте сразу Объект.Товары.
  2. Используйте процедуру ОбработкаЗаполнения. Это гарантирует, что при нажатии кнопки «Создать на основании» данные будут переданы корректно.

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

Проблема с видом операции и формой документа

Вы могли заметить, что после заполнения табличной части форма документа вдруг меняет свой внешний вид или переключается на другую вкладку. Причина кроется в реквизите ВидОперации. В типовых решениях форма документа динамически подстраивается под содержимое таблиц. Если система «видит» только услуги, она принудительно переключает вид операции в «Услуги».

Чтобы форма всегда оставалась в нужном вам виде (например, «Товары, услуги, комиссия»), выполните следующие действия:

Что делать, если возникают ошибки типов?

При обновлении нетиповых конфигураций часто встречаются ошибки вида Переменная не определена или Тип не найден. Это связано с тем, что в новой версии платформы или БСП могли измениться имена перечислений или состав реквизитов (например, КолонкаСостоянияЭДО). В таких случаях:

  1. Откройте Конфигуратор и найдите объект, на который ругается система.
  2. Проверьте, существует ли такой реквизит в текущей версии метаданных.
  3. Если реквизит переименован, используйте ОбщегоНазначения.ПолучитьЗначениеРеквизита() или актуальные методы, предоставляемые библиотекой стандартных подсистем.

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

← На главную