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