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